ordit 0.1.0 → 0.1.2
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +3 -3
- data/lib/ordit/auditor.rb +30 -102
- data/lib/ordit/result_generator.rb +67 -0
- data/lib/ordit/scanner.rb +27 -18
- data/lib/ordit/version.rb +1 -1
- data/lib/ordit.rb +1 -0
- data/lib/tasks/ordit.rake +4 -4
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdefa2e20e2bd7fa34e8c898fc6e54e934a35e6c9dc3eb5e9ce9f22bf0403b87
|
4
|
+
data.tar.gz: 704929dfdbee426f4d358512b18d217f2ddf1521f8e376cdb839993066b229a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 980a3d0f8ba5d373577b55594350962f784775de06f2c0b288271929a71a68998799fc60b1611293a68ce15102168923377d0dccde9699f2348775c5cf4dc180
|
7
|
+
data.tar.gz: 3e83e18491bb40508a8f65a8210b29e1c31e94c4e87c67c64c033ed5a3682768c39cae36c794363d37a8d2bdb3f3a457e161a52001584e0b1eabd8349891a0cc
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -56,13 +56,13 @@ Example output:
|
|
56
56
|
Find all uses of a specific controller:
|
57
57
|
|
58
58
|
```bash
|
59
|
-
rails
|
59
|
+
rails ordit:scan[controller_name]
|
60
60
|
```
|
61
61
|
|
62
62
|
Example:
|
63
63
|
```bash
|
64
|
-
rails
|
65
|
-
rails
|
64
|
+
rails ordit:scan[products]
|
65
|
+
rails ordit:scan[users--name] # For namespaced controllers
|
66
66
|
```
|
67
67
|
|
68
68
|
### Configuration
|
data/lib/ordit/auditor.rb
CHANGED
@@ -2,27 +2,27 @@
|
|
2
2
|
|
3
3
|
module Ordit
|
4
4
|
class Auditor
|
5
|
-
def
|
6
|
-
|
5
|
+
def self.run
|
6
|
+
new.run
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
used_controllers: used_controllers,
|
16
|
-
controller_locations: find_controller_locations,
|
17
|
-
usage_locations: find_usage_locations
|
9
|
+
def run
|
10
|
+
ResultGenerator.new(
|
11
|
+
defined_controllers:,
|
12
|
+
used_controllers:,
|
13
|
+
controller_locations:,
|
14
|
+
usage_locations:
|
18
15
|
)
|
19
16
|
end
|
20
17
|
|
21
18
|
private
|
22
19
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
20
|
+
def config
|
21
|
+
@config ||= Ordit.configuration
|
22
|
+
end
|
23
|
+
|
24
|
+
def defined_controllers
|
25
|
+
config.controller_paths.each_with_object(Set.new) do |path, controllers|
|
26
26
|
Dir.glob(path.to_s).each do |file|
|
27
27
|
# Extract relative path from controllers directory
|
28
28
|
full_path = Pathname.new(file)
|
@@ -32,6 +32,8 @@ module Ordit
|
|
32
32
|
|
33
33
|
# Get path components after 'controllers'
|
34
34
|
controller_path = full_path.each_filename.to_a[(controllers_dir + 1)..]
|
35
|
+
next unless controller_path[-1].include?('_controller')
|
36
|
+
|
35
37
|
# Remove _controller.js from the last component
|
36
38
|
controller_path[-1] = controller_path[-1].sub(/_controller\.(js|ts)$/, "")
|
37
39
|
# Join with -- for namespacing and convert underscores to hyphens
|
@@ -39,17 +41,10 @@ module Ordit
|
|
39
41
|
controllers << name
|
40
42
|
end
|
41
43
|
end
|
42
|
-
controllers
|
43
44
|
end
|
44
45
|
|
45
|
-
def
|
46
|
-
|
47
|
-
patterns = [
|
48
|
-
/data-controller=["']([^"']+)["']/, # HTML attribute syntax
|
49
|
-
/data:\s*{\s*(?:controller:|:controller\s*=>)\s*["']([^"']+)["']/ # Both hash syntaxes
|
50
|
-
]
|
51
|
-
|
52
|
-
@config.view_paths.each do |path|
|
46
|
+
def used_controllers
|
47
|
+
config.view_paths.each_with_object(Set.new) do |path, controllers|
|
53
48
|
Dir.glob(path.to_s).each do |file|
|
54
49
|
content = File.read(file)
|
55
50
|
patterns.each do |pattern|
|
@@ -64,12 +59,10 @@ module Ordit
|
|
64
59
|
end
|
65
60
|
end
|
66
61
|
end
|
67
|
-
controllers
|
68
62
|
end
|
69
63
|
|
70
|
-
def
|
71
|
-
|
72
|
-
@config.controller_paths.each do |path_pattern|
|
64
|
+
def controller_locations
|
65
|
+
config.controller_paths.each_with_object({}) do |path_pattern, locations|
|
73
66
|
Dir.glob(path_pattern).each do |file|
|
74
67
|
relative_path = Pathname.new(file).relative_path_from(Dir.pwd)
|
75
68
|
controller_path = relative_path.to_s.gsub(%r{^app/javascript/controllers/|_controller\.(js|ts)$}, "")
|
@@ -77,18 +70,10 @@ module Ordit
|
|
77
70
|
locations[name] = relative_path
|
78
71
|
end
|
79
72
|
end
|
80
|
-
locations
|
81
73
|
end
|
82
74
|
|
83
|
-
def
|
84
|
-
|
85
|
-
patterns = [
|
86
|
-
/data-controller=["']([^"']+)["']/,
|
87
|
-
/data:\s*{(?:[^}]*\s)?controller:\s*["']([^"']+)["']/,
|
88
|
-
/data:\s*{(?:[^}]*\s)?controller\s*=>\s*["']([^"']+)["']/
|
89
|
-
]
|
90
|
-
|
91
|
-
@config.view_paths.each do |path_pattern|
|
75
|
+
def usage_locations
|
76
|
+
config.view_paths.each_with_object(Hash.new { |h, k| h[k] = {} }) do |path_pattern, locations|
|
92
77
|
Dir.glob(path_pattern).each do |file|
|
93
78
|
File.readlines(file).each_with_index do |line, index|
|
94
79
|
patterns.each do |pattern|
|
@@ -103,73 +88,16 @@ module Ordit
|
|
103
88
|
end
|
104
89
|
end
|
105
90
|
end
|
106
|
-
locations
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
class AuditResult
|
111
|
-
attr_reader :defined_controllers, :used_controllers,
|
112
|
-
:controller_locations, :usage_locations
|
113
|
-
|
114
|
-
def initialize(defined_controllers:, used_controllers:,
|
115
|
-
controller_locations:, usage_locations:)
|
116
|
-
@defined_controllers = defined_controllers
|
117
|
-
@used_controllers = used_controllers
|
118
|
-
@controller_locations = controller_locations
|
119
|
-
@usage_locations = usage_locations
|
120
|
-
end
|
121
|
-
|
122
|
-
def unused_controllers
|
123
|
-
defined_controllers - used_controllers
|
124
|
-
end
|
125
|
-
|
126
|
-
def undefined_controllers
|
127
|
-
used_controllers - defined_controllers
|
128
91
|
end
|
129
92
|
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
puts "\n❌ Defined but unused controllers:"
|
139
|
-
unused_controllers.sort.each do |controller|
|
140
|
-
puts " #{controller}"
|
141
|
-
puts " └─ #{controller_locations[controller]}"
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
if undefined_controllers.any?
|
146
|
-
puts "\n⚠️ Used but undefined controllers:"
|
147
|
-
undefined_controllers.sort.each do |controller|
|
148
|
-
puts " #{controller}"
|
149
|
-
usage_locations[controller].each do |file, lines|
|
150
|
-
puts " └─ #{file} (lines: #{lines.join(", ")})"
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
if active_controllers.any?
|
156
|
-
puts "\n✅ Active controllers:"
|
157
|
-
active_controllers.sort.each do |controller|
|
158
|
-
puts " #{controller}"
|
159
|
-
puts " └─ Defined in: #{controller_locations[controller]}"
|
160
|
-
puts " └─ Used in:"
|
161
|
-
usage_locations[controller].each do |file, lines|
|
162
|
-
puts " └─ #{file} (lines: #{lines.join(", ")})"
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
puts "\n📈 Summary:"
|
168
|
-
puts " Total controllers defined: #{defined_controllers.size}"
|
169
|
-
puts " Total controllers in use: #{used_controllers.size}"
|
170
|
-
puts " Unused controllers: #{unused_controllers.size}"
|
171
|
-
puts " Undefined controllers: #{undefined_controllers.size}"
|
172
|
-
puts " Properly paired: #{active_controllers.size}"
|
93
|
+
def patterns
|
94
|
+
@patterns ||= [
|
95
|
+
/data-controller=["']([^"']+)["']/, # HTML attribute syntax
|
96
|
+
# Ruby 1.9+ hash syntax - covers both with and without symbol prefix
|
97
|
+
/data:\s*{(?:[^}]*\s)?(?::)?controller:\s*["']([^"']+)["']/,
|
98
|
+
# Hash rocket syntax - covers both with and without symbol prefix
|
99
|
+
/data:\s*{(?:[^}]*\s)?(?::)?controller\s*=>\s*["']([^"']+)["']/
|
100
|
+
]
|
173
101
|
end
|
174
102
|
end
|
175
103
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Ordit
|
2
|
+
class ResultGenerator
|
3
|
+
attr_reader :defined_controllers, :used_controllers,
|
4
|
+
:controller_locations, :usage_locations
|
5
|
+
|
6
|
+
def initialize(defined_controllers:, used_controllers:,
|
7
|
+
controller_locations:, usage_locations:)
|
8
|
+
@defined_controllers = defined_controllers
|
9
|
+
@used_controllers = used_controllers
|
10
|
+
@controller_locations = controller_locations
|
11
|
+
@usage_locations = usage_locations
|
12
|
+
end
|
13
|
+
|
14
|
+
def unused_controllers
|
15
|
+
defined_controllers - used_controllers
|
16
|
+
end
|
17
|
+
|
18
|
+
def undefined_controllers
|
19
|
+
used_controllers - defined_controllers
|
20
|
+
end
|
21
|
+
|
22
|
+
def active_controllers
|
23
|
+
defined_controllers & used_controllers
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_console
|
27
|
+
puts "\n📊 Stimulus Controller Audit\n"
|
28
|
+
|
29
|
+
if unused_controllers.any?
|
30
|
+
puts "\n❌ Defined but unused controllers:"
|
31
|
+
unused_controllers.sort.each do |controller|
|
32
|
+
puts " #{controller}"
|
33
|
+
puts " └─ #{controller_locations[controller]}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
if undefined_controllers.any?
|
38
|
+
puts "\n⚠️ Used but undefined controllers:"
|
39
|
+
undefined_controllers.sort.each do |controller|
|
40
|
+
puts " #{controller}"
|
41
|
+
usage_locations[controller].each do |file, lines|
|
42
|
+
puts " └─ #{file} (lines: #{lines.join(", ")})"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if active_controllers.any?
|
48
|
+
puts "\n✅ Active controllers:"
|
49
|
+
active_controllers.sort.each do |controller|
|
50
|
+
puts " #{controller}"
|
51
|
+
puts " └─ Defined in: #{controller_locations[controller]}"
|
52
|
+
puts " └─ Used in:"
|
53
|
+
usage_locations[controller].each do |file, lines|
|
54
|
+
puts " └─ #{file} (lines: #{lines.join(", ")})"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
puts "\n📈 Summary:"
|
60
|
+
puts " Total controllers defined: #{defined_controllers.size}"
|
61
|
+
puts " Total controllers in use: #{used_controllers.size}"
|
62
|
+
puts " Unused controllers: #{unused_controllers.size}"
|
63
|
+
puts " Undefined controllers: #{undefined_controllers.size}"
|
64
|
+
puts " Properly paired: #{active_controllers.size}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/ordit/scanner.rb
CHANGED
@@ -2,25 +2,22 @@
|
|
2
2
|
|
3
3
|
module Ordit
|
4
4
|
class Scanner
|
5
|
-
def
|
6
|
-
|
5
|
+
def self.run(controller)
|
6
|
+
new(controller).run
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
matches = find_matches(controller)
|
11
|
-
print_results(controller, matches)
|
12
|
-
end
|
9
|
+
attr_reader :controller
|
13
10
|
|
14
|
-
|
11
|
+
def initialize(controller)
|
12
|
+
@controller = controller
|
13
|
+
end
|
15
14
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
/data-controller=["'](?:[^"']*\s)?#{Regexp.escape(controller)}(?:\s[^"']*)?["']/, # HTML attribute
|
20
|
-
/data:\s*{\s*(?:controller:|:controller\s*=>)\s*["'](?:[^"']*\s)?#{Regexp.escape(controller)}(?:\s[^"']*)?["']/ # Both hash syntaxes
|
21
|
-
]
|
15
|
+
def run
|
16
|
+
print
|
17
|
+
end
|
22
18
|
|
23
|
-
|
19
|
+
def results
|
20
|
+
config.view_paths.each_with_object([]) do |path, matches|
|
24
21
|
Dir.glob(path.to_s).each do |file|
|
25
22
|
content = File.readlines(file)
|
26
23
|
content.each_with_index do |line, index|
|
@@ -34,19 +31,31 @@ module Ordit
|
|
34
31
|
end
|
35
32
|
end
|
36
33
|
end
|
37
|
-
matches
|
38
34
|
end
|
39
35
|
|
40
|
-
|
36
|
+
private
|
37
|
+
|
38
|
+
def config
|
39
|
+
@config ||= Ordit.configuration
|
40
|
+
end
|
41
|
+
|
42
|
+
def patterns
|
43
|
+
@patterns ||= [
|
44
|
+
/data-controller=["'](?:[^"']*\s)?#{Regexp.escape(controller)}(?:\s[^"']*)?["']/, # HTML attribute
|
45
|
+
/data:\s*{\s*(?:controller:|:controller\s*=>)\s*["'](?:[^"']*\s)?#{Regexp.escape(controller)}(?:\s[^"']*)?["']/ # Both hash syntaxes
|
46
|
+
]
|
47
|
+
end
|
48
|
+
|
49
|
+
def print
|
41
50
|
puts "\nSearching for stimulus controller: '#{controller}'\n\n"
|
42
51
|
|
43
|
-
if
|
52
|
+
if results.empty?
|
44
53
|
puts "No matches found."
|
45
54
|
return
|
46
55
|
end
|
47
56
|
|
48
57
|
current_file = nil
|
49
|
-
|
58
|
+
results.each do |match|
|
50
59
|
if current_file != match[:file]
|
51
60
|
puts "📁 #{match[:file]}"
|
52
61
|
current_file = match[:file]
|
data/lib/ordit/version.rb
CHANGED
data/lib/ordit.rb
CHANGED
data/lib/tasks/ordit.rake
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
namespace :
|
3
|
+
namespace :ordit do
|
4
4
|
desc "Audit Stimulus controllers usage and find orphaned controllers"
|
5
5
|
task stimulus: :environment do
|
6
|
-
|
6
|
+
Ordit::Auditor.run
|
7
7
|
end
|
8
8
|
|
9
9
|
desc "Scan files for stimulus controller usage (e.g., rake audit:scan[products])"
|
@@ -11,10 +11,10 @@ namespace :audit do
|
|
11
11
|
controller = args[:controller]
|
12
12
|
|
13
13
|
if controller.nil? || controller.empty?
|
14
|
-
puts "Please provide a controller name: rake
|
14
|
+
puts "Please provide a controller name: rake ordit:scan[controller_name]"
|
15
15
|
next
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
Ordit::Scanner.run(controller)
|
19
19
|
end
|
20
20
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ordit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toby
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/ordit/auditor.rb
|
54
54
|
- lib/ordit/configuration.rb
|
55
55
|
- lib/ordit/railtie.rb
|
56
|
+
- lib/ordit/result_generator.rb
|
56
57
|
- lib/ordit/scanner.rb
|
57
58
|
- lib/ordit/version.rb
|
58
59
|
- lib/tasks/ordit.rake
|