diff --git a/CHANGELOG.md b/CHANGELOG.md index fd713b9012..26b0391eff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Removed deprecated `AnalysisOptions.from` use `AnalysisOptions.fromMap` instead - Removed deprecated `Config.linesOfCodeWarningLevel` use `Config.linesOfExecutableCodeWarningLevel` instead +- Removed deprecated `MetricsAnalysisRecorder.startRecordFile` and `MetricsAnalysisRecorder.endRecordFile` use `MetricsRecordsStore.recordFile` instead # 1.10.0 diff --git a/bin/metrics.dart b/bin/metrics.dart index 6292721749..731e9481cd 100644 --- a/bin/metrics.dart +++ b/bin/metrics.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:dart_code_metrics/metrics_analyzer.dart'; import 'package:dart_code_metrics/reporters.dart'; -import 'package:dart_code_metrics/src/analysis_options.dart'; import 'package:dart_code_metrics/src/cli/arguments_parser.dart'; import 'package:dart_code_metrics/src/cli/arguments_validation.dart'; import 'package:dart_code_metrics/src/cli/arguments_validation_exceptions.dart'; @@ -80,9 +79,9 @@ Future _runAnalysis( ? await analysisOptionsFromFile(analysisOptionsFile) : null; - final recorder = MetricsAnalysisRecorder(); - final analyzer = MetricsAnalyzer(recorder, options: options); - final runner = MetricsAnalysisRunner(recorder, analyzer, dartFilePaths, + final store = MetricsRecordsStore.store(); + final analyzer = MetricsAnalyzer(store, options: options); + final runner = MetricsAnalysisRunner(analyzer, store, dartFilePaths, rootFolder: rootFolder) ..run(); diff --git a/example/example.dart b/example/example.dart index 6869e2614c..2259766de0 100644 --- a/example/example.dart +++ b/example/example.dart @@ -7,14 +7,14 @@ void main() { // Root folder path is used to resolve relative file paths const rootFolder = 'lib/src'; - // Recorder keeps reported issues in format-agnostic way - final recorder = MetricsAnalysisRecorder(); + // Store keeps reported issues in format-agnostic way + final store = MetricsRecordsStore.store(); - // Analyzer traverses files and report its findings to passed recorder - final analyzer = MetricsAnalyzer(recorder); + // Analyzer traverses files and report its findings to passed store + final analyzer = MetricsAnalyzer(store); - // Runner coordinates recorder and analyzer - final runner = MetricsAnalysisRunner(recorder, analyzer, filesToAnalyze, + // Runner coordinates analyzer and store + final runner = MetricsAnalysisRunner(analyzer, store, filesToAnalyze, rootFolder: rootFolder); // Execute run() to analyze files and collect results diff --git a/lib/metrics_analyzer.dart b/lib/metrics_analyzer.dart index c6629430b8..dce35423b9 100644 --- a/lib/metrics_analyzer.dart +++ b/lib/metrics_analyzer.dart @@ -1,5 +1,4 @@ export 'package:dart_code_metrics/src/analysis_options.dart'; -export 'package:dart_code_metrics/src/metrics_analysis_recorder.dart'; export 'package:dart_code_metrics/src/metrics_analysis_runner.dart'; export 'package:dart_code_metrics/src/metrics_analyzer.dart'; export 'package:dart_code_metrics/src/metrics_records_builder.dart'; diff --git a/lib/src/metrics_analysis_recorder.dart b/lib/src/metrics_analysis_recorder.dart index be35347602..a6e5fa7876 100644 --- a/lib/src/metrics_analysis_recorder.dart +++ b/lib/src/metrics_analysis_recorder.dart @@ -1,12 +1,12 @@ -import 'package:dart_code_metrics/src/metrics_records_builder.dart'; -import 'package:dart_code_metrics/src/metrics_records_store.dart'; -import 'package:dart_code_metrics/src/models/code_issue.dart'; -import 'package:dart_code_metrics/src/models/file_record.dart'; -import 'package:dart_code_metrics/src/models/function_record.dart'; import 'package:path/path.dart' as p; +import 'metrics_records_builder.dart'; +import 'metrics_records_store.dart'; +import 'models/code_issue.dart'; import 'models/component_record.dart'; import 'models/design_issue.dart'; +import 'models/file_record.dart'; +import 'models/function_record.dart'; import 'models/scoped_component_declaration.dart'; import 'models/scoped_function_declaration.dart'; import 'utils/metrics_analyzer_utils.dart'; @@ -44,18 +44,7 @@ class MetricsAnalysisRecorder return this; } - @Deprecated('Use recordFile') - void startRecordFile(String filePath, String rootDirectory) { - _startRecordFile(filePath, rootDirectory); - } - - @Deprecated('Use recordFile') - void endRecordFile() { - _endRecordFile(); - } - @override - @Deprecated('Use MetricsRecordsBuilder.recordComponent') void recordComponent( ScopedComponentDeclaration declaration, ComponentRecord record) { _checkState(); @@ -68,7 +57,6 @@ class MetricsAnalysisRecorder } @override - @Deprecated('Use MetricsRecordsBuilder.recordFunction') void recordFunction( ScopedFunctionDeclaration declaration, FunctionRecord record) { _checkState(); @@ -88,7 +76,6 @@ class MetricsAnalysisRecorder } @override - @Deprecated('Use MetricsRecordsBuilder.recordIssues') void recordIssues(Iterable issues) { _checkState(); @@ -103,14 +90,6 @@ class MetricsAnalysisRecorder } void _startRecordFile(String filePath, String rootDirectory) { - if (filePath == null) { - throw ArgumentError.notNull('filePath'); - } - if (_fileGroupPath != null) { - throw StateError( - "Can't start a file group while another one is started. Use `endRecordFile` to close the opened one."); - } - _fileGroupPath = filePath; _relativeGroupPath = rootDirectory != null ? p.relative(filePath, from: rootDirectory) diff --git a/lib/src/metrics_analysis_runner.dart b/lib/src/metrics_analysis_runner.dart index dd7820aa1b..cbbbabc8dd 100644 --- a/lib/src/metrics_analysis_runner.dart +++ b/lib/src/metrics_analysis_runner.dart @@ -1,21 +1,21 @@ -import 'package:dart_code_metrics/src/metrics_analysis_recorder.dart'; -import 'package:dart_code_metrics/src/metrics_analyzer.dart'; -import 'package:dart_code_metrics/src/models/file_record.dart'; +import 'metrics_analyzer.dart'; +import 'metrics_records_store.dart'; +import 'models/file_record.dart'; -/// Coordinates [MetricsAnalysisRecorder] and [MetricsAnalyzer] to collect code quality info +/// Coordinates [MetricsAnalyzer] and [MetricsRecordsStore] to collect code quality info /// Use [ConsoleReporter], [HtmlReporter], [JsonReporter] or [CodeClimateReporter] to produce reports from collected info class MetricsAnalysisRunner { - final MetricsAnalysisRecorder _recorder; final MetricsAnalyzer _analyzer; + final MetricsRecordsStore _store; final Iterable _filePaths; final String _rootFolder; - MetricsAnalysisRunner(this._recorder, this._analyzer, this._filePaths, + MetricsAnalysisRunner(this._analyzer, this._store, this._filePaths, {String rootFolder}) : _rootFolder = rootFolder; /// Get results of analysis run. Will return empty iterable if [run()] wasn't executed yet - Iterable results() => _recorder.records(); + Iterable results() => _store.records(); /// Perform analysis of file paths passed in constructor void run() { diff --git a/lib/src/metrics_analyzer.dart b/lib/src/metrics_analyzer.dart index b82d363104..1a7d65d992 100644 --- a/lib/src/metrics_analyzer.dart +++ b/lib/src/metrics_analyzer.dart @@ -1,25 +1,25 @@ import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/analysis/utilities.dart'; -import 'package:dart_code_metrics/src/halstead_volume/halstead_volume_ast_visitor.dart'; -import 'package:dart_code_metrics/src/ignore_info.dart'; -import 'package:dart_code_metrics/src/metrics_analysis_recorder.dart'; -import 'package:dart_code_metrics/src/models/design_issue.dart'; -import 'package:dart_code_metrics/src/models/function_record.dart'; -import 'package:dart_code_metrics/src/rules/base_rule.dart'; -import 'package:dart_code_metrics/src/scope_ast_visitor.dart'; import 'package:glob/glob.dart'; import 'package:path/path.dart' as p; import 'analysis_options.dart'; import 'anti_patterns/base_pattern.dart'; import 'anti_patterns_factory.dart'; +import 'halstead_volume/halstead_volume_ast_visitor.dart'; +import 'ignore_info.dart'; import 'lines_of_code/lines_with_code_ast_visitor.dart'; import 'metrics/cyclomatic_complexity/control_flow_ast_visitor.dart'; import 'metrics/cyclomatic_complexity/cyclomatic_config.dart'; +import 'metrics_records_store.dart'; import 'models/component_record.dart'; import 'models/config.dart'; +import 'models/design_issue.dart'; +import 'models/function_record.dart'; +import 'rules/base_rule.dart'; import 'rules_factory.dart'; +import 'scope_ast_visitor.dart'; import 'utils/metrics_analyzer_utils.dart'; /// Performs code quality analysis on specified files @@ -30,10 +30,10 @@ class MetricsAnalyzer { final Iterable _globalExclude; final Config _metricsConfig; final Iterable _metricsExclude; - final MetricsAnalysisRecorder _recorder; + final MetricsRecordsStore _store; MetricsAnalyzer( - this._recorder, { + this._store, { AnalysisOptions options, }) : _checkingCodeRules = options?.rules != null ? getRulesById(options.rules) : [], @@ -59,7 +59,7 @@ class MetricsAnalyzer { final lineInfo = parseResult.lineInfo; - _recorder.recordFile(filePath, rootFolder, (builder) { + _store.recordFile(filePath, rootFolder, (builder) { if (!_isExcluded(relativeFilePath, _metricsExclude)) { for (final component in visitor.components) { builder.recordComponent( diff --git a/lib/src/metrics_records_store.dart b/lib/src/metrics_records_store.dart index c2e765f0c0..07a0e69c30 100644 --- a/lib/src/metrics_records_store.dart +++ b/lib/src/metrics_records_store.dart @@ -1,8 +1,11 @@ -import 'package:dart_code_metrics/src/models/file_record.dart'; -import 'package:dart_code_metrics/src/metrics_records_builder.dart'; +import 'metrics_analysis_recorder.dart'; +import 'metrics_records_builder.dart'; +import 'models/file_record.dart'; abstract class MetricsRecordsStore { Iterable records(); MetricsRecordsStore recordFile(String filePath, String rootDirectory, void Function(MetricsRecordsBuilder) f); + + factory MetricsRecordsStore.store() => MetricsAnalysisRecorder(); } diff --git a/test/metrics_analysis_recorder_test.dart b/test/metrics_analysis_recorder_test.dart index 7d5e148423..ecb5a73fff 100644 --- a/test/metrics_analysis_recorder_test.dart +++ b/test/metrics_analysis_recorder_test.dart @@ -1,5 +1,4 @@ @TestOn('vm') -// ignore_for_file: deprecated_member_use_from_same_package import 'package:analyzer/dart/ast/ast.dart'; import 'package:dart_code_metrics/src/metrics_analysis_recorder.dart'; import 'package:dart_code_metrics/src/models/code_issue.dart'; @@ -154,23 +153,6 @@ void main() { }); }); - group('startRecordFile', () { - test('throws ArgumentError if we call them without filePath', () { - expect(() { - MetricsAnalysisRecorder().startRecordFile(null, null); - }, throwsArgumentError); - }); - - test('throws StateError if we call them twice witout endRecordFile', () { - final recorder = MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory); - - expect(() { - recorder.startRecordFile(filePath, rootDirectory); - }, throwsStateError); - }); - }); - group('recordComponent', () { const componentName = 'simpleClass'; @@ -190,9 +172,10 @@ void main() { test('throws ArgumentError if we call them without record', () { expect(() { - MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordComponent(null, null); + MetricsAnalysisRecorder().recordFile(filePath, rootDirectory, + (recorder) { + recorder.recordComponent(null, null); + }); }, throwsArgumentError); }); @@ -201,9 +184,9 @@ void main() { ComponentRecord(firstLine: 1, lastLine: 2, methodsCount: 3); final recorder = MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordComponent(record, componentRecord) - ..endRecordFile(); + .recordFile(filePath, rootDirectory, (recorder) { + recorder.recordComponent(record, componentRecord); + }); expect(recorder.records().single.components, containsPair(componentName, componentRecord)); @@ -229,9 +212,10 @@ void main() { test('throws ArgumentError if we call them without record', () { expect(() { - MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordFunction(null, null); + MetricsAnalysisRecorder().recordFile(filePath, rootDirectory, + (recorder) { + recorder.recordFunction(null, null); + }); }, throwsArgumentError); }); @@ -247,9 +231,9 @@ void main() { ); final recorder = MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordFunction(record, functionRecord) - ..endRecordFile(); + .recordFile(filePath, rootDirectory, (recorder) { + recorder.recordFunction(record, functionRecord); + }); expect(recorder.records().single.functions, containsPair(functionName, functionRecord)); @@ -270,8 +254,8 @@ void main() { const _issueRecommendation = 'recommendation'; final recorder = MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordDesignIssues([ + .recordFile(filePath, rootDirectory, (recorder) { + recorder.recordDesignIssues([ DesignIssue( patternId: _issuePatternId, patternDocumentation: Uri.parse(_issuePatternDocumentation), @@ -283,8 +267,8 @@ void main() { message: _issueMessage, recommendation: _issueRecommendation, ), - ]) - ..endRecordFile(); + ]); + }); final issue = recorder.records().single.designIssue.single; expect(issue.patternId, _issuePatternId); @@ -310,8 +294,8 @@ void main() { const _issueCorrectionComment = 'correction comment'; final recorder = MetricsAnalysisRecorder() - ..startRecordFile(filePath, rootDirectory) - ..recordIssues([ + .recordFile(filePath, rootDirectory, (recorder) { + recorder.recordIssues([ CodeIssue( ruleId: _issueRuleId, ruleDocumentation: Uri.parse(_issueRuleDocumentation), @@ -325,8 +309,8 @@ void main() { correction: _issueCorrection, correctionComment: _issueCorrectionComment, ), - ]) - ..endRecordFile(); + ]); + }); final issue = recorder.records().single.issues.single; expect(issue.ruleId, _issueRuleId); diff --git a/test/metrics_analysis_runner_test.dart b/test/metrics_analysis_runner_test.dart index 1bfb1de189..a897c6f909 100644 --- a/test/metrics_analysis_runner_test.dart +++ b/test/metrics_analysis_runner_test.dart @@ -1,19 +1,18 @@ @TestOn('vm') -import 'package:dart_code_metrics/src/metrics_analysis_recorder.dart'; import 'package:dart_code_metrics/src/metrics_analysis_runner.dart'; import 'package:dart_code_metrics/src/metrics_analyzer.dart'; +import 'package:dart_code_metrics/src/metrics_records_store.dart'; import 'package:dart_code_metrics/src/models/file_record.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -class MetricsAnalysisRecorderMock extends Mock - implements MetricsAnalysisRecorder {} +class MetricsRecordsStoreMock extends Mock implements MetricsRecordsStore {} class MetricsAnalyzerMock extends Mock implements MetricsAnalyzer {} void main() { group('MetricsAnalysisRunner', () { - test('results() returns MetricsAnalysisRecorder.runAnalysis', () { + test('results() returns array of FileRecords', () { const stubRecords = [ FileRecord( fullPath: 'lib/foo.dart', @@ -33,10 +32,10 @@ void main() { ), ]; - final recorder = MetricsAnalysisRecorderMock(); - when(recorder.records()).thenReturn(stubRecords); + final store = MetricsRecordsStoreMock(); + when(store.records()).thenReturn(stubRecords); - final runner = MetricsAnalysisRunner(recorder, MetricsAnalyzerMock(), []); + final runner = MetricsAnalysisRunner(MetricsAnalyzerMock(), store, []); expect(runner.results(), equals(stubRecords)); }); @@ -47,7 +46,7 @@ void main() { final analyzer = MetricsAnalyzerMock(); - MetricsAnalysisRunner(MetricsAnalysisRecorderMock(), analyzer, files, + MetricsAnalysisRunner(analyzer, MetricsRecordsStoreMock(), files, rootFolder: root) .run();