Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Flutter CI
name: Dart CI

on:
pull_request: { }
Expand Down Expand Up @@ -35,4 +35,4 @@ jobs:
- name: Check for any formatting and statically analyze the code.
run: |
make format
make analyze
make analyze
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@
<a href="https://pub.dartlang.org/packages/flutter_gen">
<img src="https://img.shields.io/pub/v/flutter_gen.svg">
</a>
<a href="https://github.com/FlutterGen/flutter_gen/actions?query=workflow%3A%22Flutter+CI%22">
<img src="https://github.com/FlutterGen/flutter_gen/workflows/Flutter%20CI/badge.svg?branch=master" />
<a href="https://github.com/FlutterGen/flutter_gen/actions?query=workflow%3A%22Dart+CI%22">
<img src="https://github.com/FlutterGen/flutter_gen/workflows/Dart%20CI/badge.svg" />
</a>
<a href="https://codecov.io/gh/FlutterGen/flutter_gen">
<img src="https://codecov.io/gh/FlutterGen/flutter_gen/branch/main/graph/badge.svg" />
</a>
<a href="https://pub.dev/packages/effective_dart">
<img src="https://img.shields.io/badge/style-effective_dart-40c4ff.svg" />
</a>
</p>

The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs.
Expand Down
196 changes: 2 additions & 194 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -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
public_member_api_docs: false
15 changes: 8 additions & 7 deletions lib/flutter_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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;
Expand Down
18 changes: 10 additions & 8 deletions lib/src/generators/assets_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
11 changes: 6 additions & 5 deletions lib/src/generators/colors_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
11 changes: 6 additions & 5 deletions lib/src/generators/fonts_generator.dart
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
2 changes: 1 addition & 1 deletion lib/src/generators/integrations/svg_integration.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:flutter_gen/src/generators/integrations/integration.dart';
import 'integration.dart';

class SvgIntegration extends Integration {
@override
Expand Down
19 changes: 11 additions & 8 deletions lib/src/settings/config.dart
Original file line number Diff line number Diff line change
@@ -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<Config> 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(
Expand Down
3 changes: 2 additions & 1 deletion lib/src/settings/flutter.dart
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down
Loading