diff --git a/.github/workflows/flutter-ci.yml b/.github/workflows/dart-ci.yaml similarity index 95% rename from .github/workflows/flutter-ci.yml rename to .github/workflows/dart-ci.yaml index 446723344..3dfc82640 100644 --- a/.github/workflows/flutter-ci.yml +++ b/.github/workflows/dart-ci.yaml @@ -1,4 +1,4 @@ -name: Flutter CI +name: Dart CI on: pull_request: { } @@ -35,4 +35,4 @@ jobs: - name: Check for any formatting and statically analyze the code. run: | make format - make analyze \ No newline at end of file + make analyze diff --git a/README.md b/README.md index 1c7d5b6bc..c17aab3f4 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,15 @@ - - + + + + +

The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs. diff --git a/analysis_options.yaml b/analysis_options.yaml index c32678274..602001d50 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,197 +1,5 @@ -# See: https://github.com/dart-lang/pedantic/tree/master/lib -include: package:pedantic/analysis_options.yaml - -# See: https://github.com/flutter/flutter/blob/master/analysis_options.yaml -analyzer: - # enable-experiment: - # - non-nullable - strong-mode: - implicit-casts: false - implicit-dynamic: false - errors: - # treat missing required parameters as a warning (not a hint) - missing_required_param: warning - # treat missing returns as a warning (not a hint) - missing_return: warning - # allow having TODOs in the code - todo: ignore - # allow self-reference to deprecated members (we do this because otherwise we have - # to annotate every member in every test, assert, etc, when we deprecate something) - deprecated_member_use_from_same_package: ignore - # Ignore analyzer hints for updating pubspecs when using Future or - # Stream and not importing dart:async - # Please see https://github.com/flutter/flutter/pull/24528 for details. - sdk_version_async_exported_from_core: ignore - exclude: - - "bin/cache/**" - # the following two are relative to the stocks example and the flutter package respectively - # see https://github.com/dart-lang/sdk/issues/28463 - - "lib/i18n/messages_*.dart" - - "lib/src/http/**" - - "lib/data/model/*.g.dart" +include: package:effective_dart/analysis_options.1.2.0.yaml linter: rules: - # these rules are documented on and in the same order as - # the Dart Lint rules page to make maintenance easier - # https://github.com/dart-lang/linter/blob/master/example/all.yaml - - always_declare_return_types - - always_put_control_body_on_new_line - # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219 - - always_require_non_null_named_parameters - # - always_specify_types - - annotate_overrides - # - avoid_annotating_with_dynamic # conflicts with always_specify_types - # - avoid_as # required for implicit-casts: true - - avoid_bool_literals_in_conditional_expressions - # - avoid_catches_without_on_clauses # we do this commonly - # - avoid_catching_errors # we do this commonly - - avoid_classes_with_only_static_members - # - avoid_double_and_int_checks # only useful when targeting JS runtime - - avoid_empty_else - - avoid_equals_and_hash_code_on_mutable_classes - - avoid_field_initializers_in_const_classes - - avoid_function_literals_in_foreach_calls - # - avoid_implementing_value_types # not yet tested - - avoid_init_to_null - # - avoid_js_rounded_ints # only useful when targeting JS runtime - - avoid_null_checks_in_equality_operators - # - avoid_positional_boolean_parameters # not yet tested - # - avoid_print # not yet tested - # - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356) - # - avoid_redundant_argument_values # not yet tested - - avoid_relative_lib_imports - - avoid_renaming_method_parameters - - avoid_return_types_on_setters - # - avoid_returning_null # there are plenty of valid reasons to return null - # - avoid_returning_null_for_future # not yet tested - - avoid_returning_null_for_void - # - avoid_returning_this # there are plenty of valid reasons to return this - # - avoid_setters_without_getters # not yet tested - # - avoid_shadowing_type_parameters # not yet tested - - avoid_single_cascade_in_expression_statements - - avoid_slow_async_io - - avoid_types_as_parameter_names - # - avoid_types_on_closure_parameters # conflicts with always_specify_types - # - avoid_unnecessary_containers # not yet tested - - avoid_unused_constructor_parameters - - avoid_void_async - # - avoid_web_libraries_in_flutter # not yet tested - - await_only_futures - - camel_case_extensions - - camel_case_types - - cancel_subscriptions - # - cascade_invocations # not yet tested - # - close_sinks # not reliable enough - # - comment_references # blocked on https://github.com/flutter/flutter/issues/20765 - # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204 - - control_flow_in_finally - # - curly_braces_in_flow_control_structures # not yet tested - # - diagnostic_describe_all_properties # not yet tested - - directives_ordering - - empty_catches - - empty_constructor_bodies - - empty_statements - # - file_names # not yet tested - - flutter_style_todos - - hash_and_equals - - implementation_imports - # - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811 - - iterable_contains_unrelated_type - # - join_return_with_assignment # not yet tested - - library_names - - library_prefixes - # - lines_longer_than_80_chars # not yet tested - - list_remove_unrelated_type - # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181 - # - missing_whitespace_between_adjacent_strings # not yet tested - - no_adjacent_strings_in_list - - no_duplicate_case_values - # - no_logic_in_create_state # not yet tested - # - no_runtimeType_toString # not yet tested - - non_constant_identifier_names - # - null_closures # not yet tested - # - omit_local_variable_types # opposite of always_specify_types - # - one_member_abstracts # too many false positives - # - only_throw_errors # https://github.com/flutter/flutter/issues/5792 - - overridden_fields - - package_api_docs - - package_names - - package_prefixed_library_names - # - parameter_assignments # we do this commonly - - prefer_adjacent_string_concatenation - - prefer_asserts_in_initializer_lists - # - prefer_asserts_with_message # not yet tested - - prefer_collection_literals - - prefer_conditional_assignment - - prefer_const_constructors - - prefer_const_constructors_in_immutables - - prefer_const_declarations - - prefer_const_literals_to_create_immutables - # - prefer_constructors_over_static_methods # not yet tested - - prefer_contains - # - prefer_double_quotes # opposite of prefer_single_quotes - - prefer_equal_for_default_values - # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods - - prefer_final_fields - - prefer_final_in_for_each - - prefer_final_locals - - prefer_for_elements_to_map_fromIterable - - prefer_foreach - # - prefer_function_declarations_over_variables # not yet tested - - prefer_generic_function_type_aliases - - prefer_if_elements_to_conditional_expressions - - prefer_if_null_operators - - prefer_initializing_formals - - prefer_inlined_adds - # - prefer_int_literals # not yet tested - # - prefer_interpolation_to_compose_strings # not yet tested - - prefer_is_empty - - prefer_is_not_empty - - prefer_is_not_operator - - prefer_iterable_whereType - # - prefer_mixin # https://github.com/dart-lang/language/issues/32 - # - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932 - # - prefer_relative_imports # not yet tested - - prefer_single_quotes - - prefer_spread_collections - - prefer_typing_uninitialized_variables - - prefer_void_to_null - # - provide_deprecation_message # not yet tested - # - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml - - recursive_getters - - slash_for_doc_comments - # - sort_child_properties_last # not yet tested - - sort_constructors_first - - sort_pub_dependencies - - sort_unnamed_constructors_first - - test_types_in_equals - - throw_in_finally - # - type_annotate_public_apis # subset of always_specify_types - - type_init_formals - # - unawaited_futures # too many false positives - # - unnecessary_await_in_return # not yet tested - - unnecessary_brace_in_string_interps - - unnecessary_const - # - unnecessary_final # conflicts with prefer_final_locals - - unnecessary_getters_setters - # - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498 - - unnecessary_new - - unnecessary_null_aware_assignments - - unnecessary_null_in_if_null_operators - - unnecessary_overrides - - unnecessary_parenthesis - - unnecessary_statements - - unnecessary_string_interpolations - - unnecessary_this - - unrelated_type_equality_checks - # - unsafe_html # not yet tested - - use_full_hex_values_for_flutter_colors - # - use_function_type_syntax_for_parameters # not yet tested - # - use_key_in_widget_constructors # not yet tested - - use_rethrow_when_possible - # - use_setters_to_change_properties # not yet tested - # - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182 - # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review - - valid_regexps - - void_checks \ No newline at end of file + public_member_api_docs: false \ No newline at end of file diff --git a/lib/flutter_generator.dart b/lib/flutter_generator.dart index b981440a1..e24d7cf08 100644 --- a/lib/flutter_generator.dart +++ b/lib/flutter_generator.dart @@ -2,13 +2,14 @@ import 'dart:io'; import 'package:build/build.dart'; import 'package:dart_style/dart_style.dart'; -import 'package:flutter_gen/src/generators/assets_generator.dart'; -import 'package:flutter_gen/src/generators/colors_generator.dart'; -import 'package:flutter_gen/src/generators/fonts_generator.dart'; -import 'package:flutter_gen/src/settings/config.dart'; -import 'package:flutter_gen/src/utils/file.dart'; import 'package:path/path.dart'; +import 'src/generators/assets_generator.dart'; +import 'src/generators/colors_generator.dart'; +import 'src/generators/fonts_generator.dart'; +import 'src/settings/config.dart'; +import 'src/utils/file.dart'; + Builder build(BuilderOptions options) { Future(() async { await FlutterGenerator(File('pubspec.yaml')).build(); @@ -41,8 +42,8 @@ class FlutterGenerator { exit(-1); } - var output = Config.DEFAULT_OUTPUT; - var lineLength = Config.DEFAULT_LINE_LENGTH; + var output = Config.defaultOutput; + var lineLength = Config.defaultLineLength; if (config.hasFlutterGen) { output = config.flutterGen.output; diff --git a/lib/src/generators/assets_generator.dart b/lib/src/generators/assets_generator.dart index 25a72abfc..bfaa96a9d 100644 --- a/lib/src/generators/assets_generator.dart +++ b/lib/src/generators/assets_generator.dart @@ -2,15 +2,16 @@ import 'dart:collection'; 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.dart'; -import 'package:flutter_gen/src/settings/flutter_gen.dart'; -import 'package:flutter_gen/src/utils/camel_case.dart'; import 'package:path/path.dart'; +import '../settings/asset_type.dart'; +import '../settings/flutter.dart'; +import '../settings/flutter_gen.dart'; +import '../utils/camel_case.dart'; +import 'generator_helper.dart'; +import 'integrations/integration.dart'; +import 'integrations/svg_integration.dart'; + String generateAssets(File pubspecFile, DartFormatter formatter, FlutterGen flutterGen, FlutterAssets assets) { assert(assets != null && assets.hasAssets, @@ -45,7 +46,8 @@ String generateAssets(File pubspecFile, DartFormatter formatter, final className = '\$${assetType.path.camelCase().capitalize()}Gen'; classesBuffer .writeln(_directoryClassGenDefinition(className, statements)); - // Add this directory reference to Assets class if we are not under the default asset folder + // Add this directory reference to Assets class + // if we are not under the default asset folder if (dirname(assetType.path) == '.') { assetsStaticStatements.add(_Statement( type: className, diff --git a/lib/src/generators/colors_generator.dart b/lib/src/generators/colors_generator.dart index 051c3ac51..aaa03b03b 100644 --- a/lib/src/generators/colors_generator.dart +++ b/lib/src/generators/colors_generator.dart @@ -2,14 +2,15 @@ import 'dart:io'; import 'package:dart_style/dart_style.dart'; import 'package:dartx/dartx.dart'; -import 'package:flutter_gen/src/generators/generator_helper.dart'; -import 'package:flutter_gen/src/settings/color_path.dart'; -import 'package:flutter_gen/src/settings/flutter_gen.dart'; -import 'package:flutter_gen/src/utils/camel_case.dart'; -import 'package:flutter_gen/src/utils/color.dart'; import 'package:path/path.dart'; import 'package:xml/xml.dart'; +import '../settings/color_path.dart'; +import '../settings/flutter_gen.dart'; +import '../utils/camel_case.dart'; +import '../utils/color.dart'; +import 'generator_helper.dart'; + String generateColors( File pubspecFile, DartFormatter formatter, FlutterGenColors colors) { assert( diff --git a/lib/src/generators/fonts_generator.dart b/lib/src/generators/fonts_generator.dart index ffa79467f..6b58467ee 100644 --- a/lib/src/generators/fonts_generator.dart +++ b/lib/src/generators/fonts_generator.dart @@ -1,10 +1,11 @@ import 'package:dart_style/dart_style.dart'; -import 'package:flutter_gen/src/generators/generator_helper.dart'; -import 'package:flutter_gen/src/settings/flutter.dart'; -import 'package:flutter_gen/src/utils/camel_case.dart'; -import 'package:flutter_gen/src/utils/cast.dart'; -import 'package:yaml/yaml.dart'; import 'package:dartx/dartx.dart'; +import 'package:yaml/yaml.dart'; + +import '../settings/flutter.dart'; +import '../utils/camel_case.dart'; +import '../utils/cast.dart'; +import 'generator_helper.dart'; String generateFonts(DartFormatter formatter, FlutterFonts fonts) { assert(fonts != null && fonts.hasFonts, diff --git a/lib/src/generators/integrations/svg_integration.dart b/lib/src/generators/integrations/svg_integration.dart index d13743907..c3850d1f7 100644 --- a/lib/src/generators/integrations/svg_integration.dart +++ b/lib/src/generators/integrations/svg_integration.dart @@ -1,4 +1,4 @@ -import 'package:flutter_gen/src/generators/integrations/integration.dart'; +import 'integration.dart'; class SvgIntegration extends Integration { @override diff --git a/lib/src/settings/config.dart b/lib/src/settings/config.dart index 1e7bfca78..d37f7dcdc 100644 --- a/lib/src/settings/config.dart +++ b/lib/src/settings/config.dart @@ -1,25 +1,28 @@ import 'dart:io'; -import 'package:flutter_gen/src/settings/flutter.dart'; -import 'package:flutter_gen/src/settings/flutter_gen.dart'; -import 'package:flutter_gen/src/utils/cast.dart'; import 'package:path/path.dart'; import 'package:yaml/yaml.dart'; +import '../utils/cast.dart'; +import 'flutter.dart'; +import 'flutter_gen.dart'; + class Config { Config(this.pubspecFile); - // ignore: non_constant_identifier_names - static final String DEFAULT_OUTPUT = 'lib${separator}gen$separator'; - static const int DEFAULT_LINE_LENGTH = 80; + static final String defaultOutput = 'lib${separator}gen$separator'; + static const int defaultLineLength = 80; final File pubspecFile; Flutter flutter; FlutterGen flutterGen; Future load() async { - print( - 'FlutterGen Loading ... ${join(basename(pubspecFile.parent.path), basename(pubspecFile.path))}'); + print('FlutterGen Loading ... ' + '${normalize(join( + basename(pubspecFile.parent.path), + basename(pubspecFile.path), + ))}'); final pubspec = await pubspecFile.readAsString().catchError((dynamic error) { throw FileSystemException( diff --git a/lib/src/settings/flutter.dart b/lib/src/settings/flutter.dart index 2e5692bf9..3ee5dc285 100644 --- a/lib/src/settings/flutter.dart +++ b/lib/src/settings/flutter.dart @@ -1,6 +1,7 @@ -import 'package:flutter_gen/src/utils/cast.dart'; import 'package:yaml/yaml.dart'; +import '../utils/cast.dart'; + class Flutter { Flutter(YamlMap flutterMap) { if (flutterMap != null) { diff --git a/lib/src/settings/flutter_gen.dart b/lib/src/settings/flutter_gen.dart index c0b372a54..4eedd86d2 100644 --- a/lib/src/settings/flutter_gen.dart +++ b/lib/src/settings/flutter_gen.dart @@ -1,9 +1,10 @@ import 'dart:io'; -import 'package:flutter_gen/src/settings/config.dart'; -import 'package:flutter_gen/src/utils/cast.dart'; import 'package:yaml/yaml.dart'; +import '../utils/cast.dart'; +import 'config.dart'; + class FlutterGen { FlutterGen(YamlMap flutterGenMap) { if (flutterGenMap != null) { @@ -24,11 +25,11 @@ class FlutterGen { String get output => _output != null && FileSystemEntity.isDirectorySync(_output) ? _output - : Config.DEFAULT_OUTPUT; + : Config.defaultOutput; int _lineLength; - int get lineLength => _lineLength ?? Config.DEFAULT_LINE_LENGTH; + int get lineLength => _lineLength ?? Config.defaultLineLength; FlutterGenIntegrations integrations; diff --git a/lib/src/utils/color.dart b/lib/src/utils/color.dart index ab79fd365..06bdbd03f 100644 --- a/lib/src/utils/color.dart +++ b/lib/src/utils/color.dart @@ -1,7 +1,7 @@ String colorFromHex(String hexColor) { hexColor = hexColor.toUpperCase().replaceFirst('#', ''); if (hexColor.length == 6) { - hexColor = 'FF' + hexColor; + hexColor = 'FF$hexColor'; } return '0x$hexColor'; } diff --git a/package-lock.json b/package-lock.json index 687ddcd0b..a41aaa87f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -147,16 +147,16 @@ "dev": true }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "error-ex": { @@ -200,15 +200,15 @@ "dev": true }, "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", "dev": true, "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", @@ -240,9 +240,9 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "lines-and-columns": { @@ -366,9 +366,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" diff --git a/package.json b/package.json index 99d4b6d02..61eff3027 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,6 @@ } }, "devDependencies": { - "husky": "^4.2.5" + "husky": "^4.3.0" } } diff --git a/pubspec.lock b/pubspec.lock index 245ec704c..cb3e88b7d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -141,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.5.0" + effective_dart: + dependency: "direct dev" + description: + name: effective_dart + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.4" glob: dependency: transitive description: @@ -275,7 +282,7 @@ packages: source: hosted version: "1.7.0" pedantic: - dependency: "direct dev" + dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" diff --git a/pubspec.yaml b/pubspec.yaml index 00743ad34..26d56ead3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,5 +28,5 @@ dependencies: dev_dependencies: test: test_coverage: - pedantic: + effective_dart: build_test: