Skip to content

Commit

Permalink
add prefs_async support
Browse files Browse the repository at this point in the history
  • Loading branch information
alextekartik committed Oct 18, 2024
1 parent 2047def commit 7caab18
Show file tree
Hide file tree
Showing 10 changed files with 133 additions and 8 deletions.
2 changes: 1 addition & 1 deletion app_prefs/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# tekartik strict extension
include: package:tekartik_lints/strict.yaml
include: package:tekartik_lints/package.yaml
2 changes: 2 additions & 0 deletions app_prefs/lib/app_prefs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import 'src/prefs.dart' as src;

export 'package:tekartik_prefs/prefs.dart';

/// @Deprecated('use async')
/// The prefs factory to user
PrefsFactory get prefsFactory => src.prefsFactory;

/// @Deprecated('use async')
/// Support Windows and Linux desktop
PrefsFactory getPrefsFactory({String? packageName}) =>
src.getPrefsFactory(packageName: packageName);
12 changes: 12 additions & 0 deletions app_prefs/lib/app_prefs_async.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:tekartik_prefs/prefs_async.dart';

import 'src/prefs.dart' as src;

export 'package:tekartik_prefs/prefs_async.dart';

/// The prefs factory to user
PrefsAsyncFactory get prefsAsyncFactory => src.prefsAsyncFactory;

/// Support Windows and Linux desktop
PrefsAsyncFactory getPrefsAsyncFactory({String? packageName}) =>
src.getPrefsAsyncFactory(packageName: packageName);
1 change: 1 addition & 0 deletions app_prefs/lib/src/prefs.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export 'package:tekartik_prefs/prefs.dart';
export 'package:tekartik_prefs/prefs_async.dart';

export 'prefs_stub.dart'
if (dart.library.js_interop) 'prefs_web.dart'
Expand Down
39 changes: 36 additions & 3 deletions app_prefs/lib/src/prefs_io.dart
Original file line number Diff line number Diff line change
@@ -1,22 +1,55 @@
import 'package:tekartik_app_sembast/sembast.dart';
import 'package:tekartik_prefs_sembast/prefs.dart';
import 'package:tekartik_prefs_sembast/prefs_async.dart';

/// Default for io use a local folder
PrefsFactory get prefsFactory => getPrefsFactory();

final _prefsFactoryMap = <String?, PrefsFactory>{};
/// Default for io use a local folder
PrefsAsyncFactory get prefsAsyncFactory => getPrefsAsyncFactory();

final _prefsFactoryMap = <String, PrefsFactory>{};
final _prefsAsyncFactoryMap = <String, PrefsAsyncFactory>{};
PrefsFactory? _defaultPrefsFactory;
PrefsAsyncFactory? _defaultPrefsAsyncFactory;

/// Sembast prefs factory
PrefsFactory newPrefsFactorySembast(String? packageName) {
return getPrefsFactorySembast(
getDatabaseFactory(packageName: packageName), '.');
}

/// Sembast prefs factory
PrefsAsyncFactory newPrefsAsyncFactorySembast({String? packageName}) {
return getPrefsAsyncFactorySembast(
getDatabaseFactory(packageName: packageName), '.');
}

/// Use sembast on linux and windows
PrefsFactory getPrefsFactory({String? packageName}) {
var prefsFactory = _prefsFactoryMap[packageName];
if (prefsFactory == null) {
_prefsFactoryMap[packageName] =
prefsFactory = newPrefsFactorySembast(packageName);
if (packageName == null) {
return _defaultPrefsFactory ??= newPrefsFactorySembast(packageName);
} else {
_prefsFactoryMap[packageName] =
prefsFactory = newPrefsFactorySembast(packageName);
}
}
return prefsFactory;
}

/// Use sembast on linux and windows
PrefsAsyncFactory getPrefsAsyncFactory({String? packageName}) {
var prefsFactory = _prefsAsyncFactoryMap[packageName];
if (prefsFactory == null) {
if (packageName == null) {
prefsFactory = _defaultPrefsAsyncFactory ??=
newPrefsAsyncFactorySembast(packageName: packageName);
} else {
_prefsAsyncFactoryMap[packageName] =
prefsFactory = newPrefsAsyncFactorySembast(packageName: packageName);
}
}
return prefsFactory;
}
10 changes: 10 additions & 0 deletions app_prefs/lib/src/prefs_stub.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
import 'package:tekartik_prefs/prefs.dart';
import 'package:tekartik_prefs/prefs_async.dart';

/// Stub
PrefsFactory get prefsFactory => _stub('prefsFactory');

/// Stub
PrefsAsyncFactory get prefsAsyncFactory => _stub('prefsAsyncFactory');

/// Stub
PrefsFactory getPrefsFactory({String? packageName}) => _stub('getPrefsFactory');

/// Stub
PrefsAsyncFactory getPrefsAsyncFactory({String? packageName}) =>
_stub('getPrefsAsyncFactory');

T _stub<T>(String message) {
throw UnimplementedError(message);
}
11 changes: 11 additions & 0 deletions app_prefs/lib/src/prefs_web.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
import 'package:tekartik_prefs/prefs_async.dart';
import 'package:tekartik_prefs_browser/prefs.dart';
import 'package:tekartik_prefs_browser/prefs_async.dart';

/// Browser prefs factory
PrefsFactory get prefsFactory => prefsFactoryBrowser;

/// Browser prefs factory
PrefsFactory getPrefsFactory({String? packageName}) => prefsFactory;

/// Browser prefs factory
PrefsAsyncFactory get prefsAsyncFactory => prefsAsyncFactoryBrowser;

/// Browser prefs factory
PrefsAsyncFactory getPrefsAsyncFactory({String? packageName}) =>
prefsAsyncFactory;
8 changes: 4 additions & 4 deletions app_prefs/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,17 @@ dependencies:
path: prefs_browser
ref: dart3a
version: '>=0.1.0'
path:
process_run:
path: ">=1.9.0"
process_run: ">=1.2.0+3"
tekartik_app_sembast:
git:
url: https://github.com/tekartik/app_common_utils.dart
ref: dart3a
path: app_sembast
version: '>=0.1.0'
dev_dependencies:
dev_build:
test:
dev_build: ">=1.1.0+1"
test: ">=1.24.0"
tekartik_lints:
git:
url: https://github.com/tekartik/common.dart
Expand Down
12 changes: 12 additions & 0 deletions app_prefs/test/app_prefs_api_test.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:tekartik_app_common_prefs/app_prefs.dart';
import 'package:tekartik_app_common_prefs/app_prefs_async.dart';
import 'package:test/test.dart';

void main() async {
Expand All @@ -14,5 +15,16 @@ void main() async {
prefsFactoryMemory;
print(prefsFactory.runtimeType); // ignore: avoid_print
});
test('def_async', () {
// ignore: unnecessary_statements
PrefsAsync;
// ignore: unnecessary_statements
PrefsAsyncFactory;
// ignore: unnecessary_statements
getPrefsAsyncFactory;
prefsAsyncFactory;
prefsAsyncFactoryMemory;
print(prefsAsyncFactory.runtimeType); // ignore: avoid_print
});
});
}
44 changes: 44 additions & 0 deletions app_prefs/test/app_prefs_async_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import 'package:tekartik_app_common_prefs/app_prefs_async.dart';
import 'package:test/test.dart';

void main() async {
group('app_prefs_sync', () {
test('default', () async {
var prefs = await prefsAsyncFactory.openPreferences('test_prefs.db');
var value = await prefs.getInt('value') ?? 0;
await prefs.setInt('value', ++value);
// print('prefs set to $value');
// Should increment at each test
});
test('doc', () async {
// Get the default persistent prefs factory.
var prefsFactory = getPrefsAsyncFactory();
var prefs = await prefsFactory.openPreferences('my_shared_prefs');

// Once you have a [Prefs] object ready, use it. You can keep it open.
await prefs.setInt('value', 26);
var title = await prefs.getString('title');

{
// For Windows/Linux support you can add package name to find a shared
// location on the file system
var prefsFactory = getPrefsAsyncFactory(packageName: 'my.package.name');

expect(prefsFactory, isNotNull);
}

// Memory
{
// In memory prefs factory.
var prefsFactory = newPrefsAsyncFactoryMemory();
var prefs = await prefsFactory.openPreferences('test_prefs.db');
expect(await prefs.getInt('value'), isNull);
await prefs.setInt('value', 1);
expect(await prefs.getInt('value'), 1);
}

// ignore: unnecessary_statements
title;
});
});
}

0 comments on commit 7caab18

Please sign in to comment.