quality_report 1.2.2 → 1.3.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: a54ad55acc9cb09976954e805eb8c7136d5f81e76ca0d23b732739b629b43b77
4
- data.tar.gz: 4ba83e201032c764ef7077187d267f9fba8f29c682e4087b893eb0ab92ecfae6
3
+ metadata.gz: f18d81f9fa7d9dca4e114657e18e06fed11bed99df6746c0438bf2bf9b625441
4
+ data.tar.gz: 19578513e16b8457a2e388e326834f31f1dd17876c822cf6f509349a2ae261e3
5
5
  SHA512:
6
- metadata.gz: 295733e297b006cca1f68d5689f44422060f689aa44f10ecca0903fa4acca34fbd098df986edbceae908aa90b228e3e076eda2c5e324a8542015d2688e9118c4
7
- data.tar.gz: acfe8e8f47c38ec7fe118a6ead137b11083ac7288b94882cf1b9980c1ae8b797ec4fc124dc470374591ba3871c471039fb9894481e2bfc4c91b34d5ff94cc160
6
+ metadata.gz: '03793a5b452e7f3ecc1b3c805eb273ff60f5619dceb902d0f19fc7c1272da7b60751ee737602671b364c00f2a2894568b8cf9c09b6e707feed5029b195c00952'
7
+ data.tar.gz: 0da7cd9be8337214421ee9ed709dc5a6119fdc48611c4648c70b211e8df0aee85b39c65d24c30dc77be690237f205c34c788176d22e49db38467368c6a9fe9f5
data/README.md CHANGED
@@ -1,12 +1,82 @@
1
1
  # Ruby Quality Report
2
2
 
3
+ ## Installation
4
+
5
+ ```sh
6
+ gem install quality-report
7
+ ```
8
+
3
9
  ## Usage
4
10
 
5
11
  ```sh
6
12
  ruby-quality-report
7
13
  ```
8
14
 
9
- This outputs a CSV report to stdout.
15
+ After a bit of a wait, it outputs a report in table form:
16
+
17
+ ![Screenshot](screenshot-1@2x.webp)
18
+
19
+ This is showing, for each author, the percentage of problematic lines of code. Lower is better.
20
+
21
+
22
+ ### For improved relevance, it has two filters.
23
+
24
+ It excludes:
25
+
26
+ - authors with fewer than 200 lines of code
27
+ - authors with no commits in the previous 60 days
28
+
29
+
30
+ ### In Rails Projects
31
+
32
+ This works great in Rails projects. It examines code recursively starting in the current directory. In my testing,
33
+ I like the results best when run from `/app`. This is how I generated the report, above.
34
+
35
+
36
+ ## How it works
37
+
38
+ It runs a subset of [Rubocop Metrics cops](https://docs.rubocop.org/rubocop/cops_metrics.html) on `*.rb` files that flag single lines or methods:
39
+
40
+ - [ABC Size](https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize)
41
+ - [Block Length](https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocklength)
42
+ - [Block Nesting](https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting)
43
+ - [Cyclomatic Complexity](https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity)
44
+ - [Method Length](https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmethodlength)
45
+ - [Perceived Complexity](https://docs.rubocop.org/rubocop/cops_metrics.html#metricsperceivedcomplexity)
46
+
47
+ It then calculates the percentage of warnings per line written, per author. Each failing check is another warning.
48
+
49
+
50
+ ## Intent
51
+
52
+ This is a team management tool to:
53
+
54
+ - understand the quality of the code your team is producing
55
+ - identify programmers who'd benefit from mentorship and education
56
+
57
+ ## Foundational Research
58
+
59
+ Diving a little deeper, I've seen the phenomenon of micro-economies of bug-creation and bug-fixing develop within teams. Some developers appear to be extremely productive. They write a lot of code. But they also introduce a lot of bugs. The productivity is illusory.
60
+
61
+ This code quality report doesn't track **bugs** per se. But it does report **quality and complexity**. Researchers have found a strong correlation between complexity and bug rate [1]. This link is reflected, _e.g.,_ in international safety standards that mandate low software complexity to reduce failures [2].
62
+
63
+ Complex code introduces bugs in a second, more subtle way. This is because code complexity is the killer of understandability. Studies have found that developers devote 64% of their time to understanding code, while only 5% is spent on actually modifying it [3].
64
+
65
+ 1. De Silva, Dilshan, et al. The Relationship between Code Complexity and Software Quality: An Empirical Study. 2023, https://www.researchgate.net/publication/370761578_The_Relationship_between_Code_Complexity_and_Software_Quality_An_Empirical_Study.
66
+ 2. See e.g., ISO 26262-1:2018(En), Road Vehicles — Functional Safety — Part 1: Vocabulary. https://www.iso.org/obp/ui/en/#iso:std:iso:26262:-1:ed-2:v1:en. Accessed 29 Sept. 2024.
67
+ 3. Feitelson, Dror G. “From Code Complexity Metrics to Program Comprehension.” Communications of the ACM, vol. 66, no. 5, May 2023, pp. 52–61. DOI.org (Crossref), https://doi.org/10.1145/3546576.
68
+
69
+
70
+ ## Roadmap
71
+
72
+ - [ ] Colorize the output to separate high, medium, and low warning percentages.
73
+ - [ ] Fix the numerical alignment.
74
+ - [ ] Add a `--csv` option.
75
+ - [ ] Make the filters configurable.
76
+ - [ ] Speed up the scan.
77
+ - [ ] Add a progress bar.
78
+ - [ ] Refactor from script-style coding to a more standard Ruby project.
79
+
10
80
 
11
81
  ## Contributing
12
82
 
@@ -17,13 +17,9 @@ def create_combined_stats(part_stats, whole_stats)
17
17
 
18
18
  whole_data.map do |label, whole_count|
19
19
  part_count = part_data[label] || 0
20
+ percent = float_to_percent(part_count.to_f / whole_count)
20
21
 
21
- {
22
- label:,
23
- part_count:,
24
- whole_count:,
25
- percent: float_to_percent(part_count.to_f / whole_count)
26
- }
22
+ { label:, part_count:, whole_count:, percent: }
27
23
  end
28
24
  end
29
25
 
@@ -52,13 +48,12 @@ def generate_table(combined_stats)
52
48
  table << [stats[:label], "#{stats[:percent]}%", stats[:part_count], stats[:whole_count]]
53
49
  end
54
50
 
55
- table.render(:unicode)
51
+ table.render(:unicode, alignments: %i[left right right right])
56
52
  end
57
53
 
58
54
  def generate_data(combined_stats)
59
55
  combined_stats
60
56
  .sort_by { |s| s[:percent] }
61
- .reverse
62
57
  end
63
58
 
64
59
  def should_skip?(stats)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module QualityReport
4
- VERSION = '1.2.2'
4
+ VERSION = '1.3.0'
5
5
  end
Binary file
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.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
@@ -75,6 +75,7 @@ files:
75
75
  - exe/ruby-quality-report
76
76
  - lib/quality_report.rb
77
77
  - lib/quality_report/version.rb
78
+ - screenshot-1@2x.webp
78
79
  - sig/quality_report.rbs
79
80
  homepage: https://github.com/dogweather/ruby-quality-report
80
81
  licenses: