From fedd069a372e1342afd10286bdbe4a6bf6852041 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:08:08 -0700 Subject: [PATCH 01/11] feat: adding package command --- .../lib/src/command_runner.dart | 1 + .../lib/src/commands/commands.dart | 1 + .../lib/src/commands/package_command.dart | 70 ++++++++++++ packages/shorebird_tools/pubspec.yaml | 2 + .../src/commands/package_command_test.dart | 102 ++++++++++++++++++ 5 files changed, 176 insertions(+) create mode 100644 packages/shorebird_tools/lib/src/commands/package_command.dart create mode 100644 packages/shorebird_tools/test/src/commands/package_command_test.dart diff --git a/packages/shorebird_tools/lib/src/command_runner.dart b/packages/shorebird_tools/lib/src/command_runner.dart index 9b3a09a2ae5c5..e4a4cb1eb1814 100644 --- a/packages/shorebird_tools/lib/src/command_runner.dart +++ b/packages/shorebird_tools/lib/src/command_runner.dart @@ -36,6 +36,7 @@ class ShorebirdToolsCommandRunner extends CommandRunner { // Add sub commands addCommand(SampleCommand(logger: _logger)); + addCommand(PackageCommand(logger: _logger)); } @override diff --git a/packages/shorebird_tools/lib/src/commands/commands.dart b/packages/shorebird_tools/lib/src/commands/commands.dart index fc0403a8354fe..34ceda22503ab 100644 --- a/packages/shorebird_tools/lib/src/commands/commands.dart +++ b/packages/shorebird_tools/lib/src/commands/commands.dart @@ -1 +1,2 @@ +export 'package_command.dart'; export 'sample_command.dart'; diff --git a/packages/shorebird_tools/lib/src/commands/package_command.dart b/packages/shorebird_tools/lib/src/commands/package_command.dart new file mode 100644 index 0000000000000..c55d06ea3c8d8 --- /dev/null +++ b/packages/shorebird_tools/lib/src/commands/package_command.dart @@ -0,0 +1,70 @@ +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 patch path to package', + ) + ..addOption( + 'output', + abbr: 'o', + mandatory: true, + help: 'The path to the output archive', + ); + } + + @override + String get description => 'Packages a generated patch 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/pubspec.yaml b/packages/shorebird_tools/pubspec.yaml index af140b04e5999..71cc792972c83 100644 --- a/packages/shorebird_tools/pubspec.yaml +++ b/packages/shorebird_tools/pubspec.yaml @@ -7,8 +7,10 @@ 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 diff --git a/packages/shorebird_tools/test/src/commands/package_command_test.dart b/packages/shorebird_tools/test/src/commands/package_command_test.dart new file mode 100644 index 0000000000000..ddea71c38c195 --- /dev/null +++ b/packages/shorebird_tools/test/src/commands/package_command_test.dart @@ -0,0 +1,102 @@ +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('wrong usage', () { + test('when missing option for -p', () 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 patch path to package +-o, --output (mandatory) The path to the output archive + +Run "shorebird_tools help" to see global options.'''), + ).called(1); + }); + + test('when missing option for -o', () 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 patch path to package +-o, --output (mandatory) The path to the output archive + +Run "shorebird_tools help" to see global options.'''), + ).called(1); + }); + }); + }); +} From 734f64c5a125efca4a49ad88baf4fa211d1ba092 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:15:49 -0700 Subject: [PATCH 02/11] adding CI to shorebird tools --- .github/workflows/shorebird_tools.yaml | 55 ++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/shorebird_tools.yaml diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml new file mode 100644 index 0000000000000..d98770c6c8110 --- /dev/null +++ b/.github/workflows/shorebird_tools.yaml @@ -0,0 +1,55 @@ +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 + + spell-check: + uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/spell_check.yml@v1 + with: + includes: | + **/*.md + !brick/**/*.md + .*/**/*.md + modified_files_only: false + + verify-version: + runs-on: ubuntu-latest + steps: + - name: 📚 Git Checkout + uses: actions/checkout@v2 + + - name: 🎯 Setup Dart + uses: dart-lang/setup-dart@v1 + with: + sdk: "stable" + + - name: 📦 Install Dependencies + run: | + dart pub get + + - name: 🔎 Verify version + run: dart run test --run-skipped -t version-verify From 522da15b54a601b946bfad608ff4b99f221d31d4 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:32:37 -0700 Subject: [PATCH 03/11] improving CI --- .github/workflows/shorebird_ci.yml | 18 +++++++++++++++++- .github/workflows/shorebird_tools.yaml | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/shorebird_ci.yml b/.github/workflows/shorebird_ci.yml index 03453aae11924..601329c8f5305 100644 --- a/.github/workflows/shorebird_ci.yml +++ b/.github/workflows/shorebird_ci.yml @@ -1,4 +1,4 @@ -name: shorebird_ci +name: shorebird_tests concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -6,9 +6,25 @@ concurrency: on: pull_request: + paths: + - ".github/workflows/shorebird_tests.yaml" + - "packages/shorebird_tests/lib/**" + - "packages/shorebird_tests/test/**" + - "packages/shorebird_tests/pubspec.yaml" + - "packages/flutter_tools/lib/**" + - "packages/flutter_tools/test/**" + - "packages/flutter_tools/pubspec.yaml" push: branches: - main + paths: + - ".github/workflows/shorebird_tests.yaml" + - "packages/shorebird_tests/lib/**" + - "packages/shorebird_tests/test/**" + - "packages/shorebird_tests/pubspec.yaml" + - "packages/flutter_tools/lib/**" + - "packages/flutter_tools/test/**" + - "packages/flutter_tools/pubspec.yaml" jobs: test: diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml index d98770c6c8110..1f16d0ffb6bb5 100644 --- a/.github/workflows/shorebird_tools.yaml +++ b/.github/workflows/shorebird_tools.yaml @@ -50,6 +50,8 @@ jobs: - name: 📦 Install Dependencies run: | dart pub get + working-directory: packages/shorebird_tools - name: 🔎 Verify version run: dart run test --run-skipped -t version-verify + working-directory: packages/shorebird_tools From 4548fbd0e4895053b05d6b150b92e9fa70f70503 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:37:47 -0700 Subject: [PATCH 04/11] fixing ci --- .github/workflows/shorebird_tools.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml index 1f16d0ffb6bb5..8ef6289d4f66a 100644 --- a/.github/workflows/shorebird_tools.yaml +++ b/.github/workflows/shorebird_tools.yaml @@ -26,15 +26,8 @@ jobs: build: uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1 - - spell-check: - uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/spell_check.yml@v1 with: - includes: | - **/*.md - !brick/**/*.md - .*/**/*.md - modified_files_only: false + working-directory: packages/shorebird_tools verify-version: runs-on: ubuntu-latest From 5b1cf3fdaf8fc69c847c09c592f11cd79eb46dc2 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:40:20 -0700 Subject: [PATCH 05/11] fixing ci --- .github/workflows/shorebird_tools.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml index 8ef6289d4f66a..0916e4ab63706 100644 --- a/.github/workflows/shorebird_tools.yaml +++ b/.github/workflows/shorebird_tools.yaml @@ -27,7 +27,7 @@ jobs: build: uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1 with: - working-directory: packages/shorebird_tools + working_directory: packages/shorebird_tools verify-version: runs-on: ubuntu-latest From bbe751778f47734472f17cbb314e0ec2a066338b Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:41:58 -0700 Subject: [PATCH 06/11] fixing formating --- packages/shorebird_tools/test/src/command_runner_test.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/shorebird_tools/test/src/command_runner_test.dart b/packages/shorebird_tools/test/src/command_runner_test.dart index 22ebba4f46078..4554a91a50546 100644 --- a/packages/shorebird_tools/test/src/command_runner_test.dart +++ b/packages/shorebird_tools/test/src/command_runner_test.dart @@ -11,10 +11,8 @@ class _MockLogger extends Mock implements Logger {} class _MockProgress extends Mock implements Progress {} - const latestVersion = '0.0.0'; - void main() { group('ShorebirdToolsCommandRunner', () { late Logger logger; From 057bcf6e2c1d3e5ef51e5611739a308375b22ab7 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:44:31 -0700 Subject: [PATCH 07/11] fixing analyze issues --- packages/shorebird_tools/test/src/command_runner_test.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/shorebird_tools/test/src/command_runner_test.dart b/packages/shorebird_tools/test/src/command_runner_test.dart index 4554a91a50546..6de70d8d68556 100644 --- a/packages/shorebird_tools/test/src/command_runner_test.dart +++ b/packages/shorebird_tools/test/src/command_runner_test.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:args/command_runner.dart'; import 'package:mason_logger/mason_logger.dart'; import 'package:mocktail/mocktail.dart'; @@ -9,8 +7,6 @@ import 'package:test/test.dart'; class _MockLogger extends Mock implements Logger {} -class _MockProgress extends Mock implements Progress {} - const latestVersion = '0.0.0'; void main() { From 7f07d6fe8300d8306a9e4d52064fc8d4979d5aa9 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:46:43 -0700 Subject: [PATCH 08/11] fix ci --- .github/workflows/shorebird_tools.yaml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/.github/workflows/shorebird_tools.yaml b/.github/workflows/shorebird_tools.yaml index 0916e4ab63706..b9264ad963b73 100644 --- a/.github/workflows/shorebird_tools.yaml +++ b/.github/workflows/shorebird_tools.yaml @@ -28,23 +28,3 @@ jobs: uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1 with: working_directory: packages/shorebird_tools - - verify-version: - runs-on: ubuntu-latest - steps: - - name: 📚 Git Checkout - uses: actions/checkout@v2 - - - name: 🎯 Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: "stable" - - - name: 📦 Install Dependencies - run: | - dart pub get - working-directory: packages/shorebird_tools - - - name: 🔎 Verify version - run: dart run test --run-skipped -t version-verify - working-directory: packages/shorebird_tools From 11d5df7e11cf387eef1e25e40be36344fd8a7021 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:53:53 -0700 Subject: [PATCH 09/11] adding missing tests --- .../src/commands/package_command_test.dart | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/shorebird_tools/test/src/commands/package_command_test.dart b/packages/shorebird_tools/test/src/commands/package_command_test.dart index ddea71c38c195..d0c6ecfd10fee 100644 --- a/packages/shorebird_tools/test/src/commands/package_command_test.dart +++ b/packages/shorebird_tools/test/src/commands/package_command_test.dart @@ -56,8 +56,30 @@ void main() { expect(extractedFile.readAsStringSync(), 'banana'); }); - group('wrong usage', () { - test('when missing option for -p', () async { + 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); @@ -73,8 +95,10 @@ Usage: shorebird_tools package [arguments] Run "shorebird_tools help" to see global options.'''), ).called(1); }); + }); - test('when missing option for -o', () async { + group('when missing option for -o', () { + test('shows errors and print the correct usage', () async { final exitCode = await commandRunner.run( [ 'package', From 3758b3eeae2e90e7ca03ee95bed4dbe5f4f51465 Mon Sep 17 00:00:00 2001 From: Erick Date: Thu, 9 May 2024 10:56:22 -0700 Subject: [PATCH 10/11] Apply suggestions from code review Co-authored-by: Bryan Oltman --- .../shorebird_tools/lib/src/commands/package_command.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shorebird_tools/lib/src/commands/package_command.dart b/packages/shorebird_tools/lib/src/commands/package_command.dart index c55d06ea3c8d8..c0e8f59e317c0 100644 --- a/packages/shorebird_tools/lib/src/commands/package_command.dart +++ b/packages/shorebird_tools/lib/src/commands/package_command.dart @@ -20,18 +20,18 @@ class PackageCommand extends Command { 'patch', abbr: 'p', mandatory: true, - help: 'The patch path to package', + help: 'The path to the patch artifact which will be packaged', ) ..addOption( 'output', abbr: 'o', mandatory: true, - help: 'The path to the output archive', + help: 'Where to write the packaged patch archive', ); } @override - String get description => 'Packages a generated patch into an archive'; + String get description => 'Packages a patch artifact into an archive'; @override String get name => 'package'; From bde128d3850c8826b46d54447a0db5cbaf89c39e Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Thu, 9 May 2024 10:58:38 -0700 Subject: [PATCH 11/11] fixing tests --- .../test/src/commands/package_command_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/shorebird_tools/test/src/commands/package_command_test.dart b/packages/shorebird_tools/test/src/commands/package_command_test.dart index d0c6ecfd10fee..8775b8b09b114 100644 --- a/packages/shorebird_tools/test/src/commands/package_command_test.dart +++ b/packages/shorebird_tools/test/src/commands/package_command_test.dart @@ -89,8 +89,8 @@ void main() { () => logger.info(''' Usage: shorebird_tools package [arguments] -h, --help Print this usage information. --p, --patch (mandatory) The patch path to package --o, --output (mandatory) The path to the output archive +-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); @@ -115,8 +115,8 @@ Run "shorebird_tools help" to see global options.'''), () => logger.info(''' Usage: shorebird_tools package [arguments] -h, --help Print this usage information. --p, --patch (mandatory) The patch path to package --o, --output (mandatory) The path to the output archive +-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);