chusaku 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be8c03a0fe70a6b717b8fb204ae3d2d1b9eaaa89597c7ada8c169cb49919d2ef
4
- data.tar.gz: 28736b04b639cba7eed34695691433a0cf4defd3f48eaf7a15faced2e04540e8
3
+ metadata.gz: cf3fc6d454cdeaf9c8c31019c1b0ec6dc4c676203a8c44cd40e24dee49ace832
4
+ data.tar.gz: ba06bb7b2868c6c2d53ac93504eb00fe0ef5527b1224f04c6c862fd27e7734fe
5
5
  SHA512:
6
- metadata.gz: 178db8776a7bfeaccbe2eea70346753cf203531c7836f706988a65c3527ac6de733580ed6e324f93658fbbeec4812fff9196f460985abdab140eea99e794ab61
7
- data.tar.gz: f8307518e4df5d74a3c5703efed73f167138c04ae2a0d2a1f314c16bc0b1e6d101c64355d994349dc238be2a486745dbea4703389bf485dbb681412e03ae21f8
6
+ metadata.gz: b932a1b72743a06701d7fa3d7a80068baf0e31df76d78a0dea7b892a46bb663c3dcd9e444599b3942a9a5eb3289b5b90b962ef39216e8f15ff04bde5bff0946b
7
+ data.tar.gz: c609bb26e27dc4018766e84d55aa38715385bff1fc444468481ff781649f9af3037e2078ada729814f9d92963e9b3752f48b1bb6cbdbe05a00000eae5ea169b4
@@ -0,0 +1,4 @@
1
+ plugins:
2
+ rubocop:
3
+ enabled: true
4
+ channel: rubocop-0-77
@@ -1,27 +1,21 @@
1
+ require:
2
+ - rubocop-performance
3
+
1
4
  AllCops:
2
5
  Exclude:
3
6
  - 'bin/**/*'
4
-
5
- Layout/IndentationConsistency:
6
- EnforcedStyle: rails
7
+ - 'test/mock/app/**/*'
8
+ - 'test/mock/examples/**/*'
7
9
 
8
10
  Metrics/AbcSize:
9
- Enabled: false
11
+ Exclude:
12
+ - 'test/**/*'
10
13
 
11
14
  Metrics/MethodLength:
12
- Enabled: false
13
-
14
- Metrics/PerceivedComplexity:
15
- Enabled: false
16
-
17
- Style/ClassVars:
18
- Enabled: false
19
-
20
- Style/CommentedKeyword:
21
- Enabled: false
22
-
23
- Style/Documentation:
24
- Enabled: false
15
+ Max: 25
16
+ Exclude:
17
+ - 'test/**/*'
25
18
 
26
- Style/RegexpLiteral:
27
- Enabled: false
19
+ Style/ClassAndModuleChildren:
20
+ Exclude:
21
+ - 'test/**/*'
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Chusaku
2
2
 
3
- | Build | Gem |
4
- |-------|-----|
5
- |[![CircleCI](https://circleci.com/gh/nshki/chusaku.svg?style=svg&circle-token=e1917972632f242932171de0ca5443148e83151c)](https://circleci.com/gh/nshki/chusaku)|[![Gem Version](https://badge.fury.io/rb/chusaku.svg)](https://badge.fury.io/rb/chusaku)|
3
+ | Gem | CI | Quality |
4
+ |-----|----|---------|
5
+ |[![Gem Version](https://badge.fury.io/rb/chusaku.svg)](https://badge.fury.io/rb/chusaku)|[![CircleCI](https://circleci.com/gh/nshki/chusaku.svg?style=svg&circle-token=e1917972632f242932171de0ca5443148e83151c)](https://circleci.com/gh/nshki/chusaku)|[![Maintainability](https://api.codeclimate.com/v1/badges/e21235bd513aadf0407b/maintainability)](https://codeclimate.com/github/nshki/chusaku/maintainability)
6
6
 
7
7
  Add comments above your Rails actions that look like:
8
8
 
@@ -61,8 +61,20 @@ Usage: chusaku [options]
61
61
  -h, --help Show this help message and quit
62
62
  ```
63
63
 
64
- If you'd like to use Chusaku as a Git hook, take a look at
65
- [Lefthook](https://github.com/Arkweid/lefthook).
64
+
65
+ ## Pre-commit Hook
66
+
67
+ Here's an example setup that you could use for automating Chusaku as a Git hook
68
+ with the [Lefthook](https://github.com/Arkweid/lefthook) gem.
69
+
70
+ ```yaml
71
+ pre-commit:
72
+ commands:
73
+ chusaku:
74
+ run: eval "! git diff --staged --name-only | grep -q 'routes.rb' && exit 0 || bundle exec chusaku --exit-with-error-on-annotation"
75
+ ```
76
+
77
+ This example config only runs Chusaku if `routes.rb` was modified.
66
78
 
67
79
 
68
80
  ## Development
@@ -44,6 +44,8 @@ Gem::Specification.new do |spec|
44
44
  spec.add_development_dependency 'bundler', '~> 2.0'
45
45
  spec.add_development_dependency 'minitest', '~> 5.0'
46
46
  spec.add_development_dependency 'rake', '~> 10.0'
47
+ spec.add_development_dependency 'rubocop', '~> 0.77'
48
+ spec.add_development_dependency 'rubocop-performance', '~> 1.5'
47
49
 
48
50
  spec.add_dependency 'rails', '> 2.0'
49
51
  end
@@ -4,106 +4,123 @@ require 'chusaku/version'
4
4
  require 'chusaku/parser'
5
5
  require 'chusaku/routes'
6
6
 
7
+ # Handles core functionality of annotating projects.
7
8
  module Chusaku
8
- # The main method to run Chusaku. Annotate all actions in your Rails project
9
- # as follows:
10
- #
11
- # # @route GET /waterlilies/:id (waterlilies)
12
- # def show
13
- # # ...
14
- # end
15
- #
16
- # @param {Array<String>} args - CLI flags
17
- # @return {Integer} 0 on success, 1 on error
18
- def self.call(args = [])
19
- routes = Chusaku::Routes.call
20
- controller_pattern = 'app/controllers/**/*_controller.rb'
21
- controller_paths = Dir.glob(Rails.root.join(controller_pattern))
22
- annotated_paths = []
23
-
24
- # Loop over all controller file paths.
25
- controller_paths.each do |path|
26
- controller = /controllers\/(.*)_controller\.rb/.match(path)[1]
27
- actions = routes[controller]
28
- next if actions.nil?
29
-
30
- # Parse the file and iterate over the parsed content, two entries at a
31
- # time.
32
- parsed_file = Chusaku::Parser.call(path: path, actions: actions.keys)
33
- parsed_file[:groups].each_cons(2) do |prev, curr|
34
- # Remove all @route comments in the previous group.
35
- if prev[:type] == :comment
36
- prev[:body] = prev[:body].gsub(/^\s*#\s*@route.*$\n/, '')
37
- end
9
+ class << self
10
+ # The main method to run Chusaku. Annotate all actions in a Rails project as
11
+ # follows:
12
+ #
13
+ # # @route GET /waterlilies/:id (waterlilies)
14
+ # def show
15
+ # # ...
16
+ # end
17
+ #
18
+ # @param {Hash} flags - CLI flags
19
+ # @return {Integer} - 0 on success, 1 on error
20
+ def call(flags = {})
21
+ @flags = flags
22
+ @routes = Chusaku::Routes.call
23
+ @annotated_paths = []
24
+ controllers_pattern = 'app/controllers/**/*_controller.rb'
25
+
26
+ Dir.glob(Rails.root.join(controllers_pattern)).each do |path|
27
+ controller = %r{controllers\/(.*)_controller\.rb}.match(path)[1]
28
+ actions = @routes[controller]
29
+ next if actions.nil?
30
+
31
+ annotate_file(path: path, controller: controller, actions: actions.keys)
32
+ end
33
+
34
+ output_results
35
+ end
38
36
 
39
- # Only proceed if we are currently looking at an action.
37
+ private
38
+
39
+ # Adds annotations to the given file.
40
+ #
41
+ # @param {String} path - Path to file
42
+ # @param {String} controller - Controller name
43
+ # @param {Array<String>} actions - List of valid actions for the controller
44
+ # @return {void}
45
+ def annotate_file(path:, controller:, actions:)
46
+ parsed_file = Chusaku::Parser.call(path: path, actions: actions)
47
+ parsed_file[:groups].each_cons(2) do |prev, curr|
48
+ clean_group(prev)
40
49
  next unless curr[:type] == :action
41
50
 
42
- # Fetch current action in routes.
43
- action = curr[:action]
44
- data = routes[controller][action]
45
- next unless data.any?
46
-
47
- # Add annotations.
48
- whitespace = /^(\s*).*$/.match(curr[:body])[1]
49
- data.reverse.each do |datum|
50
- annotation = annotate(datum)
51
- comment = "#{whitespace}# #{annotation}\n"
52
- curr[:body] = comment + curr[:body]
53
- end
51
+ route_data = @routes[controller][curr[:action]]
52
+ next unless route_data.any?
53
+
54
+ annotate_group(group: curr, route_data: route_data)
54
55
  end
55
56
 
56
- # Write to file.
57
- parsed_content = parsed_file[:groups].map { |pf| pf[:body] }
58
- new_content = parsed_content.join
59
- if parsed_file[:content] != new_content
60
- write(path, new_content) unless args.include?(:dry)
61
- annotated_paths << path
57
+ write_to_file(path: path, parsed_file: parsed_file)
58
+ end
59
+
60
+ # Given a parsed group, clean out its contents.
61
+ #
62
+ # @param {Hash} group - { type: Symbol, body: String }
63
+ # @return {void}
64
+ def clean_group(group)
65
+ return unless group[:type] == :comment
66
+
67
+ group[:body] = group[:body].gsub(/^\s*#\s*@route.*$\n/, '')
68
+ group[:body] =
69
+ group[:body].gsub(%r{^\s*# (GET|POST|PATCH\/PUT|DELETE) \/\S+$\n}, '')
70
+ end
71
+
72
+ # Add an annotation to the given group given by Chusaku::Parser that looks
73
+ # like:
74
+ #
75
+ # @route GET /waterlilies/:id (waterlilies)
76
+ #
77
+ # @param {Hash} group - Parsed content given by Chusaku::Parser
78
+ # @param {Hash} route_data - Individual route data given by Chusaku::Routes
79
+ # @return {void}
80
+ def annotate_group(group:, route_data:)
81
+ whitespace = /^(\s*).*$/.match(group[:body])[1]
82
+ route_data.reverse_each do |datum|
83
+ name = datum[:name]
84
+ annotation = "@route #{datum[:verb]} #{datum[:path]}"
85
+ annotation += " (#{name})" unless name.nil?
86
+ comment = "#{whitespace}# #{annotation}\n"
87
+ group[:body] = comment + group[:body]
62
88
  end
63
89
  end
64
90
 
65
- # Output results to user.
66
- if annotated_paths.any?
67
- puts "Annotated #{annotated_paths.join(', ')}"
68
- if args.include?(:error_on_annotation)
69
- 1
70
- else
71
- 0
91
+ # Write annotated content to a file if it differs from the original.
92
+ #
93
+ # @param {String} path - File path to write to
94
+ # @param {Hash} parsed_file - Hash mutated by `annotate_group`
95
+ # @return {void}
96
+ def write_to_file(path:, parsed_file:)
97
+ content = parsed_file[:groups].map { |pf| pf[:body] }.join
98
+ return unless parsed_file[:content] != content
99
+
100
+ unless @flags.include?(:dry)
101
+ File.open(path, 'r+') do |file|
102
+ if file.respond_to?(:test_write)
103
+ file.test_write(content, path)
104
+ else
105
+ file.write(content)
106
+ end
107
+ end
72
108
  end
73
- else
74
- puts "Nothing to annotate"
75
- 0
109
+
110
+ @annotated_paths.push(path)
76
111
  end
77
- end
78
112
 
79
- # Write given content to a file. If we're using an overridden version of File,
80
- # then use its method instead for testing purposes.
81
- #
82
- # @param {String} path - File path to write to
83
- # @param {String} content - Contents of the file
84
- # @return {void}
85
- def self.write(path, content)
86
- File.open(path, 'r+') do |file|
87
- if file.respond_to?(:test_write)
88
- file.test_write(content, path)
113
+ # Output results to user.
114
+ #
115
+ # @return {Integer} - 0 for success, 1 for error
116
+ def output_results
117
+ if @annotated_paths.any?
118
+ puts("Annotated #{@annotated_paths.join(', ')}")
119
+ @flags.include?(:error_on_annotation) ? 1 : 0
89
120
  else
90
- file.write(content)
121
+ puts('Nothing to annotate')
122
+ 0
91
123
  end
92
124
  end
93
125
  end
94
-
95
- # Given a hash describing an action, generate an annotation in the form:
96
- #
97
- # @route GET /waterlilies/:id (waterlilies)
98
- #
99
- # @param {Hash} action_info - Parsed line given by Chusaku::Parser
100
- # @return {String} Annotation for given parsed line
101
- def self.annotate(action_info)
102
- verb = action_info[:verb]
103
- path = action_info[:path]
104
- name = action_info[:name]
105
- annotation = "@route #{verb} #{path}"
106
- annotation += " (#{name})" unless name.nil?
107
- annotation
108
- end
109
126
  end
@@ -4,18 +4,19 @@ require 'optparse'
4
4
  require 'chusaku'
5
5
 
6
6
  module Chusaku
7
+ # Enables flags for the `chusaku` executable.
7
8
  class CLI
9
+ attr_reader :options
10
+
8
11
  STATUS_SUCCESS = 0
9
12
  STATUS_ERROR = 1
10
13
 
11
- attr_reader :options
12
-
13
14
  Finished = Class.new(RuntimeError)
14
15
  NotARailsProject = Class.new(RuntimeError)
15
16
 
16
17
  # Initializes a new instance of Chusaku::CLI.
17
18
  #
18
- # @return {Chusaku::CLI} Instance of this class
19
+ # @return {Chusaku::CLI} - Instance of this class
19
20
  def initialize
20
21
  @options = {}
21
22
  end
@@ -23,7 +24,7 @@ module Chusaku
23
24
  # Parse CLI flags, if any, and handle applicable behaviors.
24
25
  #
25
26
  # @param {Array<String>} args - CLI arguments
26
- # @return {Integer} 0 on success, 1 on error
27
+ # @return {Integer} - 0 on success, 1 on error
27
28
  def call(args = ARGV)
28
29
  optparser.parse!(args)
29
30
  check_for_rails_project
@@ -37,55 +38,83 @@ module Chusaku
37
38
 
38
39
  private
39
40
 
40
- # Raises exception if Rails project cannot be detected.
41
- #
42
- # @raise {Chusaku::CLI::NotARailsProject} Exception if not Rails project
43
- # @return {void}
44
- def check_for_rails_project
45
- unless File.directory?('./app/controllers') && File.exist?('./Rakefile')
46
- raise NotARailsProject
47
- end
48
- end
41
+ # Raises exception if Rails project cannot be detected.
42
+ #
43
+ # @raise {Chusaku::CLI::NotARailsProject} - Exception if not Rails project
44
+ # @return {void}
45
+ def check_for_rails_project
46
+ has_controllers = File.directory?('./app/controllers')
47
+ has_rakefile = File.exist?('./Rakefile')
48
+ raise NotARailsProject unless has_controllers && has_rakefile
49
+ end
49
50
 
50
- # Returns an instance of OptionParser with supported flags.
51
- #
52
- # @return {OptionParser} Preconfigured OptionParser instance
53
- def optparser
54
- OptionParser.new do |opts|
55
- opts.banner = 'Usage: chusaku [options]'
51
+ # Returns an instance of OptionParser with supported flags.
52
+ #
53
+ # @return {OptionParser} - Preconfigured OptionParser instance
54
+ def optparser
55
+ OptionParser.new do |opts|
56
+ opts.banner = 'Usage: chusaku [options]'
57
+ add_error_on_annotation_flag(opts)
58
+ add_dry_run_flag(opts)
59
+ add_version_flag(opts)
60
+ add_help_flag(opts)
61
+ end
62
+ end
56
63
 
57
- opts.on(
58
- '--exit-with-error-on-annotation',
59
- 'Fail if any file was annotated'
60
- ) do
61
- @options[:error_on_annotation] = true
62
- end
64
+ # Adds `--exit-with-error-on-annotation` flag.
65
+ #
66
+ # @param {OptionParser} opts - OptionParser instance
67
+ # @return {void}
68
+ def add_error_on_annotation_flag(opts)
69
+ opts.on(
70
+ '--exit-with-error-on-annotation',
71
+ 'Fail if any file was annotated'
72
+ ) do
73
+ @options[:error_on_annotation] = true
74
+ end
75
+ end
63
76
 
64
- opts.on(
65
- '--dry-run',
66
- 'Run without file modifications'
67
- ) do
68
- @options[:dry] = true
69
- end
77
+ # Adds `--dry-run` flag.
78
+ #
79
+ # @param {OptionParser} opts - OptionParser instance
80
+ # @return {void}
81
+ def add_dry_run_flag(opts)
82
+ opts.on(
83
+ '--dry-run',
84
+ 'Run without file modifications'
85
+ ) do
86
+ @options[:dry] = true
87
+ end
88
+ end
70
89
 
71
- opts.on(
72
- '-v',
73
- '--version',
74
- 'Show Chusaku version number and quit'
75
- ) do
76
- puts(Chusaku::VERSION)
77
- raise Finished
78
- end
90
+ # Adds `--version` flag.
91
+ #
92
+ # @param {OptionParser} opts - OptionParser instance
93
+ # @return {void}
94
+ def add_version_flag(opts)
95
+ opts.on(
96
+ '-v',
97
+ '--version',
98
+ 'Show Chusaku version number and quit'
99
+ ) do
100
+ puts(Chusaku::VERSION)
101
+ raise Finished
102
+ end
103
+ end
79
104
 
80
- opts.on(
81
- '-h',
82
- '--help',
83
- 'Show this help message and quit'
84
- ) do
85
- puts(opts)
86
- raise Finished
87
- end
88
- end
105
+ # Adds `--help` flag.
106
+ #
107
+ # @param {OptionParser} opts - OptionParser instance
108
+ # @return {void}
109
+ def add_help_flag(opts)
110
+ opts.on(
111
+ '-h',
112
+ '--help',
113
+ 'Show this help message and quit'
114
+ ) do
115
+ puts(opts)
116
+ raise Finished
89
117
  end
118
+ end
90
119
  end
91
120
  end
@@ -1,27 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chusaku
4
+ # Handles parsing a file and groups its lines into categories.
4
5
  module Parser
5
- # Parses a file and groups its lines into categories:
6
- #
7
6
  # Example output:
8
7
  #
9
- # [ { type: :code,
10
- # body: 'class Foo\n',
11
- # action: nil },
12
- # { type: :comment,
13
- # body: ' # Bar\n # Baz\n',
14
- # action: nil },
15
- # { type: :action,
16
- # body: ' def action_name; end\n',
17
- # action: 'action_name' }
18
- # { type: :code,
19
- # body: 'end # vanilla is the best flavor\n',
20
- # action: nil } ]
8
+ # {
9
+ # content: <Original file content>,
10
+ # groups: [
11
+ # {
12
+ # type: :code,
13
+ # body: 'class Foo\n',
14
+ # action: nil
15
+ # },
16
+ # {
17
+ # type: :comment,
18
+ # body: ' # Bar\n # Baz\n',
19
+ # action: nil
20
+ # },
21
+ # {
22
+ # type: :action,
23
+ # body: ' def action_name; end\n',
24
+ # action: 'action_name'
25
+ # }
26
+ # {
27
+ # type: :code,
28
+ # body: 'end # vanilla is the best flavor\n',
29
+ # action: nil
30
+ # }
31
+ # ]
32
+ # }
21
33
  #
22
34
  # @param {String} path - File path to parse
23
35
  # @param {Array<String>} actions - List of valid actions for this route
24
- # @return {Hash} Parsed groups of the file and original content
36
+ # @return {Hash} - { content: String, groups: Array<Hash> }
25
37
  def self.call(path:, actions:)
26
38
  groups = []
27
39
  group = {}
@@ -43,10 +55,7 @@ module Chusaku
43
55
 
44
56
  # Push the last group onto the array and return.
45
57
  groups.push(group)
46
- {
47
- content: content,
48
- groups: groups
49
- }
58
+ { content: content, groups: groups }
50
59
  end
51
60
 
52
61
  # Given a line and actions, returns the line's type:
@@ -62,7 +71,7 @@ module Chusaku
62
71
  #
63
72
  # @param {String} line - A line of a file
64
73
  # @param {Array<String>} actions - List of valid actions for this route
65
- # @return {Hash} Parsed line
74
+ # @return {Hash} - { type: Symbol, body: String, action: String }
66
75
  def self.parse_line(line:, actions:)
67
76
  comment_match = /^\s*#.*$/.match(line)
68
77
  def_match = /^\s*def\s+(\w*)\s*\w*.*$/.match(line)
@@ -1,49 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chusaku
4
- module Routes
5
- # Extract information about the Rails project's routes.
6
- #
7
- # Example output:
8
- #
9
- # {
10
- # 'users' => {
11
- # 'edit' => [
12
- # { verb: 'GET', path: '/users/:id', name: 'edit_user' }],
13
- # 'update' => [
14
- # { verb: 'PATCH', path: '/users', name: 'edit_user' },
15
- # { verb: 'PUT', path: '/users', name: 'edit_user' }]
16
- # },
17
- # 'empanadas' => {
18
- # 'create' => [
19
- # { verb: 'POST', path: '/empanadas', name: nil }]
20
- # }
21
- # }
22
- #
23
- # @return {Hash} Routes hash
24
- def self.call
25
- routes = {}
4
+ # Handles extracting information about the Rails project's routes.
5
+ class Routes
6
+ class << self
7
+ # Example output:
8
+ #
9
+ # {
10
+ # 'users' => {
11
+ # 'edit' => [
12
+ # { verb: 'GET', path: '/users/:id', name: 'edit_user' }
13
+ # ],
14
+ # 'update' => [
15
+ # { verb: 'PATCH', path: '/users', name: 'edit_user' },
16
+ # { verb: 'PUT', path: '/users', name: 'edit_user' }
17
+ # ]
18
+ # },
19
+ # 'empanadas' => {
20
+ # 'create' => [
21
+ # { verb: 'POST', path: '/empanadas', name: nil }
22
+ # ]
23
+ # }
24
+ # }
25
+ #
26
+ # @return {Hash} - Routes hash
27
+ def call
28
+ routes = {}
26
29
 
27
- Rails.application.routes.routes.each do |route|
28
- defaults = route.defaults
29
- controller = defaults[:controller]
30
- action = defaults[:action]
30
+ Rails.application.routes.routes.each do |route|
31
+ controller, action = extract_controller_and_action_from(route)
32
+ routes[controller] ||= {}
33
+ routes[controller][action] ||= []
34
+ routes[controller][action].push(format_route(route))
35
+ end
31
36
 
32
- routes[controller] ||= {}
33
- routes[controller][action] ||= []
34
- routes[controller][action].push(format_route(route))
37
+ backfill_routes(routes)
35
38
  end
36
39
 
37
- backfill_routes(routes)
38
- end
39
-
40
- private
40
+ private
41
41
 
42
42
  # Extract information of a given route.
43
43
  #
44
44
  # @param {ActionDispatch::Journey::Route} route - Route given by Rails
45
- # @return {Hash} Formatted hash for given route
46
- def self.format_route(route)
45
+ # @return {Hash} - { verb: String, path: String, name: String }
46
+ def format_route(route)
47
47
  {
48
48
  verb: route.verb,
49
49
  path: route.path.spec.to_s.gsub('(.:format)', ''),
@@ -55,8 +55,8 @@ module Chusaku
55
55
  # `Rails.application.routes`.
56
56
  #
57
57
  # @param {Hash} routes - Routes hash generated by this class
58
- # @return {Hash} Backfilled routes
59
- def self.backfill_routes(routes)
58
+ # @return {Hash} - Backfilled routes hash
59
+ def backfill_routes(routes)
60
60
  paths = {}
61
61
 
62
62
  routes.each do |_controller, actions|
@@ -70,5 +70,18 @@ module Chusaku
70
70
 
71
71
  routes
72
72
  end
73
+
74
+ # Given a route, extract the controller and action strings.
75
+ #
76
+ # @param {ActionDispatch::Journey::Route} route - Route instance
77
+ # @return {Array<String>} - [String, String]
78
+ def extract_controller_and_action_from(route)
79
+ defaults = route.defaults
80
+ controller = defaults[:controller]
81
+ action = defaults[:action]
82
+
83
+ [controller, action]
84
+ end
85
+ end
73
86
  end
74
87
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chusaku
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  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: 0.2.0
4
+ version: 0.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: 2019-10-27 00:00:00.000000000 Z
11
+ date: 2019-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.77'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.77'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-performance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rails
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +103,7 @@ extensions: []
75
103
  extra_rdoc_files: []
76
104
  files:
77
105
  - ".circleci/config.yml"
106
+ - ".codeclimate.yml"
78
107
  - ".gitignore"
79
108
  - ".rubocop.yml"
80
109
  - Gemfile