From 75b3b25117daf9625baa5dbcdd11a6c9c6ab5679 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Mon, 4 Feb 2019 21:01:50 +0100 Subject: [PATCH] Specify analysis rules and conform to them --- analysis_options.yaml | 80 +++++++++++++++++++ sally/analysis_options.yaml | 1 + sally/lib/src/runtime/components/where.dart | 2 +- .../lib/src/runtime/executor/type_system.dart | 2 +- sally/lib/src/runtime/expressions/bools.dart | 8 +- .../src/runtime/expressions/expression.dart | 11 ++- .../src/runtime/expressions/variables.dart | 2 +- sally/lib/src/runtime/sql_types.dart | 6 +- sally/lib/src/runtime/statements/select.dart | 1 + sally/lib/src/runtime/structure/columns.dart | 3 + sally/test/generated_tables.dart | 13 +-- sally/test/queries_test.dart | 28 +++---- sally_generator/analysis_options.yaml | 1 + sally_generator/lib/generator.dart | 2 +- sally_generator/lib/src/errors.dart | 2 +- .../lib/src/model/specified_column.dart | 3 + .../lib/src/parser/column_parser.dart | 36 ++++----- sally_generator/lib/src/parser/parser.dart | 5 +- .../lib/src/parser/table_parser.dart | 10 +-- sally_generator/lib/src/sally_generator.dart | 10 +-- sally_generator/lib/src/utils/type_utils.dart | 4 +- sally_generator/test/parser/parser_test.dart | 50 ++++++------ 22 files changed, 190 insertions(+), 90 deletions(-) create mode 100644 analysis_options.yaml create mode 120000 sally/analysis_options.yaml create mode 120000 sally_generator/analysis_options.yaml diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 00000000..f0ff2379 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,80 @@ + +analyzer: + strong-mode: + implicit-casts: false + errors: + unused_element: error + unused_import: error + unused_local_variable: error + dead_code: error + override_on_non_overriding_method: error +linter: + rules: + - annotate_overrides + - avoid_empty_else + - avoid_function_literals_in_foreach_calls + - avoid_init_to_null + - avoid_null_checks_in_equality_operators + - avoid_relative_lib_imports + - avoid_return_types_on_setters + - avoid_returning_null + - avoid_types_as_parameter_names + - avoid_unused_constructor_parameters + - await_only_futures + - camel_case_types + - cancel_subscriptions + - cascade_invocations + - comment_references + - constant_identifier_names + - control_flow_in_finally + - directives_ordering + - empty_catches + - empty_constructor_bodies + - empty_statements + - hash_and_equals + - implementation_imports + - invariant_booleans + - iterable_contains_unrelated_type + - library_names + - library_prefixes + - list_remove_unrelated_type + - no_adjacent_strings_in_list + - no_duplicate_case_values + - non_constant_identifier_names + - null_closures + - omit_local_variable_types + - only_throw_errors + - overridden_fields + - package_api_docs + - package_names + - package_prefixed_library_names + - prefer_adjacent_string_concatenation + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_contains + - prefer_equal_for_default_values + - prefer_final_fields + - prefer_initializing_formals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_single_quotes + - prefer_typing_uninitialized_variables + - recursive_getters + - slash_for_doc_comments + - super_goes_last + - test_types_in_equals + - throw_in_finally + - type_init_formals + - unawaited_futures + - unnecessary_brace_in_string_interps + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_statements + - unnecessary_this + - unrelated_type_equality_checks + - use_rethrow_when_possible + - valid_regexps diff --git a/sally/analysis_options.yaml b/sally/analysis_options.yaml new file mode 120000 index 00000000..c9e0d9fb --- /dev/null +++ b/sally/analysis_options.yaml @@ -0,0 +1 @@ +../analysis_options.yaml \ No newline at end of file diff --git a/sally/lib/src/runtime/components/where.dart b/sally/lib/src/runtime/components/where.dart index 2838c89a..8e9e892b 100644 --- a/sally/lib/src/runtime/components/where.dart +++ b/sally/lib/src/runtime/components/where.dart @@ -9,7 +9,7 @@ class Where extends Component { @override void writeInto(GenerationContext context) { - context.buffer.write("WHERE "); + context.buffer.write('WHERE '); predicate.writeInto(context); } } diff --git a/sally/lib/src/runtime/executor/type_system.dart b/sally/lib/src/runtime/executor/type_system.dart index 99a9c182..f71e8306 100644 --- a/sally/lib/src/runtime/executor/type_system.dart +++ b/sally/lib/src/runtime/executor/type_system.dart @@ -11,6 +11,6 @@ class SqlTypeSystem { /// Returns the appropriate sql type for the dart type provided as the /// generic parameter. SqlType forDartType() { - return types.singleWhere((t) => t is SqlType); + return types.singleWhere((t) => t is SqlType) as SqlType; } } diff --git a/sally/lib/src/runtime/expressions/bools.dart b/sally/lib/src/runtime/expressions/bools.dart index 65537263..d205c3b5 100644 --- a/sally/lib/src/runtime/expressions/bools.dart +++ b/sally/lib/src/runtime/expressions/bools.dart @@ -8,17 +8,21 @@ Expression and(Expression a, Expression b) => Expression not(Expression a) => NotExpression(a); class AndExpression extends Expression with InfixOperator { + @override Expression left, right; - final String operator = "AND"; + @override + final String operator = 'AND'; AndExpression(this.left, this.right); } class OrExpression extends Expression with InfixOperator { + @override Expression left, right; - final String operator = "AND"; + @override + final String operator = 'AND'; OrExpression(this.left, this.right); } diff --git a/sally/lib/src/runtime/expressions/expression.dart b/sally/lib/src/runtime/expressions/expression.dart index e37c5814..0d7006a5 100644 --- a/sally/lib/src/runtime/expressions/expression.dart +++ b/sally/lib/src/runtime/expressions/expression.dart @@ -39,21 +39,24 @@ abstract class InfixOperator implements Expression { } } -enum ComparisonOperator { less, less_or_equal, equal, more_or_equal, more } +enum ComparisonOperator { less, lessOrEqual, equal, moreOrEqual, more } class Comparison extends InfixOperator { static const Map operatorNames = { ComparisonOperator.less: '<', - ComparisonOperator.less_or_equal: '<=', + ComparisonOperator.lessOrEqual: '<=', ComparisonOperator.equal: '=', - ComparisonOperator.more_or_equal: '>=', + ComparisonOperator.moreOrEqual: '>=', ComparisonOperator.more: '>' }; + @override final Expression left; + @override final Expression right; final ComparisonOperator op; + @override final bool placeBrackets = false; @override @@ -61,5 +64,5 @@ class Comparison extends InfixOperator { Comparison(this.left, this.op, this.right); - Comparison.equal(this.left, this.right) : this.op = ComparisonOperator.equal; + Comparison.equal(this.left, this.right) : op = ComparisonOperator.equal; } diff --git a/sally/lib/src/runtime/expressions/variables.dart b/sally/lib/src/runtime/expressions/variables.dart index 16e43661..90990491 100644 --- a/sally/lib/src/runtime/expressions/variables.dart +++ b/sally/lib/src/runtime/expressions/variables.dart @@ -10,7 +10,7 @@ class Variable> extends Expression { @override void writeInto(GenerationContext context) { context.introduceVariable(value); - context.buffer.write("?"); + context.buffer.write('?'); } } diff --git a/sally/lib/src/runtime/sql_types.dart b/sally/lib/src/runtime/sql_types.dart index e0605475..7f18d65b 100644 --- a/sally/lib/src/runtime/sql_types.dart +++ b/sally/lib/src/runtime/sql_types.dart @@ -27,7 +27,7 @@ class BoolType extends SqlType { @override String mapToSqlConstant(bool content) { - return content ? "1" : "0"; + return content ? '1' : '0'; } @override @@ -40,7 +40,7 @@ class StringType extends SqlType { const StringType(); @override - String mapFromDatabaseResponse(response) => response; + String mapFromDatabaseResponse(response) => response as String; @override String mapToSqlConstant(String content) { @@ -56,7 +56,7 @@ class IntType extends SqlType { const IntType(); @override - int mapFromDatabaseResponse(response) => response; + int mapFromDatabaseResponse(response) => response as int; @override String mapToSqlConstant(int content) => content.toString(); diff --git a/sally/lib/src/runtime/statements/select.dart b/sally/lib/src/runtime/statements/select.dart index 9c7a8596..067c2bb3 100644 --- a/sally/lib/src/runtime/statements/select.dart +++ b/sally/lib/src/runtime/statements/select.dart @@ -5,6 +5,7 @@ import 'package:sally/src/runtime/structure/table_info.dart'; class SelectStatement extends Query { @override + // ignore: overridden_fields covariant TableInfo table; SelectStatement(GeneratedDatabase database, this.table) diff --git a/sally/lib/src/runtime/structure/columns.dart b/sally/lib/src/runtime/structure/columns.dart index cca4be9a..aa20e223 100644 --- a/sally/lib/src/runtime/structure/columns.dart +++ b/sally/lib/src/runtime/structure/columns.dart @@ -23,6 +23,7 @@ abstract class GeneratedColumn> extends Column { class GeneratedTextColumn extends GeneratedColumn implements TextColumn { + @override final String $name; GeneratedTextColumn(this.$name); @@ -34,6 +35,7 @@ class GeneratedTextColumn extends GeneratedColumn class GeneratedBoolColumn extends GeneratedColumn implements BoolColumn { + @override final String $name; GeneratedBoolColumn(this.$name); @@ -48,6 +50,7 @@ class GeneratedBoolColumn extends GeneratedColumn class GeneratedIntColumn extends GeneratedColumn implements IntColumn { + @override final String $name; GeneratedIntColumn(this.$name); diff --git a/sally/test/generated_tables.dart b/sally/test/generated_tables.dart index cb2ca882..3e510e4c 100644 --- a/sally/test/generated_tables.dart +++ b/sally/test/generated_tables.dart @@ -19,13 +19,16 @@ class GeneratedUsersTable extends Users with TableInfo { GeneratedUsersTable(this.db); - IntColumn id = GeneratedIntColumn("id"); - TextColumn name = GeneratedTextColumn("name"); - BoolColumn isAwesome = GeneratedBoolColumn("is_awesome"); + @override + IntColumn id = GeneratedIntColumn('id'); + @override + TextColumn name = GeneratedTextColumn('name'); + @override + BoolColumn isAwesome = GeneratedBoolColumn('is_awesome'); @override List> get $columns => [id, name, isAwesome]; @override - String get $tableName => "users"; + String get $tableName => 'users'; @override Users get asDslTable => this; @override @@ -36,7 +39,7 @@ class GeneratedUsersTable extends Users with TableInfo { class TestDatabase extends GeneratedDatabase { TestDatabase(QueryExecutor executor) - : super(SqlTypeSystem.withDefaults(), executor); + : super(const SqlTypeSystem.withDefaults(), executor); GeneratedUsersTable get users => GeneratedUsersTable(this); } diff --git a/sally/test/queries_test.dart b/sally/test/queries_test.dart index ecac340e..9c465302 100644 --- a/sally/test/queries_test.dart +++ b/sally/test/queries_test.dart @@ -17,40 +17,40 @@ void main() { when(executor.runSelect(any, any)).thenAnswer((_) => Future.value([])); }); - group("Generates SELECT statements", () { - test("generates simple statements", () { + group('Generates SELECT statements', () { + test('generates simple statements', () { db.select(db.users).get(); - verify(executor.runSelect("SELECT * FROM users;", argThat(isEmpty))); + verify(executor.runSelect('SELECT * FROM users;', argThat(isEmpty))); }); - test("generates limit statements", () { + test('generates limit statements', () { (db.select(db.users)..limit(10)).get(); verify(executor.runSelect( - "SELECT * FROM users LIMIT 10;", argThat(isEmpty))); + 'SELECT * FROM users LIMIT 10;', argThat(isEmpty))); }); - test("generates like expressions", () { - (db.select(db.users)..where((u) => u.name.like("Dash%"))).get(); + test('generates like expressions', () { + (db.select(db.users)..where((u) => u.name.like('Dash%'))).get(); verify(executor - .runSelect("SELECT * FROM users WHERE name LIKE ?;", ["Dash%"])); + .runSelect('SELECT * FROM users WHERE name LIKE ?;', ['Dash%'])); }); - test("generates complex predicates", () { + test('generates complex predicates', () { (db.select(db.users) ..where((u) => - and(not(u.name.equalsVal("Dash")), (u.id.isBiggerThan(12))))) + and(not(u.name.equalsVal('Dash')), (u.id.isBiggerThan(12))))) .get(); verify(executor.runSelect( - "SELECT * FROM users WHERE (NOT name = ?) AND (id > ?);", - ["Dash", 12])); + 'SELECT * FROM users WHERE (NOT name = ?) AND (id > ?);', + ['Dash', 12])); }); - test("generates expressions from boolean fields", () { + test('generates expressions from boolean fields', () { (db.select(db.users)..where((u) => u.isAwesome)).get(); verify(executor.runSelect( - "SELECT * FROM users WHERE (is_awesome = 1);", argThat(isEmpty))); + 'SELECT * FROM users WHERE (is_awesome = 1);', argThat(isEmpty))); }); }); diff --git a/sally_generator/analysis_options.yaml b/sally_generator/analysis_options.yaml new file mode 120000 index 00000000..c9e0d9fb --- /dev/null +++ b/sally_generator/analysis_options.yaml @@ -0,0 +1 @@ +../analysis_options.yaml \ No newline at end of file diff --git a/sally_generator/lib/generator.dart b/sally_generator/lib/generator.dart index ca917a62..9f570d95 100644 --- a/sally_generator/lib/generator.dart +++ b/sally_generator/lib/generator.dart @@ -3,4 +3,4 @@ import 'package:source_gen/source_gen.dart'; import 'package:sally_generator/src/sally_generator.dart'; Builder sallyBuilder(BuilderOptions _) => - new SharedPartBuilder([SallyGenerator()], "sally"); + SharedPartBuilder([SallyGenerator()], 'sally'); diff --git a/sally_generator/lib/src/errors.dart b/sally_generator/lib/src/errors.dart index b2a14b90..2b889fbe 100644 --- a/sally_generator/lib/src/errors.dart +++ b/sally_generator/lib/src/errors.dart @@ -6,7 +6,7 @@ class SallyError { final Element affectedElement; SallyError( - {this.critical = false, this.message, this.affectedElement = null}); + {this.critical = false, this.message, this.affectedElement}); } class ErrorStore { diff --git a/sally_generator/lib/src/model/specified_column.dart b/sally_generator/lib/src/model/specified_column.dart index 260d7cc5..1d0c30b6 100644 --- a/sally_generator/lib/src/model/specified_column.dart +++ b/sally_generator/lib/src/model/specified_column.dart @@ -54,6 +54,9 @@ class AutoIncrement extends ColumnFeature { @override bool operator ==(other) => other is AutoIncrement; + + @override + int get hashCode => 1337420; } abstract class LimitingTextLength extends ColumnFeature diff --git a/sally_generator/lib/src/parser/column_parser.dart b/sally_generator/lib/src/parser/column_parser.dart index 3f6c2cb9..9946cdbe 100644 --- a/sally_generator/lib/src/parser/column_parser.dart +++ b/sally_generator/lib/src/parser/column_parser.dart @@ -4,22 +4,22 @@ import 'package:sally_generator/src/model/specified_column.dart'; import 'package:sally_generator/src/parser/parser.dart'; import 'package:sally_generator/src/sally_generator.dart'; -const String startInt = "integer"; -const String startString = "text"; -const String startBool = "boolean"; +const String startInt = 'integer'; +const String startString = 'text'; +const String startBool = 'boolean'; // todo replace with set literal once dart supports it final Set starters = [startInt, startString, startBool].toSet(); -const String functionNamed = "named"; -const String functionPrimaryKey = "primaryKey"; -const String functionReferences = "references"; -const String functionAutoIncrement = "autoIncrement"; -const String functionWithLength = "withLength"; +const String functionNamed = 'named'; +const String functionPrimaryKey = 'primaryKey'; +const String functionReferences = 'references'; +const String functionAutoIncrement = 'autoIncrement'; +const String functionWithLength = 'withLength'; -const String errorMessage = "This getter does not create a valid column that " - "can be parsed by sally. Please refer to the readme from sally to see how " - "columns are formed. If you have any questions, feel free to raise an issue."; +const String errorMessage = 'This getter does not create a valid column that ' + 'can be parsed by sally. Please refer to the readme from sally to see how ' + 'columns are formed. If you have any questions, feel free to raise an issue.'; class ColumnParser extends ParserBase { ColumnParser(SallyGenerator generator) : super(generator); @@ -51,9 +51,9 @@ class ColumnParser extends ParserBase { String foundStartMethod; String foundExplicitName; - bool wasDeclaredAsPrimaryKey = false; + var wasDeclaredAsPrimaryKey = false; // todo parse reference - List foundFeatures = []; + final foundFeatures = []; while (true) { final methodName = remainingExpr.methodName.name; @@ -71,7 +71,7 @@ class ColumnParser extends ParserBase { affectedElement: getter.declaredElement, message: "You're setting more than one name here, the first will " - "be used")); + 'be used')); } foundExplicitName = @@ -80,8 +80,8 @@ class ColumnParser extends ParserBase { critical: false, affectedElement: getter.declaredElement, message: - "This table name is cannot be resolved! Please only use " - "a constant string as parameter for .named().")); + 'This table name is cannot be resolved! Please only use ' + 'a constant string as parameter for .named().')); }); break; case functionPrimaryKey: @@ -91,8 +91,8 @@ class ColumnParser extends ParserBase { break; // todo: parsing this is going to suck case functionWithLength: final args = remainingExpr.argumentList; - final minArg = findNamedArgument(args, "min"); - final maxArg = findNamedArgument(args, "max"); + final minArg = findNamedArgument(args, 'min'); + final maxArg = findNamedArgument(args, 'max'); foundFeatures.add(LimitingTextLength.withLength( min: readIntLiteral(minArg, () {}), diff --git a/sally_generator/lib/src/parser/parser.dart b/sally_generator/lib/src/parser/parser.dart index 7cde4b13..1095a12b 100644 --- a/sally_generator/lib/src/parser/parser.dart +++ b/sally_generator/lib/src/parser/parser.dart @@ -22,7 +22,7 @@ class ParserBase { affectedElement: method.declaredElement, critical: true, message: - "This method must have an expression body (use => instead of {return ...})")); + 'This method must have an expression body (use => instead of {return ...})')); return null; } @@ -33,7 +33,7 @@ class ParserBase { if (!(expression is StringLiteral)) { onError(); } else { - String value = (expression as StringLiteral).stringValue; + final value = (expression as StringLiteral).stringValue; if (value == null) onError(); else @@ -46,6 +46,7 @@ class ParserBase { int readIntLiteral(Expression expression, void onError()) { if (!(expression is IntegerLiteral)) { onError(); + // ignore: avoid_returning_null return null; } else { return (expression as IntegerLiteral).value; diff --git a/sally_generator/lib/src/parser/table_parser.dart b/sally_generator/lib/src/parser/table_parser.dart index 6b7e0558..4f607137 100644 --- a/sally_generator/lib/src/parser/table_parser.dart +++ b/sally_generator/lib/src/parser/table_parser.dart @@ -12,19 +12,19 @@ class TableParser extends ParserBase { TableParser(SallyGenerator generator) : super(generator); SpecifiedTable parse(ClassElement element) { - String sqlName = _parseTableName(element); + final sqlName = _parseTableName(element); return SpecifiedTable( fromClass: element, columns: _parseColumns(element), sqlName: sqlName, dartTypeName: - "${element.name}_Data" // TODO better name for generated data classes + '${element.name}_Data' // TODO better name for generated data classes ); } String _parseTableName(ClassElement element) { - final tableNameGetter = element.getGetter("tableName"); + final tableNameGetter = element.getGetter('tableName'); if (tableNameGetter == null) { // class does not override tableName. So just use the dart class name // instead. Will use placed_orders for a class called PlacedOrders @@ -38,11 +38,11 @@ class TableParser extends ParserBase { final returnExpr = returnExpressionOfMethod( tableNameDeclaration.node as MethodDeclaration); - String tableName = readStringLiteral(returnExpr, () { + final tableName = readStringLiteral(returnExpr, () { generator.errors.add(SallyError( critical: true, message: - "This getter must return a string literal, and do nothing more", + 'This getter must return a string literal, and do nothing more', affectedElement: tableNameGetter)); }); diff --git a/sally_generator/lib/src/sally_generator.dart b/sally_generator/lib/src/sally_generator.dart index 0c58b395..429d31be 100644 --- a/sally_generator/lib/src/sally_generator.dart +++ b/sally_generator/lib/src/sally_generator.dart @@ -8,8 +8,8 @@ import 'package:sally_generator/src/parser/table_parser.dart'; import 'package:source_gen/source_gen.dart'; class SallyGenerator extends Generator { - Map _astForLibs = Map(); - ErrorStore errors = ErrorStore(); + final Map _astForLibs = {}; + final ErrorStore errors = ErrorStore(); TableParser tableParser; ColumnParser columnParser; @@ -25,12 +25,12 @@ class SallyGenerator extends Generator { @override String generate(LibraryReader library, BuildStep buildStep) { - final testUsers = library.findType("Users"); + final testUsers = library.findType('Users'); - if (testUsers == null) return ""; + if (testUsers == null) return ''; TableParser(this).parse(testUsers); - return ""; + return ''; } } diff --git a/sally_generator/lib/src/utils/type_utils.dart b/sally_generator/lib/src/utils/type_utils.dart index ba38b683..1916704e 100644 --- a/sally_generator/lib/src/utils/type_utils.dart +++ b/sally_generator/lib/src/utils/type_utils.dart @@ -1,9 +1,9 @@ import 'package:analyzer/dart/element/type.dart'; bool isFromSally(DartType type) { - return type.element.library.location.components.first.contains("sally"); + return type.element.library.location.components.first.contains('sally'); } bool isColumn(DartType type) { - return isFromSally(type) && type.name.contains("Column"); + return isFromSally(type) && type.name.contains('Column'); } diff --git a/sally_generator/test/parser/parser_test.dart b/sally_generator/test/parser/parser_test.dart index fe0aae18..55b254ac 100644 --- a/sally_generator/test/parser/parser_test.dart +++ b/sally_generator/test/parser/parser_test.dart @@ -36,7 +36,7 @@ void main() async { @override String get tableName => constructTableName();" } - ''', (r) => r.findLibraryByName("test_parser")); + ''', (r) => r.findLibraryByName('test_parser')); }); setUp(() { @@ -44,57 +44,57 @@ void main() async { generator.columnParser = ColumnParser(generator); }); - group("SQL table name", () { - test("should parse correctly when valid", () { + group('SQL table name', () { + test('should parse correctly when valid', () { expect( TableParser(generator) - .parse(testLib.getType("TableWithCustomName")) + .parse(testLib.getType('TableWithCustomName')) .sqlName, - equals("my-fancy-table")); + equals('my-fancy-table')); }); - test("should use class name if table name is not specified", () { - expect(TableParser(generator).parse(testLib.getType("Users")).sqlName, - equals("users")); + test('should use class name if table name is not specified', () { + expect(TableParser(generator).parse(testLib.getType('Users')).sqlName, + equals('users')); }); - test("should not parse for complex methods", () async { - TableParser(generator).parse(testLib.getType("WrongName")); + test('should not parse for complex methods', () async { + TableParser(generator).parse(testLib.getType('WrongName')); expect(generator.errors.errors, isNotEmpty); }); }); - group("Columns", () { - test("should use field name if no name has been set explicitely", () { - final table = TableParser(generator).parse(testLib.getType("Users")); + group('Columns', () { + test('should use field name if no name has been set explicitely', () { + final table = TableParser(generator).parse(testLib.getType('Users')); final idColumn = - table.columns.singleWhere((col) => col.name.name == "id"); + table.columns.singleWhere((col) => col.name.name == 'id'); - expect(idColumn.name, equals(ColumnName.implicitly("id"))); + expect(idColumn.name, equals(ColumnName.implicitly('id'))); }); - test("should use explicit name, if it exists", () { - final table = TableParser(generator).parse(testLib.getType("Users")); + test('should use explicit name, if it exists', () { + final table = TableParser(generator).parse(testLib.getType('Users')); final idColumn = - table.columns.singleWhere((col) => col.name.name == "user_name"); + table.columns.singleWhere((col) => col.name.name == 'user_name'); - expect(idColumn.name, equals(ColumnName.explicitly("user_name"))); + expect(idColumn.name, equals(ColumnName.explicitly('user_name'))); }); - test("should parse min and max length for text columns", () { - final table = TableParser(generator).parse(testLib.getType("Users")); + test('should parse min and max length for text columns', () { + final table = TableParser(generator).parse(testLib.getType('Users')); final idColumn = - table.columns.singleWhere((col) => col.name.name == "user_name"); + table.columns.singleWhere((col) => col.name.name == 'user_name'); expect(idColumn.features, contains(LimitingTextLength.withLength(min: 6, max: 32))); }); - test("should only parse max length when relevant", () { - final table = TableParser(generator).parse(testLib.getType("Users")); + test('should only parse max length when relevant', () { + final table = TableParser(generator).parse(testLib.getType('Users')); final idColumn = - table.columns.singleWhere((col) => col.name.name == "onlyMax"); + table.columns.singleWhere((col) => col.name.name == 'onlyMax'); expect( idColumn.features, contains(LimitingTextLength.withLength(max: 100)));