Skip to content

Commit b2f385d

Browse files
committed
Migrating acyclic_steps to null-safety
1 parent 083ff9e commit b2f385d

File tree

4 files changed

+18
-49
lines changed

4 files changed

+18
-49
lines changed

acyclic_steps/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## v0.11.0
2+
* Migrated to null-safety, shouldn't involve any breaking changes.
3+
14
## v0.10.1
25
* Added a workaround for `ArgumentError.checkNotNull` regression in Dart 2.8.1,
36
see [dartlang/sdk#41871](https://github.com/dart-lang/sdk/issues/41871).

acyclic_steps/lib/src/fluent_api.dart

+12-46
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ typedef RunStepWrapper = Future<T> Function<T>(
4646
/// mocks/fakes in a testing setup.
4747
@sealed
4848
class Runner {
49-
final Map<Step<Object>, dynamic> _cache = {};
49+
final Map<Step<Object?>, dynamic> _cache = {};
5050
final RunStepWrapper _wrapRunStep;
5151

5252
/// Create a [Runner] instance with an empty cache.
@@ -94,13 +94,7 @@ class Runner {
9494
/// ```
9595
Runner({
9696
RunStepWrapper wrapRunStep = _defaultRunStep,
97-
}) : _wrapRunStep = wrapRunStep {
98-
// Workaround Dart 2.8.1 regression reported in:
99-
// https://github.com/dart-lang/sdk/issues/41871
100-
if (wrapRunStep == null) {
101-
throw ArgumentError.notNull('wrapRunStep');
102-
}
103-
}
97+
}) : _wrapRunStep = wrapRunStep;
10498

10599
/// Override [step] with [value], ensuring that [step] evaluates to [value]
106100
/// when [run] is called in this [Runner].
@@ -148,8 +142,6 @@ class Runner {
148142
/// }
149143
/// ```
150144
void override<T, S extends Step<T>>(S step, FutureOr<T> value) {
151-
ArgumentError.checkNotNull(step, 'step');
152-
153145
if (_cache.containsKey(step)) {
154146
throw StateError('Value for $step is already cached');
155147
}
@@ -185,17 +177,13 @@ class Runner {
185177
/// assert(myComponent1 == myComponent2);
186178
/// }
187179
/// ```
188-
Future<T> run<T>(Step<T> step) {
189-
ArgumentError.checkNotNull(step, 'step');
190-
191-
return _cache.putIfAbsent(
192-
step,
193-
() => step._create(
194-
this,
195-
(fn) => _wrapRunStep(step, () => Future.value(fn())),
196-
),
197-
);
198-
}
180+
Future<T> run<T>(Step<T> step) => _cache.putIfAbsent(
181+
step,
182+
() => step._create(
183+
this,
184+
(fn) => _wrapRunStep(step, () => Future.value(fn())),
185+
),
186+
);
199187
}
200188

201189
/// A [Step] is a function that may depend on the result of other steps.
@@ -238,7 +226,7 @@ class Step<T> {
238226
/// depend on other steps and so forth. However, as the set of dependencies
239227
/// must be specified when a [Step] is created, it is not possible for there
240228
/// to be any dependency cycles.
241-
final Iterable<Step<Object>> directDependencies;
229+
final Iterable<Step<Object?>> directDependencies;
242230

243231
/// Internal method for creating an [T] given a [Runner] [r] that evaluate
244232
/// the [directDependencies].
@@ -258,7 +246,7 @@ class Step<T> {
258246
@override
259247
String toString() => 'Step[$name]';
260248

261-
Step._(this.name, this._create, List<Step<Object>> dependencies)
249+
Step._(this.name, this._create, List<Step<Object?>> dependencies)
262250
: directDependencies = UnmodifiableListView(dependencies);
263251

264252
/// Define a [Step] using a [StepBuilder].
@@ -299,10 +287,7 @@ class Step<T> {
299287
/// // Setup Server using router and database
300288
/// });
301289
/// ```
302-
static StepBuilder define(String name) {
303-
ArgumentError.checkNotNull(name, 'name');
304-
return StepBuilder._(name);
305-
}
290+
static StepBuilder define(String name) => StepBuilder._(name);
306291
}
307292

308293
/// Builder for creating a [Step].
@@ -321,7 +306,6 @@ class StepBuilder {
321306
/// This methods returns a new builder to be used as an intermediate result in
322307
/// the expression defining a step. See [Step.define] for how to define steps.
323308
StepBuilder1<A> dep<A>(Step<A> stepA) {
324-
ArgumentError.checkNotNull(stepA, 'stepA');
325309
return StepBuilder1._(_name, stepA);
326310
}
327311

@@ -331,7 +315,6 @@ class StepBuilder {
331315
/// This methods returns a new builder to be used as an intermediate result in
332316
/// the expression defining a step. See [Step.define] for how to define steps.
333317
StepBuilderN<S> deps<S>(Iterable<Step<S>> dependencies) {
334-
ArgumentError.checkNotNull(dependencies, 'dependencies');
335318
final dependencies_ = List<Step<S>>.from(dependencies);
336319
return StepBuilderN._(_name, dependencies_);
337320
}
@@ -345,7 +328,6 @@ class StepBuilder {
345328
/// This method returns the [Step] built by the builder, see [Step.define] for
346329
/// how to define steps using this API.
347330
Step<T> build<T>(FutureOr<T> Function() runStep) {
348-
ArgumentError.checkNotNull(runStep, 'runStep');
349331
return Step._(_name, (r, wrap) async {
350332
return await wrap(() => runStep());
351333
}, []);
@@ -399,7 +381,6 @@ class StepBuilder1<A> {
399381
/// This methods returns a new builder to be used as an intermediate result in
400382
/// the expression defining a step. See [Step.define] for how to define steps.
401383
StepBuilder2<A, B> dep<B>(Step<B> stepB) {
402-
ArgumentError.checkNotNull(stepB, 'stepB');
403384
return StepBuilder2._(_name, _a, stepB);
404385
}
405386

@@ -442,7 +423,6 @@ class StepBuilder2<A, B> {
442423
/// This methods returns a new builder to be used as an intermediate result in
443424
/// the expression defining a step. See [Step.define] for how to define steps.
444425
StepBuilder3<A, B, C> dep<C>(Step<C> stepC) {
445-
ArgumentError.checkNotNull(stepC, 'stepC');
446426
return StepBuilder3._(_name, _a, _b, stepC);
447427
}
448428

@@ -493,7 +473,6 @@ class StepBuilder3<A, B, C> {
493473
/// This methods returns a new builder to be used as an intermediate result in
494474
/// the expression defining a step. See [Step.define] for how to define steps.
495475
StepBuilder4<A, B, C, D> dep<D>(Step<D> stepD) {
496-
ArgumentError.checkNotNull(stepD, 'stepD');
497476
return StepBuilder4._(_name, _a, _b, _c, stepD);
498477
}
499478

@@ -517,7 +496,6 @@ class StepBuilder3<A, B, C> {
517496
)
518497
runStep,
519498
) {
520-
ArgumentError.checkNotNull(runStep, 'runStep');
521499
return Step._(_name, (r, wrap) async {
522500
final a_ = r.run(_a);
523501
final b_ = r.run(_b);
@@ -557,7 +535,6 @@ class StepBuilder4<A, B, C, D> {
557535
/// This methods returns a new builder to be used as an intermediate result in
558536
/// the expression defining a step. See [Step.define] for how to define steps.
559537
StepBuilder5<A, B, C, D, E> dep<E>(Step<E> stepE) {
560-
ArgumentError.checkNotNull(stepE, 'stepE');
561538
return StepBuilder5._(_name, _a, _b, _c, _d, stepE);
562539
}
563540

@@ -582,7 +559,6 @@ class StepBuilder4<A, B, C, D> {
582559
)
583560
runStep,
584561
) {
585-
ArgumentError.checkNotNull(runStep, 'runStep');
586562
return Step._(_name, (r, wrap) async {
587563
final a_ = r.run(_a);
588564
final b_ = r.run(_b);
@@ -626,7 +602,6 @@ class StepBuilder5<A, B, C, D, E> {
626602
/// This methods returns a new builder to be used as an intermediate result in
627603
/// the expression defining a step. See [Step.define] for how to define steps.
628604
StepBuilder6<A, B, C, D, E, F> dep<F>(Step<F> stepF) {
629-
ArgumentError.checkNotNull(stepF, 'stepF');
630605
return StepBuilder6._(_name, _a, _b, _c, _d, _e, stepF);
631606
}
632607

@@ -652,7 +627,6 @@ class StepBuilder5<A, B, C, D, E> {
652627
)
653628
runStep,
654629
) {
655-
ArgumentError.checkNotNull(runStep, 'runStep');
656630
return Step._(_name, (r, wrap) async {
657631
final a_ = r.run(_a);
658632
final b_ = r.run(_b);
@@ -700,7 +674,6 @@ class StepBuilder6<A, B, C, D, E, F> {
700674
/// This methods returns a new builder to be used as an intermediate result in
701675
/// the expression defining a step. See [Step.define] for how to define steps.
702676
StepBuilder7<A, B, C, D, E, F, G> dep<G>(Step<G> stepG) {
703-
ArgumentError.checkNotNull(stepG, 'stepG');
704677
return StepBuilder7._(_name, _a, _b, _c, _d, _e, _f, stepG);
705678
}
706679

@@ -727,7 +700,6 @@ class StepBuilder6<A, B, C, D, E, F> {
727700
)
728701
runStep,
729702
) {
730-
ArgumentError.checkNotNull(runStep, 'runStep');
731703
return Step._(_name, (r, wrap) async {
732704
final a_ = r.run(_a);
733705
final b_ = r.run(_b);
@@ -779,7 +751,6 @@ class StepBuilder7<A, B, C, D, E, F, G> {
779751
/// This methods returns a new builder to be used as an intermediate result in
780752
/// the expression defining a step. See [Step.define] for how to define steps.
781753
StepBuilder8<A, B, C, D, E, F, G, H> dep<H>(Step<H> stepH) {
782-
ArgumentError.checkNotNull(stepH, 'stepH');
783754
return StepBuilder8._(_name, _a, _b, _c, _d, _e, _f, _g, stepH);
784755
}
785756

@@ -807,7 +778,6 @@ class StepBuilder7<A, B, C, D, E, F, G> {
807778
)
808779
runStep,
809780
) {
810-
ArgumentError.checkNotNull(runStep, 'runStep');
811781
return Step._(_name, (r, wrap) async {
812782
final a_ = r.run(_a);
813783
final b_ = r.run(_b);
@@ -863,7 +833,6 @@ class StepBuilder8<A, B, C, D, E, F, G, H> {
863833
/// This methods returns a new builder to be used as an intermediate result in
864834
/// the expression defining a step. See [Step.define] for how to define steps.
865835
StepBuilder9<A, B, C, D, E, F, G, H, I> dep<I>(Step<I> stepI) {
866-
ArgumentError.checkNotNull(stepI, 'stepI');
867836
return StepBuilder9._(_name, _a, _b, _c, _d, _e, _f, _g, _h, stepI);
868837
}
869838

@@ -892,7 +861,6 @@ class StepBuilder8<A, B, C, D, E, F, G, H> {
892861
)
893862
runStep,
894863
) {
895-
ArgumentError.checkNotNull(runStep, 'runStep');
896864
return Step._(_name, (r, wrap) async {
897865
final a_ = r.run(_a);
898866
final b_ = r.run(_b);
@@ -983,7 +951,6 @@ class StepBuilder9<A, B, C, D, E, F, G, H, I> {
983951
)
984952
runStep,
985953
) {
986-
ArgumentError.checkNotNull(runStep, 'runStep');
987954
return Step._(_name, (r, wrap) async {
988955
final a_ = r.run(_a);
989956
final b_ = r.run(_b);
@@ -1068,7 +1035,6 @@ class StepBuilder9N<A, B, C, D, E, F, G, H, I, S> {
10681035
)
10691036
runStep,
10701037
) {
1071-
ArgumentError.checkNotNull(runStep, 'runStep');
10721038
return Step._(_name, (r, wrap) async {
10731039
final a_ = r.run(_a);
10741040
final b_ = r.run(_b);

acyclic_steps/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: acyclic_steps
2-
version: 0.10.1
2+
version: 0.11.0
33
description: |
44
An explicit acyclic step dependency framework with concurrent evaluation
55
and dependency injection.
@@ -12,5 +12,5 @@ dev_dependencies:
1212
test: ^1.5.1
1313
pedantic: ^1.4.0
1414
environment:
15-
sdk: '>=2.4.0 <3.0.0'
15+
sdk: '>=2.12.0 <3.0.0'
1616

acyclic_steps/test/acyclic_steps_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void main() {
2424
/// evaluate a step that depends on [messageStep] it is necessary to
2525
/// override this step, by injecting a value to replace it.
2626
final messageStep = Step.define('message').build<String>(
27-
() => throw UnimplementedError('message must be overriden with input'),
27+
(() => throw UnimplementedError('message must be overriden with input')) as FutureOr<String> Function(),
2828
);
2929

3030
/// A step that provides date and time

0 commit comments

Comments
 (0)