-
Notifications
You must be signed in to change notification settings - Fork 222
/
analysed_module.rb
93 lines (75 loc) · 1.89 KB
/
analysed_module.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# frozen_string_literal: true
require 'virtus'
require 'rubycritic/core/rating'
module RubyCritic
class AnalysedModule
include Virtus.model
# Complexity is reduced by a factor of 25 when calculating cost
COMPLEXITY_FACTOR = 25.0
attribute :coverage
attribute :name
attribute :smells_count
attribute :file_location
attribute :file_name
attribute :line_count
attribute :pathname
attribute :smells, Array, default: []
attribute :churn
attribute :committed_at
attribute :complexity, Float, default: Float::INFINITY
attribute :duplication, Integer, default: 0
attribute :methods_count
def path
@path ||= pathname.to_s
end
def file_location
pathname.dirname
end
def file_name
pathname.basename
end
def line_count
File.read(path).each_line.count
end
def cost
@cost ||= smells.map(&:cost).inject(0.0, :+) +
(complexity / COMPLEXITY_FACTOR)
end
def coverage_rating
@coverage_rating ||= Rating.from_cost(100 - coverage)
end
def rating
@rating ||= Rating.from_cost(cost)
end
def complexity_per_method
if methods_count.zero?
'N/A'
else
complexity.fdiv(methods_count).round(1)
end
end
def smells_count
smells.count
end
def smells?
!smells.empty?
end
def smells_at_location(location)
smells.select { |smell| smell.at_location?(location) }
end
def <=>(other)
[rating.to_s, name] <=> [other.rating.to_s, other.name]
end
def to_h
{
name: name, path: path, smells: smells,
churn: churn, committed_at: committed_at, complexity: complexity,
duplication: duplication, methods_count: methods_count, cost: cost,
rating: rating
}
end
def to_json(*options)
to_h.to_json(*options)
end
end
end