From 5b2b1e92fb5a38aaa7948d6b0d6bc0d706144ac0 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 7 Jan 2023 18:26:02 -0800 Subject: [PATCH] Move to new analyzer language settings Enable and fix a bunch of lints. Require Dart 2.18 or greater --- .github/workflows/test-package.yml | 2 +- CHANGELOG.md | 1 + analysis_options.yaml | 74 ++++++++---------- lib/src/logger.dart | 6 +- pubspec.yaml | 4 +- test/logging_test.dart | 116 ++++++++++++++--------------- 6 files changed, 98 insertions(+), 105 deletions(-) diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index c356000..cc5abcf 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest] - sdk: [2.12.0, dev] + sdk: [2.18.0, dev] steps: - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d diff --git a/CHANGELOG.md b/CHANGELOG.md index 614a925..afde9c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 1.1.1-dev * Add a check that throws if a logger name ends with '.'. +* Require Dart 2.18 ## 1.1.0 diff --git a/analysis_options.yaml b/analysis_options.yaml index b143be9..ecc7948 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,63 +1,55 @@ +# https://dart.dev/guides/language/analysis-options include: package:lints/recommended.yaml analyzer: - strong-mode: - implicit-casts: false + language: + strict-casts: true + strict-raw-types: true linter: rules: - - annotate_overrides + - always_declare_return_types + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_classes_with_only_static_members - avoid_dynamic_calls - - avoid_function_literals_in_foreach_calls - - avoid_init_to_null - - avoid_null_checks_in_equality_operators - - avoid_relative_lib_imports + - avoid_private_typedef_functions + - avoid_redundant_argument_values - avoid_returning_null + - avoid_returning_null_for_future + - avoid_returning_this - avoid_unused_constructor_parameters - - await_only_futures - - camel_case_types + - avoid_void_async - cancel_subscriptions - comment_references - # See https://github.com/dart-lang/logging/issues/43 - #- constant_identifier_names - - control_flow_in_finally - directives_ordering - - empty_catches - - empty_constructor_bodies - - empty_statements - - hash_and_equals - - implementation_imports - - iterable_contains_unrelated_type - - library_names - - library_prefixes - - list_remove_unrelated_type + - join_return_with_assignment + - lines_longer_than_80_chars + - literal_only_boolean_expressions + - missing_whitespace_between_adjacent_strings - no_adjacent_strings_in_list - - non_constant_identifier_names + - no_runtimeType_toString - 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_asserts_in_initializer_lists - prefer_const_constructors - - prefer_final_fields - - prefer_generic_function_type_aliases - - prefer_initializing_formals - - prefer_interpolation_to_compose_strings + - prefer_const_declarations + - prefer_expression_function_bodies + - prefer_final_locals + - prefer_relative_imports - prefer_single_quotes - - prefer_typing_uninitialized_variables - - slash_for_doc_comments + - sort_pub_dependencies - test_types_in_equals - throw_in_finally - - type_init_formals - - unnecessary_brace_in_string_interps - - unnecessary_const - - unnecessary_getters_setters + - type_annotate_public_apis + - unawaited_futures + - unnecessary_await_in_return - unnecessary_lambdas - - unnecessary_new - - unnecessary_null_aware_assignments + - unnecessary_parenthesis + - unnecessary_raw_strings - unnecessary_statements - - unnecessary_this + - use_if_null_to_convert_nulls_to_bools + - use_raw_strings + - use_string_buffers + - use_super_parameters diff --git a/lib/src/logger.dart b/lib/src/logger.dart index 96ab556..f90fd06 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -83,7 +83,7 @@ class Logger { } // Split hierarchical names (separated with '.'). - var dot = name.lastIndexOf('.'); + final dot = name.lastIndexOf('.'); Logger? parent; String thisName; if (dot == -1) { @@ -161,7 +161,7 @@ class Logger { } /// Whether a message for [value]'s level is loggable in this logger. - bool isLoggable(Level value) => (value >= level); + bool isLoggable(Level value) => value >= level; /// Adds a log record for a [message] at a particular [logLevel] if /// `isLoggable(logLevel)` is true. @@ -202,7 +202,7 @@ class Logger { } zone ??= Zone.current; - var record = + final record = LogRecord(logLevel, msg, fullName, error, stackTrace, zone, object); if (parent == null) { diff --git a/pubspec.yaml b/pubspec.yaml index da9a138..d0f6894 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,8 +7,8 @@ description: >- repository: https://github.com/dart-lang/logging environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.18.0 <3.0.0" dev_dependencies: - lints: '>=1.0.0 <3.0.0' + lints: ^2.0.0 test: ^1.16.0 diff --git a/test/logging_test.dart b/test/logging_test.dart index 2033214..4a7d40a 100644 --- a/test/logging_test.dart +++ b/test/logging_test.dart @@ -13,26 +13,26 @@ void main() { final hierarchicalLoggingEnabledDefault = hierarchicalLoggingEnabled; test('level comparison is a valid comparator', () { - var level1 = const Level('NOT_REAL1', 253); + const level1 = Level('NOT_REAL1', 253); expect(level1 == level1, isTrue); expect(level1 <= level1, isTrue); expect(level1 >= level1, isTrue); expect(level1 < level1, isFalse); expect(level1 > level1, isFalse); - var level2 = const Level('NOT_REAL2', 455); + const level2 = Level('NOT_REAL2', 455); expect(level1 <= level2, isTrue); expect(level1 < level2, isTrue); expect(level2 >= level1, isTrue); expect(level2 > level1, isTrue); - var level3 = const Level('NOT_REAL3', 253); + const level3 = Level('NOT_REAL3', 253); expect(level1, isNot(same(level3))); // different instances expect(level1, equals(level3)); // same value. }); test('default levels are in order', () { - final levels = Level.LEVELS; + const levels = Level.LEVELS; for (var i = 0; i < levels.length; i++) { for (var j = i + 1; j < levels.length; j++) { @@ -55,7 +55,7 @@ void main() { Level.SEVERE, ]; - final sorted = Level.LEVELS; + const sorted = Level.LEVELS; expect(unsorted, isNot(orderedEquals(sorted))); @@ -64,7 +64,7 @@ void main() { }); test('levels are hashable', () { - var map = {}; + final map = {}; map[Level.INFO] = 'info'; map[Level.SHOUT] = 'shout'; expect(map[Level.INFO], same('info')); @@ -87,7 +87,7 @@ void main() { }); test('logger naming is hierarchical', () { - var c = Logger('a.b.c'); + final c = Logger('a.b.c'); expect(c.name, equals('c')); expect(c.parent!.name, equals('b')); expect(c.parent!.parent!.name, equals('a')); @@ -96,7 +96,7 @@ void main() { }); test('logger full name', () { - var c = Logger('a.b.c'); + final c = Logger('a.b.c'); expect(c.fullName, equals('a.b.c')); expect(c.parent!.fullName, equals('a.b')); expect(c.parent!.parent!.fullName, equals('a')); @@ -105,9 +105,9 @@ void main() { }); test('logger parent-child links are correct', () { - var a = Logger('a'); - var b = Logger('a.b'); - var c = Logger('a.c'); + final a = Logger('a'); + final b = Logger('a.b'); + final c = Logger('a.c'); expect(a, same(b.parent)); expect(a, same(c.parent)); expect(a.children['b'], same(b)); @@ -115,10 +115,10 @@ void main() { }); test('loggers are singletons', () { - var a1 = Logger('a'); - var a2 = Logger('a'); - var b = Logger('a.b'); - var root = Logger.root; + final a1 = Logger('a'); + final a2 = Logger('a'); + final b = Logger('a.b'); + final root = Logger.root; expect(a1, same(a2)); expect(a1, same(b.parent)); expect(root, same(a1.parent)); @@ -126,8 +126,8 @@ void main() { }); test('cannot directly manipulate Logger.children', () { - var loggerAB = Logger('a.b'); - var loggerA = loggerAB.parent!; + final loggerAB = Logger('a.b'); + final loggerA = loggerAB.parent!; expect(loggerA.children['b'], same(loggerAB), reason: 'can read Children'); @@ -139,9 +139,9 @@ void main() { test('stackTrace gets throw to LogRecord', () { Logger.root.level = Level.INFO; - var records = []; + final records = []; - var sub = Logger.root.onRecord.listen(records.add); + final sub = Logger.root.onRecord.listen(records.add); try { throw UnsupportedError('test exception'); @@ -156,17 +156,17 @@ void main() { expect(records, hasLength(3)); - var severe = records[0]; + final severe = records[0]; expect(severe.message, 'severe'); expect(severe.error is UnsupportedError, isTrue); expect(severe.stackTrace is StackTrace, isTrue); - var warning = records[1]; + final warning = records[1]; expect(warning.message, 'warning'); expect(warning.error is UnsupportedError, isTrue); expect(warning.stackTrace is StackTrace, isTrue); - var shout = records[2]; + final shout = records[2]; expect(shout.message, 'shout'); expect(shout.error, isNull); expect(shout.stackTrace, isNull); @@ -174,10 +174,10 @@ void main() { group('zone gets recorded to LogRecord', () { test('root zone', () { - var root = Logger.root; + final root = Logger.root; - var recordingZone = Zone.current; - var records = []; + final recordingZone = Zone.current; + final records = []; root.onRecord.listen(records.add); root.info('hello'); @@ -186,10 +186,10 @@ void main() { }); test('child zone', () { - var root = Logger.root; + final root = Logger.root; late Zone recordingZone; - var records = []; + final records = []; root.onRecord.listen(records.add); runZoned(() { @@ -202,10 +202,10 @@ void main() { }); test('custom zone', () { - var root = Logger.root; + final root = Logger.root; late Zone recordingZone; - var records = []; + final records = []; root.onRecord.listen(records.add); runZoned(() { @@ -226,9 +226,9 @@ void main() { }); test('create new instances of Logger', () { - var a1 = Logger.detached('a'); - var a2 = Logger.detached('a'); - var a = Logger('a'); + final a1 = Logger.detached('a'); + final a2 = Logger.detached('a'); + final a = Logger('a'); expect(a1, isNot(a2)); expect(a1, isNot(a)); @@ -236,12 +236,12 @@ void main() { }); test('parent is null', () { - var a = Logger.detached('a'); + final a = Logger.detached('a'); expect(a.parent, null); }); test('children is empty', () { - var a = Logger.detached('a'); + final a = Logger.detached('a'); expect(a.children, {}); }); @@ -292,12 +292,12 @@ void main() { }); group('mutating levels', () { - var root = Logger.root; - var a = Logger('a'); - var b = Logger('a.b'); - var c = Logger('a.b.c'); - var d = Logger('a.b.c.d'); - var e = Logger('a.b.c.d.e'); + final root = Logger.root; + final a = Logger('a'); + final b = Logger('a.b'); + final c = Logger('a.b.c'); + final d = Logger('a.b.c.d'); + final e = Logger('a.b.c.d.e'); setUp(() { hierarchicalLoggingEnabled = true; @@ -411,7 +411,7 @@ void main() { test('logging methods store appropriate level', () { root.level = Level.ALL; - var rootMessages = []; + final rootMessages = []; root.onRecord.listen((record) { rootMessages.add('${record.level}: ${record.message}'); }); @@ -441,7 +441,7 @@ void main() { test('logging methods store exception', () { root.level = Level.ALL; - var rootMessages = []; + final rootMessages = []; root.onRecord.listen((r) { rootMessages.add('${r.level}: ${r.message} ${r.error}'); }); @@ -487,9 +487,9 @@ void main() { test('message logging - no hierarchy', () { root.level = Level.WARNING; - var rootMessages = []; - var aMessages = []; - var cMessages = []; + final rootMessages = []; + final aMessages = []; + final cMessages = []; c.onRecord.listen((record) { cMessages.add('${record.level}: ${record.message}'); }); @@ -538,9 +538,9 @@ void main() { b.level = Level.WARNING; - var rootMessages = []; - var aMessages = []; - var cMessages = []; + final rootMessages = []; + final aMessages = []; + final cMessages = []; c.onRecord.listen((record) { cMessages.add('${record.level}: ${record.message}'); }); @@ -604,7 +604,7 @@ void main() { test('message logging - lazy functions', () { root.level = Level.INFO; - var messages = []; + final messages = []; root.onRecord.listen((record) { messages.add('${record.level}: ${record.message}'); }); @@ -626,9 +626,9 @@ void main() { test('message logging - calls toString', () { root.level = Level.INFO; - var messages = []; - var objects = []; - var object = Object(); + final messages = []; + final objects = []; + final object = Object(); root.onRecord.listen((record) { messages.add('${record.level}: ${record.message}'); objects.add(record.object); @@ -661,14 +661,14 @@ void main() { }); group('recordStackTraceAtLevel', () { - var root = Logger.root; + final root = Logger.root; tearDown(() { recordStackTraceAtLevel = Level.OFF; root.clearListeners(); }); test('no stack trace by default', () { - var records = []; + final records = []; root.onRecord.listen(records.add); root.severe('hello'); root.warning('hello'); @@ -680,7 +680,7 @@ void main() { }); test('trace recorded only on requested levels', () { - var records = []; + final records = []; recordStackTraceAtLevel = Level.WARNING; root.onRecord.listen(records.add); root.severe('hello'); @@ -693,8 +693,8 @@ void main() { }); test('provided trace is used if given', () { - var trace = StackTrace.current; - var records = []; + final trace = StackTrace.current; + final records = []; recordStackTraceAtLevel = Level.WARNING; root.onRecord.listen(records.add); root.severe('hello'); @@ -705,7 +705,7 @@ void main() { }); test('error also generated when generating a trace', () { - var records = []; + final records = []; recordStackTraceAtLevel = Level.WARNING; root.onRecord.listen(records.add); root.severe('hello');