Compare commits

...

2 Commits

Author SHA1 Message Date
8a026cf541
feat: upgrade to handle dart 3.0.0
Some checks failed
continuous-integration/drone/pr Build is failing
2023-10-09 21:44:56 +02:00
f2c33feb73
feat(analysis): add full toolchain to easely update ruleset 2023-10-09 21:44:23 +02:00
14 changed files with 703 additions and 156 deletions

View File

@ -1 +0,0 @@
2.5.0

View File

@ -1,3 +1,26 @@
## 2.6.0
- **ADDED** annotate_redeclares (https://dart.dev/tools/linter-rules/annotate_redeclares)
- **ADDED** deprecated_member_use_from_same_package (https://dart.dev/tools/linter-rules/deprecated_member_use_from_same_package)
- **ADDED** diagnostic_describe_all_properties (https://dart.dev/tools/linter-rules/diagnostic_describe_all_properties)
- **ADDED** implicit_reopen (https://dart.dev/tools/linter-rules/implicit_reopen)
- **ADDED** invalid_case_patterns (https://dart.dev/tools/linter-rules/invalid_case_patterns)
- **ADDED** matching_super_parameters (https://dart.dev/tools/linter-rules/matching_super_parameters)
- **ADDED** no_literal_bool_comparisons (https://dart.dev/tools/linter-rules/no_literal_bool_comparisons)
- **ADDED** no_self_assignments (https://dart.dev/tools/linter-rules/no_self_assignments)
- **ADDED** no_wildcard_variable_uses (https://dart.dev/tools/linter-rules/no_wildcard_variable_uses)
- **ADDED** prefer_final_parameters (https://dart.dev/tools/linter-rules/prefer_final_parameters)
- **ADDED** prefer_foreach (https://dart.dev/tools/linter-rules/prefer_foreach)
- **ADDED** type_literal_in_constant_pattern (https://dart.dev/tools/linter-rules/type_literal_in_constant_pattern)
- **ADDED** unnecessary_breaks (https://dart.dev/tools/linter-rules/unnecessary_breaks)
- **ADDED** unnecessary_library_directive (https://dart.dev/tools/linter-rules/unnecessary_library_directive)
- **ADDED** unnecessary_null_aware_operator_on_extension_on_nullable (https://dart.dev/tools/linter-rules/unnecessary_null_aware_operator_on_extension_on_nullable)
- **REMOVED** always_require_non_null_named_parameters (https://dart.dev/tools/linter-rules/always_require_non_null_named_parameters)
- **REMOVED** avoid_returning_null_for_future (https://dart.dev/tools/linter-rules/avoid_returning_null_for_future)
- **REMOVED** iterable_contains_unrelated_type (https://dart.dev/tools/linter-rules/iterable_contains_unrelated_type)
- **REMOVED** list_remove_unrelated_type (https://dart.dev/tools/linter-rules/list_remove_unrelated_type)
- **REMOVED** prefer_equal_for_default_values (https://dart.dev/tools/linter-rules/prefer_equal_for_default_values)
## 2.5.0
- **FIX**(analysis): remove depencies sort. (4e3b288e)

View File

@ -20,7 +20,7 @@
![SDK: Dart & Flutter](https://img.shields.io/badge/SDK-Dart%20%7C%20Flutter-blue?style=flat-square)
This package provides lint rules for Dart and Flutter which are used at [Wyatt Studio](https://wyatt-studio.fr). For more information, see the complete list of options in **lib/analysis_options.2.5.0.yaml**.
This package provides lint rules for Dart and Flutter which are used at [Wyatt Studio](https://wyatt-studio.fr). For more information, see the complete list of options in **lib/analysis_options.2.6.0.yaml**.
**Note**: This package was heavily inspired by [pedantic](https://github.com/dart-lang/pedantic), [Very Good Analysis](https://github.com/VeryGoodOpenSource/very_good_analysis) and the official [flutter_lints](https://pub.dev/packages/flutter_lints).
@ -29,7 +29,7 @@ This package provides lint rules for Dart and Flutter which are used at [Wyatt
Using CLI:
```sh
dart pub add wyatt_analysis:2.5.0 --dev --hosted-url=https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
dart pub add wyatt_analysis:2.6.0 --dev --hosted-url=https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
```
## Usage
@ -39,7 +39,7 @@ To use the lints, add a dependency in your `pubspec.yaml` :
```yaml
wyatt_analysis:
hosted: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
version: 2.5.0
version: 2.6.0
```
Then, add an include in `analysis_options.yaml` :
@ -57,13 +57,13 @@ include: package:wyatt_analysis/analysis_options.flutter.yaml
If you wish to restrict the lint version, specify a version of `analysis_options.yaml` instead:
```yaml
include: package:wyatt_analysis/analysis_options.flutter.2.5.0.yaml
include: package:wyatt_analysis/analysis_options.flutter.2.6.0.yaml
```
If you just want **Dart** version:
```yaml
include: package:wyatt_analysis/analysis_options.2.5.0.yaml
include: package:wyatt_analysis/analysis_options.2.6.0.yaml
```
## Suppressing Lints
@ -117,12 +117,44 @@ To indicate your project is using `wyatt_analysis` → [![style: wyatt analysis]
When you want to create a new version of the plugin. Before any modification, execute the following command to create new files:
```sh
./new_version.sh <new_version>
./tools/new_version.sh <version>
```
The previous version is automatically detected thanks to the `.latest_version` file.
So `.latest_version` needs to be versioned!
The previous version is automatically retrieved from the `pubspec.yaml` file.
This script will create the following files:
* `lib/analysis_options.<version>.yaml`
* `lib/analysis_options.flutter.<version>.yaml`
And update the following files:
* `README.md`
* `pubspec.yaml`
* `lib/analysis_options.yaml`
* `lib/analysis_options.flutter.yaml`
* `lib/wyatt_analysis.dart`
Then, you can use the following command to retrieve latest available lints from the official linter.
```sh
./tools/check_rules.sh
```
After that, you can modify the files `lib/analysis_options.<version>.yaml` and `lib/analysis_options.flutter.<version>.yaml` to add new lints or remove some.
Then you can sort the lints with the following command:
```sh
./tools/sort_rules.sh
```
Finally, you can generate the changelog with the following command:
```sh
./tools/generate_changelog.sh <old_version>
```
The new version is automatically retrieved from the `pubspec.yaml` file. But **you have to specify** the previous version.
## Notes
You can explore every lint rules [here](https://dart-lang.github.io/linter/lints/).
You can explore every lint rules [here](https://dart.dev/tools/linter-rules).

View File

@ -0,0 +1,232 @@
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
analyzer:
language:
strict-casts: true
strict-inference: true
strict-raw-types: true
errors:
todo: ignore
close_sinks: ignore
missing_required_param: error
missing_return: error
record_literal_one_positional_no_trailing_comma: error
collection_methods_unrelated_type: warning
unrelated_type_equality_checks: warning
exclude:
- lib/l10n/**
- lib/generated/**
- lib/gen/**
- lib/generated_plugin_registrant.dart
- test/.test_coverage.dart
- "**/*.g.dart"
- "**/*.freezed.dart"
linter:
rules:
- always_declare_return_types
- always_put_control_body_on_new_line
- always_put_required_named_parameters_first
- always_use_package_imports
- annotate_overrides
- annotate_redeclares
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_double_and_int_checks
- avoid_dynamic_calls
- avoid_empty_else
- avoid_equals_and_hash_code_on_mutable_classes
- avoid_escaping_inner_quotes
- avoid_field_initializers_in_const_classes
- avoid_final_parameters
- avoid_function_literals_in_foreach_calls
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_multiple_declarations_per_line
- avoid_null_checks_in_equality_operators
- avoid_positional_boolean_parameters
- avoid_private_typedef_functions
- avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null
- avoid_returning_null_for_void
- avoid_returning_this
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_type_to_string
- avoid_types_as_parameter_names
- avoid_types_on_closure_parameters
- avoid_unused_constructor_parameters
- avoid_void_async
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
- cascade_invocations
- cast_nullable_to_non_nullable
- collection_methods_unrelated_type
- combinators_ordering
- comment_references
- conditional_uri_does_not_exist
- constant_identifier_names
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- dangling_library_doc_comments
- depend_on_referenced_packages
- deprecated_consistency
- deprecated_member_use_from_same_package
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- eol_at_end_of_file
- exhaustive_cases
- file_names
- flutter_style_todos
- hash_and_equals
- implementation_imports
- implicit_call_tearoffs
- implicit_reopen
- invalid_case_patterns
- join_return_with_assignment
- leading_newlines_in_multiline_strings
- library_names
- library_prefixes
- library_private_types_in_public_api
- lines_longer_than_80_chars
- literal_only_boolean_expressions
- matching_super_parameters
- missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
- no_default_cases
- no_duplicate_case_values
- no_leading_underscores_for_library_prefixes
- no_leading_underscores_for_local_identifiers
- no_literal_bool_comparisons
- no_runtimeType_toString
- no_self_assignments
- no_wildcard_variable_uses
- non_constant_identifier_names
- noop_primitive_operations
- null_check_on_nullable_type_parameter
- null_closures
- one_member_abstracts
- only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
- parameter_assignments
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_asserts_with_message
- 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
- prefer_contains
- prefer_expression_function_bodies
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_final_parameters
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- prefer_int_literals
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
- prefer_mixin
- prefer_null_aware_method_calls
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- provide_deprecation_message
- recursive_getters
- require_trailing_commas
- slash_for_doc_comments
- sort_constructors_first
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- tighten_type_of_initializing_formals
- type_annotate_public_apis
- type_init_formals
- type_literal_in_constant_pattern
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_breaks
- unnecessary_const
- unnecessary_constructor_name
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_late
- unnecessary_library_directive
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_aware_operator_on_extension_on_nullable
- unnecessary_null_checks
- unnecessary_null_in_if_null_operators
- unnecessary_nullable_for_final_variable_declarations
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_raw_strings
- unnecessary_statements
- unnecessary_string_escapes
- unnecessary_string_interpolations
- unnecessary_this
- unnecessary_to_list_in_spreads
- unrelated_type_equality_checks
- unsafe_html
- use_enums
- use_function_type_syntax_for_parameters
- use_if_null_to_convert_nulls_to_bools
- use_is_even_rather_than_modulo
- use_late_for_private_fields_and_variables
- use_named_constants
- use_raw_strings
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_string_in_part_of_directives
- use_super_parameters
- use_test_throws_matchers
- use_to_and_as_if_applicable
- valid_regexps
- void_checks
# Ignored rules (incompatible with some of our rules)
# - always_specify_types
# - prefer_double_quotes
# - prefer_relative_imports
# - unnecessary_final

View File

@ -0,0 +1,32 @@
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
include: package:wyatt_analysis/analysis_options.2.6.0.yaml
linter:
rules:
- avoid_print
- avoid_unnecessary_containers
- avoid_web_libraries_in_flutter
- diagnostic_describe_all_properties
- no_logic_in_create_state
- sized_box_for_whitespace
- sized_box_shrink_expand
- sort_child_properties_last
- use_build_context_synchronously
- use_colored_box
- use_decorated_box
- use_full_hex_values_for_flutter_colors
- use_key_in_widget_constructors

View File

@ -15,5 +15,5 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
include: package:wyatt_analysis/analysis_options.flutter.2.5.0.yaml
include: package:wyatt_analysis/analysis_options.flutter.2.6.0.yaml

View File

@ -15,5 +15,5 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
include: package:wyatt_analysis/analysis_options.2.5.0.yaml
include: package:wyatt_analysis/analysis_options.2.6.0.yaml

View File

@ -18,4 +18,4 @@
/// used internally at [Wyatt Studio](https://wyatt-studio.fr).
library wyatt_analysis;
const String wyattAnalysisVersion = '2.5.0';
const String wyattAnalysisVersion = '2.6.0';

View File

@ -1,142 +0,0 @@
#!/usr/bin/env sh
# Copyright (C) 2022 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
usage="
usage:
$(basename "$0") <new_version> -- create new analyzer files.
where:
new_version: new version, for example \`2.4.0\`"
new=$1
if [ -z "$new" ]; then
echo "new_version cannot be null"
echo "${usage}"
exit 1
fi
SCRIPT_PATH="${BASH_SOURCE:-$0}"
ABS_SCRIPT_PATH="$(realpath "${SCRIPT_PATH}")"
ABS_DIRECTORY="$(dirname "${ABS_SCRIPT_PATH}")"
LATEST_VERSION="${ABS_DIRECTORY}/.latest_version"
# Read latest version
if [ -e "$LATEST_VERSION" ]; then
old=$(cat "$LATEST_VERSION")
echo "> latest package version is: $old"
echo "> new package version is: $new"
else
echo "latest version is not set"
echo "create a file named \`.latest_version\` in the root of the project"
exit 1
fi
LIB="${ABS_DIRECTORY}/lib/wyatt_analysis.dart"
OPTIONS="${ABS_DIRECTORY}/lib/analysis_options.yaml"
OLD_OPTIONS="${ABS_DIRECTORY}/lib/analysis_options.${old}.yaml"
NEW_OPTIONS="${ABS_DIRECTORY}/lib/analysis_options.${new}.yaml"
OPTIONS_FLUTTER="${ABS_DIRECTORY}/lib/analysis_options.flutter.yaml"
OLD_OPTIONS_FLUTTER="${ABS_DIRECTORY}/lib/analysis_options.flutter.${old}.yaml"
NEW_OPTIONS_FLUTTER="${ABS_DIRECTORY}/lib/analysis_options.flutter.${new}.yaml"
if [ ! -e "$OLD_OPTIONS" ]; then
echo "analysis_options.${old}.yaml doesn't exists"
echo "${usage}"
exit 1
fi
if [ ! -e "$OLD_OPTIONS_FLUTTER" ]; then
echo "analysis_options.flutter.${old}.yaml doesn't exists"
echo "${usage}"
exit 1
fi
if [ -e "$NEW_OPTIONS" ]; then
echo "analysis_options.${new}.yaml already exists"
echo "${usage}"
exit 1
fi
if [ -e "$NEW_OPTIONS_FLUTTER" ]; then
echo "analysis_options.flutter.${old}.yaml already exists"
echo "${usage}"
exit 1
fi
# Copy previous version files
cp "${OLD_OPTIONS}" "${NEW_OPTIONS}"
cp "${OLD_OPTIONS_FLUTTER}" "${NEW_OPTIONS_FLUTTER}"
# Search and replace old version string occurences in new files
sed -e "s/${old}/${new}/g" "${NEW_OPTIONS_FLUTTER}" > tempfile.tmp
mv -f tempfile.tmp "${NEW_OPTIONS_FLUTTER}"
sed -e "s/${old}/${new}/g" "${LIB}" > tempfile.tmp
mv -f tempfile.tmp "${LIB}"
sed -e "s/${old}/${new}/g" "README.md" > tempfile.tmp
mv -f tempfile.tmp "README.md"
echo "
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
include: package:wyatt_analysis/analysis_options.${new}.yaml
" > "${OPTIONS}"
echo "
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
include: package:wyatt_analysis/analysis_options.flutter.${new}.yaml
" > "${OPTIONS_FLUTTER}"
# Update latest version
echo "${new}" > "$LATEST_VERSION"
exit 0

View File

@ -17,7 +17,7 @@
name: wyatt_analysis
description: Lint rules for Dart and Flutter used internally at Wyatt Studio.
repository: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_analysis
version: 2.5.0
version: 2.6.0
publish_to: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub

View File

@ -0,0 +1,105 @@
#!/usr/bin/env bash
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# This script scrapes the latest version of the ruleset from the
# official Dart repository and tests it against the latest version of
# the Wyatt Analysis ruleset.
basename=$(basename "$0")
basepath=$(dirname "$0")
official_ruleset_url="https://raw.githubusercontent.com/dart-lang/sdk/main/pkg/linter/example/all.yaml"
red=$(tput setaf 1)
blue=$(tput setaf 4)
yellow=$(tput setaf 3)
reset=$(tput sgr0)
# Check for dependencies.
if ! command -v yq &>/dev/null; then
echo "yq could not be found. Please install it and try again."
echo "https://github.com/mikefarah/yq"
exit 1
fi
# Check for arguments, if no arguments read latest version from pubspec.yaml.
if [ $# -eq 0 ]; then
wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
else
wyatt_analysis_version=$1
fi
# Read latest version
wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
# Check if the version of the Wyatt Analysis ruleset is valid by checking if the file exists.
if [ ! -f "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" ]; then
echo "Wyatt Analysis version $wyatt_analysis_version could not be found."
exit 1
fi
echo "Found Wyatt Analysis version $wyatt_analysis_version"
# Generate temporary directory.
tmp_dir=$(mktemp -d)
# Download the official ruleset.
curl -s "$official_ruleset_url" >"$tmp_dir/official.yaml"
# List yaml elements in the official ruleset, "linter.rules" and save it in an array.
official_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/official.yaml"))
echo "Finding differences between the official ruleset and the Wyatt Analysis ruleset..."
echo "This may take a while..."
# Merges the wyatt dart analysis ruleset with the wyatt flutter analysis ruleset.
yq ea '. as $item ireduce ({}; . *+ $item)' "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml" >"$tmp_dir/wyatt.yaml"
# List yaml elements in the Wyatt Analysis ruleset, "linter.rules" and save it in an array.
wyatt_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/wyatt.yaml"))
# Read merged files, and list all ignored rules (starting with a # -).
ignored_rules=($(grep -oP '(?<=# - ).*' "$tmp_dir/wyatt.yaml"))
echo "Found $(echo "${official_rules[@]}" | wc -w) rules in the official ruleset."
echo "Found $(echo "${wyatt_rules[@]}" | wc -w) rules in the Wyatt Analysis ruleset."
echo "Found $(echo "${ignored_rules[@]}" | wc -w) ignored rules in the Wyatt Analysis ruleset."
# Iterate over the official ruleset.
for rule in "${official_rules[@]}"; do
# Check if the rule is in the Wyatt Analysis ruleset.
if ! grep -q "$rule" "$tmp_dir/wyatt.yaml"; then
echo "${red}+ $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
fi
done
# Iterate over the Wyatt Analysis ruleset and print the rules that are not in the official ruleset.
for rule in "${wyatt_rules[@]}"; do
# Check if the rule is in the official ruleset.
if ! grep -q "$rule" "$tmp_dir/official.yaml"; then
echo "${blue}- $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
fi
done
# Iterate over the ignored rules and print them.
for rule in "${ignored_rules[@]}"; do
echo "${yellow}~ $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
done
# Remove temporary directory.
rm -rf "$tmp_dir"
exit 0

View File

@ -0,0 +1,109 @@
#!/usr/bin/env bash
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
basename=$(basename "$0")
basepath=$(dirname "$0")
# Check for dependencies.
if ! command -v yq &>/dev/null; then
echo "yq could not be found. Please install it and try again."
echo "https://github.com/mikefarah/yq"
exit 1
fi
# Check for arguments,
# it should be the version of the old ruleset that you want to compare with the new ruleset.
if [ $# -eq 0 ]; then
echo "Please provide the version of the old ruleset that you want to compare with the new ruleset."
exit 1
fi
# Read the version of the old ruleset from the arguments.
old_wyatt_analysis_version=$1
# Read the version of the new ruleset from pubspec.yaml.
new_wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
# Check if the version of the Wyatt Analysis ruleset is valid by checking if the file exists.
if [ ! -f "$basepath/../lib/analysis_options.$old_wyatt_analysis_version.yaml" ]; then
echo "Wyatt Analysis version $old_wyatt_analysis_version could not be found."
exit 1
fi
if [ ! -f "$basepath/../lib/analysis_options.$new_wyatt_analysis_version.yaml" ]; then
echo "Wyatt Analysis version $new_wyatt_analysis_version could not be found."
exit 1
fi
echo "Found Wyatt Analysis version $old_wyatt_analysis_version and $new_wyatt_analysis_version"
# Generate temporary directory.
tmp_dir=$(mktemp -d)
# Merges the wyatt dart analysis ruleset with the wyatt flutter analysis ruleset.
yq ea '. as $item ireduce ({}; . *+ $item)' "$basepath/../lib/analysis_options.$old_wyatt_analysis_version.yaml" "$basepath/../lib/analysis_options.flutter.$old_wyatt_analysis_version.yaml" >"$tmp_dir/old_wyatt.yaml"
yq ea '. as $item ireduce ({}; . *+ $item)' "$basepath/../lib/analysis_options.$new_wyatt_analysis_version.yaml" "$basepath/../lib/analysis_options.flutter.$new_wyatt_analysis_version.yaml" >"$tmp_dir/new_wyatt.yaml"
# List yaml elements in the old ruleset, "linter.rules" and save it in an array.
old_wyatt_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/old_wyatt.yaml"))
# List yaml elements in the new ruleset, "linter.rules" and save it in an array.
new_wyatt_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/new_wyatt.yaml"))
# List all the rules that are in the old ruleset but not in the new ruleset.
removed_rules=($(comm -23 <(printf '%s\n' "${old_wyatt_rules[@]}" | sort) <(printf '%s\n' "${new_wyatt_rules[@]}" | sort)))
# List all the rules that are in the new ruleset but not in the old ruleset.
added_rules=($(comm -13 <(printf '%s\n' "${old_wyatt_rules[@]}" | sort) <(printf '%s\n' "${new_wyatt_rules[@]}" | sort)))
# Generate markdown file.
echo "## ${new_wyatt_analysis_version}" >"$tmp_dir/CHANGELOG.md"
echo "" >>"$tmp_dir/CHANGELOG.md"
# Iterate over the added rules and print them in the markdown file.
for rule in "${added_rules[@]}"; do
echo " - **ADDED** $rule (https://dart.dev/tools/linter-rules/$rule)" >>"$tmp_dir/CHANGELOG.md"
done
# Iterate over the removed rules and print them in the markdown file.
for rule in "${removed_rules[@]}"; do
echo " - **REMOVED** $rule (https://dart.dev/tools/linter-rules/$rule)" >>"$tmp_dir/CHANGELOG.md"
done
echo "" >>"$tmp_dir/CHANGELOG.md"
# Print the contents of the markdown file.
cat "$tmp_dir/CHANGELOG.md"
# Ask the user if they want to add the changes to the CHANGELOG.md file.
read -p "Do you want to add the changes to the CHANGELOG.md file? (y/n) " -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
# Add the changes to the top of the CHANGELOG.md file.
cat "$tmp_dir/CHANGELOG.md" "$basepath/../CHANGELOG.md" >"$tmp_dir/CHANGELOG.md.tmp"
cp -f "$tmp_dir/CHANGELOG.md.tmp" "$basepath/../CHANGELOG.md"
rm -f "$tmp_dir/CHANGELOG.md.tmp"
fi
# Remove temporary directory.
rm -rf "$tmp_dir"
exit 0

View File

@ -0,0 +1,98 @@
#!/usr/bin/env bash
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
basename=$(basename "$0")
basepath=$(dirname "$0")
# Check for arguments, first argument should be wyatt_analysis_version.
if [ $# -eq 0 ]; then
echo "Usage: $basename <wyatt_analysis_version>"
exit 1
fi
wyatt_analysis_version=$1
# Check for dependencies.
if ! command -v yq &>/dev/null; then
echo "yq could not be found. Please install it and try again."
echo "https://github.com/mikefarah/yq"
exit 1
fi
# Read latest version
latest_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
echo "> latest package version is: $latest_version"
echo "> new package version is: $wyatt_analysis_version"
# Create array with all files that need to exist
files=(
"${basepath}/../pubspec.yaml"
"${basepath}/../README.md"
"${basepath}/../lib/wyatt_analysis.dart"
"${basepath}/../lib/analysis_options.yaml"
"${basepath}/../lib/analysis_options.flutter.yaml"
"${basepath}/../lib/analysis_options.${latest_version}.yaml"
"${basepath}/../lib/analysis_options.flutter.${latest_version}.yaml"
)
# Check if all files exist
for file in "${files[@]}"; do
if [ ! -f "$file" ]; then
echo "File ${file} doesn't exists"
exit 1
fi
done
# Create new analysis_options files
echo "Creating new analysis_options files"
cp "${basepath}/../lib/analysis_options.${latest_version}.yaml" "${basepath}/../lib/analysis_options.${wyatt_analysis_version}.yaml"
cp "${basepath}/../lib/analysis_options.flutter.${latest_version}.yaml" "${basepath}/../lib/analysis_options.flutter.${wyatt_analysis_version}.yaml"
# Update version in new analysis_options files
echo "Updating version in new analysis_options files"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../lib/analysis_options.${wyatt_analysis_version}.yaml"
rm "${basepath}/../lib/analysis_options.${wyatt_analysis_version}.yaml.bu"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../lib/analysis_options.flutter.${wyatt_analysis_version}.yaml"
rm "${basepath}/../lib/analysis_options.flutter.${wyatt_analysis_version}.yaml.bu"
# Update version in pubspec.yaml
echo "Updating version in pubspec.yaml"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../pubspec.yaml"
rm "${basepath}/../pubspec.yaml.bu"
# Update version in README.md
echo "Updating version in README.md"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../README.md"
rm "${basepath}/../README.md.bu"
# Update version in wyatt_analysis.dart
echo "Updating version in wyatt_analysis.dart"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../lib/wyatt_analysis.dart"
rm "${basepath}/../lib/wyatt_analysis.dart.bu"
# Update version in analysis_options.yaml
echo "Updating version in analysis_options.yaml"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../lib/analysis_options.yaml"
rm "${basepath}/../lib/analysis_options.yaml.bu"
# Update version in analysis_options.flutter.yaml
echo "Updating version in analysis_options.flutter.yaml"
sed -i.bu "s/${latest_version}/${wyatt_analysis_version}/g" "${basepath}/../lib/analysis_options.flutter.yaml"
rm "${basepath}/../lib/analysis_options.flutter.yaml.bu"
exit 0

View File

@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
basename=$(basename "$0")
basepath=$(dirname "$0")
# Check for dependencies.
if ! command -v yq &>/dev/null; then
echo "yq could not be found. Please install it and try again."
echo "https://github.com/mikefarah/yq"
exit 1
fi
# Check for arguments, if no arguments read latest version from pubspec.yaml.
if [ $# -eq 0 ]; then
wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
else
wyatt_analysis_version=$1
fi
# Check if the version of the Wyatt Analysis ruleset is valid by checking if the file exists.
if [ ! -f "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" ]; then
echo "Wyatt Analysis version $wyatt_analysis_version could not be found."
exit 1
fi
echo "Found Wyatt Analysis version $wyatt_analysis_version"
echo "Sorting rules..."
# Sort the rules in "lint.rules" alphabetically.
yq eval '.linter.rules |= sort_by(.)' "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" >"$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml.tmp"
cp -f "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml.tmp" "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml"
rm -f "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml.tmp"
# Sort the rules in "lint.rules" alphabetically.
yq eval '.linter.rules |= sort_by(.)' "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml" >"$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml.tmp"
cp -f "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml.tmp" "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml"
rm -f "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml.tmp"
exit 0