Skip to content

Commit 8d826ad

Browse files
authored
chore(db_studio): Update linter/style preferences (#408)
- Ensures `celest_lints` is used - Applies latest linter/style preferences using dart fix - Re-formats using Dart 3.8
1 parent d14f00d commit 8d826ad

File tree

9 files changed

+84
-76
lines changed

9 files changed

+84
-76
lines changed

.github/workflows/celest_db_studio.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,26 @@ permissions:
1515
contents: read
1616

1717
jobs:
18+
analyze_and_format:
19+
runs-on: ubuntu-latest
20+
timeout-minutes: 10
21+
steps:
22+
- name: Git Checkout
23+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
24+
- name: Setup Flutter
25+
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # 2.19.0
26+
with:
27+
channel: beta
28+
cache: true
29+
- name: Get Packages
30+
working-directory: packages/celest_db_studio
31+
run: dart pub upgrade
32+
- name: Analyze
33+
working-directory: packages/celest_db_studio
34+
run: dart analyze
35+
- name: Format
36+
working-directory: packages/celest_db_studio
37+
run: dart format --language-version=latest --set-exit-if-changed .
1838
test:
1939
runs-on: ubuntu-latest
2040
timeout-minutes: 10
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
## 1.0.0
1+
## 0.1.0
22

33
- Initial version.
Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,5 @@
1-
# This file configures the static analysis results for your project (errors,
2-
# warnings, and lints).
3-
#
4-
# This enables the 'recommended' set of lints from `package:lints`.
5-
# This set helps identify many issues that may lead to problems when running
6-
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
7-
# style and format.
8-
#
9-
# If you want a smaller set of lints you can change this to specify
10-
# 'package:lints/core.yaml'. These are just the most critical lints
11-
# (the recommended set includes the core lints).
12-
# The core lints are also what is used by pub.dev for scoring packages.
1+
include: package:celest_lints/library.yaml
132

14-
include: package:lints/recommended.yaml
15-
16-
# Uncomment the following section to specify additional rules.
17-
18-
# linter:
19-
# rules:
20-
# - camel_case_types
21-
22-
# analyzer:
23-
# exclude:
24-
# - path/to/excluded/files/**
25-
26-
# For more information about the core and recommended set of lints, see
27-
# https://dart.dev/go/core-lints
28-
29-
# For additional information about configuring this file, see
30-
# https://dart.dev/guides/language/analysis-options
3+
analyzer:
4+
errors:
5+
public_member_api_docs: ignore

packages/celest_db_studio/bin/server.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,31 @@ import 'package:shelf/shelf.dart';
55
import 'package:shelf/shelf_io.dart';
66

77
Future<void> main(List<String> args) async {
8-
final databaseUrl = Platform.environment['DATABASE_URL'];
8+
final String? databaseUrl = Platform.environment['DATABASE_URL'];
99
if (databaseUrl == null) {
10-
print('DATABASE_URL environment variable is not set.');
10+
stderr.writeln('DATABASE_URL environment variable is not set.');
1111
exit(1);
1212
}
13-
final authToken = Platform.environment['DATABASE_AUTH_TOKEN'];
13+
final String? authToken = Platform.environment['DATABASE_AUTH_TOKEN'];
1414

15-
final dbStudio = await CelestDbStudio.create(
15+
final CelestDbStudio dbStudio = await CelestDbStudio.create(
1616
databaseUri: Uri.parse(databaseUrl),
1717
authToken: authToken,
1818
);
19-
final handler = Pipeline()
19+
final Handler handler = const Pipeline()
2020
.addMiddleware(logRequests())
2121
.addHandler(dbStudio.call);
2222

23-
final port = int.parse(Platform.environment['PORT'] ?? '8080');
24-
final server = await serve(handler, InternetAddress.loopbackIPv4, port);
25-
print('Server listening on http://localhost:${server.port}');
23+
final int port = int.parse(Platform.environment['PORT'] ?? '8080');
24+
final HttpServer server = await serve(
25+
handler,
26+
InternetAddress.loopbackIPv4,
27+
port,
28+
);
29+
stdout.writeln('Server listening on http://localhost:${server.port}');
2630

2731
await ProcessSignal.sigint.watch().first;
2832

29-
print('Stopping server...');
33+
stdout.writeln('Stopping server...');
3034
await server.close(force: true);
3135
}

packages/celest_db_studio/lib/celest_db_studio.dart

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,27 @@ export 'package:celest_db_studio/src/driver.dart';
1111
/// {@template celest_db_studio.celest_db_studio}
1212
/// A simple server which serves an instance of Outerbase Studio as an embedded
1313
/// iframe and responds to query requests from the iframe.
14-
///
15-
/// The server connects to a database using the provided [databaseUri] and
16-
/// proxies requests from the iframe to the database.
1714
/// {@endtemplate}
1815
final class CelestDbStudio {
16+
CelestDbStudio.from({this.pageTitle = defaultTitle, required Driver driver})
17+
: _driver = driver;
18+
1919
/// {@macro celest_db_studio.celest_db_studio}
20+
///
21+
/// The server connects to a database using the provided [databaseUri] and
22+
/// proxies requests from the iframe to the database.
2023
static Future<CelestDbStudio> create({
2124
String pageTitle = defaultTitle,
2225
required Uri databaseUri,
2326
String? authToken,
2427
}) async {
25-
final driver = await Driver.connect(databaseUri, authToken: authToken);
28+
final Driver driver = await Driver.connect(
29+
databaseUri,
30+
authToken: authToken,
31+
);
2632
return CelestDbStudio.from(pageTitle: pageTitle, driver: driver);
2733
}
2834

29-
CelestDbStudio.from({this.pageTitle = defaultTitle, required Driver driver})
30-
: _driver = driver;
31-
3235
/// The default title of the page.
3336
static const String defaultTitle = 'DB Studio';
3437

@@ -68,7 +71,7 @@ final class CelestDbStudio {
6871
if (request.method == 'OPTIONS') {
6972
return Response.ok(null, headers: corsHeaders);
7073
}
71-
final response = await innerHandler(request);
74+
final Response response = await innerHandler(request);
7275
return response.change(headers: corsHeaders);
7376
};
7477
}
@@ -102,7 +105,7 @@ final class CelestDbStudio {
102105

103106
/// Responds to query requests from the Outerbase Studio iframe.
104107
Future<Response> _query(Request request) async {
105-
final json = await JsonUtf8.decodeStream(request.read());
108+
final Object? json = await JsonUtf8.decodeStream(request.read());
106109
if (json
107110
case {
108111
'id': final int id,
@@ -115,7 +118,7 @@ final class CelestDbStudio {
115118
'statement': final String statement,
116119
}) {
117120
try {
118-
final result = await _driver.execute(statement);
121+
final DriverResultSet result = await _driver.execute(statement);
119122
return Response.ok(
120123
jsonEncode({
121124
'type': type,

packages/celest_db_studio/lib/src/driver.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
import 'package:hrana/src/rpc_client.dart' as hrana;
33
import 'package:hrana/src/rpc_http_client.dart' as hrana;
44
import 'package:sqlite3/sqlite3.dart' show Database, sqlite3;
5+
import 'package:sqlite3/src/result_set.dart';
56

67
sealed class Driver {
78
static Future<Driver> connect(Uri uri, {String? authToken}) async {
89
switch (uri) {
910
case Uri(scheme: 'libsql' || 'https' || 'http'):
10-
return await HranaDriver.connect(uri, jwtToken: authToken);
11+
return HranaDriver.connect(uri, jwtToken: authToken);
1112
case Uri(scheme: 'file', path: '/:memory:'):
1213
return NativeDriver.memory();
1314
case Uri(scheme: 'file'):
@@ -34,8 +35,8 @@ final class NativeDriver extends Driver {
3435

3536
@override
3637
Future<DriverResultSet> execute(String sql) async {
37-
final result = _database.select(sql);
38-
final headers = [
38+
final ResultSet result = _database.select(sql);
39+
final List<DriverResultHeader> headers = [
3940
for (final column in result.columnNames)
4041
DriverResultHeader(
4142
name: column,
@@ -56,7 +57,7 @@ final class HranaDriver extends Driver {
5657
HranaDriver(this._client);
5758

5859
static Future<HranaDriver> connect(Uri uri, {String? jwtToken}) async {
59-
final client = await hrana.HranaHttpClient.connect(
60+
final hrana.HranaHttpClient client = await hrana.HranaHttpClient.connect(
6061
uri.replace(
6162
scheme: switch (uri.scheme) {
6263
'wss' || 'libsql' || 'https' => 'https',
@@ -73,12 +74,12 @@ final class HranaDriver extends Driver {
7374

7475
@override
7576
Future<DriverResultSet> execute(String sql) async {
76-
final session = await _client.openStream();
77+
final hrana.HranaStream session = await _client.openStream();
7778
try {
78-
final result = await session.executeStatement(
79+
final hrana.StatementResult result = await session.executeStatement(
7980
hrana.SqlStatement(sql: sql, args: [], namedArgs: [], wantRows: true),
8081
);
81-
final headers = [
82+
final List<DriverResultHeader> headers = [
8283
for (final column in result.columns)
8384
DriverResultHeader(
8485
name: column.name ?? '',

packages/celest_db_studio/test/e2e_test.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void main() {
1818
late Process p;
1919

2020
setUpAll(() async {
21-
final sqldPort = await selectFreePort();
21+
final int sqldPort = await selectFreePort();
2222
sqld = await startSqld(sqldPort);
2323

2424
port = await selectFreePort();
@@ -83,7 +83,7 @@ void main() {
8383
await p.exitCode;
8484
try {
8585
await dbDir.delete(recursive: true);
86-
} catch (e) {
86+
} on Object {
8787
// OK
8888
}
8989
});
@@ -130,7 +130,7 @@ void main() {
130130
'E2E',
131131
skip: hasChromeDriver ? null : 'Chromedriver not installed',
132132
() async {
133-
final chromedriver = await Process.start('chromedriver', [
133+
final Process chromedriver = await Process.start('chromedriver', [
134134
'--port=4444',
135135
'--url-base=wd/hub',
136136
]);
@@ -153,7 +153,7 @@ void main() {
153153
.then(fail),
154154
]);
155155

156-
final driver = await createDriver(
156+
final WebDriver driver = await createDriver(
157157
spec: WebDriverSpec.JsonWire,
158158
desired: {
159159
...Capabilities.chrome,
@@ -167,31 +167,31 @@ void main() {
167167
addTearDown(driver.quit);
168168

169169
await driver.get('http://localhost:$port');
170-
final iframe = await driver.waitForElement(
170+
final WebElement iframe = await driver.waitForElement(
171171
const By.tagName('iframe'),
172172
timeout: const Duration(seconds: 10),
173173
);
174-
final src = await iframe.attributes['src'];
174+
final String? src = await iframe.attributes['src'];
175175
expect(src, 'https://studio.outerbase.com/embed/sqlite');
176176

177177
// Ensure that sending `SELECT 1;` works and returns `1` in the result cell.
178178

179179
await driver.switchTo.frame(iframe);
180180

181-
final input = await driver.waitForElement(
181+
final WebElement input = await driver.waitForElement(
182182
const By.className('cm-content'),
183183
);
184184
await input.click();
185185
await input.sendKeys('SELECT 1;');
186186

187-
final runButton = await driver.findElement(
187+
final WebElement runButton = await driver.findElement(
188188
const By.cssSelector(
189189
r'body > div.flex.h-screen.w-screen.flex-col > div > div:nth-child(3) > div.flex.h-full.w-full.flex-col > div.relative.grow > div > div > div:nth-child(1) > div > div.flex.border-b.bg-neutral-50.py-3.pr-1.pl-3.dark\:bg-neutral-950 > div.flex.gap-2 > div > button.inline-flex.items-center.justify-center.whitespace-nowrap.font-medium.transition-colors.focus-visible\:outline-hidden.focus-visible\:ring-1.focus-visible\:ring-ring.disabled\:pointer-events-none.disabled\:opacity-50.bg-primary.text-primary-foreground.shadow-sm.hover\:bg-primary\/90.h-8.rounded-md.px-3.text-sm.rounded-r-none',
190190
),
191191
);
192192
await runButton.click();
193193

194-
final resultCell = await driver.waitForElement(
194+
final WebElement resultCell = await driver.waitForElement(
195195
const By.cssSelector(
196196
r'body > div.flex.h-screen.w-screen.flex-col > div > div:nth-child(3) > div.flex.h-full.w-full.flex-col > div.relative.grow > div > div > div:nth-child(3) > div.flex.h-full.w-full.flex-col > div.relative.grow > div:nth-child(1) > div > div.grow.overflow-hidden > div > div > table > tbody > tr > td.overflow-hidden.border-r.border-b.box-border.hover\:bg-neutral-100.dark\:hover\:bg-neutral-800.bg-transparent',
197197
),
@@ -207,7 +207,7 @@ bool get hasChromeDriver {
207207
try {
208208
Process.runSync('chromedriver', ['--version']);
209209
return true;
210-
} catch (e) {
210+
} on Object {
211211
return false;
212212
}
213213
}
@@ -221,10 +221,10 @@ extension on SearchContext {
221221
while (stopwatch.elapsed < timeout) {
222222
try {
223223
return await findElement(by);
224-
} catch (e) {
224+
} on Object {
225225
// Ignore and retry
226226
}
227-
await Future.delayed(const Duration(milliseconds: 100));
227+
await Future<void>.delayed(const Duration(milliseconds: 100));
228228
}
229229
throw TimeoutException(null, 'Element not found within $timeout');
230230
}

packages/celest_db_studio/test/server_test.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import 'dart:io';
44
import 'package:celest_db_studio/celest_db_studio.dart';
55
import 'package:http/http.dart' as http;
66
import 'package:shelf/shelf_io.dart';
7+
import 'package:shelf/src/request.dart';
8+
import 'package:shelf/src/response.dart';
79
import 'package:shelf_router/shelf_router.dart';
810
import 'package:test/test.dart';
911

@@ -16,10 +18,10 @@ void main() {
1618
late http.Client client;
1719

1820
setUpAll(() async {
19-
final studio = await CelestDbStudio.create(
21+
final CelestDbStudio studio = await CelestDbStudio.create(
2022
databaseUri: Uri.parse('file::memory:'),
2123
);
22-
final handler =
24+
final Future<Response> Function(Request request) handler =
2325
basePath.isEmpty
2426
? studio.call
2527
: (Router()..mount(basePath, studio.call)).call;
@@ -37,7 +39,7 @@ void main() {
3739

3840
for (final url in validUrls) {
3941
test('GET $url', () async {
40-
final response = await client.send(
42+
final http.StreamedResponse response = await client.send(
4143
http.Request('GET', Uri.parse('$uri$url'))
4244
..followRedirects = true,
4345
);
@@ -51,7 +53,7 @@ void main() {
5153
}
5254

5355
test('POST /query', () async {
54-
final response = await client.post(
56+
final http.Response response = await client.post(
5557
Uri.parse('$uri/query'),
5658
body: jsonEncode({
5759
'id': 1,
@@ -72,7 +74,7 @@ void main() {
7274

7375
for (final url in invalidUrls) {
7476
test('GET $url', () async {
75-
final response = await client.get(uri.resolve(url));
77+
final http.Response response = await client.get(uri.resolve(url));
7678
expect(response.statusCode, 404);
7779
expect(response.body, contains('Route not found'));
7880
});

packages/celest_db_studio/test/start_server.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'dart:io';
33
import 'package:docker_process/docker_process.dart';
44

55
Future<DockerProcess> startSqld(int port) async {
6-
final process = await DockerProcess.start(
6+
final DockerProcess process = await DockerProcess.start(
77
image: 'ghcr.io/tursodatabase/libsql-server:latest',
88
name: 'dart-hrana-test-$port',
99
readySignal: (line) => line.contains('serving internal rpc server'),
@@ -14,8 +14,11 @@ Future<DockerProcess> startSqld(int port) async {
1414
}
1515

1616
Future<int> selectFreePort() async {
17-
final socket = await ServerSocket.bind(InternetAddress.anyIPv4, 0);
18-
final port = socket.port;
17+
final ServerSocket socket = await ServerSocket.bind(
18+
InternetAddress.anyIPv4,
19+
0,
20+
);
21+
final int port = socket.port;
1922
await socket.close();
2023
return port;
2124
}

0 commit comments

Comments
 (0)