Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delete old unused code in pub_get_command.dart. #449

Merged
merged 8 commits into from
Mar 9, 2023
190 changes: 0 additions & 190 deletions tools/sz_repo_cli/lib/src/commands/src/pub_get_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ import 'dart:async';
import 'dart:io';

import 'package:args/command_runner.dart';
import 'package:meta/meta.dart';
import 'package:optional/optional.dart';
import 'package:rxdart/rxdart.dart';

import 'package:sz_repo_cli/src/common/common.dart';

Expand Down Expand Up @@ -80,190 +77,3 @@ class PubGetCommand extends Command {
}
}
}

class GetPackagesUseCase {
final SharezoneRepo repo;
Duration packageTimeout;
DateTime Function() _getCurrentDateTime;

GetPackagesUseCase({
@required this.repo,
DateTime Function() getCurrentDateTime,
}) {
_getCurrentDateTime = getCurrentDateTime ?? () => DateTime.now();
}

Stream<PackageGetResult> getPackages({
bool includeFlutterApp,
@required Duration packageTimeout,
}) {
this.packageTimeout = packageTimeout;
var packageStream = repo.dartLibraries.streamPackages().mergeWithValues([
repo.sharezoneCiCdTool,
if (includeFlutterApp) repo.sharezoneFlutterApp,
]);
return _getPackages(packageStream);
}

PackageStatusUpdater _getStatusUpdater(Package package) =>
PackageStatusUpdater(
package: package, getCurrentDateTime: _getCurrentDateTime);

Stream<PackageGetResult> _getPackages(Stream<Package> packageStream) async* {
final futures = <Future>[];

await for (final package in packageStream) {
final _statusUpdater = _getStatusUpdater(package);
yield PackageGetResult(package, _statusUpdater.statusStream);

_statusUpdater.started();
final future = package
.getPackages()
.timeout(
packageTimeout,
onTimeout: () =>
throw PackageTimeoutException(packageTimeout, package),
)
.then((_) => _statusUpdater.success())
.catchError(
(e, s) => _statusUpdater.failure(error: e, stackTrace: s));

futures.add(future);
}

await Future.wait(futures);
return;
}
}

class PackageStatusUpdater {
final Package package;
final DateTime Function() getCurrentDateTime;
final _controller = BehaviorSubject<PackageGetStatus>();
Stream<PackageGetStatus> get statusStream => _controller;
Running _running;

PackageStatusUpdater({
@required this.package,
this.getCurrentDateTime,
});

void started() {
_running = Running.since(startedOn: getCurrentDateTime());
_controller.add(_running);
}

void success() {
if (_running == null) {
throw StateError('success can only be called after calling running');
}
_controller.add(_running.toSuccess(now: getCurrentDateTime()));
_controller.close();
}

void failure({@required dynamic error, StackTrace stackTrace}) {
if (_running == null) {
throw StateError('failure can only be called after calling running');
}
_controller.add(_running.toFailure(
error: error,
stackTrace: stackTrace,
now: getCurrentDateTime(),
));
_controller.close();
}
}

class PackageGetResult {
final Package package;
final Stream<PackageGetStatus> status;

PackageGetResult(this.package, this.status);
}

abstract class PackageGetStatus {
final DateTime startedOn;

PackageGetStatus({@required this.startedOn});

FutureOr<T> when<T>({
@required FutureOr<T> Function(Success) success,
@required FutureOr<T> Function(Failure) failure,
@required FutureOr<T> Function(Running) running,
}) {
if (this is Success) {
return success(this as Success);
}
if (this is Failure) {
return failure(this as Failure);
}
if (this is Running) {
return running(this as Running);
}
throw UnimplementedError('when not implemented for $runtimeType');
}
}

class Success extends PackageGetStatus {
final Duration timeItTookToRun;

Success({
@required DateTime startedOn,
@required this.timeItTookToRun,
}) : super(startedOn: startedOn);
}

class Failure extends PackageGetStatus {
final dynamic error;
final Optional<StackTrace> stackTrace;

Failure({
@required this.error,
StackTrace stackTrace,
@required DateTime startedOn,
}) : stackTrace = Optional.ofNullable(stackTrace),
super(startedOn: startedOn);
}

class Running extends PackageGetStatus {
Running.since({
@required DateTime startedOn,
}) : super(startedOn: startedOn);

Success toSuccess({@required DateTime now}) {
return Success(
startedOn: startedOn,
timeItTookToRun: now.difference(startedOn),
);
}

Failure toFailure(
{@required DateTime now,
@required dynamic error,
StackTrace stackTrace}) {
return Failure(
startedOn: startedOn,
error: error,
stackTrace: stackTrace,
);
}
}

class PackageGetResultPresenter {
PackageGetResultPresenter();

void present(Stream<PackageGetResult> results) {
results.listen((result) {
result.status.listen((status) {
final statusString = status.when(
success: (success) => '✅',
failure: (failure) => '⛔ Failure\n${failure.error}',
running: (running) => '⚙ Running',
);

print(
'[${result.package.type.toReadableString()}] ${result.package.name} $statusString');
});
});
}
}