diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ff6aef189..59901206c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,6 +2,3 @@ ### What is the value of this and can you measure success? -### Screenshots (Optional) - - diff --git a/example/assets/images/icons/fuchsia.svg b/example/assets/images/icons/fuchsia.svg new file mode 100644 index 000000000..b6fb406aa --- /dev/null +++ b/example/assets/images/icons/fuchsia.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/example/assets/images/icons/kmm.svg b/example/assets/images/icons/kmm.svg new file mode 100644 index 000000000..8e7df0754 --- /dev/null +++ b/example/assets/images/icons/kmm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart index e96d2838b..5aa085454 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,6 +4,63 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; + +class $PicturesGen { + const $PicturesGen(); + + AssetGenImage get chip5 => const AssetGenImage('pictures/chip5.jpg'); +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + AssetGenImage get chip2 => const AssetGenImage('assets/images/chip2.jpg'); + AssetGenImage get chip1 => const AssetGenImage('assets/images/chip1.jpg'); + AssetGenImage get logo => const AssetGenImage('assets/images/logo.png'); + AssetGenImage get profile => const AssetGenImage('assets/images/profile.jpg'); + $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); + $AssetsImagesChip4Gen get chip4 => const $AssetsImagesChip4Gen(); + $AssetsImagesIconsGen get icons => const $AssetsImagesIconsGen(); +} + +class $AssetsJsonGen { + const $AssetsJsonGen(); + + String get fruits => 'assets/json/fruits.json'; +} + +class $AssetsImagesChip3Gen { + const $AssetsImagesChip3Gen(); + + AssetGenImage get chip3 => + const AssetGenImage('assets/images/chip3/chip3.jpg'); +} + +class $AssetsImagesChip4Gen { + const $AssetsImagesChip4Gen(); + + AssetGenImage get chip4 => + const AssetGenImage('assets/images/chip4/chip4.jpg'); +} + +class $AssetsImagesIconsGen { + const $AssetsImagesIconsGen(); + + SvgGenImage get fuchsia => + const SvgGenImage('assets/images/icons/fuchsia.svg'); + SvgGenImage get kmm => const SvgGenImage('assets/images/icons/kmm.svg'); + SvgGenImage get paint => const SvgGenImage('assets/images/icons/paint.svg'); +} + +class Assets { + Assets._(); + + static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsJsonGen json = $AssetsJsonGen(); + static const $PicturesGen pictures = $PicturesGen(); +} class AssetGenImage extends AssetImage { const AssetGenImage(String assetName) @@ -55,54 +112,32 @@ class AssetGenImage extends AssetImage { String get path => _assetName; } -class $PicturesGen { - const $PicturesGen(); +class SvgGenImage { + const SvgGenImage(this._assetName); - AssetGenImage get chip5 => const AssetGenImage('pictures/chip5.jpg'); -} - -class $AssetsImagesGen { - const $AssetsImagesGen(); - - AssetGenImage get chip2 => const AssetGenImage('assets/images/chip2.jpg'); - AssetGenImage get chip1 => const AssetGenImage('assets/images/chip1.jpg'); - AssetGenImage get logo => const AssetGenImage('assets/images/logo.png'); - AssetGenImage get profile => const AssetGenImage('assets/images/profile.jpg'); - $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); - $AssetsImagesChip4Gen get chip4 => const $AssetsImagesChip4Gen(); - $AssetsImagesIconsGen get icons => const $AssetsImagesIconsGen(); -} - -class $AssetsJsonGen { - const $AssetsJsonGen(); - - String get fruits => 'assets/json/fruits.json'; -} - -class $AssetsImagesChip3Gen { - const $AssetsImagesChip3Gen(); - - AssetGenImage get chip3 => - const AssetGenImage('assets/images/chip3/chip3.jpg'); -} - -class $AssetsImagesChip4Gen { - const $AssetsImagesChip4Gen(); - - AssetGenImage get chip4 => - const AssetGenImage('assets/images/chip4/chip4.jpg'); -} - -class $AssetsImagesIconsGen { - const $AssetsImagesIconsGen(); - - String get paint => 'assets/images/icons/paint.svg'; -} + final String _assetName; -class Assets { - Assets._(); + SvgPicture svg({ + bool matchTextDirection = false, + AssetBundle bundle, + String package, + double width, + double height, + BoxFit fit = BoxFit.contain, + AlignmentGeometry alignment = Alignment.center, + bool allowDrawingOutsideViewBox = false, + WidgetBuilder placeholderBuilder, + Color color, + BlendMode colorBlendMode = BlendMode.srcIn, + String semanticsLabel, + bool excludeFromSemantics = false, + Clip clipBehavior = Clip.hardEdge, + }) { + return SvgPicture.asset( + _assetName, + matchTextDirection: matchTextDirection, + ); + } - static const $AssetsImagesGen images = $AssetsImagesGen(); - static const $AssetsJsonGen json = $AssetsJsonGen(); - static const $PicturesGen pictures = $PicturesGen(); + String get path => _assetName; } diff --git a/example/lib/main.dart b/example/lib/main.dart index 4845f84b4..e34325cfb 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -17,27 +17,36 @@ void main() { title: const Text('FlutterGen'), ), body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // Auto generated image from FlutterGen. - Image(image: Assets.images.chip1), - Assets.pictures.chip5.image( - width: 120, - height: 120, - fit: BoxFit.scaleDown, - ), - const Text( - 'Hi there, I\'m FlutterGen', - style: TextStyle( - // Auto generated color from FlutterGen. - color: ColorName.black60, - // Auto generated font from FlutterGen. - fontFamily: FontFamily.robotoMono, - fontFamilyFallback: [FontFamily.raleway], + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Auto generated image from FlutterGen. + Image(image: Assets.images.chip1), + Assets.images.icons.kmm.svg(), + Assets.images.icons.fuchsia.svg(), + Assets.images.icons.paint.svg( + width: 120, + height: 120 ), - ), - ], + Assets.pictures.chip5.image( + width: 120, + height: 120, + fit: BoxFit.scaleDown, + ), + const Text( + 'Hi there, I\'m FlutterGen', + style: TextStyle( + // Auto generated color from FlutterGen. + color: ColorName.black60, + + // Auto generated font from FlutterGen. + fontFamily: FontFamily.robotoMono, + fontFamilyFallback: [FontFamily.raleway], + ), + ), + ], + ), ), ), ), diff --git a/example/pubspec.lock b/example/pubspec.lock index 8e708e011..6fa0ffacc 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -28,14 +28,14 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.2" + version: "2.5.0-nullsafety" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety" build: dependency: transitive description: @@ -70,14 +70,14 @@ packages: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.10.0" + version: "1.10.2" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "5.2.0" + version: "6.0.1" built_collection: dependency: transitive description: @@ -98,14 +98,14 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0-nullsafety.2" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "1.2.0-nullsafety" checked_yaml: dependency: transitive description: @@ -126,7 +126,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0-nullsafety" code_builder: dependency: transitive description: @@ -140,7 +140,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.13" + version: "1.15.0-nullsafety.2" convert: dependency: transitive description: @@ -182,7 +182,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.0-nullsafety" fixnum: dependency: transitive description: @@ -202,6 +202,13 @@ packages: relative: true source: path version: "0.0.21" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.18.1" flutter_test: dependency: "direct dev" description: flutter @@ -276,14 +283,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.8" + version: "0.12.10-nullsafety" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety.2" mime: dependency: transitive description: @@ -318,21 +325,35 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1+1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" pedantic: dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.9.0" + version: "1.9.2" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.1.0" pool: dependency: transitive description: @@ -386,21 +407,21 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.5" + version: "1.10.0-nullsafety" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety" stream_transform: dependency: transitive description: @@ -414,21 +435,21 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0-nullsafety" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.17" + version: "0.2.19-nullsafety" time: dependency: transitive description: @@ -449,14 +470,14 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0-nullsafety.2" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety.2" watcher: dependency: transitive description: @@ -477,7 +498,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "4.2.0" + version: "4.5.0" yaml: dependency: transitive description: @@ -486,5 +507,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.9.0 <3.0.0" - flutter: ">=1.20.0" + dart: ">=2.10.0-0.0.dev <2.10.0" + flutter: ">=1.20.0 <2.0.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 77aa894f8..7187713bd 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -13,6 +13,8 @@ dependencies: flutter: sdk: flutter + flutter_svg: ^0.18.1 + dev_dependencies: flutter_test: sdk: flutter @@ -24,6 +26,9 @@ flutter_gen: output: lib/gen/ # Optional (default: lib/gen/) lineLength: 80 # Optional (default: 80) + integrations: + flutter_svg: true + colors: inputs: - assets/color/colors.xml @@ -37,6 +42,8 @@ flutter: - assets/images/chip3/chip3.jpg - assets/images/chip3/chip3.jpg # duplicated - assets/images/chip4/ + - assets/images/icons/fuchsia.svg + - assets/images/icons/kmm.svg - assets/images/icons/paint.svg - assets/json/fruits.json - pictures/chip5.jpg diff --git a/lib/flutter_generator.dart b/lib/flutter_generator.dart index 128a8e133..3ed36afd8 100644 --- a/lib/flutter_generator.dart +++ b/lib/flutter_generator.dart @@ -63,8 +63,8 @@ class FlutterGenerator { final formatter = DartFormatter(pageWidth: lineLength); if (config.flutter.hasAssets) { - final generated = - generateAssets(pubspecFile, formatter, config.flutter.assets); + final generated = generateAssets( + pubspecFile, formatter, config.flutterGen, config.flutter.assets); final assets = File(join(pubspecFile.parent.path, output, 'assets.gen.dart')); writeAsString(generated, file: assets); diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index 1472720b5..d6b54bd1c 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -3,38 +3,48 @@ import 'dart:io'; import 'package:dart_style/dart_style.dart'; import 'package:flutter_gen/src/generators/generator_helper.dart'; +import 'package:flutter_gen/src/generators/integrations/integration.dart'; +import 'package:flutter_gen/src/generators/integrations/svg_integration.dart'; import 'package:flutter_gen/src/settings/asset_type.dart'; import 'package:flutter_gen/src/settings/flutter/flutter_assets.dart'; +import 'package:flutter_gen/src/settings/flutterGen/flutter_gen.dart'; import 'package:flutter_gen/src/utils/camel_case.dart'; import 'package:path/path.dart'; -String generateAssets( - File pubspecFile, DartFormatter formatter, FlutterAssets assets) { +String generateAssets(File pubspecFile, DartFormatter formatter, + FlutterGen flutterGen, FlutterAssets assets) { assert(assets != null && assets.hasAssets, throw 'The value of "flutter/assets:" is incorrect.'); - final buffer = StringBuffer(); - buffer.writeln(header()); - buffer.writeln(_assetGenImageClassDefinition); + final importsBuffer = StringBuffer(); + final classesBuffer = StringBuffer(); final assetRelativePathList = _getAssetRelativePathList(pubspecFile, assets); final assetTypeQueue = ListQueue.from( _constructAssetTree(assetRelativePathList).children); final assetsStaticStatements = <_Statement>[]; + final integrations = []; + if (flutterGen != null && + flutterGen.hasIntegrations && + flutterGen.integrations.hasFlutterSvg) { + integrations.add(SvgIntegration()); + } + while (assetTypeQueue.isNotEmpty) { final assetType = assetTypeQueue.removeFirst(); final assetAbsolutePath = join(pubspecFile.parent.path, assetType.path); if (FileSystemEntity.isDirectorySync(assetAbsolutePath)) { - final statements = - _createDirectoryClassGenStatements(pubspecFile, assetType); + final statements = _createDirectoryClassGenStatements( + pubspecFile, assetType, integrations); if (assetType.isDefaultAssetsDirectory) { assetsStaticStatements.addAll(statements); } else { final className = '\$${assetType.path.camelCase().capitalize()}Gen'; - buffer.writeln(_directoryClassGenDefinition(className, statements)); + classesBuffer + .writeln(_directoryClassGenDefinition(className, statements)); // Add this directory reference to Assets class if we are not under the default asset folder if (dirname(assetType.path) == '.') { assetsStaticStatements.add(_Statement( @@ -50,8 +60,24 @@ String generateAssets( } } - buffer.writeln(_assetsClassDefinition(assetsStaticStatements)); + classesBuffer.writeln(_assetsClassDefinition(assetsStaticStatements)); + classesBuffer.writeln(_assetGenImageClassDefinition); + + final imports = {'package:flutter/widgets.dart'}; + integrations + .where((integration) => integration.isEnabled) + .forEach((integration) { + imports.addAll(integration.requiredImports); + classesBuffer.writeln(integration.classOutput); + }); + for (final package in imports) { + importsBuffer.writeln(import(package)); + } + final buffer = StringBuffer(); + buffer.writeln(header); + buffer.writeln(importsBuffer.toString()); + buffer.writeln(classesBuffer.toString()); return formatter.format(buffer.toString()); } @@ -100,9 +126,7 @@ AssetType _constructAssetTree(List assetRelativePathList) { } List<_Statement> _createDirectoryClassGenStatements( - File pubspecFile, - AssetType assetType, -) { + File pubspecFile, AssetType assetType, List integrations) { final statements = assetType.children .map((child) { final childAssetAbsolutePath = @@ -124,12 +148,26 @@ List<_Statement> _createDirectoryClassGenStatements( isConstConstructor: true, ); } else if (!child.isUnKnownMime) { - statement = _Statement( - type: 'String', - name: child.baseName.camelCase(), - value: '\'${child.path}\'', - isConstConstructor: false, + final integration = integrations.firstWhere( + (element) => element.mime == child.mime, + orElse: () => null, ); + if (integration == null) { + statement ??= _Statement( + type: 'String', + name: child.baseName.camelCase(), + value: '\'${child.path}\'', + isConstConstructor: false, + ); + } else { + integration.isEnabled = true; + statement = _Statement( + type: integration.className, + name: child.baseName.camelCase(), + value: integration.classInstantiate(child.path), + isConstConstructor: integration.isConstConstructor, + ); + } } return statement; }) @@ -168,7 +206,6 @@ class $className { } const String _assetGenImageClassDefinition = ''' -import 'package:flutter/widgets.dart'; class AssetGenImage extends AssetImage { const AssetGenImage(String assetName) diff --git a/lib/src/generators/colors_generator.dart b/lib/src/generators/colors_generator.dart index e61d45bfb..602d0ae46 100644 --- a/lib/src/generators/colors_generator.dart +++ b/lib/src/generators/colors_generator.dart @@ -19,7 +19,7 @@ String generateColors( throw 'The value of "flutter_gen/colors/inputs:" is incorrect.'); final buffer = StringBuffer(); - buffer.writeln(header()); + buffer.writeln(header); buffer.writeln("import 'package:flutter/painting.dart';"); buffer.writeln("import 'package:flutter/material.dart';"); buffer.writeln(); diff --git a/lib/src/generators/fonts_generator.dart b/lib/src/generators/fonts_generator.dart index 493bb25c2..3135a7bbb 100644 --- a/lib/src/generators/fonts_generator.dart +++ b/lib/src/generators/fonts_generator.dart @@ -10,7 +10,7 @@ String generateFonts(DartFormatter formatter, FlutterFonts fonts) { throw 'The value of "flutter/fonts:" is incorrect.'); final buffer = StringBuffer(); - buffer.writeln(header()); + buffer.writeln(header); buffer.writeln('class FontFamily {'); buffer.writeln(' FontFamily._();'); buffer.writeln(); diff --git a/lib/src/generators/generator_helper.dart b/lib/src/generators/generator_helper.dart index df33b75f8..c0964ef01 100644 --- a/lib/src/generators/generator_helper.dart +++ b/lib/src/generators/generator_helper.dart @@ -1,7 +1,10 @@ -String header() { +String get header { return '''/// GENERATED CODE - DO NOT MODIFY BY HAND /// ***************************************************** /// FlutterGen /// ***************************************************** + '''; } + +String import(String package) => 'import \'$package\';'; diff --git a/lib/src/generators/integrations/integration.dart b/lib/src/generators/integrations/integration.dart new file mode 100644 index 000000000..4911ea144 --- /dev/null +++ b/lib/src/generators/integrations/integration.dart @@ -0,0 +1,15 @@ +abstract class Integration { + bool isEnabled = false; + + List get requiredImports; + + String get classOutput; + + String get className; + + String classInstantiate(String path); + + String get mime; + + bool get isConstConstructor; +} diff --git a/lib/src/generators/integrations/svg_integration.dart b/lib/src/generators/integrations/svg_integration.dart new file mode 100644 index 000000000..d13743907 --- /dev/null +++ b/lib/src/generators/integrations/svg_integration.dart @@ -0,0 +1,52 @@ +import 'package:flutter_gen/src/generators/integrations/integration.dart'; + +class SvgIntegration extends Integration { + @override + List get requiredImports => [ + 'package:flutter_svg/flutter_svg.dart', + 'package:flutter/services.dart', + ]; + + @override + String get classOutput => '''class SvgGenImage { + const SvgGenImage(this._assetName); + + final String _assetName; + + SvgPicture svg({ + bool matchTextDirection = false, + AssetBundle bundle, + String package, + double width, + double height, + BoxFit fit = BoxFit.contain, + AlignmentGeometry alignment = Alignment.center, + bool allowDrawingOutsideViewBox = false, + WidgetBuilder placeholderBuilder, + Color color, + BlendMode colorBlendMode = BlendMode.srcIn, + String semanticsLabel, + bool excludeFromSemantics = false, + Clip clipBehavior = Clip.hardEdge, + }) { + return SvgPicture.asset( + _assetName, + matchTextDirection: matchTextDirection, + ); + } + + String get path => _assetName; +}'''; + + @override + String get className => 'SvgGenImage'; + + @override + String classInstantiate(String path) => 'SvgGenImage\(\'$path\'\)'; + + @override + String get mime => 'image/svg+xml'; + + @override + bool get isConstConstructor => true; +} diff --git a/lib/src/settings/flutterGen/flutter_gen.dart b/lib/src/settings/flutterGen/flutter_gen.dart index 44ea34df0..6ba99d395 100644 --- a/lib/src/settings/flutterGen/flutter_gen.dart +++ b/lib/src/settings/flutterGen/flutter_gen.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter_gen/src/settings/config.dart'; import 'package:flutter_gen/src/settings/flutterGen/flutter_gen_colors.dart'; +import 'package:flutter_gen/src/settings/flutterGen/flutter_gen_integrations.dart'; import 'package:flutter_gen/src/utils/cast.dart'; import 'package:yaml/yaml.dart'; @@ -9,6 +10,8 @@ class FlutterGen { FlutterGen(YamlMap flutterGenMap) { if (flutterGenMap != null) { _output = safeCast(flutterGenMap['output']); + _integrations = FlutterGenIntegrations( + safeCast(flutterGenMap['integrations'])); _lineLength = safeCast(flutterGenMap['lineLength']); _colors = FlutterGenColors(safeCast(flutterGenMap['colors'])); } @@ -25,6 +28,12 @@ class FlutterGen { int get lineLength => _lineLength ?? Config.DEFAULT_LINE_LENGTH; + FlutterGenIntegrations _integrations; + + FlutterGenIntegrations get integrations => _integrations; + + bool get hasIntegrations => integrations != null; + FlutterGenColors _colors; FlutterGenColors get colors => _colors; diff --git a/lib/src/settings/flutterGen/flutter_gen_integrations.dart b/lib/src/settings/flutterGen/flutter_gen_integrations.dart new file mode 100644 index 000000000..d22e1a687 --- /dev/null +++ b/lib/src/settings/flutterGen/flutter_gen_integrations.dart @@ -0,0 +1,16 @@ +import 'package:flutter_gen/src/utils/cast.dart'; +import 'package:yaml/yaml.dart'; + +class FlutterGenIntegrations { + FlutterGenIntegrations(YamlMap flutterGenMap) { + if (flutterGenMap != null) { + _flutterSvg = safeCast(flutterGenMap['flutter_svg']); + } + } + + bool _flutterSvg; + + bool get flutterSvg => _flutterSvg ?? false; + + bool get hasFlutterSvg => flutterSvg; +} diff --git a/test/flutter_gen_test.dart b/test/flutter_gen_test.dart index 24b5508bc..35b930f31 100644 --- a/test/flutter_gen_test.dart +++ b/test/flutter_gen_test.dart @@ -97,7 +97,7 @@ void main() { test('Wrong output path', () async { await FlutterGenerator( - File('test_resources/pubspec_wrong_output_path.yaml')) + File('test_resources/pubspec_wrong_output_path.yaml')) .build(); expect( File('test_resources/lib/gen/assets.gen.dart').readAsStringSync(), @@ -115,7 +115,7 @@ void main() { test('Wrong lineLength', () async { await FlutterGenerator( - File('test_resources/pubspec_wrong_line_length.yaml')) + File('test_resources/pubspec_wrong_line_length.yaml')) .build(); expect( File('test_resources/lib/gen/assets.gen.dart').readAsStringSync(), @@ -133,12 +133,27 @@ void main() { test('Assets on pubspec.yaml', () async { final pubspec = File('test_resources/pubspec_assets.yaml'); + final pubstri = pubspec.readAsStringSync(); final config = await Config(pubspec).load(); final formatter = DartFormatter(pageWidth: config.flutterGen.lineLength); - final actual = generateAssets(pubspec, formatter, config.flutter.assets); + final actual = generateAssets( + pubspec, formatter, config.flutterGen, config.flutter.assets); final expected = - File('test_resources/actual_data/assets.gen.dart').readAsStringSync(); + File('test_resources/actual_data/assets.gen.dart').readAsStringSync(); + + expect(actual, expected); + }); + + test('Assets with No inegrations on pubspec.yaml', () async { + final pubspec = File('test_resources/pubspec_assets_no_integrations.yaml'); + final config = await Config(pubspec).load(); + final formatter = DartFormatter(pageWidth: config.flutterGen.lineLength); + + final actual = generateAssets( + pubspec, formatter, config.flutterGen, config.flutter.assets); + final expected = + File('test_resources/actual_data/assets_no_integrations.gen.dart').readAsStringSync(); expect(actual, expected); }); diff --git a/test_resources/actual_data/assets.gen.dart b/test_resources/actual_data/assets.gen.dart index e96d2838b..5aa085454 100644 --- a/test_resources/actual_data/assets.gen.dart +++ b/test_resources/actual_data/assets.gen.dart @@ -4,6 +4,63 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; + +class $PicturesGen { + const $PicturesGen(); + + AssetGenImage get chip5 => const AssetGenImage('pictures/chip5.jpg'); +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + AssetGenImage get chip2 => const AssetGenImage('assets/images/chip2.jpg'); + AssetGenImage get chip1 => const AssetGenImage('assets/images/chip1.jpg'); + AssetGenImage get logo => const AssetGenImage('assets/images/logo.png'); + AssetGenImage get profile => const AssetGenImage('assets/images/profile.jpg'); + $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); + $AssetsImagesChip4Gen get chip4 => const $AssetsImagesChip4Gen(); + $AssetsImagesIconsGen get icons => const $AssetsImagesIconsGen(); +} + +class $AssetsJsonGen { + const $AssetsJsonGen(); + + String get fruits => 'assets/json/fruits.json'; +} + +class $AssetsImagesChip3Gen { + const $AssetsImagesChip3Gen(); + + AssetGenImage get chip3 => + const AssetGenImage('assets/images/chip3/chip3.jpg'); +} + +class $AssetsImagesChip4Gen { + const $AssetsImagesChip4Gen(); + + AssetGenImage get chip4 => + const AssetGenImage('assets/images/chip4/chip4.jpg'); +} + +class $AssetsImagesIconsGen { + const $AssetsImagesIconsGen(); + + SvgGenImage get fuchsia => + const SvgGenImage('assets/images/icons/fuchsia.svg'); + SvgGenImage get kmm => const SvgGenImage('assets/images/icons/kmm.svg'); + SvgGenImage get paint => const SvgGenImage('assets/images/icons/paint.svg'); +} + +class Assets { + Assets._(); + + static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsJsonGen json = $AssetsJsonGen(); + static const $PicturesGen pictures = $PicturesGen(); +} class AssetGenImage extends AssetImage { const AssetGenImage(String assetName) @@ -55,54 +112,32 @@ class AssetGenImage extends AssetImage { String get path => _assetName; } -class $PicturesGen { - const $PicturesGen(); +class SvgGenImage { + const SvgGenImage(this._assetName); - AssetGenImage get chip5 => const AssetGenImage('pictures/chip5.jpg'); -} - -class $AssetsImagesGen { - const $AssetsImagesGen(); - - AssetGenImage get chip2 => const AssetGenImage('assets/images/chip2.jpg'); - AssetGenImage get chip1 => const AssetGenImage('assets/images/chip1.jpg'); - AssetGenImage get logo => const AssetGenImage('assets/images/logo.png'); - AssetGenImage get profile => const AssetGenImage('assets/images/profile.jpg'); - $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); - $AssetsImagesChip4Gen get chip4 => const $AssetsImagesChip4Gen(); - $AssetsImagesIconsGen get icons => const $AssetsImagesIconsGen(); -} - -class $AssetsJsonGen { - const $AssetsJsonGen(); - - String get fruits => 'assets/json/fruits.json'; -} - -class $AssetsImagesChip3Gen { - const $AssetsImagesChip3Gen(); - - AssetGenImage get chip3 => - const AssetGenImage('assets/images/chip3/chip3.jpg'); -} - -class $AssetsImagesChip4Gen { - const $AssetsImagesChip4Gen(); - - AssetGenImage get chip4 => - const AssetGenImage('assets/images/chip4/chip4.jpg'); -} - -class $AssetsImagesIconsGen { - const $AssetsImagesIconsGen(); - - String get paint => 'assets/images/icons/paint.svg'; -} + final String _assetName; -class Assets { - Assets._(); + SvgPicture svg({ + bool matchTextDirection = false, + AssetBundle bundle, + String package, + double width, + double height, + BoxFit fit = BoxFit.contain, + AlignmentGeometry alignment = Alignment.center, + bool allowDrawingOutsideViewBox = false, + WidgetBuilder placeholderBuilder, + Color color, + BlendMode colorBlendMode = BlendMode.srcIn, + String semanticsLabel, + bool excludeFromSemantics = false, + Clip clipBehavior = Clip.hardEdge, + }) { + return SvgPicture.asset( + _assetName, + matchTextDirection: matchTextDirection, + ); + } - static const $AssetsImagesGen images = $AssetsImagesGen(); - static const $AssetsJsonGen json = $AssetsJsonGen(); - static const $PicturesGen pictures = $PicturesGen(); + String get path => _assetName; } diff --git a/test_resources/actual_data/assets_no_integrations.gen.dart b/test_resources/actual_data/assets_no_integrations.gen.dart new file mode 100644 index 000000000..191dc1f8f --- /dev/null +++ b/test_resources/actual_data/assets_no_integrations.gen.dart @@ -0,0 +1,110 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +import 'package:flutter/widgets.dart'; + +class $PicturesGen { + const $PicturesGen(); + + AssetGenImage get chip5 => const AssetGenImage('pictures/chip5.jpg'); +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + AssetGenImage get chip2 => const AssetGenImage('assets/images/chip2.jpg'); + AssetGenImage get chip1 => const AssetGenImage('assets/images/chip1.jpg'); + AssetGenImage get logo => const AssetGenImage('assets/images/logo.png'); + AssetGenImage get profile => const AssetGenImage('assets/images/profile.jpg'); + $AssetsImagesChip3Gen get chip3 => const $AssetsImagesChip3Gen(); + $AssetsImagesChip4Gen get chip4 => const $AssetsImagesChip4Gen(); + $AssetsImagesIconsGen get icons => const $AssetsImagesIconsGen(); +} + +class $AssetsJsonGen { + const $AssetsJsonGen(); + + String get fruits => 'assets/json/fruits.json'; +} + +class $AssetsImagesChip3Gen { + const $AssetsImagesChip3Gen(); + + AssetGenImage get chip3 => + const AssetGenImage('assets/images/chip3/chip3.jpg'); +} + +class $AssetsImagesChip4Gen { + const $AssetsImagesChip4Gen(); + + AssetGenImage get chip4 => + const AssetGenImage('assets/images/chip4/chip4.jpg'); +} + +class $AssetsImagesIconsGen { + const $AssetsImagesIconsGen(); + + String get fuchsia => 'assets/images/icons/fuchsia.svg'; + String get kmm => 'assets/images/icons/kmm.svg'; + String get paint => 'assets/images/icons/paint.svg'; +} + +class Assets { + Assets._(); + + static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsJsonGen json = $AssetsJsonGen(); + static const $PicturesGen pictures = $PicturesGen(); +} + +class AssetGenImage extends AssetImage { + const AssetGenImage(String assetName) + : _assetName = assetName, + super(assetName); + final String _assetName; + + Image image({ + ImageFrameBuilder frameBuilder, + ImageLoadingBuilder loadingBuilder, + ImageErrorWidgetBuilder errorBuilder, + String semanticLabel, + bool excludeFromSemantics = false, + double width, + double height, + Color color, + BlendMode colorBlendMode, + BoxFit fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = false, + bool isAntiAlias = false, + FilterQuality filterQuality = FilterQuality.low, + }) { + return Image( + image: this, + frameBuilder: frameBuilder, + loadingBuilder: loadingBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + width: width, + height: height, + color: color, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + filterQuality: filterQuality, + ); + } + + String get path => _assetName; +} diff --git a/test_resources/assets/images/icons/fuchsia.svg b/test_resources/assets/images/icons/fuchsia.svg new file mode 100644 index 000000000..b6fb406aa --- /dev/null +++ b/test_resources/assets/images/icons/fuchsia.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/test_resources/assets/images/icons/kmm.svg b/test_resources/assets/images/icons/kmm.svg new file mode 100644 index 000000000..8e7df0754 --- /dev/null +++ b/test_resources/assets/images/icons/kmm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test_resources/pubspec.yaml b/test_resources/pubspec.yaml index 4a34bff76..b838a35bf 100644 --- a/test_resources/pubspec.yaml +++ b/test_resources/pubspec.yaml @@ -2,7 +2,10 @@ name: example flutter_gen: output: lib/gen/ - lineLength: 80 # Optional (default: 80) + lineLength: 80 + + integrations: + flutter_svg: true colors: inputs: @@ -17,6 +20,8 @@ flutter: - assets/images/chip3/chip3.jpg - assets/images/chip3/chip3.jpg # duplicated - assets/images/chip4/ + - assets/images/icons/fuchsia.svg + - assets/images/icons/kmm.svg - assets/images/icons/paint.svg - assets/json/fruits.json - pictures/chip5.jpg diff --git a/test_resources/pubspec_assets.yaml b/test_resources/pubspec_assets.yaml index 33d387de1..0b4f20229 100644 --- a/test_resources/pubspec_assets.yaml +++ b/test_resources/pubspec_assets.yaml @@ -4,12 +4,17 @@ flutter_gen: output: lib/gen/ # Optional (default: lib/gen/) lineLength: 80 # Optional (default: 80) + integrations: + flutter_svg: true + flutter: assets: - assets/images - assets/images/chip3/chip3.jpg - assets/images/chip3/chip3.jpg # duplicated - assets/images/chip4/ + - assets/images/icons/fuchsia.svg + - assets/images/icons/kmm.svg - assets/images/icons/paint.svg - assets/json/fruits.json - pictures/chip5.jpg diff --git a/test_resources/pubspec_assets_no_integrations.yaml b/test_resources/pubspec_assets_no_integrations.yaml new file mode 100644 index 000000000..e172069f1 --- /dev/null +++ b/test_resources/pubspec_assets_no_integrations.yaml @@ -0,0 +1,17 @@ +name: test + +flutter_gen: + output: lib/gen/ # Optional (default: lib/gen/) + lineLength: 80 # Optional (default: 80) + +flutter: + assets: + - assets/images + - assets/images/chip3/chip3.jpg + - assets/images/chip3/chip3.jpg # duplicated + - assets/images/chip4/ + - assets/images/icons/fuchsia.svg + - assets/images/icons/kmm.svg + - assets/images/icons/paint.svg + - assets/json/fruits.json + - pictures/chip5.jpg