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

Commit

Permalink
update code_climate report
Browse files Browse the repository at this point in the history
  • Loading branch information
dkrutskikh committed Aug 30, 2020
1 parent 0f22fd0 commit 554657b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 59 deletions.
17 changes: 8 additions & 9 deletions lib/src/reporters/code_climate/code_climate_issue.dart
Expand Up @@ -5,6 +5,8 @@ import 'package:dart_code_metrics/src/models/code_issue.dart';
import 'package:dart_code_metrics/src/models/code_issue_severity.dart';
import 'package:meta/meta.dart';

import '../../models/design_issue.dart';

@immutable
class CodeClimateLocationLines {
final int begin;
Expand Down Expand Up @@ -57,15 +59,6 @@ class CodeClimateIssue {
return CodeClimateIssue._(name, desc, categories, location, fingerprint);
}

factory CodeClimateIssue.linesOfExecutableCode(int startLine, int endLine,
int value, String fileName, String functionName, int threshold) {
final desc =
'Function `$functionName` has $value executable code lines (exceeds $threshold allowed). Consider refactoring.';

return CodeClimateIssue._create(
'linesOfExecutableCode', desc, startLine, endLine, fileName);
}

factory CodeClimateIssue.cyclomaticComplexity(int startLine, int endLine,
int value, String fileName, String functionName, int threshold) {
final desc =
Expand Down Expand Up @@ -114,6 +107,12 @@ class CodeClimateIssue {
categories: severityHumanReadable[issue.severity]);
}

factory CodeClimateIssue.fromDesignIssue(
DesignIssue issue, String fileName) =>
CodeClimateIssue._create(issue.patternId, issue.message,
issue.sourceSpan.start.line, issue.sourceSpan.start.line, fileName,
categories: const ['Complexity']);

Map<String, Object> toJson() => {
'type': type,
'check_name': checkName,
Expand Down
18 changes: 5 additions & 13 deletions lib/src/reporters/code_climate/code_climate_reporter.dart
Expand Up @@ -53,17 +53,6 @@ class CodeClimateReporter implements Reporter {
reportConfig.cyclomaticComplexityWarningLevel));
}

if (UtilitySelector.isIssueLevel(
report.linesOfExecutableCode.violationLevel)) {
result.add(CodeClimateIssue.linesOfExecutableCode(
func.firstLine,
func.lastLine,
report.linesOfExecutableCode.value,
record.relativePath,
key,
reportConfig.linesOfExecutableCodeWarningLevel));
}

if (UtilitySelector.isIssueLevel(
report.maintainabilityIndex.violationLevel)) {
result.add(CodeClimateIssue.maintainabilityIndex(
Expand All @@ -85,8 +74,11 @@ class CodeClimateReporter implements Reporter {
}
}

result.addAll(record.issues.map(
(issue) => CodeClimateIssue.fromCodeIssue(issue, record.relativePath)));
result
..addAll(record.issues.map((issue) =>
CodeClimateIssue.fromCodeIssue(issue, record.relativePath)))
..addAll(record.designIssue.map((issue) =>
CodeClimateIssue.fromDesignIssue(issue, record.relativePath)));

return result;
}
Expand Down
89 changes: 52 additions & 37 deletions test/reporters/code_climate_reporter_test.dart
Expand Up @@ -5,6 +5,7 @@ import 'package:dart_code_metrics/src/models/code_issue.dart';
import 'package:dart_code_metrics/src/models/code_issue_severity.dart';
import 'package:dart_code_metrics/src/models/component_record.dart';
import 'package:dart_code_metrics/src/models/config.dart';
import 'package:dart_code_metrics/src/models/design_issue.dart';
import 'package:dart_code_metrics/src/models/file_record.dart';
import 'package:dart_code_metrics/src/models/function_record.dart';
import 'package:dart_code_metrics/src/reporters/code_climate/code_climate_reporter.dart';
Expand All @@ -27,6 +28,57 @@ void main() {
expect(_reporter.report([]), isEmpty);
});

test('file with design issues', () {
const _issuePatternId = 'patternId1';
const _issuePatternDocumentation = 'https://docu.edu/patternId1.html';
const _issueLine = 2;
const _issueMessage = 'first issue message';
const _issueRecomendation = 'issue recomendation';

final records = [
FileRecord(
fullPath: fullPath,
relativePath: 'example.dart',
components: Map.unmodifiable(<String, ComponentRecord>{}),
functions: Map.unmodifiable(<String, FunctionRecord>{}),
issues: const [],
designIssue: [
DesignIssue(
patternId: _issuePatternId,
patternDocumentation: Uri.parse(_issuePatternDocumentation),
sourceSpan: SourceSpanBase(
SourceLocation(1,
sourceUrl: Uri.parse(fullPath),
line: _issueLine,
column: 3),
SourceLocation(6, sourceUrl: Uri.parse(fullPath)),
'issue'),
message: 'first issue message',
recommendation: _issueRecomendation,
),
],
),
];

final report =
(json.decode(_reporter.report(records).first) as List<Object>).first
as Map<String, Object>;

expect(report, containsPair('type', 'issue'));
expect(report, containsPair('check_name', _issuePatternId));
expect(report, containsPair('description', _issueMessage));
expect(report, containsPair('categories', ['Complexity']));
expect(
report,
containsPair('location', {
'path': 'example.dart',
'lines': {'begin': _issueLine, 'end': _issueLine},
}));
expect(report, containsPair('remediation_points', 50000));
expect(report,
containsPair('fingerprint', '8842a666b8aee4f2eae51205e0114dae'));
});

test('file with style severity issues', () {
const _issueRuleId = 'ruleId1';
const _issueRuleDocumentation = 'https://docu.edu/ruleId1.html';
Expand Down Expand Up @@ -139,43 +191,6 @@ void main() {
});

group('function', () {
test('with long body', () {
final records = [
FileRecord(
fullPath: fullPath,
relativePath: 'example.dart',
components: Map.unmodifiable(<String, ComponentRecord>{}),
functions: Map.unmodifiable(<String, FunctionRecord>{
'function': buildFunctionRecordStub(
linesWithCode: List.generate(150, (index) => index)),
}),
issues: const [],
designIssue: const [],
),
];

final report =
(json.decode(_reporter.report(records).first) as List<Object>).first
as Map<String, Object>;

expect(report, containsPair('type', 'issue'));
expect(report, containsPair('check_name', 'linesOfExecutableCode'));
expect(
report,
containsPair('description',
'Function `function` has 150 executable code lines (exceeds 50 allowed). Consider refactoring.'));
expect(report, containsPair('categories', ['Complexity']));
expect(
report,
containsPair('location', {
'path': 'example.dart',
'lines': {'begin': 0, 'end': 0},
}));
expect(report, containsPair('remediation_points', 50000));
expect(report,
containsPair('fingerprint', '01bdb88a1141bd18f91bd2c933953436'));
});

test('with short body', () {
final records = [
FileRecord(
Expand Down

0 comments on commit 554657b

Please sign in to comment.