quality_report 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 864f3f5fa2d1b9a35478532a96341ef0b23df5911aa8eb8ac0293beb7e42397a
4
- data.tar.gz: 926133e5ba6df85661a397f10e6c035e987b0d3a68920595633a8d3b6d4d9330
3
+ metadata.gz: 1aafbd19100b614829f3aa4a2d7043b7b7028da09443bb536e37ee809809b6c0
4
+ data.tar.gz: cf7797690c19a1dc7c1f89737d828a4270bee1b9c36c3183ea642109998fdb45
5
5
  SHA512:
6
- metadata.gz: 047430fe2e35df46138827d368f7eae6dc24881a41f952e128f59fae156fe0338bfff5a721d148372983513f7d8f45bc71ecc6bd77377918bb8e8d5c755f0e4f
7
- data.tar.gz: 154ffb7d0e21db6d0ac67b20a5d73247980ae074bf21323369a4ed2d9add28e4e7af101f11e90d8319240ce5a804715202fea345a2d8fd47d618683863f545c3
6
+ metadata.gz: e5b3663e60903633291665affbc5347c604fb60037adf8ac7661ddd82929009ad36335ad5e754d09f58b88f916df74d899ef7c75472fdbeb505ac3e2c06796a5
7
+ data.tar.gz: 9076995297047c26ede10b5c0c892a07eeb0b178e562da85aaf0a61a0a4e8bf173cfdecc62f86045d465d6c58a0d731923c871da28daa19604c2ea3c8e8038c8
data/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
  ruby-quality-report
7
7
  ```
8
8
 
9
+ This outputs a CSV report to stdout.
10
+
9
11
  ## Contributing
10
12
 
11
13
  Bug reports and pull requests are welcome on GitHub at https://github.com/dogweather/ruby-quality-report.
@@ -21,10 +21,12 @@ RUBOCOP_WARNINGS = `rubocop --format json --force-default-config --only Metrics/
21
21
 
22
22
  LOCATIONS =
23
23
  JSON
24
- .parse(RUBOCOP_WARNINGS)['files']
25
- .reject{ |f| f['offenses'].empty? }
26
- .map{ |f| f['offenses']
27
- .map{|o| { path: f['path'], begin: o['location']['start_line'], end: o['location']['last_line'] }}}
24
+ .parse(RUBOCOP_WARNINGS)['files']
25
+ .reject { |f| f['offenses'].empty? }
26
+ .map do |f|
27
+ f['offenses']
28
+ .map { |o| { path: f['path'], begin: o['location']['start_line'], end: o['location']['last_line'] } }
29
+ end
28
30
  .flatten
29
31
 
30
32
  LOCATIONS.each do |location|
@@ -15,7 +15,7 @@
15
15
  # Bob
16
16
  # Alice
17
17
 
18
- RUBY_FILES = `find . -name '*.rb'`
18
+ RUBY_FILES = `find . -name '*.rb'`.freeze
19
19
 
20
20
  RUBY_FILES
21
- .each_line{ |filename| puts `line-authors #{filename}` }
21
+ .each_line { |filename| puts `line-authors #{filename}` }
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'tty-table'
2
5
 
3
6
  #
4
7
  # ruby-quality-report
@@ -14,11 +17,12 @@ def create_combined_stats(part_stats, whole_stats)
14
17
 
15
18
  whole_data.map do |label, whole_count|
16
19
  part_count = part_data[label] || 0
20
+
17
21
  {
18
22
  label:,
19
23
  part_count:,
20
24
  whole_count:,
21
- percent: part_count.to_f / whole_count.to_f
25
+ percent: float_to_percent(part_count.to_f / whole_count)
22
26
  }
23
27
  end
24
28
  end
@@ -27,27 +31,67 @@ def make_data_set(two_column_data)
27
31
  hash = {}
28
32
  two_column_data.each_line do |line|
29
33
  count, label = line.split(' ')
30
- hash[label] = count.to_i
34
+ hash[label] = count.to_i
31
35
  end
32
36
  hash
33
37
  end
34
38
 
35
39
  def generate_csv(combined_stats)
40
+ generate_data(combined_stats)
41
+ .map { |stats| [stats[:label], stats[:percent], stats[:part_count], stats[:whole_count]].join(',') }
42
+ .tap { |x| x.prepend(['Author,Percent Flagged,Flagged Lines,All Lines']) }
43
+ .join("\n")
44
+ end
45
+
46
+ def generate_table(combined_stats)
47
+ table = TTY::Table.new(header: ['Author', 'Percent Flagged', 'Flagged Lines', 'All Lines'])
48
+
49
+ generate_data(combined_stats).each do |stats|
50
+ next if should_skip?(stats)
51
+
52
+ table << [stats[:label], "#{stats[:percent]}%", stats[:part_count], stats[:whole_count]]
53
+ end
54
+
55
+ table.render(:unicode)
56
+ end
57
+
58
+ def generate_data(combined_stats)
36
59
  combined_stats
37
- .sort_by{|s| s[:percent]}
60
+ .sort_by { |s| s[:percent] }
38
61
  .reverse
39
- .map{ |stats| [stats[:label], stats[:percent], stats[:part_count], stats[:whole_count]].join(',') }
40
- .tap{|x| x.prepend(["Author,Percent Flagged,Flagged Lines,All Lines"])}
41
- .join("\n")
42
62
  end
43
63
 
64
+ def should_skip?(stats)
65
+ less_than_200_lines_total?(stats) || no_commits_in_last_60_days?(stats)
66
+ end
67
+
68
+ def less_than_200_lines_total?(stats)
69
+ stats[:whole_count] < 200
70
+ end
71
+
72
+ def no_commits_in_last_60_days?(stats)
73
+ author = stats[:label]
74
+
75
+ # Get the last commit timestamp in Unix epoch format
76
+ last_commit = `git log -1 --format="%at" --author="#{author}"`.chomp
77
+ return true if last_commit.empty? # Handle case where author has no commits
78
+
79
+ # Convert Unix timestamp to Time object
80
+ last_commit_time = Time.at(last_commit.to_i)
81
+ sixty_days_ago = Time.now - (60 * 24 * 60 * 60) # 60 days in seconds
82
+
83
+ last_commit_time < sixty_days_ago
84
+ end
85
+
86
+ def float_to_percent(a_float)
87
+ (Float(a_float) * 100).round(1)
88
+ end
44
89
 
45
90
  #
46
91
  # Execution begins here
47
92
  #
48
- PART_STATS = `ruby-author-warnings | frequency-list`
49
- WHOLE_STATS = `ruby-line-authors | frequency-list`
50
-
93
+ PART_STATS = `ruby-author-warnings | frequency-list`.freeze
94
+ WHOLE_STATS = `ruby-line-authors | frequency-list`.freeze
51
95
  COMBINED_STATS = create_combined_stats(PART_STATS, WHOLE_STATS)
52
96
 
53
- puts generate_csv(COMBINED_STATS)
97
+ puts generate_table(COMBINED_STATS)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module QualityReport
4
- VERSION = '1.0.0'
4
+ VERSION = '1.2.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quality_report
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.68'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-table
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.12.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.12.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement