commit 63d18f5c6c04637ac48d3c8942cae164b8eb0fb2 Author: Hans Kokx Date: Fri Oct 4 13:52:01 2024 +0200 Initial commit Signed-off-by: Hans Kokx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ac5aa98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..24472f1 --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2663184aa79047d0a33a14a3b607954f8fdd8730" + channel: "stable" + +project_type: package diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fae40e7 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +This package provides lint rules for Dart and Flutter which are used by the [Arcane Framework](https://github.com/hanskokx/arcane_framework). For more information, see the [complete list of options](https://github.com/hanskokx/arcane_analysis/blob/main/lib/analysis_options.1.0.0.yaml). + +**Note**: Although the linting rules differ, the package layout has taken enormous inspiration from the excellent [very_good_analysis](https://github.com/VeryGoodOpenSource/very_good_analysis) package from [Very Good Ventures](https://verygood.ventures/), which was in turn heavily inspired by [pedantic](https://github.com/dart-lang/pedantic). + +## Usage + +To use the linting rules, add this package as a dev dependency in your `pubspec.yaml`: + +```shell +dart pub add dev:arcane_analysis +# or +flutter pub add dev:arcane_analysis +``` + +Then, include it in `analysis_options.yaml`: + +```yaml +include: package:arcane_analysis/analysis_options.yaml +``` + +This will ensure you always use the latest version of the lints. If you wish to restrict the lint version, specify a version of `analysis_options.yaml` instead: + +```yaml +include: package:arcane_analysis/analysis_options.1.0.0.yaml +``` + +## Suppressing Lints + +There may be cases where specific lint rules are undesirable. Lint rules can be suppressed at the line, file, or project level. + +An example use case for suppressing lint rules at the file level is suppressing the `prefer_const_constructors` in order to achieve 100% code coverage. This is due to the fact that `const` constructors are executed before the tests are run, resulting in no coverage collection. + +### Line Level + +To suppress a specific lint rule for a specific line of code, use an `ignore` comment directly above the line: + +```dart +void doSomething() { + // ignore: avoid_print + print("This would produce a warning."); +} +``` + +### File Level + +To suppress a specific lint rule of a specific file, use an `ignore_for_file` comment at the top of the file: + +```dart +// ignore_for_file: avoid_print + +void doSomething() { + print("This would produce a warning."); +} +``` + +### Project Level + +To suppress a specific lint rule for an entire project, modify `analysis_options.yaml`: + +```yaml +include: package:arcane_analysis/analysis_options.yaml +linter: + rules: + avoid_print: false +``` + +## Badge + +To indicate your project is using `arcane_analysis` → ![Arcane analysis Badge](https://img.shields.io/badge/style-arcane_analysis-6E35AE) + +```md +[![style: arcane analysis](https://img.shields.io/badge/style-arcane_analysis-6E35AE)](https://pub.dev/packages/arcane_analysis) +``` diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0092317 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1 @@ +include: lib/analyysis_options.yaml diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml new file mode 100644 index 0000000..b4ee426 --- /dev/null +++ b/example/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:arcane_analysis/analysis_options.yaml + +linter: + rules: + public_member_api_docs: false diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..cfd520d --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,12 @@ +// The following syntax deactivates a lint for the entire file: +// ignore_for_file: avoid_print + +void main() { + /// The following line would normally show a lint warning + /// but we can disable the lint rule for this line using the following syntax. + var greeting = 'hello world'; // ignore: prefer_final_locals + + /// The following line would normally show a lint warning + /// but we can disable the lint rule for this file using `ignore_for_file`. + print(greeting); +} diff --git a/lib/analysis_options.1.0.0.yaml b/lib/analysis_options.1.0.0.yaml new file mode 100644 index 0000000..2649a6b --- /dev/null +++ b/lib/analysis_options.1.0.0.yaml @@ -0,0 +1,123 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + errors: + # treat missing required parameters as an error (not a hint) + missing_required_param: error + # treat missing returns as an error (not a hint) + missing_return: error + invalid_annotation_target: ignore + exclude: + - lib/**/*.g.dart + - lib/*.g.dart + - lib/**/*.graphql.dart + - lib/**/*.freezed.dart + - test/**/*.mocks.dart + language: + strict-casts: true + +linter: + rules: + always_declare_return_types: true + always_put_required_named_parameters_first: true + annotate_overrides: true + avoid_annotating_with_dynamic: true + avoid_dynamic_calls: true + avoid_escaping_inner_quotes: true + avoid_function_literals_in_foreach_calls: true + avoid_null_checks_in_equality_operators: true + avoid_print: true + avoid_relative_lib_imports: true + avoid_setters_without_getters: true + avoid_shadowing_type_parameters: true + avoid_single_cascade_in_expression_statements: true + avoid_unnecessary_containers: true + avoid_unused_constructor_parameters: true + avoid_void_async: true + camel_case_extensions: true + camel_case_types: true + cancel_subscriptions: true + close_sinks: true + collection_methods_unrelated_type: true + constant_identifier_names: true + control_flow_in_finally: true + depend_on_referenced_packages: true + directives_ordering: true + empty_constructor_bodies: true + empty_statements: true + eol_at_end_of_file: true + exhaustive_cases: true + file_names: true + flutter_style_todos: true + hash_and_equals: true + implementation_imports: true + implicit_call_tearoffs: true + leading_newlines_in_multiline_strings: true + missing_whitespace_between_adjacent_strings: true + no_adjacent_strings_in_list: true + no_duplicate_case_values: true + no_leading_underscores_for_library_prefixes: true + no_leading_underscores_for_local_identifiers: true + no_logic_in_create_state: true + no_runtimeType_toString: true + non_constant_identifier_names: true + null_check_on_nullable_type_parameter: true + null_closures: true + only_throw_errors: true + package_prefixed_library_names: true + prefer_adjacent_string_concatenation: true + prefer_asserts_in_initializer_lists: true + prefer_collection_literals: true + prefer_conditional_assignment: true + prefer_const_constructors_in_immutables: true + prefer_const_constructors: true + prefer_const_declarations: true + prefer_const_literals_to_create_immutables: true + prefer_constructors_over_static_methods: true + prefer_contains: true + prefer_double_quotes: true + prefer_final_fields: true + prefer_final_in_for_each: true + prefer_final_locals: true + prefer_for_elements_to_map_fromIterable: true + prefer_function_declarations_over_variables: true + prefer_generic_function_type_aliases: true + prefer_if_null_operators: true + prefer_initializing_formals: true + prefer_inlined_adds: true + prefer_interpolation_to_compose_strings: true + prefer_is_empty: true + prefer_is_not_empty: true + prefer_is_not_operator: true + prefer_iterable_whereType: true + prefer_null_aware_operators: true + prefer_spread_collections: true + prefer_typing_uninitialized_variables: true + provide_deprecation_message: true + recursive_getters: true + require_trailing_commas: true + sized_box_for_whitespace: true + sized_box_shrink_expand: true + slash_for_doc_comments: true + sort_child_properties_last: true + sort_pub_dependencies: true + type_init_formals: true + type_literal_in_constant_pattern: true + unawaited_futures: true + unnecessary_await_in_return: true + unnecessary_brace_in_string_interps: true + unnecessary_const: true + unnecessary_constructor_name: true + unnecessary_getters_setters: true + unnecessary_late: true + unnecessary_new: true + unnecessary_null_aware_assignments: true + unnecessary_null_in_if_null_operators: true + unnecessary_nullable_for_final_variable_declarations: true + unnecessary_overrides: true + unnecessary_parenthesis: true + unnecessary_statements: true + use_build_context_synchronously: true + use_colored_box: true + use_key_in_widget_constructors: true + valid_regexps: true diff --git a/lib/analysis_options.yaml b/lib/analysis_options.yaml new file mode 100644 index 0000000..5ed5dbb --- /dev/null +++ b/lib/analysis_options.yaml @@ -0,0 +1 @@ +include: package:arcane_analysis/analysis_options.1.0.0.yaml diff --git a/lib/arcane_analysis.dart b/lib/arcane_analysis.dart new file mode 100644 index 0000000..7307124 --- /dev/null +++ b/lib/arcane_analysis.dart @@ -0,0 +1,2 @@ +/// Arcane's Dart analyser settings and best practices +library arcane_analysis; diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..bd2baef --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,12 @@ +name: arcane_analysis +description: Linting rules for Dart and Flutter used by the Arcane Framework +version: 1.0.0 +homepage: https://github.com/hanskokx/arcane_analysis +repository: https://github.com/hanskokx/arcane_analysis +documentation: https://github.com/hanskokx/arcane_analysis +issue_tracker: https://github.com/hanskokx/arcane_analysis/issues +topics: [lints, analyzer, analysis, linting rules, linter, arcane_framework, arcane] + +environment: + sdk: ^3.5.3 +