Skip to content
This repository has been archived by the owner on Jul 16, 2023. It is now read-only.

Commit

Permalink
Merge 20ac7c4 into 2483011
Browse files Browse the repository at this point in the history
  • Loading branch information
dkrutskikh committed Sep 6, 2020
2 parents 2483011 + 20ac7c4 commit b03e13d
Show file tree
Hide file tree
Showing 10 changed files with 66 additions and 102 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -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

Expand Down
7 changes: 3 additions & 4 deletions bin/metrics.dart
Expand Up @@ -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';
Expand Down Expand Up @@ -80,9 +79,9 @@ Future<void> _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();

Expand Down
12 changes: 6 additions & 6 deletions example/example.dart
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion 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';
Expand Down
31 changes: 5 additions & 26 deletions 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';
Expand Down Expand Up @@ -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();
Expand All @@ -68,7 +57,6 @@ class MetricsAnalysisRecorder
}

@override
@Deprecated('Use MetricsRecordsBuilder.recordFunction')
void recordFunction(
ScopedFunctionDeclaration declaration, FunctionRecord record) {
_checkState();
Expand All @@ -88,7 +76,6 @@ class MetricsAnalysisRecorder
}

@override
@Deprecated('Use MetricsRecordsBuilder.recordIssues')
void recordIssues(Iterable<CodeIssue> issues) {
_checkState();

Expand All @@ -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)
Expand Down
14 changes: 7 additions & 7 deletions 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<String> _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<FileRecord> results() => _recorder.records();
Iterable<FileRecord> results() => _store.records();

/// Perform analysis of file paths passed in constructor
void run() {
Expand Down
20 changes: 10 additions & 10 deletions 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
Expand All @@ -30,10 +30,10 @@ class MetricsAnalyzer {
final Iterable<Glob> _globalExclude;
final Config _metricsConfig;
final Iterable<Glob> _metricsExclude;
final MetricsAnalysisRecorder _recorder;
final MetricsRecordsStore _store;

MetricsAnalyzer(
this._recorder, {
this._store, {
AnalysisOptions options,
}) : _checkingCodeRules =
options?.rules != null ? getRulesById(options.rules) : [],
Expand All @@ -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(
Expand Down
7 changes: 5 additions & 2 deletions 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<FileRecord> records();
MetricsRecordsStore recordFile(String filePath, String rootDirectory,
void Function(MetricsRecordsBuilder) f);

factory MetricsRecordsStore.store() => MetricsAnalysisRecorder();
}
60 changes: 22 additions & 38 deletions 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';
Expand Down Expand Up @@ -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';

Expand All @@ -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);
});

Expand All @@ -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));
Expand All @@ -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);
});

Expand All @@ -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));
Expand All @@ -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),
Expand All @@ -283,8 +267,8 @@ void main() {
message: _issueMessage,
recommendation: _issueRecommendation,
),
])
..endRecordFile();
]);
});

final issue = recorder.records().single.designIssue.single;
expect(issue.patternId, _issuePatternId);
Expand All @@ -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),
Expand All @@ -325,8 +309,8 @@ void main() {
correction: _issueCorrection,
correctionComment: _issueCorrectionComment,
),
])
..endRecordFile();
]);
});

final issue = recorder.records().single.issues.single;
expect(issue.ruleId, _issueRuleId);
Expand Down
15 changes: 7 additions & 8 deletions 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',
Expand All @@ -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));
});
Expand All @@ -47,7 +46,7 @@ void main() {

final analyzer = MetricsAnalyzerMock();

MetricsAnalysisRunner(MetricsAnalysisRecorderMock(), analyzer, files,
MetricsAnalysisRunner(analyzer, MetricsRecordsStoreMock(), files,
rootFolder: root)
.run();

Expand Down

0 comments on commit b03e13d

Please sign in to comment.