hashira 0.7.0 → 0.9.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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +94 -0
  3. data/README.md +57 -3
  4. data/exe/hashira +1 -1
  5. data/lib/hashira/analysis/finding.rb +11 -1
  6. data/lib/hashira/analysis/syntax.rb +6 -6
  7. data/lib/hashira/analysis/type_walk.rb +4 -0
  8. data/lib/hashira/churn.rb +1 -10
  9. data/lib/hashira/ci/accepted.rb +9 -7
  10. data/lib/hashira/ci/baseline.rb +53 -33
  11. data/lib/hashira/ci/comparison.rb +33 -0
  12. data/lib/hashira/ci/diff.rb +0 -15
  13. data/lib/hashira/ci/gate.rb +3 -3
  14. data/lib/hashira/ci/mark.rb +7 -0
  15. data/lib/hashira/ci/ratchet.rb +12 -4
  16. data/lib/hashira/ci/ratchet_report.rb +4 -4
  17. data/lib/hashira/ci/scope.rb +0 -1
  18. data/lib/hashira/ci/slice.rb +21 -0
  19. data/lib/hashira/ci/sweep.rb +13 -0
  20. data/lib/hashira/cli/arguments.rb +12 -8
  21. data/lib/hashira/cli/choice.rb +9 -0
  22. data/lib/hashira/cli/command_line.rb +8 -5
  23. data/lib/hashira/cli/fail_on.rb +6 -6
  24. data/lib/hashira/cli/flag.rb +3 -1
  25. data/lib/hashira/cli/flags.rb +10 -0
  26. data/lib/hashira/cli/format.rb +1 -1
  27. data/lib/hashira/cli/needs.rb +13 -2
  28. data/lib/hashira/cli/only.rb +16 -0
  29. data/lib/hashira/cli/options.rb +8 -10
  30. data/lib/hashira/cli/package_by.rb +1 -1
  31. data/lib/hashira/cli/run.rb +9 -8
  32. data/lib/hashira/cli.rb +22 -21
  33. data/lib/hashira/complexity/cognitive_score.rb +44 -33
  34. data/lib/hashira/complexity/method_finding.rb +7 -5
  35. data/lib/hashira/complexity/method_score.rb +1 -1
  36. data/lib/hashira/complexity/scores.rb +11 -9
  37. data/lib/hashira/coupling/audiences.rb +3 -3
  38. data/lib/hashira/coupling/catalog.rb +8 -6
  39. data/lib/hashira/coupling/census.rb +42 -22
  40. data/lib/hashira/coupling/cycle_search.rb +11 -7
  41. data/lib/hashira/coupling/definitions.rb +1 -7
  42. data/lib/hashira/coupling/edge_map.rb +9 -8
  43. data/lib/hashira/coupling/folding.rb +5 -5
  44. data/lib/hashira/coupling/graph.rb +16 -9
  45. data/lib/hashira/coupling/metric.rb +3 -1
  46. data/lib/hashira/coupling/naming.rb +4 -4
  47. data/lib/hashira/coupling/references.rb +12 -12
  48. data/lib/hashira/coupling/report.rb +7 -9
  49. data/lib/hashira/coupling/roll_call.rb +1 -1
  50. data/lib/hashira/coupling/roll_call_findings.rb +1 -1
  51. data/lib/hashira/coupling/roster.rb +37 -12
  52. data/lib/hashira/coupling/rule.rb +1 -1
  53. data/lib/hashira/coupling/sdp_violation_findings.rb +3 -1
  54. data/lib/hashira/duplication/clones.rb +1 -1
  55. data/lib/hashira/duplication/clusters.rb +10 -7
  56. data/lib/hashira/duplication/delta.rb +1 -4
  57. data/lib/hashira/duplication/duplication_finding.rb +4 -2
  58. data/lib/hashira/duplication/fragment.rb +20 -2
  59. data/lib/hashira/duplication/harvest.rb +7 -5
  60. data/lib/hashira/duplication/index.rb +3 -2
  61. data/lib/hashira/duplication/literal.rb +25 -0
  62. data/lib/hashira/duplication/similarity.rb +2 -2
  63. data/lib/hashira/duplication/variance.rb +7 -1
  64. data/lib/hashira/error.rb +0 -3
  65. data/lib/hashira/focus.rb +29 -0
  66. data/lib/hashira/git_log.rb +19 -0
  67. data/lib/hashira/hotspots/file_cost.rb +1 -1
  68. data/lib/hashira/hotspots/rollup.rb +2 -2
  69. data/lib/hashira/pipeline.rb +22 -14
  70. data/lib/hashira/project.rb +35 -34
  71. data/lib/hashira/report/columns.rb +14 -8
  72. data/lib/hashira/report/graph_payload.rb +1 -1
  73. data/lib/hashira/report/hotspot_table.rb +1 -1
  74. data/lib/hashira/report/json.rb +2 -1
  75. data/lib/hashira/report/metrics_table.rb +3 -3
  76. data/lib/hashira/report/phrases.rb +23 -18
  77. data/lib/hashira/report/smell_phrases.rb +2 -2
  78. data/lib/hashira/smells/branches.rb +62 -0
  79. data/lib/hashira/smells/census.rb +11 -6
  80. data/lib/hashira/smells/check.rb +1 -5
  81. data/lib/hashira/smells/contexts.rb +7 -5
  82. data/lib/hashira/smells/control_parameter.rb +1 -1
  83. data/lib/hashira/smells/data_clump.rb +2 -4
  84. data/lib/hashira/smells/duplicate_method_call.rb +25 -5
  85. data/lib/hashira/smells/feature_envy.rb +3 -3
  86. data/lib/hashira/smells/foreign.rb +14 -14
  87. data/lib/hashira/smells/instance_variable_assumption.rb +5 -15
  88. data/lib/hashira/smells/kind.rb +9 -0
  89. data/lib/hashira/smells/lineage.rb +92 -0
  90. data/lib/hashira/smells/manual_dispatch.rb +1 -1
  91. data/lib/hashira/smells/module_initialize.rb +0 -2
  92. data/lib/hashira/smells/nil_check.rb +1 -1
  93. data/lib/hashira/smells/ownership.rb +19 -7
  94. data/lib/hashira/smells/param_check.rb +2 -2
  95. data/lib/hashira/smells/refs.rb +13 -7
  96. data/lib/hashira/smells/repeated_conditional.rb +1 -3
  97. data/lib/hashira/smells/report.rb +16 -7
  98. data/lib/hashira/smells/too_many_instance_variables.rb +3 -3
  99. data/lib/hashira/smells/visibility.rb +18 -11
  100. data/lib/hashira/trees.rb +8 -4
  101. data/lib/hashira/version.rb +1 -1
  102. data/lib/hashira.rb +12 -0
  103. metadata +13 -1
@@ -5,17 +5,24 @@ require "prism"
5
5
  class Hashira::Smells::Visibility
6
6
  MARKERS = %i[public private protected module_function].freeze
7
7
 
8
- def initialize(type_node)
9
- @section = :public
10
- @overrides = {}
11
- @found = []
12
- scan(statements(type_node))
8
+ def initialize(type)
9
+ @node = type
13
10
  end
14
11
 
15
- def entries = @found.map { |node, section| [node, @overrides.fetch(node.name, section)] }
12
+ def entries
13
+ blank
14
+ scan(statements(@node))
15
+ @_found.map { |node, section| [node, @_overrides.fetch(node.name, section)] }
16
+ end
16
17
 
17
18
  private
18
19
 
20
+ def blank
21
+ @_section = :public
22
+ @_overrides = {}
23
+ @_found = []
24
+ end
25
+
19
26
  def statements(node)
20
27
  body = node.body
21
28
  body.is_a?(Prism::StatementsNode) ? body.body : []
@@ -25,7 +32,7 @@ class Hashira::Smells::Visibility
25
32
 
26
33
  def classify(node)
27
34
  case node
28
- when Prism::DefNode then @found << [node, @section]
35
+ when Prism::DefNode then @_found << [node, @_section]
29
36
  when Prism::CallNode then heed(node)
30
37
  else descend(node)
31
38
  end
@@ -46,19 +53,19 @@ class Hashira::Smells::Visibility
46
53
  def bare?(node) = MARKERS.include?(node.name) && !node.receiver
47
54
 
48
55
  def switch(name, arguments)
49
- arguments ? tag(name, arguments.arguments) : (@section = name)
56
+ arguments ? tag(name, arguments.arguments) : (@_section = name)
50
57
  end
51
58
 
52
59
  def tag(section, arguments) = arguments.each { note(it, section) }
53
60
 
54
61
  def note(argument, section)
55
62
  case argument
56
- when Prism::DefNode then @found << [argument, section]
57
- when Prism::SymbolNode then @overrides[argument.unescaped.to_sym] = section
63
+ when Prism::DefNode then @_found << [argument, section]
64
+ when Prism::SymbolNode then @_overrides[argument.unescaped.to_sym] = section
58
65
  end
59
66
  end
60
67
 
61
68
  def shadow(node)
62
- statements(node).each { @found << [it, :singleton] if it.is_a?(Prism::DefNode) }
69
+ statements(node).each { @_found << [it, :singleton] if it.is_a?(Prism::DefNode) }
63
70
  end
64
71
  end
data/lib/hashira/trees.rb CHANGED
@@ -4,17 +4,21 @@ require "prism"
4
4
 
5
5
  class Hashira::Trees
6
6
  def initialize(project)
7
- @unparsed = []
8
- @all = project.files.to_h { [it, parse(it)] }
7
+ @project = project
9
8
  end
10
9
 
11
- attr_reader :all, :unparsed
10
+ def all = @_all ||= @project.files.to_h { [it, parse(it)] }
11
+
12
+ def unparsed
13
+ all
14
+ @_unparsed ||= []
15
+ end
12
16
 
13
17
  private
14
18
 
15
19
  def parse(path)
16
20
  result = Prism.parse_file(path)
17
- @unparsed << path if result.failure?
21
+ (@_unparsed ||= []) << path if result.failure?
18
22
  result.value
19
23
  rescue SystemCallError => error
20
24
  raise(Hashira::Error, "cannot read #{path} (#{error.message})")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hashira
4
- VERSION = "0.7.0"
4
+ VERSION = "0.9.0"
5
5
  end
data/lib/hashira.rb CHANGED
@@ -34,25 +34,32 @@ require_relative "hashira/analysis/node_walk"
34
34
  require_relative "hashira/analysis/syntax"
35
35
  require_relative "hashira/analysis/type_walk"
36
36
  require_relative "hashira/churn"
37
+ require_relative "hashira/git_log"
37
38
  require_relative "hashira/ci/accepted"
38
39
  require_relative "hashira/ci/baseline"
40
+ require_relative "hashira/ci/comparison"
39
41
  require_relative "hashira/ci/diff"
40
42
  require_relative "hashira/ci/edge_diff_report"
41
43
  require_relative "hashira/ci/finding_diff_report"
42
44
  require_relative "hashira/ci/gate"
43
45
  require_relative "hashira/ci/improvement"
46
+ require_relative "hashira/ci/mark"
44
47
  require_relative "hashira/ci/ratchet"
45
48
  require_relative "hashira/ci/ratchet_report"
46
49
  require_relative "hashira/ci/scope"
50
+ require_relative "hashira/ci/slice"
47
51
  require_relative "hashira/ci/status"
52
+ require_relative "hashira/ci/sweep"
48
53
  require_relative "hashira/cli"
49
54
  require_relative "hashira/cli/arguments"
55
+ require_relative "hashira/cli/choice"
50
56
  require_relative "hashira/cli/command_line"
51
57
  require_relative "hashira/cli/fail_on"
52
58
  require_relative "hashira/cli/flag"
53
59
  require_relative "hashira/cli/flags"
54
60
  require_relative "hashira/cli/format"
55
61
  require_relative "hashira/cli/needs"
62
+ require_relative "hashira/cli/only"
56
63
  require_relative "hashira/cli/options"
57
64
  require_relative "hashira/cli/package_by"
58
65
  require_relative "hashira/cli/run"
@@ -110,6 +117,7 @@ require_relative "hashira/duplication/fragment"
110
117
  require_relative "hashira/duplication/grouping"
111
118
  require_relative "hashira/duplication/harvest"
112
119
  require_relative "hashira/duplication/index"
120
+ require_relative "hashira/duplication/literal"
113
121
  require_relative "hashira/duplication/maximal"
114
122
  require_relative "hashira/duplication/near_miss"
115
123
  require_relative "hashira/duplication/sequence"
@@ -117,6 +125,7 @@ require_relative "hashira/duplication/similarity"
117
125
  require_relative "hashira/duplication/union_find"
118
126
  require_relative "hashira/duplication/variance"
119
127
  require_relative "hashira/error"
128
+ require_relative "hashira/focus"
120
129
  require_relative "hashira/hotspots/file_cost"
121
130
  require_relative "hashira/hotspots/rollup"
122
131
  require_relative "hashira/pipeline"
@@ -134,8 +143,10 @@ require_relative "hashira/report/phrases"
134
143
  require_relative "hashira/report/smell_phrases"
135
144
  require_relative "hashira/report/text"
136
145
  require_relative "hashira/report/view"
146
+ require_relative "hashira/smells/branches"
137
147
  require_relative "hashira/smells/census"
138
148
  require_relative "hashira/smells/check"
149
+ require_relative "hashira/smells/kind"
139
150
  require_relative "hashira/smells/conditions"
140
151
  require_relative "hashira/smells/contexts"
141
152
  require_relative "hashira/smells/control_parameter"
@@ -143,6 +154,7 @@ require_relative "hashira/smells/data_clump"
143
154
  require_relative "hashira/smells/duplicate_method_call"
144
155
  require_relative "hashira/smells/feature_envy"
145
156
  require_relative "hashira/smells/instance_variable_assumption"
157
+ require_relative "hashira/smells/lineage"
146
158
  require_relative "hashira/smells/manual_dispatch"
147
159
  require_relative "hashira/smells/module_initialize"
148
160
  require_relative "hashira/smells/nil_check"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Giacomo GK
@@ -33,23 +33,29 @@ files:
33
33
  - lib/hashira/churn.rb
34
34
  - lib/hashira/ci/accepted.rb
35
35
  - lib/hashira/ci/baseline.rb
36
+ - lib/hashira/ci/comparison.rb
36
37
  - lib/hashira/ci/diff.rb
37
38
  - lib/hashira/ci/edge_diff_report.rb
38
39
  - lib/hashira/ci/finding_diff_report.rb
39
40
  - lib/hashira/ci/gate.rb
40
41
  - lib/hashira/ci/improvement.rb
42
+ - lib/hashira/ci/mark.rb
41
43
  - lib/hashira/ci/ratchet.rb
42
44
  - lib/hashira/ci/ratchet_report.rb
43
45
  - lib/hashira/ci/scope.rb
46
+ - lib/hashira/ci/slice.rb
44
47
  - lib/hashira/ci/status.rb
48
+ - lib/hashira/ci/sweep.rb
45
49
  - lib/hashira/cli.rb
46
50
  - lib/hashira/cli/arguments.rb
51
+ - lib/hashira/cli/choice.rb
47
52
  - lib/hashira/cli/command_line.rb
48
53
  - lib/hashira/cli/fail_on.rb
49
54
  - lib/hashira/cli/flag.rb
50
55
  - lib/hashira/cli/flags.rb
51
56
  - lib/hashira/cli/format.rb
52
57
  - lib/hashira/cli/needs.rb
58
+ - lib/hashira/cli/only.rb
53
59
  - lib/hashira/cli/options.rb
54
60
  - lib/hashira/cli/package_by.rb
55
61
  - lib/hashira/cli/run.rb
@@ -108,6 +114,7 @@ files:
108
114
  - lib/hashira/duplication/grouping.rb
109
115
  - lib/hashira/duplication/harvest.rb
110
116
  - lib/hashira/duplication/index.rb
117
+ - lib/hashira/duplication/literal.rb
111
118
  - lib/hashira/duplication/maximal.rb
112
119
  - lib/hashira/duplication/near_miss.rb
113
120
  - lib/hashira/duplication/sequence.rb
@@ -115,6 +122,8 @@ files:
115
122
  - lib/hashira/duplication/union_find.rb
116
123
  - lib/hashira/duplication/variance.rb
117
124
  - lib/hashira/error.rb
125
+ - lib/hashira/focus.rb
126
+ - lib/hashira/git_log.rb
118
127
  - lib/hashira/hotspots/file_cost.rb
119
128
  - lib/hashira/hotspots/rollup.rb
120
129
  - lib/hashira/pipeline.rb
@@ -133,6 +142,7 @@ files:
133
142
  - lib/hashira/report/text.rb
134
143
  - lib/hashira/report/view.rb
135
144
  - lib/hashira/smells/boundary_sprawl.rb
145
+ - lib/hashira/smells/branches.rb
136
146
  - lib/hashira/smells/census.rb
137
147
  - lib/hashira/smells/check.rb
138
148
  - lib/hashira/smells/conditions.rb
@@ -143,6 +153,8 @@ files:
143
153
  - lib/hashira/smells/feature_envy.rb
144
154
  - lib/hashira/smells/foreign.rb
145
155
  - lib/hashira/smells/instance_variable_assumption.rb
156
+ - lib/hashira/smells/kind.rb
157
+ - lib/hashira/smells/lineage.rb
146
158
  - lib/hashira/smells/manual_dispatch.rb
147
159
  - lib/hashira/smells/module_initialize.rb
148
160
  - lib/hashira/smells/nil_check.rb