Skip to content

Commit

Permalink
Merge pull request #93 from rainyl/better-lints
Browse files Browse the repository at this point in the history
update lint rules and format
  • Loading branch information
rainyl authored Jun 11, 2024
2 parents cecaf1f + 75afcab commit e8a48d1
Show file tree
Hide file tree
Showing 59 changed files with 1,072 additions and 714 deletions.
233 changes: 230 additions & 3 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,231 @@
include: package:flutter_lints/flutter.yaml
# include: package:solid_lints/analysis_options.yaml

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
# https://github.com/solid-software/solid_lints/blob/master/lib/analysis_options.yaml
analyzer:
plugins:
- custom_lint
exclude:
# General generated files
- '**/*.g.dart'
- '**/*.gr.dart'

# Flutter
- 'lib/generated_plugin_registrant.dart'

# mockito
- '*.mocks.dart'
- '**/*.mocks.dart'

# freezed
- '**/*.freezed.dart'

# protobuf
- '**/*.pb.dart'

# test_coverage
- test/.test_coverage.dart

language:
# We've seen errors tied to use of implicit operations similar to the ones described in
# https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks.
# When we do things explicitly there is less room for errors.
strict-casts: true
# strict-raw-types: true

errors:
missing_required_param: error
missing_return: error
parameter_assignments: error
linter:
rules:
- always_declare_return_types
- always_put_required_named_parameters_first
# - always_use_package_imports
- annotate_overrides
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_double_and_int_checks
- avoid_dynamic_calls
- avoid_empty_else
- avoid_escaping_inner_quotes
- avoid_field_initializers_in_const_classes
# We are already using the `parameter_assignments` lint.
# Adding final to parameters has the same effect as `parameter_assignments`
# so it doesn't make sense to use final parameters with `parameter_assignments`.
- avoid_final_parameters
- avoid_function_literals_in_foreach_calls
- avoid_implementing_value_types
- avoid_init_to_null
# - avoid_multiple_declarations_per_line
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters
- avoid_print
- avoid_private_typedef_functions
# - avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null_for_void
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_type_to_string
- avoid_types_as_parameter_names
- avoid_unnecessary_containers
- avoid_unused_constructor_parameters
- avoid_void_async
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
# Similar to avoid-non-null-assertion, which is already used,
# basically it suggests to not ignore possible null value
- cast_nullable_to_non_nullable
- close_sinks
- comment_references
- conditional_uri_does_not_exist
- constant_identifier_names
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- depend_on_referenced_packages
- deprecated_consistency
# - diagnostic_describe_all_properties
- directives_ordering
# Pretty much agree with Passy & linter package.
# Our use case for Flutter for web where there are no flavors yet.
# So using dart-define is helpful.
#- do_not_use_environment
- empty_catches
- empty_constructor_bodies
- empty_statements
- eol_at_end_of_file
- exhaustive_cases
- file_names
- hash_and_equals
- implementation_imports
# deprecated rule in Flutter 3.7
# - invariant_booleans
# - iterable_contains_unrelated_type
- collection_methods_unrelated_type
- join_return_with_assignment
- leading_newlines_in_multiline_strings
- library_names
- library_prefixes
# - lines_longer_than_80_chars
# - list_remove_unrelated_type
- literal_only_boolean_expressions
- no_adjacent_strings_in_list
- no_duplicate_case_values
- no_leading_underscores_for_library_prefixes
- no_leading_underscores_for_local_identifiers
- no_logic_in_create_state
- no_runtimeType_toString
- non_constant_identifier_names
- noop_primitive_operations
- null_check_on_nullable_type_parameter
- overridden_fields
- package_names
- package_prefixed_library_names
- parameter_assignments
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- 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
# These two are incompatible, and one should be selected depending on your project's style.
# - prefer_double_quotes
# - prefer_single_quotes
# removed in Dart 3.0.0
# - prefer_equal_for_default_values
# Not used, as the default app template has a single statement return code generated.
# While this could be beneficial for Dart projects and maintaining code style, we are unaware
# of any substantial evidence that improves code when using expression function body
# vs single statement return. We are considering including this in Dart only lints.
# - prefer_expression_function_bodies
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
# While it is similar to `unnecessary_lambdas`,
# it forcefully replaces structural/procedural semantics with
# their functional counterparts.
# We think this is a stylistic choice and will leave it up to users.
# - prefer_foreach
- prefer_for_elements_to_map_fromIterable
- 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_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
- prefer_null_aware_method_calls
- prefer_null_aware_operators
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- provide_deprecation_message
# - public_member_api_docs
- recursive_getters
- require_trailing_commas
- secure_pubspec_urls
- sized_box_for_whitespace
- sized_box_shrink_expand
- slash_for_doc_comments
- sort_child_properties_last
# We tend to use class organization close to standard Java convention, where fields come first.
# Martin, R. C. & Coplien, J. O. (2013), Chapter 10: Classes. Clean code: a handbook of agile software craftsmanship , Prentice Hall , Upper Saddle River, NJ [etc.] . 136
# - sort_constructors_first
# - sort_pub_dependencies
# - sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- tighten_type_of_initializing_formals
- type_annotate_public_apis
- type_init_formals
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_breaks
- unnecessary_const
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_new
- unnecessary_null_aware_assignments
- 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_build_context_synchronously
- use_colored_box
- use_decorated_box
- use_full_hex_values_for_flutter_colors
- use_function_type_syntax_for_parameters
- use_if_null_to_convert_nulls_to_bools
- use_is_even_rather_than_modulo
- use_named_constants
- use_raw_strings
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_super_parameters
- use_test_throws_matchers
- valid_regexps
- void_checks
6 changes: 3 additions & 3 deletions bin/setup.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import 'package:args/command_runner.dart';
import 'setup_commands.dart';

void main(List<String> args) async {
CommandRunner("setup", "Setup for opencv_dart")
final cmd = CommandRunner("setup", "Setup for opencv_dart")
..addCommand(WindowsSetupCommand())
..addCommand(LinuxSetupCommand())
..addCommand(MacOsSetupCommand())
..addCommand(AndroidSetupCommand())
..addCommand(IosSetupCommand())
..run(args);
..addCommand(IosSetupCommand());
await cmd.run(args);
}
64 changes: 28 additions & 36 deletions bin/setup_commands.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import 'dart:io';

import 'package:stack_trace/stack_trace.dart';
import 'package:archive/archive_io.dart';
import 'package:args/command_runner.dart';
import 'package:yaml/yaml.dart';
import 'package:path/path.dart' as p;
import 'package:stack_trace/stack_trace.dart';
import 'package:yaml/yaml.dart';

const setupPkgName = "opencv_dart";

Expand All @@ -19,10 +19,10 @@ abstract class BaseSetupCommand extends Command {

String get arch {
final arch_ = argResults?["arch"] as String;
return ARCH_MAP[os]?[arch_] ?? arch_;
return ARCH_MAP[os]?[arch_] as String? ?? arch_;
}

String get pkgRoot => Frame.caller(1).uri.resolve("..").toFilePath();
String get pkgRoot => Frame.caller().uri.resolve("..").toFilePath();

bool get force => argResults?.flag("force") ?? false;
String get os => name;
Expand All @@ -32,28 +32,18 @@ abstract class BaseSetupCommand extends Command {
print(asInfo('Using package:$setupPkgName from $opencvRoot'));

final doc = loadYaml(File(p.join(opencvRoot, "pubspec.yaml")).readAsStringSync());
final version = doc["binary_version"] as String;
// ignore: avoid_dynamic_calls
final String version = doc["binary_version"] as String;
final libTarName = "libopencv_dart-$os-$downArch.tar.gz";

if (extractPath == null) {
switch (os) {
case OS.windows:
extractPath = p.join(opencvRoot, "windows");
break;
case OS.linux:
extractPath = p.join(opencvRoot, "linux");
break;
case OS.android:
extractPath = p.join(opencvRoot, "android", "src", "main", "jniLibs", downArch);
case OS.macos:
extractPath = p.join(opencvRoot, "macos");
case OS.ios:
extractPath = p.join(opencvRoot, "ios");
case OS.fuchsia:
default:
throw UnsupportedError(asError("Platform $os not supported"));
}
}
extractPath ??= switch (os) {
OS.windows => p.join(opencvRoot, "windows"),
OS.linux => p.join(opencvRoot, "windows"),
OS.android => p.join(opencvRoot, "android", "src", "main", "jniLibs", downArch),
OS.macos => p.join(opencvRoot, "macos"),
OS.ios => p.join(opencvRoot, "ios"),
_ => throw UnsupportedError(asError("Platform $os not supported"))
};

if (!Directory(extractPath).existsSync()) {
Directory(extractPath).createSync(recursive: true);
Expand All @@ -65,7 +55,7 @@ abstract class BaseSetupCommand extends Command {
if (force || !saveFile.existsSync()) {
if (!saveFile.parent.existsSync()) saveFile.parent.createSync(recursive: true);

String url = "https://github.com/rainyl/opencv_dart/releases/download/v$version/$libTarName";
final String url = "https://github.com/rainyl/opencv_dart/releases/download/v$version/$libTarName";
print(asInfo("Downloading $url"));
try {
final request = await HttpClient().getUrl(Uri.parse(url));
Expand All @@ -86,11 +76,13 @@ abstract class BaseSetupCommand extends Command {
// Check if libs already existed, avoid double-extract
if (Directory(extractPath)
.listSync()
.map((e) =>
e.path.endsWith(".so") ||
e.path.endsWith(".dll") ||
e.path.endsWith(".dylib") ||
e.path.endsWith(".framework"))
.map(
(e) =>
e.path.endsWith(".so") ||
e.path.endsWith(".dll") ||
e.path.endsWith(".dylib") ||
e.path.endsWith(".framework"),
)
.any((e) => e)) {
print(asWarning("Libs already exists in $extractPath, Skipping..."));
return;
Expand All @@ -104,7 +96,7 @@ abstract class BaseSetupCommand extends Command {
}

@override
void run() async {
Future<void> run() async {
print(asInfo("opencv_dart: working for $os $arch"));
await downloadAndExtract(arch);
print(asInfo("Finished"));
Expand All @@ -126,7 +118,7 @@ class MacOsSetupCommand extends BaseSetupCommand {
allowed: ["x86_64", "x64", "arm64"],
mandatory: true,
);
argParser.addFlag("force", abbr: "f", defaultsTo: false, help: "Force download and extract");
argParser.addFlag("force", abbr: "f", help: "Force download and extract");
}
}

Expand All @@ -139,7 +131,7 @@ class WindowsSetupCommand extends BaseSetupCommand {

WindowsSetupCommand() {
argParser.addOption("arch", abbr: "a", allowed: ["x86_64", "x64"], mandatory: true);
argParser.addFlag("force", abbr: "f", defaultsTo: false, help: "Force download and extract");
argParser.addFlag("force", abbr: "f", help: "Force download and extract");
}
}

Expand All @@ -152,7 +144,7 @@ class LinuxSetupCommand extends BaseSetupCommand {

LinuxSetupCommand() {
argParser.addOption("arch", abbr: "a", allowed: ["x86_64", "x64"], mandatory: true);
argParser.addFlag("force", abbr: "f", defaultsTo: false, help: "Force download and extract");
argParser.addFlag("force", abbr: "f", help: "Force download and extract");
}
}

Expand All @@ -170,7 +162,7 @@ class AndroidSetupCommand extends BaseSetupCommand {
allowed: ["x86_64", "arm64-v8a", "armeabi-v7a"],
mandatory: true,
);
argParser.addFlag("force", abbr: "f", defaultsTo: false, help: "Force download and extract");
argParser.addFlag("force", abbr: "f", help: "Force download and extract");
}
}

Expand All @@ -188,7 +180,7 @@ class IosSetupCommand extends BaseSetupCommand {
allowed: ["x86_64", "x64", "arm64", "os64"],
mandatory: true,
);
argParser.addFlag("force", abbr: "f", defaultsTo: false, help: "Force download and extract");
argParser.addFlag("force", abbr: "f", help: "Force download and extract");
}
}

Expand Down
Loading

0 comments on commit e8a48d1

Please sign in to comment.