metric_fu 4.11.3 → 4.11.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +69 -0
- data/.travis.yml +0 -1
- data/CONTRIBUTORS +1 -1
- data/Gemfile +23 -20
- data/Guardfile +9 -9
- data/HISTORY.md +10 -1
- data/checksum/metric_fu-4.11.3.gem.sha512 +1 -0
- data/config/rubocop.yml +269 -0
- data/gem_tasks/rubocop.rake +10 -0
- data/lib/metric_fu.rb +11 -9
- data/lib/metric_fu/calculate.rb +0 -1
- data/lib/metric_fu/cli/client.rb +6 -6
- data/lib/metric_fu/cli/helper.rb +22 -13
- data/lib/metric_fu/cli/parser.rb +14 -18
- data/lib/metric_fu/configuration.rb +7 -11
- data/lib/metric_fu/constantize.rb +4 -4
- data/lib/metric_fu/data_structures/line_numbers.rb +10 -11
- data/lib/metric_fu/data_structures/location.rb +12 -14
- data/lib/metric_fu/data_structures/sexp_node.rb +31 -13
- data/lib/metric_fu/environment.rb +29 -31
- data/lib/metric_fu/formatter.rb +4 -6
- data/lib/metric_fu/formatter/html.rb +13 -13
- data/lib/metric_fu/formatter/syntax.rb +5 -7
- data/lib/metric_fu/formatter/yaml.rb +1 -1
- data/lib/metric_fu/gem_run.rb +13 -15
- data/lib/metric_fu/gem_version.rb +9 -11
- data/lib/metric_fu/generator.rb +5 -8
- data/lib/metric_fu/io.rb +13 -15
- data/lib/metric_fu/loader.rb +17 -18
- data/lib/metric_fu/logger.rb +15 -18
- data/lib/metric_fu/logging/mf_debugger.rb +4 -4
- data/lib/metric_fu/metric.rb +11 -12
- data/lib/metric_fu/metrics/cane/generator.rb +10 -9
- data/lib/metric_fu/metrics/cane/grapher.rb +5 -7
- data/lib/metric_fu/metrics/cane/metric.rb +6 -8
- data/lib/metric_fu/metrics/cane/report.html.erb +3 -3
- data/lib/metric_fu/metrics/cane/violations.rb +6 -6
- data/lib/metric_fu/metrics/churn/generator.rb +2 -6
- data/lib/metric_fu/metrics/churn/hotspot.rb +1 -3
- data/lib/metric_fu/metrics/churn/metric.rb +5 -7
- data/lib/metric_fu/metrics/flay/generator.rb +7 -11
- data/lib/metric_fu/metrics/flay/grapher.rb +5 -6
- data/lib/metric_fu/metrics/flay/hotspot.rb +5 -7
- data/lib/metric_fu/metrics/flay/metric.rb +5 -7
- data/lib/metric_fu/metrics/flog/generator.rb +22 -23
- data/lib/metric_fu/metrics/flog/grapher.rb +11 -11
- data/lib/metric_fu/metrics/flog/hotspot.rb +3 -5
- data/lib/metric_fu/metrics/flog/metric.rb +3 -5
- data/lib/metric_fu/metrics/hotspots/analysis/analyzed_problems.rb +0 -1
- data/lib/metric_fu/metrics/hotspots/analysis/analyzer_tables.rb +19 -18
- data/lib/metric_fu/metrics/hotspots/analysis/grouping.rb +0 -2
- data/lib/metric_fu/metrics/hotspots/analysis/groupings.rb +1 -3
- data/lib/metric_fu/metrics/hotspots/analysis/problems.rb +4 -6
- data/lib/metric_fu/metrics/hotspots/analysis/ranked_problem_location.rb +14 -9
- data/lib/metric_fu/metrics/hotspots/analysis/ranking.rb +4 -5
- data/lib/metric_fu/metrics/hotspots/analysis/rankings.rb +1 -3
- data/lib/metric_fu/metrics/hotspots/analysis/record.rb +3 -5
- data/lib/metric_fu/metrics/hotspots/analysis/scoring_strategies.rb +0 -2
- data/lib/metric_fu/metrics/hotspots/analysis/table.rb +3 -4
- data/lib/metric_fu/metrics/hotspots/generator.rb +3 -6
- data/lib/metric_fu/metrics/hotspots/hotspot.rb +13 -13
- data/lib/metric_fu/metrics/hotspots/hotspot_analyzer.rb +5 -8
- data/lib/metric_fu/metrics/hotspots/metric.rb +1 -3
- data/lib/metric_fu/metrics/hotspots/report.html.erb +1 -1
- data/lib/metric_fu/metrics/rails_best_practices/generator.rb +10 -12
- data/lib/metric_fu/metrics/rails_best_practices/grapher.rb +5 -6
- data/lib/metric_fu/metrics/rails_best_practices/metric.rb +1 -3
- data/lib/metric_fu/metrics/rcov/external_client.rb +1 -3
- data/lib/metric_fu/metrics/rcov/generator.rb +13 -15
- data/lib/metric_fu/metrics/rcov/grapher.rb +6 -7
- data/lib/metric_fu/metrics/rcov/hotspot.rb +5 -7
- data/lib/metric_fu/metrics/rcov/metric.rb +5 -7
- data/lib/metric_fu/metrics/rcov/rcov_format_coverage.rb +16 -55
- data/lib/metric_fu/metrics/rcov/rcov_line.rb +48 -0
- data/lib/metric_fu/metrics/rcov/report.html.erb +2 -2
- data/lib/metric_fu/metrics/rcov/simplecov_formatter.rb +10 -11
- data/lib/metric_fu/metrics/reek/generator.rb +22 -23
- data/lib/metric_fu/metrics/reek/grapher.rb +5 -6
- data/lib/metric_fu/metrics/reek/hotspot.rb +5 -7
- data/lib/metric_fu/metrics/reek/metric.rb +2 -4
- data/lib/metric_fu/metrics/roodi/generator.rb +9 -10
- data/lib/metric_fu/metrics/roodi/grapher.rb +5 -6
- data/lib/metric_fu/metrics/roodi/hotspot.rb +1 -3
- data/lib/metric_fu/metrics/roodi/metric.rb +2 -4
- data/lib/metric_fu/metrics/saikuro/generator.rb +23 -27
- data/lib/metric_fu/metrics/saikuro/hotspot.rb +1 -3
- data/lib/metric_fu/metrics/saikuro/metric.rb +7 -8
- data/lib/metric_fu/metrics/saikuro/parsing_element.rb +6 -8
- data/lib/metric_fu/metrics/saikuro/report.html.erb +1 -1
- data/lib/metric_fu/metrics/saikuro/scratch_file.rb +24 -29
- data/lib/metric_fu/metrics/stats/generator.rb +9 -12
- data/lib/metric_fu/metrics/stats/grapher.rb +8 -9
- data/lib/metric_fu/metrics/stats/hotspot.rb +1 -3
- data/lib/metric_fu/metrics/stats/metric.rb +3 -5
- data/lib/metric_fu/reporter.rb +1 -1
- data/lib/metric_fu/reporting/graphs/graph.rb +8 -12
- data/lib/metric_fu/reporting/graphs/grapher.rb +7 -9
- data/lib/metric_fu/reporting/result.rb +0 -3
- data/lib/metric_fu/run.rb +12 -3
- data/lib/metric_fu/tasks/metric_fu.rake +8 -8
- data/lib/metric_fu/templates/configuration.rb +2 -5
- data/lib/metric_fu/templates/metrics_template.rb +19 -19
- data/lib/metric_fu/templates/report.rb +5 -8
- data/lib/metric_fu/templates/template.rb +20 -24
- data/lib/metric_fu/utility.rb +7 -8
- data/lib/metric_fu/version.rb +1 -1
- data/metric_fu.gemspec +31 -32
- data/spec/cli/helper_spec.rb +7 -14
- data/spec/dummy/lib/bad_encoding.rb +1 -1
- data/spec/fixtures/coverage-153.rb +2 -2
- data/spec/fixtures/coverage.rb +2 -2
- data/spec/metric_fu/calculate_spec.rb +3 -3
- data/spec/metric_fu/configuration_spec.rb +70 -82
- data/spec/metric_fu/data_structures/line_numbers_spec.rb +3 -5
- data/spec/metric_fu/data_structures/location_spec.rb +13 -31
- data/spec/metric_fu/formatter/configuration_spec.rb +11 -13
- data/spec/metric_fu/formatter/html_spec.rb +21 -28
- data/spec/metric_fu/formatter/yaml_spec.rb +9 -17
- data/spec/metric_fu/formatter_spec.rb +6 -6
- data/spec/metric_fu/gem_version_spec.rb +3 -5
- data/spec/metric_fu/generator_spec.rb +28 -38
- data/spec/metric_fu/loader_spec.rb +1 -3
- data/spec/metric_fu/metric_spec.rb +17 -21
- data/spec/metric_fu/metrics/cane/configuration_spec.rb +8 -8
- data/spec/metric_fu/metrics/cane/generator_spec.rb +26 -29
- data/spec/metric_fu/metrics/churn/configuration_spec.rb +6 -8
- data/spec/metric_fu/metrics/churn/generator_spec.rb +6 -11
- data/spec/metric_fu/metrics/flay/configuration_spec.rb +6 -8
- data/spec/metric_fu/metrics/flay/generator_spec.rb +36 -37
- data/spec/metric_fu/metrics/flay/grapher_spec.rb +2 -2
- data/spec/metric_fu/metrics/flog/configuration_spec.rb +11 -13
- data/spec/metric_fu/metrics/flog/generator_spec.rb +29 -31
- data/spec/metric_fu/metrics/flog/grapher_spec.rb +8 -10
- data/spec/metric_fu/metrics/hotspots/analysis/analyzed_problems_spec.rb +18 -24
- data/spec/metric_fu/metrics/hotspots/analysis/analyzer_tables_spec.rb +12 -17
- data/spec/metric_fu/metrics/hotspots/analysis/ranking_spec.rb +2 -6
- data/spec/metric_fu/metrics/hotspots/analysis/rankings_spec.rb +5 -14
- data/spec/metric_fu/metrics/hotspots/analysis/table_spec.rb +1 -3
- data/spec/metric_fu/metrics/hotspots/generator_spec.rb +6 -8
- data/spec/metric_fu/metrics/hotspots/hotspot_analyzer_spec.rb +1 -3
- data/spec/metric_fu/metrics/hotspots/hotspot_spec.rb +4 -5
- data/spec/metric_fu/metrics/rails_best_practices/configuration_spec.rb +6 -10
- data/spec/metric_fu/metrics/rails_best_practices/generator_spec.rb +2 -3
- data/spec/metric_fu/metrics/rails_best_practices/grapher_spec.rb +3 -3
- data/spec/metric_fu/metrics/rcov/configuration_spec.rb +20 -22
- data/spec/metric_fu/metrics/rcov/generator_spec.rb +6 -10
- data/spec/metric_fu/metrics/rcov/grapher_spec.rb +2 -2
- data/spec/metric_fu/metrics/rcov/hotspot_spec.rb +8 -8
- data/spec/metric_fu/metrics/rcov/rcov_line_spec.rb +89 -0
- data/spec/metric_fu/metrics/rcov/simplecov_formatter_spec.rb +31 -33
- data/spec/metric_fu/metrics/reek/configuration_spec.rb +6 -6
- data/spec/metric_fu/metrics/reek/generator_spec.rb +19 -20
- data/spec/metric_fu/metrics/reek/grapher_spec.rb +4 -4
- data/spec/metric_fu/metrics/roodi/configuration_spec.rb +7 -9
- data/spec/metric_fu/metrics/roodi/generator_spec.rb +3 -3
- data/spec/metric_fu/metrics/roodi/grapher_spec.rb +2 -2
- data/spec/metric_fu/metrics/saikuro/configuration_spec.rb +18 -19
- data/spec/metric_fu/metrics/saikuro/generator_spec.rb +7 -7
- data/spec/metric_fu/metrics/stats/generator_spec.rb +9 -9
- data/spec/metric_fu/metrics/stats/grapher_spec.rb +2 -2
- data/spec/metric_fu/reporter_spec.rb +3 -4
- data/spec/metric_fu/reporting/graphs/graph_spec.rb +1 -4
- data/spec/metric_fu/reporting/graphs/grapher_spec.rb +5 -5
- data/spec/metric_fu/reporting/result_spec.rb +9 -11
- data/spec/metric_fu/run_spec.rb +18 -32
- data/spec/metric_fu/templates/configuration_spec.rb +28 -34
- data/spec/metric_fu/templates/metrics_template_spec.rb +11 -0
- data/spec/metric_fu/templates/report_spec.rb +4 -4
- data/spec/metric_fu/templates/template_spec.rb +62 -48
- data/spec/metric_fu/utility_spec.rb +2 -2
- data/spec/metric_fu_spec.rb +5 -7
- data/spec/shared/configured.rb +9 -11
- data/spec/shared/test_coverage.rb +5 -9
- data/spec/spec_helper.rb +9 -9
- data/spec/support/deferred_garbaged_collection.rb +1 -2
- data/spec/support/matcher_create_file.rb +2 -4
- data/spec/support/matcher_create_files.rb +2 -4
- data/spec/support/suite.rb +3 -3
- data/spec/support/test_fixtures.rb +5 -7
- data/spec/support/timeout.rb +1 -1
- data/spec/support/usage_test.rb +23 -24
- data/spec/usage_test_spec.rb +18 -20
- metadata +12 -2
- metadata.gz.sig +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
MetricFu.reporting_require {
|
1
|
+
MetricFu.reporting_require { "graphs/grapher" }
|
2
2
|
module MetricFu
|
3
3
|
class FlogGrapher < Grapher
|
4
4
|
attr_accessor :flog_average, :labels, :top_five_percent_average
|
@@ -11,30 +11,30 @@ module MetricFu
|
|
11
11
|
super
|
12
12
|
@flog_average = []
|
13
13
|
@labels = {}
|
14
|
-
@top_five_percent_average =[]
|
14
|
+
@top_five_percent_average = []
|
15
15
|
end
|
16
16
|
|
17
17
|
def get_metrics(metrics, date)
|
18
18
|
if metrics && metrics[:flog]
|
19
19
|
@top_five_percent_average.push(calc_top_five_percent_average(metrics))
|
20
20
|
@flog_average.push(metrics[:flog][:average])
|
21
|
-
@labels.update(
|
21
|
+
@labels.update(@labels.size => date)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def title
|
26
|
-
|
26
|
+
"Flog: code complexity"
|
27
27
|
end
|
28
28
|
|
29
29
|
def data
|
30
30
|
[
|
31
|
-
[
|
32
|
-
[
|
31
|
+
["average", @flog_average.join(",")],
|
32
|
+
["top 5% average", @top_five_percent_average.join(",")]
|
33
33
|
]
|
34
34
|
end
|
35
35
|
|
36
36
|
def output_filename
|
37
|
-
|
37
|
+
"flog.js"
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
@@ -43,7 +43,7 @@ module MetricFu
|
|
43
43
|
return calc_top_five_percent_average_legacy(metrics) if metrics[:flog][:pages]
|
44
44
|
|
45
45
|
method_scores = metrics[:flog][:method_containers].inject([]) do |method_scores, container|
|
46
|
-
method_scores += container[:methods].values.map {|v| v[:score]}
|
46
|
+
method_scores += container[:methods].values.map { |v| v[:score] }
|
47
47
|
end
|
48
48
|
method_scores.sort!.reverse!
|
49
49
|
|
@@ -59,14 +59,14 @@ module MetricFu
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def calc_top_five_percent_average_legacy(metrics)
|
62
|
-
methods = metrics[:flog][:pages].inject([]) {|methods, page| methods << page[:scanned_methods]}
|
62
|
+
methods = metrics[:flog][:pages].inject([]) { |methods, page| methods << page[:scanned_methods] }
|
63
63
|
methods.flatten!
|
64
|
-
methods = methods.sort_by {|method| method[:score]}.reverse
|
64
|
+
methods = methods.sort_by { |method| method[:score] }.reverse
|
65
65
|
|
66
66
|
number_of_methods_that_is_five_percent = (methods.size * 0.05).ceil
|
67
67
|
|
68
68
|
total_for_five_percent =
|
69
|
-
methods[0...number_of_methods_that_is_five_percent].inject(0) {|total, method| total += method[:score] }
|
69
|
+
methods[0...number_of_methods_that_is_five_percent].inject(0) { |total, method| total += method[:score] }
|
70
70
|
if number_of_methods_that_is_five_percent == 0
|
71
71
|
0.0
|
72
72
|
else
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class MetricFu::FlogHotspot < MetricFu::Hotspot
|
2
|
-
|
3
2
|
COLUMNS = %w{score}
|
4
3
|
|
5
4
|
def columns
|
@@ -23,10 +22,10 @@ class MetricFu::FlogHotspot < MetricFu::Hotspot
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def generate_records(data, table)
|
26
|
-
return if data==nil
|
25
|
+
return if data == nil
|
27
26
|
Array(data[:method_containers]).each do |method_container|
|
28
27
|
Array(method_container[:methods]).each do |entry|
|
29
|
-
file_path = entry[1][:path].sub(%r{^/},
|
28
|
+
file_path = entry[1][:path].sub(%r{^/}, "") if entry[1][:path]
|
30
29
|
location = MetricFu::Location.for(entry.first)
|
31
30
|
table << {
|
32
31
|
"metric" => name,
|
@@ -42,7 +41,6 @@ class MetricFu::FlogHotspot < MetricFu::Hotspot
|
|
42
41
|
def present_group(group)
|
43
42
|
occurences = group.size
|
44
43
|
complexity = get_mean(group.column("score"))
|
45
|
-
"#{
|
44
|
+
"#{'average ' if occurences > 1}complexity is %.1f" % complexity
|
46
45
|
end
|
47
|
-
|
48
46
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
module MetricFu
|
2
2
|
class MetricFlog < Metric
|
3
|
-
|
4
3
|
def name
|
5
4
|
:flog
|
6
5
|
end
|
7
6
|
|
8
7
|
def default_run_options
|
9
|
-
{ :
|
8
|
+
{ dirs_to_flog: MetricFu::Io::FileSystem.directory("code_dirs"), continue: true, all: true, quiet: true }
|
10
9
|
end
|
11
10
|
|
12
11
|
def has_graph?
|
@@ -22,10 +21,9 @@ module MetricFu
|
|
22
21
|
end
|
23
22
|
|
24
23
|
def activate
|
25
|
-
activate_library
|
26
|
-
activate_library
|
24
|
+
activate_library "flog"
|
25
|
+
activate_library "flog_cli"
|
27
26
|
super
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
29
|
end
|
@@ -23,10 +23,10 @@ module MetricFu
|
|
23
23
|
|
24
24
|
def tables_for(item)
|
25
25
|
{
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
26
|
+
class: @class_tables,
|
27
|
+
method: @method_tables,
|
28
|
+
file: @file_tables,
|
29
|
+
tool: @tool_tables
|
30
30
|
}.fetch(item) do
|
31
31
|
raise ArgumentError, "Item must be :class, :method, or :file, but was #{item}"
|
32
32
|
end
|
@@ -35,7 +35,7 @@ module MetricFu
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def make_table(columns)
|
38
|
-
MetricFu::Table.new(:
|
38
|
+
MetricFu::Table.new(column_names: columns)
|
39
39
|
end
|
40
40
|
|
41
41
|
def make_table_hash(columns)
|
@@ -52,9 +52,9 @@ module MetricFu
|
|
52
52
|
table.each do |row|
|
53
53
|
# We know that Saikuro provides the wrong data
|
54
54
|
# TODO inject Saikuro reference
|
55
|
-
next if row[
|
56
|
-
key = [row[
|
57
|
-
file_path = row[
|
55
|
+
next if row["metric"] == :saikuro
|
56
|
+
key = [row["class_name"], row["method_name"]]
|
57
|
+
file_path = row["file_path"]
|
58
58
|
@class_and_method_to_file[key] ||= file_path
|
59
59
|
end
|
60
60
|
end
|
@@ -63,7 +63,7 @@ module MetricFu
|
|
63
63
|
def process_rows!
|
64
64
|
# Correct incorrect rows in the table
|
65
65
|
table.each do |row|
|
66
|
-
row_metric = row[
|
66
|
+
row_metric = row["metric"] # perf optimization
|
67
67
|
# TODO inject Saikuro reference
|
68
68
|
if row_metric == :saikuro
|
69
69
|
fix_row_file_path!(row)
|
@@ -75,37 +75,38 @@ module MetricFu
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
|
79
78
|
# COLLECT AND PROCESS RAW HOTSPOT METRICS
|
80
79
|
def fix_row_file_path!(row)
|
81
80
|
# We know that Saikuro rows are broken
|
82
81
|
# next unless row['metric'] == :saikuro
|
83
|
-
key = [row[
|
84
|
-
current_file_path = row[
|
82
|
+
key = [row["class_name"], row["method_name"]]
|
83
|
+
current_file_path = row["file_path"].to_s
|
85
84
|
correct_file_path = @class_and_method_to_file[key]
|
86
|
-
if
|
87
|
-
row[
|
85
|
+
if !correct_file_path.nil? && correct_file_path.include?(current_file_path)
|
86
|
+
row["file_path"] = correct_file_path
|
88
87
|
else
|
89
88
|
# There wasn't an exact match, so we can do a substring match
|
90
89
|
matching_file_path = file_paths.detect {|file_path|
|
91
|
-
file_path
|
90
|
+
!file_path.nil? && file_path.include?(current_file_path)
|
92
91
|
}
|
93
|
-
if
|
94
|
-
row[
|
92
|
+
if matching_file_path
|
93
|
+
row["file_path"] = matching_file_path
|
95
94
|
end
|
96
95
|
end
|
97
96
|
end
|
98
97
|
|
99
98
|
def file_paths
|
100
|
-
@file_paths ||= @table.column(
|
99
|
+
@file_paths ||= @table.column("file_path").uniq
|
101
100
|
end
|
102
101
|
|
103
102
|
def file_tables
|
104
103
|
@file_tables ||= make_table_hash(@columns)
|
105
104
|
end
|
105
|
+
|
106
106
|
def class_tables
|
107
107
|
@class_tables ||= make_table_hash(@columns)
|
108
108
|
end
|
109
|
+
|
109
110
|
def method_tables
|
110
111
|
@method_tables ||= make_table_hash(@columns)
|
111
112
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
MetricFu.metrics_require {
|
1
|
+
MetricFu.metrics_require { "hotspots/analysis/grouping" }
|
2
2
|
module MetricFu
|
3
3
|
class HotspotGroupings
|
4
|
-
|
5
4
|
def initialize(table, opts)
|
6
5
|
@table, @opts = table, opts
|
7
6
|
end
|
@@ -9,6 +8,5 @@ module MetricFu
|
|
9
8
|
def get_grouping
|
10
9
|
MetricFu::Grouping.new(@table, @opts)
|
11
10
|
end
|
12
|
-
|
13
11
|
end
|
14
12
|
end
|
@@ -1,9 +1,8 @@
|
|
1
|
-
MetricFu.metrics_require {
|
1
|
+
MetricFu.metrics_require { "hotspots/analysis/groupings" }
|
2
2
|
module MetricFu
|
3
3
|
class HotspotProblems
|
4
|
-
|
5
4
|
def initialize(sub_table)
|
6
|
-
@grouping = group_by(sub_table,
|
5
|
+
@grouping = group_by(sub_table, "metric")
|
7
6
|
end
|
8
7
|
|
9
8
|
def problems
|
@@ -14,9 +13,8 @@ module MetricFu
|
|
14
13
|
problems
|
15
14
|
end
|
16
15
|
|
17
|
-
def group_by(sub_table, by =
|
18
|
-
MetricFu::HotspotGroupings.new(sub_table, :
|
16
|
+
def group_by(sub_table, by = "metric")
|
17
|
+
MetricFu::HotspotGroupings.new(sub_table, by: by).get_grouping
|
19
18
|
end
|
20
|
-
|
21
19
|
end
|
22
20
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
MetricFu.lib_require {
|
2
|
-
MetricFu.metrics_require {
|
1
|
+
MetricFu.lib_require { "errors/analysis_error" }
|
2
|
+
MetricFu.metrics_require { "hotspots/analysis/problems" }
|
3
3
|
module MetricFu
|
4
4
|
class HotspotRankedProblemLocation
|
5
|
-
MetricFu.data_structures_require {
|
5
|
+
MetricFu.data_structures_require { "location" }
|
6
6
|
attr_reader :sub_table, :granularity
|
7
7
|
def initialize(sub_table, granularity)
|
8
8
|
@sub_table = sub_table
|
@@ -11,8 +11,8 @@ module MetricFu
|
|
11
11
|
|
12
12
|
def to_hash
|
13
13
|
{
|
14
|
-
|
15
|
-
|
14
|
+
"location" => location.to_hash,
|
15
|
+
"details" => stringify_keys(problems),
|
16
16
|
}
|
17
17
|
end
|
18
18
|
|
@@ -24,7 +24,6 @@ module MetricFu
|
|
24
24
|
result
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
27
|
# @todo redo as item,value, options = {}
|
29
28
|
# Note that the other option for 'details' is :detailed (this isn't
|
30
29
|
# at all clear from this method itself
|
@@ -44,30 +43,36 @@ module MetricFu
|
|
44
43
|
def file_path
|
45
44
|
first_row.file_path
|
46
45
|
end
|
46
|
+
|
47
47
|
def class_name
|
48
48
|
first_row.class_name
|
49
49
|
end
|
50
|
+
|
50
51
|
def method_name
|
51
52
|
first_row.method_name
|
52
53
|
end
|
54
|
+
|
53
55
|
def file_location
|
54
56
|
MetricFu::Location.get(file_path, nil, nil)
|
55
57
|
end
|
58
|
+
|
56
59
|
def method_location
|
57
60
|
MetricFu::Location.get(file_path, class_name, method_name)
|
58
61
|
end
|
62
|
+
|
59
63
|
def class_location
|
60
64
|
MetricFu::Location.get(file_path, class_name, nil)
|
61
65
|
end
|
66
|
+
|
62
67
|
def first_row
|
63
68
|
assert_sub_table_has_data
|
64
69
|
@first_row ||= sub_table[0]
|
65
70
|
end
|
71
|
+
|
66
72
|
def assert_sub_table_has_data
|
67
|
-
if (sub_table.length==0)
|
68
|
-
raise MetricFu::AnalysisError, "The #{item
|
73
|
+
if (sub_table.length == 0)
|
74
|
+
raise MetricFu::AnalysisError, "The #{item} '#{value}' does not have any rows in the analysis table"
|
69
75
|
end
|
70
76
|
end
|
71
|
-
|
72
77
|
end
|
73
78
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
module MetricFu
|
3
3
|
class Ranking
|
4
4
|
extend Forwardable
|
@@ -13,8 +13,8 @@ module MetricFu
|
|
13
13
|
|
14
14
|
def percentile(item)
|
15
15
|
index = sorted_items.index(item)
|
16
|
-
worse_item_count = (length - (index+1))
|
17
|
-
worse_item_count.to_f/length
|
16
|
+
worse_item_count = (length - (index + 1))
|
17
|
+
worse_item_count.to_f / length
|
18
18
|
end
|
19
19
|
|
20
20
|
def_delegator :@items_to_score, :has_key?, :scored?
|
@@ -23,8 +23,7 @@ module MetricFu
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def sorted_items
|
26
|
-
@sorted_items ||= @items_to_score.sort_by {|
|
26
|
+
@sorted_items ||= @items_to_score.sort_by { |_item, score| -score }.map { |item, _score| item }
|
27
27
|
end
|
28
|
-
|
29
28
|
end
|
30
29
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
MetricFu.metrics_require do
|
2
2
|
[
|
3
|
-
|
3
|
+
"hotspots/analysis/ranking"
|
4
4
|
]
|
5
5
|
end
|
6
6
|
module MetricFu
|
7
7
|
class HotspotRankings
|
8
|
-
|
9
8
|
def initialize(tool_tables)
|
10
9
|
@tool_tables = tool_tables
|
11
10
|
@file_ranking = MetricFu::Ranking.new
|
@@ -88,6 +87,5 @@ module MetricFu
|
|
88
87
|
master_ranking[item] += analyzer.score(metric_ranking, item) # scaling? Do we just add in the raw score?
|
89
88
|
end
|
90
89
|
end
|
91
|
-
|
92
90
|
end
|
93
91
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
module MetricFu
|
2
2
|
class Record
|
3
|
-
|
4
3
|
attr_reader :data
|
5
4
|
|
6
|
-
def initialize(data,
|
5
|
+
def initialize(data, _columns)
|
7
6
|
@data = data
|
8
7
|
end
|
9
8
|
|
10
9
|
def method_missing(name, *args, &block)
|
11
10
|
key = name.to_s
|
12
|
-
if key ==
|
11
|
+
if key == "fetch"
|
13
12
|
@data.send(name, *args, &block)
|
14
13
|
elsif @data.has_key?(key)
|
15
14
|
@data[key]
|
@@ -19,7 +18,7 @@ module MetricFu
|
|
19
18
|
end
|
20
19
|
|
21
20
|
def []=(key, value)
|
22
|
-
|
21
|
+
@data[key] = value
|
23
22
|
end
|
24
23
|
|
25
24
|
def [](key)
|
@@ -29,6 +28,5 @@ module MetricFu
|
|
29
28
|
def has_key?(key)
|
30
29
|
@data.has_key?(key)
|
31
30
|
end
|
32
|
-
|
33
31
|
end
|
34
32
|
end
|
@@ -10,7 +10,7 @@ module MetricFu
|
|
10
10
|
@rows = []
|
11
11
|
@columns = opts.fetch(:column_names)
|
12
12
|
|
13
|
-
@make_index = opts.fetch(:make_index) {true}
|
13
|
+
@make_index = opts.fetch(:make_index) { true }
|
14
14
|
@metric_index = {}
|
15
15
|
end
|
16
16
|
|
@@ -58,11 +58,10 @@ module MetricFu
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def updated_key_index(record)
|
61
|
-
if record.has_key?(
|
62
|
-
@metric_index[record.metric] ||= MetricFu::Table.new(:
|
61
|
+
if record.has_key?("metric")
|
62
|
+
@metric_index[record.metric] ||= MetricFu::Table.new(column_names: @columns, make_index: false)
|
63
63
|
@metric_index[record.metric] << record
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
67
66
|
end
|
68
67
|
end
|