increase min sdk and apply new formatter

This commit is contained in:
Fabian Freund
2025-02-18 15:37:03 +01:00
parent f7885fc829
commit a1ee8bef35
266 changed files with 11329 additions and 10058 deletions
@@ -95,13 +95,9 @@ class BangDao extends DatabaseAccessor<BangDatabase> with _$BangDaoMixin {
final ftsQuery = db.buildFtsQuery(searchString);
if (ftsQuery.isNotEmpty) {
return db.queryBangs(
query: ftsQuery,
);
return db.queryBangs(query: ftsQuery);
} else {
return db.queryBangsBasic(
query: db.buildLikeQuery(searchString),
);
return db.queryBangsBasic(query: db.buildLikeQuery(searchString));
}
}
@@ -9,19 +9,17 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
SyncDao(super.db);
SingleOrNullSelectable<DateTime?> lastSyncOfGroup(BangGroup group) {
final query = selectOnly(db.bangSync)
..addColumns([db.bangSync.lastSync])
..where(db.bangSync.group.equalsValue(group));
final query =
selectOnly(db.bangSync)
..addColumns([db.bangSync.lastSync])
..where(db.bangSync.group.equalsValue(group));
return query.map((row) => row.read(db.bangSync.lastSync));
}
Future<void> upsertLastSyncOfGroup(BangGroup group, DateTime lastSync) {
return db.bangSync.insertOne(
BangSyncCompanion.insert(
group: Value(group),
lastSync: lastSync,
),
BangSyncCompanion.insert(group: Value(group), lastSync: lastSync),
onConflict: DoUpdate(
(old) => BangSyncCompanion.custom(lastSync: Variable(lastSync)),
),
@@ -33,11 +31,9 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
}
Future<void> replaceBangs(Iterable<Bang> bangs) {
return batch(
(batch) {
batch.replaceAll(db.bang, bangs);
},
);
return batch((batch) {
batch.replaceAll(db.bang, bangs);
});
}
Future<int> deleteBangs(Iterable<String> triggers) {
@@ -50,36 +46,34 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
required Iterable<Bang> remoteBangs,
required DateTime syncTime,
}) async {
final remoteBangMap =
Map.fromEntries(remoteBangs.map((e) => MapEntry(e.trigger, e)));
final localBangMap =
await db.bangDao.getBangList(groups: [group]).get().then(
(bangs) =>
Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
);
final remoteBangMap = Map.fromEntries(
remoteBangs.map((e) => MapEntry(e.trigger, e)),
);
final localBangMap = await db.bangDao
.getBangList(groups: [group])
.get()
.then(
(bangs) => Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
);
final remoteBangTriggers = remoteBangMap.keys.toSet();
final localBangTriggers = localBangMap.keys.toSet();
final removedBangs = localBangTriggers.difference(remoteBangTriggers);
final addedBangs = remoteBangTriggers.difference(localBangTriggers).map(
(e) => remoteBangMap[e]!,
);
final addedBangs = remoteBangTriggers
.difference(localBangTriggers)
.map((e) => remoteBangMap[e]!);
final changedBangs = remoteBangTriggers
.intersection(localBangTriggers)
.where((e) => remoteBangMap[e] != localBangMap[e])
.map(
(e) => remoteBangMap[e]!,
);
.map((e) => remoteBangMap[e]!);
await db.transaction(
() async {
await deleteBangs(removedBangs);
await insertBangs(addedBangs);
await replaceBangs(changedBangs);
await upsertLastSyncOfGroup(group, syncTime);
},
);
await db.transaction(() async {
await deleteBangs(removedBangs);
await insertBangs(addedBangs);
await replaceBangs(changedBangs);
await upsertLastSyncOfGroup(group, syncTime);
});
}
}
@@ -9,10 +9,7 @@ import 'package:lensai/features/search/domain/fts_tokenizer.dart';
part 'database.g.dart';
@DriftDatabase(
include: {'database.drift'},
daos: [BangDao, SyncDao],
)
@DriftDatabase(include: {'database.drift'}, daos: [BangDao, SyncDao])
class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
@override
final int schemaVersion = 1;
@@ -24,10 +21,10 @@ class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
@override
MigrationStrategy get migration => MigrationStrategy(
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON;');
},
);
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON;');
},
);
BangDatabase(super.e);
}
File diff suppressed because it is too large Load Diff
+20 -19
View File
@@ -8,9 +8,7 @@ import 'package:lensai/features/bangs/data/database/database.dart'
part 'bang.g.dart';
enum BangGroup {
general(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json',
),
general('https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json'),
assistant(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
),
@@ -90,16 +88,19 @@ class Bang with FastEquatable implements Insertable<Bang> {
}
Uri getUrl(String? query) {
final url = (query != null)
? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query))
: urlTemplate;
final url =
(query != null)
? urlTemplate.replaceAll(
_templateQueryPlaceholder,
formatQuery(query),
)
: urlTemplate;
var template = Uri.parse(url);
if (!template.hasScheme || template.origin.isEmpty) {
template = Uri.https(domain).replace(
path: template.path,
query: template.query,
);
template = Uri.https(
domain,
).replace(path: template.path, query: template.query);
}
return template;
@@ -133,15 +134,15 @@ class Bang with FastEquatable implements Insertable<Bang> {
@override
List<Object?> get hashParameters => [
group,
websiteName,
domain,
trigger,
urlTemplate,
category,
subCategory,
format,
];
group,
websiteName,
domain,
trigger,
urlTemplate,
category,
subCategory,
format,
];
@override
Map<String, Expression<Object>> toColumns(bool nullToAbsent) {
+57 -49
View File
@@ -72,7 +72,6 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
Bang format(Set<BangFormat>? format) => this(format: format);
@override
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `Bang(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -90,38 +89,46 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
Object? format = const $CopyWithPlaceholder(),
}) {
return Bang(
websiteName: websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain: domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger: trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
group: group == const $CopyWithPlaceholder()
? _value.group
// ignore: cast_nullable_to_non_nullable
: group as BangGroup?,
category: category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory: subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format: format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
websiteName:
websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain:
domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger:
trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate:
urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
group:
group == const $CopyWithPlaceholder()
? _value.group
// ignore: cast_nullable_to_non_nullable
: group as BangGroup?,
category:
category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory:
subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format:
format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
);
}
}
@@ -137,26 +144,27 @@ extension $BangCopyWith on Bang {
// **************************************************************************
Bang _$BangFromJson(Map<String, dynamic> json) => Bang(
websiteName: json['s'] as String,
domain: json['d'] as String,
trigger: json['t'] as String,
urlTemplate: json['u'] as String,
category: json['c'] as String?,
subCategory: json['sc'] as String?,
format: (json['fmt'] as List<dynamic>?)
websiteName: json['s'] as String,
domain: json['d'] as String,
trigger: json['t'] as String,
urlTemplate: json['u'] as String,
category: json['c'] as String?,
subCategory: json['sc'] as String?,
format:
(json['fmt'] as List<dynamic>?)
?.map((e) => $enumDecode(_$BangFormatEnumMap, e))
.toSet(),
);
);
Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
's': instance.websiteName,
'd': instance.domain,
't': instance.trigger,
'u': instance.urlTemplate,
'c': instance.category,
'sc': instance.subCategory,
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
};
's': instance.websiteName,
'd': instance.domain,
't': instance.trigger,
'u': instance.urlTemplate,
'c': instance.category,
'sc': instance.subCategory,
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
};
const _$BangFormatEnumMap = {
BangFormat.openBasePath: 'open_base_path',
@@ -29,9 +29,9 @@ class BangData extends Bang {
@override
List<Object?> get hashParameters => [
...super.hashParameters,
frequency,
lastUsed,
icon,
];
...super.hashParameters,
frequency,
lastUsed,
icon,
];
}
@@ -84,7 +84,6 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
BangData icon(BrowserIcon? icon) => this(icon: icon);
@override
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `BangData(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -104,46 +103,56 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
Object? icon = const $CopyWithPlaceholder(),
}) {
return BangData(
websiteName: websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain: domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger: trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
category: category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory: subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format: format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
frequency: frequency == const $CopyWithPlaceholder()
? _value.frequency
// ignore: cast_nullable_to_non_nullable
: frequency as int?,
lastUsed: lastUsed == const $CopyWithPlaceholder()
? _value.lastUsed
// ignore: cast_nullable_to_non_nullable
: lastUsed as DateTime?,
icon: icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as BrowserIcon?,
websiteName:
websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain:
domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger:
trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate:
urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
category:
category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory:
subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format:
format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
frequency:
frequency == const $CopyWithPlaceholder()
? _value.frequency
// ignore: cast_nullable_to_non_nullable
: frequency as int?,
lastUsed:
lastUsed == const $CopyWithPlaceholder()
? _value.lastUsed
// ignore: cast_nullable_to_non_nullable
: lastUsed as DateTime?,
icon:
icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as BrowserIcon?,
);
}
}
@@ -15,9 +15,5 @@ class SearchHistoryEntry with FastEquatable {
bool get cacheHash => true;
@override
List<Object?> get hashParameters => [
searchQuery,
trigger,
searchDate,
];
List<Object?> get hashParameters => [searchQuery, trigger, searchDate];
}
@@ -19,25 +19,22 @@ class BangSourceService extends _$BangSourceService {
}
Future<Result<List<Bang>>> getBangs(Uri url, BangGroup? group) async {
return Result.fromAsync(
() async {
final response = await _client.get(url);
return await compute(
(args) => jsonDecode(utf8.decode(args[0])) as List,
[response.bodyBytes],
).then(
(json) => json.map((e) {
var bang = Bang.fromJson(e as Map<String, dynamic>);
return Result.fromAsync(() async {
final response = await _client.get(url);
return await compute((args) => jsonDecode(utf8.decode(args[0])) as List, [
response.bodyBytes,
]).then(
(json) =>
json.map((e) {
var bang = Bang.fromJson(e as Map<String, dynamic>);
if (group != null) {
bang = bang.copyWith.group(group);
}
if (group != null) {
bang = bang.copyWith.group(group);
}
return bang;
}).toList(),
);
},
exceptionHandler: handleHttpError,
);
return bang;
}).toList(),
);
}, exceptionHandler: handleHttpError);
}
}
@@ -12,14 +12,15 @@ String _$bangSourceServiceHash() => r'2f734d563fa20de306a72013526ef1f72f910fe1';
@ProviderFor(BangSourceService)
final bangSourceServiceProvider =
AutoDisposeNotifierProvider<BangSourceService, void>.internal(
BangSourceService.new,
name: r'bangSourceServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSourceServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
BangSourceService.new,
name: r'bangSourceServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSourceServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangSourceService = AutoDisposeNotifier<void>;
// ignore_for_file: type=lint