diff --git a/.github/workflows/mason.yaml b/.github/workflows/mason.yaml index 2de631382..cacabf395 100644 --- a/.github/workflows/mason.yaml +++ b/.github/workflows/mason.yaml @@ -6,6 +6,7 @@ on: - master paths: - .github/workflows/mason.yaml + - packages/mason_logger/** - packages/mason/** pull_request: @@ -13,6 +14,7 @@ on: - master paths: - .github/workflows/mason.yaml + - packages/mason_logger/** - packages/mason/** jobs: diff --git a/.github/workflows/mason_cli.yaml b/.github/workflows/mason_cli.yaml index 5130ed8a4..8254d9523 100644 --- a/.github/workflows/mason_cli.yaml +++ b/.github/workflows/mason_cli.yaml @@ -6,6 +6,9 @@ on: - master paths: - .github/workflows/mason_cli.yaml + - packages/mason_logger/** + - packages/mason_api/** + - packages/mason/** - packages/mason_cli/** pull_request: @@ -13,6 +16,9 @@ on: - master paths: - .github/workflows/mason_cli.yaml + - packages/mason_logger/** + - packages/mason_api/** + - packages/mason/** - packages/mason_cli/** jobs: diff --git a/packages/mason/lib/src/generator.dart b/packages/mason/lib/src/generator.dart index 7a2103a52..74c6cf0ac 100644 --- a/packages/mason/lib/src/generator.dart +++ b/packages/mason/lib/src/generator.dart @@ -11,9 +11,11 @@ import 'package:mason/mason.dart'; import 'package:mason/src/compute.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; +import 'package:pool/pool.dart'; part 'hooks.dart'; +final _descriptorPool = Pool(32); final _partialRegExp = RegExp(r'\{\{~\s(.+)\s\}\}'); final _fileRegExp = RegExp(r'{{%\s?([a-zA-Z]+)\s?%}}'); final _delimeterRegExp = RegExp('{{([^;,=]*?)}}'); @@ -88,6 +90,7 @@ class MasonGenerator extends Generator { .whereType() .map((file) { return () async { + final resource = await _descriptorPool.request(); try { final content = await File(file.path).readAsBytes(); final relativePath = file.path.substring( @@ -96,6 +99,8 @@ class MasonGenerator extends Generator { return TemplateFile.fromBytes(relativePath, content); } on Exception { return null; + } finally { + resource.release(); } }(); }); diff --git a/packages/mason/pubspec.yaml b/packages/mason/pubspec.yaml index 8cd570ff1..8183fc1eb 100644 --- a/packages/mason/pubspec.yaml +++ b/packages/mason/pubspec.yaml @@ -21,6 +21,7 @@ dependencies: meta: ^1.7.0 mustache_template: ^2.0.0 path: ^1.8.0 + pool: ^1.5.1 pub_semver: ^2.1.0 recase: ^4.0.0 yaml: ^3.1.0 diff --git a/packages/mason/test/src/generator_test.dart b/packages/mason/test/src/generator_test.dart index 4e5f42b08..6342efaa5 100644 --- a/packages/mason/test/src/generator_test.dart +++ b/packages/mason/test/src/generator_test.dart @@ -134,6 +134,29 @@ void main() { expect(production.readAsStringSync(), equals('PRODUCTION')); }); + test('constructs an instance (loops stress test)', () async { + const fileCount = 1000; + final brick = Brick.path( + path.join('test', 'bricks', 'loop'), + ); + final generator = await MasonGenerator.fromBrick(brick); + final tempDir = Directory.systemTemp.createTempSync(); + final files = await generator.generate( + DirectoryGeneratorTarget(tempDir), + vars: { + 'values': List.generate(fileCount, (index) => '$index'), + }, + ); + + expect(files.length, equals(fileCount)); + expect( + files.every( + (element) => element.status == GeneratedFileStatus.created, + ), + isTrue, + ); + }); + test('constructs an instance with hooks', () async { const name = 'Dash'; final brick = Brick.path(