diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml deleted file mode 100644 index b9264ad963b73..0000000000000 --- a/.github/workflows/shorebird_tools.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Shorebird Tools 💻 - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -on: - pull_request: - paths: - - ".github/workflows/shorebird_tools.yaml" - - "packages/shorebird_tools/lib/**" - - "packages/shorebird_tools/test/**" - - "packages/shorebird_tools/pubspec.yaml" - push: - branches: - - main - paths: - - ".github/workflows/shorebird_tools.yaml" - - "packages/shorebird_tools/lib/**" - - "packages/shorebird_tools/test/**" - - "packages/shorebird_tools/pubspec.yaml" - -jobs: - semantic-pull-request: - uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/semantic_pull_request.yml@v1 - - build: - uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1 - with: - working_directory: packages/shorebird_tools diff --git a/packages/shorebird_tests/README.md b/packages/shorebird_tests/README.md index 12993440b17ea..b87fb24a480da 100644 --- a/packages/shorebird_tests/README.md +++ b/packages/shorebird_tests/README.md @@ -1 +1,2 @@ -A dart project that includes tests that perfoma asserts in the modifications made on the Flutter framework by the Shorebird team. +A dart project that includes tests that perform asserts in the modifications +made on the Flutter framework by the Shorebird team. diff --git a/packages/shorebird_tools/.gitignore b/packages/shorebird_tools/.gitignore deleted file mode 100644 index 9f6ee8a769286..0000000000000 --- a/packages/shorebird_tools/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# See https://www.dartlang.org/guides/libraries/private-files - -# Files and directories created by pub -.dart_tool/ -.packages -build/ -pubspec.lock - -# Files generated during tests -.test_coverage.dart -coverage/ -.test_runner.dart - -# Android studio and IntelliJ -.idea \ No newline at end of file diff --git a/packages/shorebird_tools/README.md b/packages/shorebird_tools/README.md deleted file mode 100644 index 86be36477f96d..0000000000000 --- a/packages/shorebird_tools/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## shorebird_tools - -Tools for shorebird which need to be pinned to a specific flutter version. \ No newline at end of file diff --git a/packages/shorebird_tools/analysis_options.yaml b/packages/shorebird_tools/analysis_options.yaml deleted file mode 100644 index fa798a831248a..0000000000000 --- a/packages/shorebird_tools/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:very_good_analysis/analysis_options.5.1.0.yaml -linter: - rules: - public_member_api_docs: false diff --git a/packages/shorebird_tools/bin/shorebird_tools.dart b/packages/shorebird_tools/bin/shorebird_tools.dart deleted file mode 100644 index 8aa6880abb82d..0000000000000 --- a/packages/shorebird_tools/bin/shorebird_tools.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'dart:io'; - -import 'package:shorebird_tools/src/command_runner.dart'; - -Future main(List args) async { - await _flushThenExit(await ShorebirdToolsCommandRunner().run(args)); -} - -/// Flushes the stdout and stderr streams, then exits the program with the given -/// status code. -/// -/// This returns a Future that will never complete, since the program will have -/// exited already. This is useful to prevent Future chains from proceeding -/// after you've decided to exit. -Future _flushThenExit(int status) { - return Future.wait([stdout.close(), stderr.close()]) - .then((_) => exit(status)); -} diff --git a/packages/shorebird_tools/dart_test.yaml b/packages/shorebird_tools/dart_test.yaml deleted file mode 100644 index 2f46c7e98c1b1..0000000000000 --- a/packages/shorebird_tools/dart_test.yaml +++ /dev/null @@ -1,3 +0,0 @@ -tags: - version-verify: - skip: "Should only be run during pull request. Verifies if version file is updated." \ No newline at end of file diff --git a/packages/shorebird_tools/lib/shorebird_tools.dart b/packages/shorebird_tools/lib/shorebird_tools.dart deleted file mode 100644 index 2c6f094a47bf5..0000000000000 --- a/packages/shorebird_tools/lib/shorebird_tools.dart +++ /dev/null @@ -1,10 +0,0 @@ -/// shorebird_tools, Shorebird tools for Flutter -/// -/// ```sh -/// # activate shorebird_tools -/// dart pub global activate shorebird_tools -/// -/// # see usage -/// shorebird_tools --help -/// ``` -library; diff --git a/packages/shorebird_tools/lib/src/command_runner.dart b/packages/shorebird_tools/lib/src/command_runner.dart deleted file mode 100644 index 25c5fc4ac0ad9..0000000000000 --- a/packages/shorebird_tools/lib/src/command_runner.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:args/args.dart'; -import 'package:args/command_runner.dart'; -import 'package:mason_logger/mason_logger.dart'; -import 'package:shorebird_tools/src/commands/commands.dart'; -import 'package:shorebird_tools/src/version.dart'; - -const executableName = 'shorebird_tools'; -const packageName = 'shorebird_tools'; -const description = 'Shorebird tools for Flutter'; - -/// {@template shorebird_tools_command_runner} -/// A [CommandRunner] for the CLI. -/// -/// ``` -/// $ shorebird_tools --version -/// ``` -/// {@endtemplate} -class ShorebirdToolsCommandRunner extends CommandRunner { - /// {@macro shorebird_tools_command_runner} - ShorebirdToolsCommandRunner({ - Logger? logger, - }) : _logger = logger ?? Logger(), - super(executableName, description) { - // Add root options and flags - argParser - ..addFlag( - 'version', - abbr: 'v', - negatable: false, - help: 'Print the current version.', - ) - ..addFlag( - 'verbose', - help: 'Noisy logging, including all shell commands executed.', - ); - - // Add sub commands - addCommand(PackageCommand(logger: _logger)); - } - - @override - void printUsage() => _logger.info(usage); - - final Logger _logger; - - @override - Future run(Iterable args) async { - try { - final topLevelResults = parse(args); - if (topLevelResults['verbose'] == true) { - _logger.level = Level.verbose; - } - return await runCommand(topLevelResults) ?? ExitCode.success.code; - } on FormatException catch (e, stackTrace) { - // On format errors, show the commands error message, root usage and - // exit with an error code - _logger - ..err(e.message) - ..err('$stackTrace') - ..info('') - ..info(usage); - return ExitCode.usage.code; - } on UsageException catch (e) { - // On usage errors, show the commands usage message and - // exit with an error code - _logger - ..err(e.message) - ..info('') - ..info(e.usage); - return ExitCode.usage.code; - } - } - - @override - Future runCommand(ArgResults topLevelResults) async { - // Verbose logs - _logger - ..detail('Argument information:') - ..detail(' Top level options:'); - for (final option in topLevelResults.options) { - if (topLevelResults.wasParsed(option)) { - _logger.detail(' - $option: ${topLevelResults[option]}'); - } - } - if (topLevelResults.command != null) { - final commandResult = topLevelResults.command!; - _logger - ..detail(' Command: ${commandResult.name}') - ..detail(' Command options:'); - for (final option in commandResult.options) { - if (commandResult.wasParsed(option)) { - _logger.detail(' - $option: ${commandResult[option]}'); - } - } - } - - // Run the command or show version - final int? exitCode; - if (topLevelResults['version'] == true) { - _logger.info(packageVersion); - exitCode = ExitCode.success.code; - } else { - exitCode = await super.runCommand(topLevelResults); - } - - return exitCode; - } -} diff --git a/packages/shorebird_tools/lib/src/commands/commands.dart b/packages/shorebird_tools/lib/src/commands/commands.dart deleted file mode 100644 index 046111b80c91f..0000000000000 --- a/packages/shorebird_tools/lib/src/commands/commands.dart +++ /dev/null @@ -1 +0,0 @@ -export 'package_command.dart'; diff --git a/packages/shorebird_tools/lib/src/commands/package_command.dart b/packages/shorebird_tools/lib/src/commands/package_command.dart deleted file mode 100644 index c0e8f59e317c0..0000000000000 --- a/packages/shorebird_tools/lib/src/commands/package_command.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'dart:io'; - -import 'package:archive/archive_io.dart'; -import 'package:args/command_runner.dart'; -import 'package:mason_logger/mason_logger.dart'; -import 'package:path/path.dart' as p; - -/// {@template package_command} -/// -/// `shorebird_tools package` -/// A [Command] that packages a generated patch into an archive -/// {@endtemplate} -class PackageCommand extends Command { - /// {@macro package_command} - PackageCommand({ - required Logger logger, - }) : _logger = logger { - argParser - ..addOption( - 'patch', - abbr: 'p', - mandatory: true, - help: 'The path to the patch artifact which will be packaged', - ) - ..addOption( - 'output', - abbr: 'o', - mandatory: true, - help: 'Where to write the packaged patch archive', - ); - } - - @override - String get description => 'Packages a patch artifact into an archive'; - - @override - String get name => 'package'; - - final Logger _logger; - - @override - Future run() async { - final patchFilePath = argResults!['patch'] as String; - final outFilePath = argResults!['output'] as String; - - final patchFile = File(patchFilePath); - if (!patchFile.existsSync()) { - _logger.err('Patch file not found at $patchFilePath'); - return ExitCode.software.code; - } - - final outFile = File(outFilePath); - - final bytes = patchFile.readAsBytesSync(); - final archiveFile = ArchiveFile( - p.basename(patchFilePath), - bytes.length, - bytes, - ); - - ZipEncoder() - ..startEncode(OutputFileStream(outFile.absolute.path)) - ..addFile(archiveFile) - ..endEncode(); - - _logger.info('Packaged patch at $patchFilePath to $outFilePath'); - - return ExitCode.success.code; - } -} diff --git a/packages/shorebird_tools/lib/src/version.dart b/packages/shorebird_tools/lib/src/version.dart deleted file mode 100644 index 67a7647b6c6d7..0000000000000 --- a/packages/shorebird_tools/lib/src/version.dart +++ /dev/null @@ -1,2 +0,0 @@ -// Generated code. Do not modify. -const packageVersion = '0.0.1'; diff --git a/packages/shorebird_tools/pubspec.yaml b/packages/shorebird_tools/pubspec.yaml deleted file mode 100644 index 71cc792972c83..0000000000000 --- a/packages/shorebird_tools/pubspec.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: shorebird_tools -description: Shorebird tools for Flutter -version: 0.0.1 -publish_to: none - -environment: - sdk: "^3.3.0" - -dependencies: - archive: ^3.5.1 - args: ^2.4.2 - mason_logger: ^0.2.12 - path: ^1.9.0 - -dev_dependencies: - build_runner: ^2.4.8 - build_verify: ^3.1.0 - build_version: ^2.1.1 - mocktail: ^1.0.3 - test: ^1.25.2 - very_good_analysis: ^5.1.0 - -executables: - shorebird_tools: diff --git a/packages/shorebird_tools/test/ensure_build_test.dart b/packages/shorebird_tools/test/ensure_build_test.dart deleted file mode 100644 index 3d1173b063895..0000000000000 --- a/packages/shorebird_tools/test/ensure_build_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -@Tags(['version-verify']) -library; - -import 'package:build_verify/build_verify.dart'; -import 'package:test/test.dart'; - -void main() { - test('ensure_build', expectBuildClean); -} diff --git a/packages/shorebird_tools/test/src/command_runner_test.dart b/packages/shorebird_tools/test/src/command_runner_test.dart deleted file mode 100644 index ac334fed94e41..0000000000000 --- a/packages/shorebird_tools/test/src/command_runner_test.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:args/command_runner.dart'; -import 'package:mason_logger/mason_logger.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:shorebird_tools/src/command_runner.dart'; -import 'package:shorebird_tools/src/version.dart'; -import 'package:test/test.dart'; - -class _MockLogger extends Mock implements Logger {} - -const latestVersion = '0.0.0'; - -void main() { - group('ShorebirdToolsCommandRunner', () { - late Logger logger; - late ShorebirdToolsCommandRunner commandRunner; - - setUp(() { - logger = _MockLogger(); - - commandRunner = ShorebirdToolsCommandRunner( - logger: logger, - ); - }); - - test('can be instantiated without an explicit analytics/logger instance', - () { - final commandRunner = ShorebirdToolsCommandRunner(); - expect(commandRunner, isNotNull); - }); - - test('handles FormatException', () async { - const exception = FormatException('oops!'); - var isFirstInvocation = true; - when(() => logger.info(any())).thenAnswer((_) { - if (isFirstInvocation) { - isFirstInvocation = false; - throw exception; - } - }); - final result = await commandRunner.run(['--version']); - expect(result, equals(ExitCode.usage.code)); - verify(() => logger.err(exception.message)).called(1); - verify(() => logger.info(commandRunner.usage)).called(1); - }); - - test('handles UsageException', () async { - final exception = UsageException('oops!', 'exception usage'); - var isFirstInvocation = true; - when(() => logger.info(any())).thenAnswer((_) { - if (isFirstInvocation) { - isFirstInvocation = false; - throw exception; - } - }); - final result = await commandRunner.run(['--version']); - expect(result, equals(ExitCode.usage.code)); - verify(() => logger.err(exception.message)).called(1); - verify(() => logger.info('exception usage')).called(1); - }); - - group('--version', () { - test('outputs current version', () async { - final result = await commandRunner.run(['--version']); - expect(result, equals(ExitCode.success.code)); - verify(() => logger.info(packageVersion)).called(1); - }); - }); - - group('--verbose', () { - test('enables verbose logging', () async { - final result = await commandRunner.run(['--verbose']); - expect(result, equals(ExitCode.success.code)); - - verify(() => logger.detail('Argument information:')).called(1); - verify(() => logger.detail(' Top level options:')).called(1); - verify(() => logger.detail(' - verbose: true')).called(1); - verifyNever(() => logger.detail(' Command options:')); - }); - }); - }); -} diff --git a/packages/shorebird_tools/test/src/commands/package_command_test.dart b/packages/shorebird_tools/test/src/commands/package_command_test.dart deleted file mode 100644 index 8775b8b09b114..0000000000000 --- a/packages/shorebird_tools/test/src/commands/package_command_test.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'dart:io'; - -import 'package:archive/archive_io.dart'; -import 'package:mason_logger/mason_logger.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:path/path.dart' as p; -import 'package:shorebird_tools/src/command_runner.dart'; -import 'package:test/test.dart'; - -class _MockLogger extends Mock implements Logger {} - -void main() { - group('package', () { - late Logger logger; - late ShorebirdToolsCommandRunner commandRunner; - late Directory testDir; - - setUp(() { - logger = _MockLogger(); - commandRunner = ShorebirdToolsCommandRunner(logger: logger); - testDir = Directory.systemTemp.createTempSync('shorebird_tools_test'); - }); - - test('packages the received patch', () async { - File(p.join(testDir.path, 'patch.txt')).writeAsStringSync('banana'); - - final exitCode = await commandRunner.run( - [ - 'package', - '-p', - p.join(testDir.path, 'patch.txt'), - '-o', - p.join(testDir.path, 'patch.zip'), - ], - ); - - expect(exitCode, ExitCode.success.code); - - verify( - () => logger.info( - 'Packaged patch at ${p.join(testDir.path, 'patch.txt')} ' - 'to ${p.join(testDir.path, 'patch.zip')}', - ), - ).called(1); - - final patchFile = File(p.join(testDir.path, 'patch.zip')); - expect(patchFile.existsSync(), isTrue); - - final extractedFolder = Directory(p.join(testDir.path, 'extracted')) - ..createSync(); - await extractFileToDisk(patchFile.path, extractedFolder.path); - - // Making sure it was correctly archived and can be extracted - final extractedFile = File(p.join(extractedFolder.path, 'patch.txt')); - expect(extractedFile.existsSync(), isTrue); - expect(extractedFile.readAsStringSync(), 'banana'); - }); - - group('when the patch file does not exists', () { - test('error and logs', () async { - final exitCode = await commandRunner.run( - [ - 'package', - '-p', - p.join(testDir.path, 'patch.txt'), - '-o', - p.join(testDir.path, 'patch.zip'), - ], - ); - - expect(exitCode, ExitCode.software.code); - - verify( - () => logger.err( - 'Patch file not found at ${p.join(testDir.path, 'patch.txt')}', - ), - ).called(1); - }); - }); - - group('when missing option for -p', () { - test('shows errors and print the correct usage', () async { - final exitCode = await commandRunner.run(['package', '-p']); - - expect(exitCode, ExitCode.usage.code); - - verify(() => logger.err('Missing argument for "patch".')).called(1); - verify( - () => logger.info(''' -Usage: shorebird_tools package [arguments] --h, --help Print this usage information. --p, --patch (mandatory) The path to the patch artifact which will be packaged --o, --output (mandatory) Where to write the packaged patch archive - -Run "shorebird_tools help" to see global options.'''), - ).called(1); - }); - }); - - group('when missing option for -o', () { - test('shows errors and print the correct usage', () async { - final exitCode = await commandRunner.run( - [ - 'package', - '-p', - 'bla', - '-o', - ], - ); - - expect(exitCode, ExitCode.usage.code); - - verify(() => logger.err('Missing argument for "output".')).called(1); - verify( - () => logger.info(''' -Usage: shorebird_tools package [arguments] --h, --help Print this usage information. --p, --patch (mandatory) The path to the patch artifact which will be packaged --o, --output (mandatory) Where to write the packaged patch archive - -Run "shorebird_tools help" to see global options.'''), - ).called(1); - }); - }); - }); -}