Skip to content

Commit f880bf0

Browse files
agordn52Anthony Gordon
authored andcommitted
chore(release): bump version to 7.20.1
1 parent 816deb6 commit f880bf0

6 files changed

Lines changed: 136 additions & 19 deletions

File tree

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
## [7.20.1] - 2026-04-26
2+
3+
### Fixed
4+
5+
* **`NyScheduler.getKeyTaskOnce(name)` now returns the full prefixed storage key** (`ny_scheduler_${name}_once`) instead of the unprefixed `${name}_once`. This makes the documented reset pattern `await NyStorage.delete(NyScheduler.getKeyTaskOnce("welcome_to_app"))` actually delete the stored flag
6+
7+
### Added
8+
9+
* **`NyScheduler.clearTaskOnce(name)`** convenience method that clears a once-task's executed state without needing to compute the storage key manually
10+
11+
### Changed
12+
13+
* Bumped `app_badge_plus` dependency from `^1.2.8` to `^1.2.9`
14+
115
## [7.20.0] - 2026-04-20
216

317
### Added

example/pubspec.lock

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ packages:
55
dependency: transitive
66
description:
77
name: app_badge_plus
8-
sha256: "81130fe6150ce2a1f12af4bb7d6f646496d284d5f87f2c121af8258a453bbb3f"
8+
sha256: dab607342bbf73b33a532e384117ccb13efbaabadb6058c40fd74d743b0ef1ab
99
url: "https://pub.dev"
1010
source: hosted
11-
version: "1.2.8"
11+
version: "1.2.9"
1212
args:
1313
dependency: transitive
1414
description:
@@ -345,10 +345,10 @@ packages:
345345
dependency: transitive
346346
description:
347347
name: hooks
348-
sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388
348+
sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e"
349349
url: "https://pub.dev"
350350
source: hosted
351-
version: "1.0.2"
351+
version: "1.0.3"
352352
http:
353353
dependency: transitive
354354
description:
@@ -604,6 +604,14 @@ packages:
604604
url: "https://pub.dev"
605605
source: hosted
606606
version: "4.1.0"
607+
record_use:
608+
dependency: transitive
609+
description:
610+
name: record_use
611+
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
612+
url: "https://pub.dev"
613+
source: hosted
614+
version: "0.6.0"
607615
rxdart:
608616
dependency: transitive
609617
description:
@@ -837,10 +845,10 @@ packages:
837845
dependency: transitive
838846
description:
839847
name: vm_service
840-
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
848+
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
841849
url: "https://pub.dev"
842850
source: hosted
843-
version: "15.0.2"
851+
version: "15.1.0"
844852
web:
845853
dependency: transitive
846854
description:

lib/helpers/src/ny_scheduler.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,17 @@ class NyScheduler {
6767
return await readBool(key);
6868
}
6969

70-
/// Get the key for a task that runs once
70+
/// Get the full storage key for a task that runs once.
71+
/// Use this with [NyStorage.delete] to reset the task.
7172
static String getKeyTaskOnce(String name) {
72-
return "${name}_once";
73+
return key("${name}_once");
74+
}
75+
76+
/// Clear the executed state for a task scheduled with [taskOnce].
77+
/// After calling this, the next [taskOnce] invocation with the same
78+
/// [name] will execute the callback again.
79+
static Future<void> clearTaskOnce(String name) async {
80+
await _secureStorage.delete(key: key("${name}_once"));
7381
}
7482

7583
/// Run a task daily

pubspec.lock

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ packages:
55
dependency: "direct main"
66
description:
77
name: app_badge_plus
8-
sha256: "81130fe6150ce2a1f12af4bb7d6f646496d284d5f87f2c121af8258a453bbb3f"
8+
sha256: dab607342bbf73b33a532e384117ccb13efbaabadb6058c40fd74d743b0ef1ab
99
url: "https://pub.dev"
1010
source: hosted
11-
version: "1.2.8"
11+
version: "1.2.9"
1212
args:
1313
dependency: transitive
1414
description:
@@ -371,10 +371,10 @@ packages:
371371
dependency: transitive
372372
description:
373373
name: hooks
374-
sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388
374+
sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e"
375375
url: "https://pub.dev"
376376
source: hosted
377-
version: "1.0.2"
377+
version: "1.0.3"
378378
http:
379379
dependency: transitive
380380
description:
@@ -676,6 +676,14 @@ packages:
676676
url: "https://pub.dev"
677677
source: hosted
678678
version: "4.1.0"
679+
record_use:
680+
dependency: transitive
681+
description:
682+
name: record_use
683+
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
684+
url: "https://pub.dev"
685+
source: hosted
686+
version: "0.6.0"
679687
rxdart:
680688
dependency: "direct main"
681689
description:
@@ -925,10 +933,10 @@ packages:
925933
dependency: transitive
926934
description:
927935
name: vm_service
928-
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
936+
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
929937
url: "https://pub.dev"
930938
source: hosted
931-
version: "15.0.2"
939+
version: "15.1.0"
932940
web:
933941
dependency: transitive
934942
description:

pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: nylo_support
22
description: Support library for the Nylo framework. This library supports routing, widgets, localization, cli, storage and more.
3-
version: 7.20.0
3+
version: 7.20.1
44
homepage: https://nylo.dev
55
repository: https://github.com/nylo-core/support/tree/7.x
66
issue_tracker: https://github.com/nylo-core/support/issues
@@ -36,7 +36,7 @@ dependencies:
3636
path_provider: ^2.1.5
3737
timezone: ^0.11.0
3838
flutter_timezone: ^5.0.2
39-
app_badge_plus: ^1.2.8
39+
app_badge_plus: ^1.2.9
4040
mask_text_input_formatter: ^2.9.0
4141
uuid: ^4.5.3
4242
characters: ^1.4.1

test/helpers/ny_scheduler_test.dart

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
1+
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
12
import 'package:flutter_test/flutter_test.dart';
23
import 'package:nylo_support/helpers/ny_helpers.dart';
4+
import 'package:nylo_support/local_storage/ny_local_storage.dart';
5+
import 'package:nylo_support/nylo.dart';
36
import 'package:nylo_support/testing/ny_testing.dart';
47

58
void main() {
69
NyTest.init();
710

11+
setUp(() {
12+
Nylo.isTestMode = true;
13+
});
14+
15+
tearDown(() async {
16+
await NyStorage.deleteAll();
17+
Nylo.isTestMode = true;
18+
});
19+
820
nyGroup('NyScheduler', () {
921
nyGroup('prefix', () {
1022
nyTest('should be ny_scheduler_', () async {
@@ -27,13 +39,80 @@ void main() {
2739
});
2840

2941
nyGroup('getKeyTaskOnce', () {
30-
nyTest('should append _once to name', () async {
31-
expect(NyScheduler.getKeyTaskOnce('myTask'), 'myTask_once');
42+
nyTest('should return the full prefixed storage key', () async {
43+
expect(
44+
NyScheduler.getKeyTaskOnce('myTask'),
45+
'ny_scheduler_myTask_once',
46+
);
3247
});
3348

3449
nyTest('should handle empty name', () async {
35-
expect(NyScheduler.getKeyTaskOnce(''), '_once');
50+
expect(NyScheduler.getKeyTaskOnce(''), 'ny_scheduler__once');
51+
});
52+
53+
nyTest(
54+
'returned key matches the key actually written by taskOnce',
55+
() async {
56+
int calls = 0;
57+
await NyScheduler.taskOnce('match_test', () async => calls++);
58+
expect(calls, 1);
59+
60+
final raw = await FlutterSecureStorage().read(
61+
key: NyScheduler.getKeyTaskOnce('match_test'),
62+
);
63+
expect(raw, 'true');
64+
},
65+
);
66+
});
67+
68+
nyGroup('hasExecutedTaskOnce', () {
69+
nyTest('returns false before the task runs', () async {
70+
expect(await NyScheduler.hasExecutedTaskOnce('not_yet'), false);
3671
});
72+
73+
nyTest('returns true after taskOnce completes', () async {
74+
await NyScheduler.taskOnce('has_run', () async {});
75+
expect(await NyScheduler.hasExecutedTaskOnce('has_run'), true);
76+
});
77+
});
78+
79+
nyGroup('clearTaskOnce', () {
80+
nyTest('allows a once-task to run again after clearing', () async {
81+
int calls = 0;
82+
Future<void> work() async => calls++;
83+
84+
await NyScheduler.taskOnce('rerun_me', work);
85+
await NyScheduler.taskOnce('rerun_me', work);
86+
expect(calls, 1);
87+
88+
await NyScheduler.clearTaskOnce('rerun_me');
89+
expect(await NyScheduler.hasExecutedTaskOnce('rerun_me'), false);
90+
91+
await NyScheduler.taskOnce('rerun_me', work);
92+
expect(calls, 2);
93+
});
94+
95+
nyTest('is a no-op when the task was never executed', () async {
96+
await NyScheduler.clearTaskOnce('never_existed');
97+
expect(await NyScheduler.hasExecutedTaskOnce('never_existed'), false);
98+
});
99+
});
100+
101+
nyGroup('developer-facing reset via NyStorage.delete', () {
102+
nyTest(
103+
'NyStorage.delete(getKeyTaskOnce(name)) resets the task',
104+
() async {
105+
int calls = 0;
106+
await NyScheduler.taskOnce('via_storage', () async => calls++);
107+
expect(calls, 1);
108+
109+
await NyStorage.delete(NyScheduler.getKeyTaskOnce('via_storage'));
110+
expect(await NyScheduler.hasExecutedTaskOnce('via_storage'), false);
111+
112+
await NyScheduler.taskOnce('via_storage', () async => calls++);
113+
expect(calls, 2);
114+
},
115+
);
37116
});
38117
});
39118
}

0 commit comments

Comments
 (0)