chusaku 1.1.0 → 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 +4 -4
- data/.github/workflows/linting.yml +2 -2
- data/.github/workflows/testing.yml +2 -2
- data/.gitignore +3 -0
- data/README.md +28 -16
- data/lib/chusaku/cli.rb +3 -2
- data/lib/chusaku/routes.rb +13 -5
- data/lib/chusaku/version.rb +1 -1
- data/lib/chusaku.rb +34 -61
- data/lib/tasks/chusaku.rake +8 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48034ba3796c8cd1ab1a16b0db1065dcdf487ea5e6bc1b08a7fcd18db4ad1d33
|
4
|
+
data.tar.gz: 65cf7dbbf5571f547aeb9cefc8cd804ccab9467b0765edcc00691c777c158554
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83c00966e23c6d8a63f9b68e35cc48a975689f21473e83344927764ac200d9eb378274c6ad82fa90a0ac6a06d286763f45661f4b2433983f903cf93371158167
|
7
|
+
data.tar.gz: 70afe36985465e34f3fa18e5eea3d51d130daaada6414a51b680a0e4f32f31e14a3e3225f8f70b594d19d8c23e9ad3b00ac9f43c4dd83c493bdd5befba483e8a
|
@@ -6,9 +6,9 @@ jobs:
|
|
6
6
|
steps:
|
7
7
|
- uses: actions/checkout@v2
|
8
8
|
- name: Set up Ruby
|
9
|
-
uses: ruby/setup-ruby@
|
9
|
+
uses: ruby/setup-ruby@v1
|
10
10
|
with:
|
11
|
-
ruby-version: 3.
|
11
|
+
ruby-version: 3.3
|
12
12
|
bundler-cache: true
|
13
13
|
- name: Run Standard
|
14
14
|
run: bundle exec standardrb --fail-level A
|
@@ -5,11 +5,11 @@ jobs:
|
|
5
5
|
runs-on: ubuntu-latest
|
6
6
|
strategy:
|
7
7
|
matrix:
|
8
|
-
ruby-version: ["
|
8
|
+
ruby-version: ["3.1", "3.2", "3.3"]
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
11
|
- name: Set up Ruby
|
12
|
-
uses: ruby/setup-ruby@
|
12
|
+
uses: ruby/setup-ruby@v1
|
13
13
|
with:
|
14
14
|
ruby-version: ${{ matrix.ruby-version }}
|
15
15
|
bundler-cache: true
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -26,16 +26,14 @@ Add this line to your Rails application's Gemfile:
|
|
26
26
|
|
27
27
|
```ruby
|
28
28
|
group :development do
|
29
|
-
# ...
|
30
29
|
gem "chusaku", require: false
|
31
|
-
# ...
|
32
30
|
end
|
33
31
|
```
|
34
32
|
|
35
33
|
And then execute:
|
36
34
|
|
37
|
-
```
|
38
|
-
|
35
|
+
```sh
|
36
|
+
bundle install
|
39
37
|
```
|
40
38
|
|
41
39
|
|
@@ -43,8 +41,8 @@ $ bundle install
|
|
43
41
|
|
44
42
|
From the root of your Rails application, run:
|
45
43
|
|
46
|
-
```
|
47
|
-
|
44
|
+
```sh
|
45
|
+
bundle exec chusaku
|
48
46
|
```
|
49
47
|
|
50
48
|
Chusaku has some flags available for use as well:
|
@@ -55,23 +53,37 @@ Usage: chusaku [options]
|
|
55
53
|
--dry-run Run without file modifications
|
56
54
|
--exit-with-error-on-annotation Fail if any file was annotated
|
57
55
|
-c, --controllers-pattern=GLOB Specify alternative controller files glob pattern
|
58
|
-
--verbose Print all
|
56
|
+
--verbose Print all annotated files
|
59
57
|
-v, --version Show Chusaku version number and quit
|
60
58
|
-h, --help Show this help message and quit
|
59
|
+
```
|
60
|
+
|
61
|
+
### Rake usage
|
62
|
+
|
63
|
+
If you'd like to use Chusaku as a Rake task, add the following line to your `Rakefile`:
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
require "chusaku"
|
67
|
+
Chusaku.load_tasks
|
68
|
+
```
|
69
|
+
|
70
|
+
This will then allow you to call:
|
71
|
+
|
72
|
+
```sh
|
73
|
+
bin/rake chusaku
|
74
|
+
```
|
75
|
+
|
76
|
+
To pass flags, pass them like you would from the CLI executable:
|
61
77
|
|
78
|
+
```sh
|
79
|
+
bin/rake chusaku -- --dry-run --exit-with-error-on-annotation
|
62
80
|
```
|
63
81
|
|
64
82
|
|
65
83
|
## Development
|
66
84
|
|
67
|
-
Read the blog post explaining how the gem works at a high level:
|
68
|
-
https://nshki.com/chusaku-a-controller-annotation-gem.
|
85
|
+
Read the blog post explaining how the gem works at a high level: https://nshki.com/chusaku-a-controller-annotation-gem.
|
69
86
|
|
70
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
71
|
-
`bundle exec rake test` to run the tests. You can also run `bin/console` for an
|
72
|
-
interactive prompt that will allow you to experiment.
|
87
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
73
88
|
|
74
|
-
To release a new version, update the version number in `version.rb`, and then
|
75
|
-
run `bundle exec rake release`, which will create a git tag for the version,
|
76
|
-
git commits and tags, and push the `.gem` file to
|
77
|
-
[rubygems.org](https://rubygems.org).
|
89
|
+
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
data/lib/chusaku/cli.rb
CHANGED
@@ -41,7 +41,8 @@ module Chusaku
|
|
41
41
|
# @raise [Chusaku::CLI::NotARailsProject] Exception if not Rails project
|
42
42
|
# @return [void]
|
43
43
|
def check_for_rails_project
|
44
|
-
|
44
|
+
controllers_pattern = options[:controllers_pattern] || DEFAULT_CONTROLLERS_PATTERN
|
45
|
+
has_controllers = !Dir.glob(Rails.root.join(controllers_pattern)).empty?
|
45
46
|
has_rakefile = File.exist?("./Rakefile")
|
46
47
|
raise NotARailsProject unless has_controllers && has_rakefile
|
47
48
|
end
|
@@ -97,7 +98,7 @@ module Chusaku
|
|
97
98
|
# @param opts [OptionParser] OptionParser instance
|
98
99
|
# @return [void]
|
99
100
|
def add_verbose_flag(opts)
|
100
|
-
opts.on("--verbose", "Print all
|
101
|
+
opts.on("--verbose", "Print all annotated files") do
|
101
102
|
@options[:verbose] = true
|
102
103
|
end
|
103
104
|
end
|
data/lib/chusaku/routes.rb
CHANGED
@@ -27,7 +27,19 @@ module Chusaku
|
|
27
27
|
def call
|
28
28
|
routes = {}
|
29
29
|
|
30
|
-
Rails.application
|
30
|
+
populate_routes(Rails.application, routes)
|
31
|
+
backfill_routes(routes)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def populate_routes(app, routes)
|
37
|
+
app.routes.routes.each do |route|
|
38
|
+
if route.app.engine?
|
39
|
+
populate_routes(route.app.app, routes)
|
40
|
+
next
|
41
|
+
end
|
42
|
+
|
31
43
|
controller, action, defaults = extract_data_from(route)
|
32
44
|
routes[controller] ||= {}
|
33
45
|
routes[controller][action] ||= []
|
@@ -39,12 +51,8 @@ module Chusaku
|
|
39
51
|
action: action,
|
40
52
|
defaults: defaults
|
41
53
|
end
|
42
|
-
|
43
|
-
backfill_routes(routes)
|
44
54
|
end
|
45
55
|
|
46
|
-
private
|
47
|
-
|
48
56
|
# Adds formatted route info for the given param combination.
|
49
57
|
#
|
50
58
|
# @param route [Hash] Route info
|
data/lib/chusaku/version.rb
CHANGED
data/lib/chusaku.rb
CHANGED
@@ -4,6 +4,8 @@ require "chusaku/routes"
|
|
4
4
|
|
5
5
|
# Handles core functionality of annotating projects.
|
6
6
|
module Chusaku
|
7
|
+
DEFAULT_CONTROLLERS_PATTERN = "**/*_controller.rb".freeze
|
8
|
+
|
7
9
|
class << self
|
8
10
|
# The main method to run Chusaku. Annotate all actions in a Rails project as
|
9
11
|
# follows:
|
@@ -18,72 +20,57 @@ module Chusaku
|
|
18
20
|
def call(flags = {})
|
19
21
|
@flags = flags
|
20
22
|
@routes = Chusaku::Routes.call
|
21
|
-
@changes = []
|
22
23
|
@changed_files = []
|
23
|
-
controllers_pattern = @flags[:controllers_pattern] ||
|
24
|
+
controllers_pattern = @flags[:controllers_pattern] || DEFAULT_CONTROLLERS_PATTERN
|
25
|
+
controllers_paths = Dir.glob(Rails.root.join(controllers_pattern))
|
26
|
+
|
27
|
+
@routes.each do |controller, actions|
|
28
|
+
next unless controller
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
next if actions.nil?
|
30
|
+
controller_class = "#{controller.underscore.camelize}Controller".constantize
|
31
|
+
action_method_name = actions.keys.first&.to_sym
|
32
|
+
next unless !action_method_name.nil? && controller_class.method_defined?(action_method_name)
|
29
33
|
|
30
|
-
|
34
|
+
source_path = controller_class.instance_method(action_method_name).source_location&.[](0)
|
35
|
+
next unless controllers_paths.include?(source_path)
|
36
|
+
|
37
|
+
annotate_file(path: source_path, actions: actions)
|
31
38
|
end
|
32
39
|
|
33
40
|
output_results
|
34
41
|
end
|
35
42
|
|
43
|
+
# Load Rake tasks for Chusaku. Should be called in your project's `Rakefile`.
|
44
|
+
#
|
45
|
+
# @return [void]
|
46
|
+
def load_tasks
|
47
|
+
Dir[File.join(File.dirname(__FILE__), "tasks", "**/*.rake")].each do |task|
|
48
|
+
load(task)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
36
52
|
private
|
37
53
|
|
38
54
|
# Adds annotations to the given file.
|
39
55
|
#
|
40
56
|
# @param path [String] Path to file
|
41
|
-
# @param
|
42
|
-
# @param actions [Array<String>] List of valid actions for the controller
|
57
|
+
# @param actions [Hash<String, Hash>] List of valid action data for the controller
|
43
58
|
# @return [void]
|
44
|
-
def annotate_file(path:,
|
45
|
-
parsed_file = Chusaku::Parser.call(path: path, actions: actions)
|
59
|
+
def annotate_file(path:, actions:)
|
60
|
+
parsed_file = Chusaku::Parser.call(path: path, actions: actions.keys)
|
46
61
|
parsed_file[:groups].each_cons(2) do |prev, curr|
|
47
|
-
|
62
|
+
clean_group(prev)
|
48
63
|
next unless curr[:type] == :action
|
49
64
|
|
50
|
-
route_data =
|
65
|
+
route_data = actions[curr[:action]]
|
51
66
|
next unless route_data.any?
|
52
67
|
|
53
|
-
|
68
|
+
annotate_group(group: curr, route_data: route_data)
|
54
69
|
end
|
55
70
|
|
56
71
|
write_to_file(path: path, parsed_file: parsed_file)
|
57
72
|
end
|
58
73
|
|
59
|
-
# Clean or annotate a group and track the group as changed if applicable.
|
60
|
-
#
|
61
|
-
# @param group [Hash] { type => Symbol, body => String }
|
62
|
-
# @param type [Symbol] [:clean, :annotate]
|
63
|
-
# @param path [String] File path
|
64
|
-
# @param route_data [Array<Hash>] [{
|
65
|
-
# verb: String,
|
66
|
-
# path: String,
|
67
|
-
# name: String }]
|
68
|
-
# @return [void]
|
69
|
-
def record_change(group:, type:, path:, route_data: [])
|
70
|
-
old_body = group[:body]
|
71
|
-
|
72
|
-
case type
|
73
|
-
when :clean
|
74
|
-
clean_group(group)
|
75
|
-
when :annotate
|
76
|
-
annotate_group(group: group, route_data: route_data)
|
77
|
-
end
|
78
|
-
return if old_body == group[:body]
|
79
|
-
|
80
|
-
@changes.push \
|
81
|
-
old_body: old_body,
|
82
|
-
new_body: group[:body],
|
83
|
-
path: path,
|
84
|
-
line_number: group[:line_number]
|
85
|
-
end
|
86
|
-
|
87
74
|
# Given a parsed group, clean out its contents.
|
88
75
|
#
|
89
76
|
# @param group [Hash] { type => Symbol, body => String }
|
@@ -191,36 +178,22 @@ module Chusaku
|
|
191
178
|
#
|
192
179
|
# @return [String] Copy to be outputted to user
|
193
180
|
def output_copy
|
194
|
-
return "
|
181
|
+
return "Controller files unchanged." if @changed_files.empty?
|
195
182
|
|
196
183
|
copy = changes_copy
|
197
|
-
copy += "
|
184
|
+
copy += "Chusaku has finished running."
|
198
185
|
copy += "\nThis was a dry run so no files were changed." if @flags.include?(:dry)
|
199
186
|
copy += "\nExited with status code 1." if @flags.include?(:error_on_annotation)
|
200
187
|
copy
|
201
188
|
end
|
202
189
|
|
203
|
-
# Returns the copy for
|
190
|
+
# Returns the copy for changed files if `--verbose` flag is passed.
|
204
191
|
#
|
205
|
-
# @return [String] Copy
|
192
|
+
# @return [String] Copy for changed files
|
206
193
|
def changes_copy
|
207
194
|
return "" unless @flags.include?(:verbose)
|
208
195
|
|
209
|
-
@
|
210
|
-
<<~CHANGE_OUTPUT
|
211
|
-
[#{change[:path]}:#{change[:line_number]}]
|
212
|
-
|
213
|
-
Before:
|
214
|
-
```ruby
|
215
|
-
#{change[:old_body].chomp}
|
216
|
-
```
|
217
|
-
|
218
|
-
After:
|
219
|
-
```ruby
|
220
|
-
#{change[:new_body].chomp}
|
221
|
-
```
|
222
|
-
CHANGE_OUTPUT
|
223
|
-
end.join("\n")
|
196
|
+
@changed_files.map { |file| "Annotated #{file}" }.join("\n") + "\n"
|
224
197
|
end
|
225
198
|
end
|
226
199
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chusaku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nishiki Liu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/chusaku/parser.rb
|
106
106
|
- lib/chusaku/routes.rb
|
107
107
|
- lib/chusaku/version.rb
|
108
|
+
- lib/tasks/chusaku.rake
|
108
109
|
homepage: https://github.com/nshki/chusaku
|
109
110
|
licenses:
|
110
111
|
- MIT
|
@@ -128,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
129
|
- !ruby/object:Gem::Version
|
129
130
|
version: '0'
|
130
131
|
requirements: []
|
131
|
-
rubygems_version: 3.
|
132
|
+
rubygems_version: 3.5.17
|
132
133
|
signing_key:
|
133
134
|
specification_version: 4
|
134
135
|
summary: Annotate your Rails controllers with route info.
|