From b3c71d1dff1eb5469e3d8a1e2d04426368ff9ec9 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 02:21:49 +0900 Subject: [PATCH 01/12] change method to getter --- lib/src/generators/assets_generator.dart | 2 +- lib/src/generators/colors_generator.dart | 2 +- lib/src/generators/fonts_generator.dart | 2 +- lib/src/generators/generator_helper.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index 1472720b5..799ad6316 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -14,7 +14,7 @@ String generateAssets( throw 'The value of "flutter/assets:" is incorrect.'); final buffer = StringBuffer(); - buffer.writeln(header()); + buffer.writeln(header); buffer.writeln(_assetGenImageClassDefinition); final assetRelativePathList = _getAssetRelativePathList(pubspecFile, assets); diff --git a/lib/src/generators/colors_generator.dart b/lib/src/generators/colors_generator.dart index 121db0fad..9658fb9f0 100644 --- a/lib/src/generators/colors_generator.dart +++ b/lib/src/generators/colors_generator.dart @@ -20,7 +20,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(); buffer.writeln('class ColorName {'); 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..3848a978a 100644 --- a/lib/src/generators/generator_helper.dart +++ b/lib/src/generators/generator_helper.dart @@ -1,4 +1,4 @@ -String header() { +String get header { return '''/// GENERATED CODE - DO NOT MODIFY BY HAND /// ***************************************************** /// FlutterGen From b8b2e545c73276c6c8496263d60926e1b1811b0c Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 05:38:26 +0900 Subject: [PATCH 02/12] add svg integration --- example/lib/gen/assets.gen.dart | 134 +++++++++++------- example/lib/main.dart | 46 +++--- example/pubspec.lock | 63 +++++--- example/pubspec.yaml | 6 + lib/flutter_generator.dart | 4 +- lib/src/generators/assets_generator.dart | 64 +++++++-- lib/src/generators/generator_helper.dart | 3 + .../generators/integrations/integration.dart | 12 ++ .../integrations/svg_integration.dart | 49 +++++++ lib/src/settings/asset_type.dart | 2 + lib/src/settings/flutterGen/flutter_gen.dart | 9 ++ .../flutterGen/flutter_gen_integrations.dart | 16 +++ test/flutter_gen_test.dart | 23 ++- test_resources/actual_data/assets.gen.dart | 134 +++++++++++------- .../assets_no_integrations.gen.dart | 108 ++++++++++++++ test_resources/pubspec.yaml | 5 +- test_resources/pubspec_assets.yaml | 3 + .../pubspec_assets_no_integrations.yaml | 15 ++ 18 files changed, 531 insertions(+), 165 deletions(-) create mode 100644 lib/src/generators/integrations/integration.dart create mode 100644 lib/src/generators/integrations/svg_integration.dart create mode 100644 lib/src/settings/flutterGen/flutter_gen_integrations.dart create mode 100644 test_resources/actual_data/assets_no_integrations.gen.dart create mode 100644 test_resources/pubspec_assets_no_integrations.yaml diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart index e96d2838b..664103249 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,56 +4,8 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; - -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; -} +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -96,7 +48,37 @@ class $AssetsImagesChip4Gen { class $AssetsImagesIconsGen { const $AssetsImagesIconsGen(); - String get paint => 'assets/images/icons/paint.svg'; + SvgGenImage get paint => SvgGenImage('assets/images/icons/paint.svg'); +} + +class SvgGenImage extends SvgPicture { + SvgGenImage(this._assetName) : super.asset(_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; } class Assets { @@ -106,3 +88,53 @@ class Assets { 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/example/lib/main.dart b/example/lib/main.dart index efac26d9d..16c375031 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -13,28 +13,34 @@ void main() { ), home: Scaffold( 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.denim, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Auto generated image from FlutterGen. + Image(image: Assets.images.chip1), + Assets.images.icons.paint, + Assets.images.icons.paint.svg( + matchTextDirection: true, + ), + 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.denim, - // Auto generated font from FlutterGen. - fontFamily: FontFamily.robotoMono, - fontFamilyFallback: [FontFamily.raleway], + // Auto generated font from FlutterGen. + fontFamily: FontFamily.robotoMono, + fontFamilyFallback: [FontFamily.raleway], + ), ), - ), - ], + ], + ), ), ), ), diff --git a/example/pubspec.lock b/example/pubspec.lock index d965fd99b..d79d93c5d 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: @@ -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: @@ -175,7 +175,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: @@ -194,7 +194,14 @@ packages: path: ".." relative: true source: path - version: "0.0.19" + 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 @@ -269,14 +276,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: @@ -311,7 +318,21 @@ 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: @@ -379,21 +400,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: @@ -407,21 +428,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" timing: dependency: transitive description: @@ -435,14 +456,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: @@ -472,5 +493,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 9fd506dc7..fc4812123 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -13,6 +13,9 @@ dependencies: flutter: sdk: flutter + flutter_svg: ^0.18.1 + + dev_dependencies: flutter_test: sdk: flutter @@ -24,6 +27,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 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 799ad6316..a01e752ec 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 classesBuffer = StringBuffer(); + final importsBuffer = 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.putIfAbsent(SvgIntegration(), () => false); + } + 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)); + final imports = {'package:flutter/widgets.dart'}; + integrations.forEach((integration, enabled) { + if (enabled) { + imports.addAll(integration.requiredImports); + classesBuffer.writeln(integration.classOutput); + } + }); + for (final package in imports) { + importsBuffer.writeln(import(package)); + } + classesBuffer.writeln(_assetsClassDefinition(assetsStaticStatements)); + classesBuffer.writeln(_assetGenImageClassDefinition); + + final buffer = StringBuffer(); + buffer.writeln(header); + buffer.writeln(importsBuffer.toString()); + buffer.writeln(classesBuffer.toString()); return formatter.format(buffer.toString()); } @@ -99,10 +125,8 @@ AssetType _constructAssetTree(List assetRelativePathList) { return assetTypeMap['.']; } -List<_Statement> _createDirectoryClassGenStatements( - File pubspecFile, - AssetType assetType, -) { +List<_Statement> _createDirectoryClassGenStatements(File pubspecFile, + AssetType assetType, Map integrations) { final statements = assetType.children .map((child) { final childAssetAbsolutePath = @@ -124,7 +148,18 @@ List<_Statement> _createDirectoryClassGenStatements( isConstConstructor: true, ); } else if (!child.isUnKnownMime) { - statement = _Statement( + for (final integration in integrations.keys) { + if (integration.mime == child.mime) { + integrations[integration] = true; + statement = _Statement( + type: integration.className, + name: child.baseName.camelCase(), + value: integration.classInstantiate(child.path), + isConstConstructor: false, + ); + } + } + statement ??= _Statement( type: 'String', name: child.baseName.camelCase(), value: '\'${child.path}\'', @@ -168,7 +203,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/generator_helper.dart b/lib/src/generators/generator_helper.dart index 3848a978a..c0964ef01 100644 --- a/lib/src/generators/generator_helper.dart +++ b/lib/src/generators/generator_helper.dart @@ -3,5 +3,8 @@ String get header { /// ***************************************************** /// 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..b7d25fe82 --- /dev/null +++ b/lib/src/generators/integrations/integration.dart @@ -0,0 +1,12 @@ +abstract class Integration { + + List get requiredImports; + + String get classOutput; + + String get className; + + String classInstantiate(String path); + + String get mime; +} diff --git a/lib/src/generators/integrations/svg_integration.dart b/lib/src/generators/integrations/svg_integration.dart new file mode 100644 index 000000000..6cf5fb101 --- /dev/null +++ b/lib/src/generators/integrations/svg_integration.dart @@ -0,0 +1,49 @@ +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 extends SvgPicture { + SvgGenImage(this._assetName) : super.asset(_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'; +} diff --git a/lib/src/settings/asset_type.dart b/lib/src/settings/asset_type.dart index 22a122ad7..3a0c6f855 100644 --- a/lib/src/settings/asset_type.dart +++ b/lib/src/settings/asset_type.dart @@ -30,6 +30,8 @@ class AssetType { } } + bool get isJson => mime == 'application/json'; + bool get isUnKnownMime => mime == null; String get baseName => basenameWithoutExtension(_path); 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..664103249 100644 --- a/test_resources/actual_data/assets.gen.dart +++ b/test_resources/actual_data/assets.gen.dart @@ -4,56 +4,8 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; - -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; -} +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -96,7 +48,37 @@ class $AssetsImagesChip4Gen { class $AssetsImagesIconsGen { const $AssetsImagesIconsGen(); - String get paint => 'assets/images/icons/paint.svg'; + SvgGenImage get paint => SvgGenImage('assets/images/icons/paint.svg'); +} + +class SvgGenImage extends SvgPicture { + SvgGenImage(this._assetName) : super.asset(_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; } class Assets { @@ -106,3 +88,53 @@ class Assets { 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/actual_data/assets_no_integrations.gen.dart b/test_resources/actual_data/assets_no_integrations.gen.dart new file mode 100644 index 000000000..4ba382d32 --- /dev/null +++ b/test_resources/actual_data/assets_no_integrations.gen.dart @@ -0,0 +1,108 @@ +/// 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 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/pubspec.yaml b/test_resources/pubspec.yaml index 39c37251b..79e8d61d4 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_gen: true colors: inputs: diff --git a/test_resources/pubspec_assets.yaml b/test_resources/pubspec_assets.yaml index 33d387de1..d0e31122f 100644 --- a/test_resources/pubspec_assets.yaml +++ b/test_resources/pubspec_assets.yaml @@ -4,6 +4,9 @@ flutter_gen: output: lib/gen/ # Optional (default: lib/gen/) lineLength: 80 # Optional (default: 80) + integrations: + flutter_svg: true + flutter: assets: - assets/images diff --git a/test_resources/pubspec_assets_no_integrations.yaml b/test_resources/pubspec_assets_no_integrations.yaml new file mode 100644 index 000000000..33d387de1 --- /dev/null +++ b/test_resources/pubspec_assets_no_integrations.yaml @@ -0,0 +1,15 @@ +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/paint.svg + - assets/json/fruits.json + - pictures/chip5.jpg From 6c07b9099aa12ef2bf78e9d391019599e025ae95 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 05:57:18 +0900 Subject: [PATCH 03/12] add test data --- example/assets/images/icons/fuchsia.svg | 9 +++++ example/assets/images/icons/kmm.svg | 1 + example/lib/gen/assets.gen.dart | 36 ++----------------- example/lib/main.dart | 5 +-- example/pubspec.yaml | 2 ++ lib/src/generators/assets_generator.dart | 4 +-- .../generators/integrations/integration.dart | 3 +- .../integrations/svg_integration.dart | 7 ++-- test_resources/actual_data/assets.gen.dart | 9 +++-- .../assets_no_integrations.gen.dart | 2 ++ .../assets/images/icons/fuchsia.svg | 9 +++++ test_resources/assets/images/icons/kmm.svg | 1 + test_resources/pubspec.yaml | 2 ++ test_resources/pubspec_assets.yaml | 2 ++ .../pubspec_assets_no_integrations.yaml | 2 ++ 15 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 example/assets/images/icons/fuchsia.svg create mode 100644 example/assets/images/icons/kmm.svg create mode 100644 test_resources/assets/images/icons/fuchsia.svg create mode 100644 test_resources/assets/images/icons/kmm.svg 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 664103249..191dc1f8f 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,8 +4,6 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -48,37 +46,9 @@ class $AssetsImagesChip4Gen { class $AssetsImagesIconsGen { const $AssetsImagesIconsGen(); - SvgGenImage get paint => SvgGenImage('assets/images/icons/paint.svg'); -} - -class SvgGenImage extends SvgPicture { - SvgGenImage(this._assetName) : super.asset(_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; + 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 { diff --git a/example/lib/main.dart b/example/lib/main.dart index 16c375031..74315bfc3 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -19,9 +19,10 @@ void main() { children: [ // Auto generated image from FlutterGen. Image(image: Assets.images.chip1), - Assets.images.icons.paint, + Assets.images.icons.paint.svg(), Assets.images.icons.paint.svg( - matchTextDirection: true, + width: 120, + height: 120 ), Assets.pictures.chip5.image( width: 120, diff --git a/example/pubspec.yaml b/example/pubspec.yaml index fc4812123..d10b202b0 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -44,6 +44,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/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index a01e752ec..0e531a1b7 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -16,8 +16,8 @@ String generateAssets(File pubspecFile, DartFormatter formatter, assert(assets != null && assets.hasAssets, throw 'The value of "flutter/assets:" is incorrect.'); - final classesBuffer = StringBuffer(); final importsBuffer = StringBuffer(); + final classesBuffer = StringBuffer(); final assetRelativePathList = _getAssetRelativePathList(pubspecFile, assets); final assetTypeQueue = ListQueue.from( @@ -155,7 +155,7 @@ List<_Statement> _createDirectoryClassGenStatements(File pubspecFile, type: integration.className, name: child.baseName.camelCase(), value: integration.classInstantiate(child.path), - isConstConstructor: false, + isConstConstructor: integration.isConstConstructor, ); } } diff --git a/lib/src/generators/integrations/integration.dart b/lib/src/generators/integrations/integration.dart index b7d25fe82..6100dfca2 100644 --- a/lib/src/generators/integrations/integration.dart +++ b/lib/src/generators/integrations/integration.dart @@ -1,5 +1,4 @@ abstract class Integration { - List get requiredImports; String get classOutput; @@ -9,4 +8,6 @@ abstract class Integration { 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 index 6cf5fb101..d13743907 100644 --- a/lib/src/generators/integrations/svg_integration.dart +++ b/lib/src/generators/integrations/svg_integration.dart @@ -8,8 +8,8 @@ class SvgIntegration extends Integration { ]; @override - String get classOutput => '''class SvgGenImage extends SvgPicture { - SvgGenImage(this._assetName) : super.asset(_assetName); + String get classOutput => '''class SvgGenImage { + const SvgGenImage(this._assetName); final String _assetName; @@ -46,4 +46,7 @@ class SvgIntegration extends Integration { @override String get mime => 'image/svg+xml'; + + @override + bool get isConstConstructor => true; } diff --git a/test_resources/actual_data/assets.gen.dart b/test_resources/actual_data/assets.gen.dart index 664103249..218989b08 100644 --- a/test_resources/actual_data/assets.gen.dart +++ b/test_resources/actual_data/assets.gen.dart @@ -48,11 +48,14 @@ class $AssetsImagesChip4Gen { class $AssetsImagesIconsGen { const $AssetsImagesIconsGen(); - SvgGenImage get paint => SvgGenImage('assets/images/icons/paint.svg'); + 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 SvgGenImage extends SvgPicture { - SvgGenImage(this._assetName) : super.asset(_assetName); +class SvgGenImage { + const SvgGenImage(this._assetName); final String _assetName; diff --git a/test_resources/actual_data/assets_no_integrations.gen.dart b/test_resources/actual_data/assets_no_integrations.gen.dart index 4ba382d32..191dc1f8f 100644 --- a/test_resources/actual_data/assets_no_integrations.gen.dart +++ b/test_resources/actual_data/assets_no_integrations.gen.dart @@ -46,6 +46,8 @@ class $AssetsImagesChip4Gen { 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'; } 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 79e8d61d4..88f94b7c0 100644 --- a/test_resources/pubspec.yaml +++ b/test_resources/pubspec.yaml @@ -21,6 +21,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 d0e31122f..0b4f20229 100644 --- a/test_resources/pubspec_assets.yaml +++ b/test_resources/pubspec_assets.yaml @@ -13,6 +13,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_no_integrations.yaml b/test_resources/pubspec_assets_no_integrations.yaml index 33d387de1..e172069f1 100644 --- a/test_resources/pubspec_assets_no_integrations.yaml +++ b/test_resources/pubspec_assets_no_integrations.yaml @@ -10,6 +10,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 From 1db50867affa388b67cce8585029a8ca9266cb32 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 05:58:24 +0900 Subject: [PATCH 04/12] update github pr template --- .github/PULL_REQUEST_TEMPLATE.md | 3 --- 1 file changed, 3 deletions(-) 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) - - From 9f50e10aa951be4992b705e0be1310613b4ce70c Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 06:00:02 +0900 Subject: [PATCH 05/12] update samples --- example/lib/gen/assets.gen.dart | 39 ++++++++++++++++++++++++++++++--- example/lib/main.dart | 3 ++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart index 191dc1f8f..218989b08 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,6 +4,8 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -46,9 +48,40 @@ class $AssetsImagesChip4Gen { 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'; + 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 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; } class Assets { diff --git a/example/lib/main.dart b/example/lib/main.dart index 74315bfc3..6709f8621 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -19,7 +19,8 @@ void main() { children: [ // Auto generated image from FlutterGen. Image(image: Assets.images.chip1), - Assets.images.icons.paint.svg(), + Assets.images.icons.kmm.svg(), + Assets.images.icons.fuchsia.svg(), Assets.images.icons.paint.svg( width: 120, height: 120 From 7e8ae7465b9779c4ba92751806f391df1b14baad Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 06:05:21 +0900 Subject: [PATCH 06/12] refactor --- lib/src/settings/asset_type.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/settings/asset_type.dart b/lib/src/settings/asset_type.dart index 3a0c6f855..4924c7498 100644 --- a/lib/src/settings/asset_type.dart +++ b/lib/src/settings/asset_type.dart @@ -32,8 +32,6 @@ class AssetType { bool get isJson => mime == 'application/json'; - bool get isUnKnownMime => mime == null; - String get baseName => basenameWithoutExtension(_path); List get children => _children; From 778f172cd2dc62697c27de31c7adf8679142b144 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 06:06:12 +0900 Subject: [PATCH 07/12] refactor --- lib/src/settings/asset_type.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/settings/asset_type.dart b/lib/src/settings/asset_type.dart index 4924c7498..22a122ad7 100644 --- a/lib/src/settings/asset_type.dart +++ b/lib/src/settings/asset_type.dart @@ -30,7 +30,7 @@ class AssetType { } } - bool get isJson => mime == 'application/json'; + bool get isUnKnownMime => mime == null; String get baseName => basenameWithoutExtension(_path); From 023349250af4d46da85502a8169b6cde3fae2adb Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 06:10:58 +0900 Subject: [PATCH 08/12] change output order --- example/lib/gen/assets.gen.dart | 39 ++------------ lib/src/generators/assets_generator.dart | 6 +-- test_resources/actual_data/assets.gen.dart | 60 +++++++++++----------- 3 files changed, 36 insertions(+), 69 deletions(-) diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart index 218989b08..191dc1f8f 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,8 +4,6 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -48,40 +46,9 @@ class $AssetsImagesChip4Gen { 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 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; + 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 { diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index 0e531a1b7..e95bb9658 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -60,6 +60,9 @@ String generateAssets(File pubspecFile, DartFormatter formatter, } } + classesBuffer.writeln(_assetsClassDefinition(assetsStaticStatements)); + classesBuffer.writeln(_assetGenImageClassDefinition); + final imports = {'package:flutter/widgets.dart'}; integrations.forEach((integration, enabled) { if (enabled) { @@ -71,9 +74,6 @@ String generateAssets(File pubspecFile, DartFormatter formatter, importsBuffer.writeln(import(package)); } - classesBuffer.writeln(_assetsClassDefinition(assetsStaticStatements)); - classesBuffer.writeln(_assetGenImageClassDefinition); - final buffer = StringBuffer(); buffer.writeln(header); buffer.writeln(importsBuffer.toString()); diff --git a/test_resources/actual_data/assets.gen.dart b/test_resources/actual_data/assets.gen.dart index 218989b08..5aa085454 100644 --- a/test_resources/actual_data/assets.gen.dart +++ b/test_resources/actual_data/assets.gen.dart @@ -54,36 +54,6 @@ class $AssetsImagesIconsGen { SvgGenImage get paint => const SvgGenImage('assets/images/icons/paint.svg'); } -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; -} - class Assets { Assets._(); @@ -141,3 +111,33 @@ class AssetGenImage extends AssetImage { String get path => _assetName; } + +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; +} From 88c9890f68a5c341ee7ec046d1d0def66fdb2a86 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 11:20:26 +0900 Subject: [PATCH 09/12] fix integrations name --- test_resources/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_resources/pubspec.yaml b/test_resources/pubspec.yaml index 88f94b7c0..1ccca7452 100644 --- a/test_resources/pubspec.yaml +++ b/test_resources/pubspec.yaml @@ -5,7 +5,7 @@ flutter_gen: lineLength: 80 integrations: - flutter_gen: true + flutter_svg: true colors: inputs: From 643bc88f2c3f136e91ff78f50e443aa0103ebf60 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 11:36:33 +0900 Subject: [PATCH 10/12] use map to list --- example/lib/gen/assets.gen.dart | 39 +++++++++++++++++-- example/pubspec.yaml | 1 - lib/src/generators/assets_generator.dart | 22 +++++------ .../generators/integrations/integration.dart | 3 ++ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart index 191dc1f8f..5aa085454 100644 --- a/example/lib/gen/assets.gen.dart +++ b/example/lib/gen/assets.gen.dart @@ -4,6 +4,8 @@ /// ***************************************************** import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/services.dart'; class $PicturesGen { const $PicturesGen(); @@ -46,9 +48,10 @@ class $AssetsImagesChip4Gen { 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'; + 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 { @@ -108,3 +111,33 @@ class AssetGenImage extends AssetImage { String get path => _assetName; } + +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; +} diff --git a/example/pubspec.yaml b/example/pubspec.yaml index d10b202b0..01841e9fa 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -15,7 +15,6 @@ dependencies: flutter_svg: ^0.18.1 - dev_dependencies: flutter_test: sdk: flutter diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index e95bb9658..2d7383c33 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -24,11 +24,11 @@ String generateAssets(File pubspecFile, DartFormatter formatter, _constructAssetTree(assetRelativePathList).children); final assetsStaticStatements = <_Statement>[]; - final integrations = {}; + final integrations = []; if (flutterGen != null && flutterGen.hasIntegrations && flutterGen.integrations.hasFlutterSvg) { - integrations.putIfAbsent(SvgIntegration(), () => false); + integrations.add(SvgIntegration()); } while (assetTypeQueue.isNotEmpty) { @@ -64,11 +64,11 @@ String generateAssets(File pubspecFile, DartFormatter formatter, classesBuffer.writeln(_assetGenImageClassDefinition); final imports = {'package:flutter/widgets.dart'}; - integrations.forEach((integration, enabled) { - if (enabled) { - imports.addAll(integration.requiredImports); - classesBuffer.writeln(integration.classOutput); - } + integrations + .where((integration) => integration.isEnabled) + .forEach((integration) { + imports.addAll(integration.requiredImports); + classesBuffer.writeln(integration.classOutput); }); for (final package in imports) { importsBuffer.writeln(import(package)); @@ -125,8 +125,8 @@ AssetType _constructAssetTree(List assetRelativePathList) { return assetTypeMap['.']; } -List<_Statement> _createDirectoryClassGenStatements(File pubspecFile, - AssetType assetType, Map integrations) { +List<_Statement> _createDirectoryClassGenStatements( + File pubspecFile, AssetType assetType, List integrations) { final statements = assetType.children .map((child) { final childAssetAbsolutePath = @@ -148,9 +148,9 @@ List<_Statement> _createDirectoryClassGenStatements(File pubspecFile, isConstConstructor: true, ); } else if (!child.isUnKnownMime) { - for (final integration in integrations.keys) { + for (final integration in integrations) { if (integration.mime == child.mime) { - integrations[integration] = true; + integration.isEnabled = true; statement = _Statement( type: integration.className, name: child.baseName.camelCase(), diff --git a/lib/src/generators/integrations/integration.dart b/lib/src/generators/integrations/integration.dart index 6100dfca2..b2c224af3 100644 --- a/lib/src/generators/integrations/integration.dart +++ b/lib/src/generators/integrations/integration.dart @@ -1,4 +1,7 @@ abstract class Integration { + + bool isEnabled = false; + List get requiredImports; String get classOutput; From 460e688c071605efd327970b592477c252664de3 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 11:43:32 +0900 Subject: [PATCH 11/12] format --- lib/src/generators/integrations/integration.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/generators/integrations/integration.dart b/lib/src/generators/integrations/integration.dart index b2c224af3..4911ea144 100644 --- a/lib/src/generators/integrations/integration.dart +++ b/lib/src/generators/integrations/integration.dart @@ -1,5 +1,4 @@ abstract class Integration { - bool isEnabled = false; List get requiredImports; From 383e2a404bd25a259e5c707c187e421c6ddc4717 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Mon, 7 Sep 2020 12:09:48 +0900 Subject: [PATCH 12/12] remove nest code --- lib/src/generators/assets_generator.dart | 35 +++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index 2d7383c33..d6b54bd1c 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -148,23 +148,26 @@ List<_Statement> _createDirectoryClassGenStatements( isConstConstructor: true, ); } else if (!child.isUnKnownMime) { - for (final integration in integrations) { - if (integration.mime == child.mime) { - integration.isEnabled = true; - statement = _Statement( - type: integration.className, - name: child.baseName.camelCase(), - value: integration.classInstantiate(child.path), - isConstConstructor: integration.isConstConstructor, - ); - } - } - 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; })