chusaku 0.3.0 → 0.5.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: cf3fc6d454cdeaf9c8c31019c1b0ec6dc4c676203a8c44cd40e24dee49ace832
4
- data.tar.gz: ba06bb7b2868c6c2d53ac93504eb00fe0ef5527b1224f04c6c862fd27e7734fe
3
+ metadata.gz: 006eca0c4d1c3b87363edd35f9070dd48bc0693e1b56b01fd3900696fa50387d
4
+ data.tar.gz: d5d3816c84eaba7c36d4e06e30eb7b8783b1dbb69f3c42190a278bf82fd01619
5
5
  SHA512:
6
- metadata.gz: b932a1b72743a06701d7fa3d7a80068baf0e31df76d78a0dea7b892a46bb663c3dcd9e444599b3942a9a5eb3289b5b90b962ef39216e8f15ff04bde5bff0946b
7
- data.tar.gz: c609bb26e27dc4018766e84d55aa38715385bff1fc444468481ff781649f9af3037e2078ada729814f9d92963e9b3752f48b1bb6cbdbe05a00000eae5ea169b4
6
+ metadata.gz: b103a27205545c18aba9e7570e0f0c63aafa558b0cb6b870520e8a25d60cbb73cdfceccc7937c09c3de5090cc304b08c1151a29ba16602802b0fdf685f8fe360
7
+ data.tar.gz: ff6eb6258eea5a27f0422d633975251827c114af744f229ab3f4eca101a6ce840b39c4bf47300f16813944b055502f78d1a88d89725d827edf90649003b43b22
data/.rubocop.yml CHANGED
@@ -7,6 +7,9 @@ AllCops:
7
7
  - 'test/mock/app/**/*'
8
8
  - 'test/mock/examples/**/*'
9
9
 
10
+ Layout/LineLength:
11
+ Max: 120
12
+
10
13
  Metrics/AbcSize:
11
14
  Exclude:
12
15
  - 'test/**/*'
@@ -16,6 +19,9 @@ Metrics/MethodLength:
16
19
  Exclude:
17
20
  - 'test/**/*'
18
21
 
22
+ Metrics/ModuleLength:
23
+ Max: 250
24
+
19
25
  Style/ClassAndModuleChildren:
20
26
  Exclude:
21
27
  - 'test/**/*'
data/chusaku.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.name = 'chusaku'
9
9
  spec.version = Chusaku::VERSION
10
10
  spec.authors = ['Nishiki Liu']
11
- spec.email = ['nishiki.liu@gmail.com']
11
+ spec.email = ['nishiki@hey.com']
12
12
 
13
13
  spec.summary = 'Annotate your Rails controllers with route info.'
14
14
  spec.description = 'Annotate your Rails controllers with route info.'
@@ -37,15 +37,15 @@ Gem::Specification.new do |spec|
37
37
  f.match(%r{^(test|spec|features)/})
38
38
  end
39
39
  end
40
- spec.bindir = 'bin'
41
- spec.executables = 'chusaku'
40
+ spec.bindir = 'bin'
41
+ spec.executables = 'chusaku'
42
42
  spec.require_paths = ['lib']
43
43
 
44
- spec.add_development_dependency 'bundler', '~> 2.0'
45
- spec.add_development_dependency 'minitest', '~> 5.0'
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'
44
+ spec.add_development_dependency 'bundler', '~> 2.2'
45
+ spec.add_development_dependency 'minitest', '~> 5.14'
46
+ spec.add_development_dependency 'rake', '~> 13.0'
47
+ spec.add_development_dependency 'rubocop', '~> 1.7'
48
+ spec.add_development_dependency 'rubocop-performance', '~> 1.9'
49
49
 
50
- spec.add_dependency 'rails', '> 2.0'
50
+ spec.add_dependency 'railties', '>= 3.0'
51
51
  end
data/lib/chusaku.rb CHANGED
@@ -15,8 +15,8 @@ module Chusaku
15
15
  # # ...
16
16
  # end
17
17
  #
18
- # @param {Hash} flags - CLI flags
19
- # @return {Integer} - 0 on success, 1 on error
18
+ # @param flags [Hash] CLI flags
19
+ # @return [Integer] 0 on success, 1 on error
20
20
  def call(flags = {})
21
21
  @flags = flags
22
22
  @routes = Chusaku::Routes.call
@@ -38,10 +38,10 @@ module Chusaku
38
38
 
39
39
  # Adds annotations to the given file.
40
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}
41
+ # @param path [String] Path to file
42
+ # @param controller [String] Controller name
43
+ # @param actions [Array<String>] List of valid actions for the controller
44
+ # @return [void]
45
45
  def annotate_file(path:, controller:, actions:)
46
46
  parsed_file = Chusaku::Parser.call(path: path, actions: actions)
47
47
  parsed_file[:groups].each_cons(2) do |prev, curr|
@@ -59,7 +59,7 @@ module Chusaku
59
59
 
60
60
  # Given a parsed group, clean out its contents.
61
61
  #
62
- # @param {Hash} group - { type: Symbol, body: String }
62
+ # @param group [Hash] { type => Symbol, body => String }
63
63
  # @return {void}
64
64
  def clean_group(group)
65
65
  return unless group[:type] == :comment
@@ -74,52 +74,114 @@ module Chusaku
74
74
  #
75
75
  # @route GET /waterlilies/:id (waterlilies)
76
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}
77
+ # @param group [Hash] Parsed content given by Chusaku::Parser
78
+ # @param route_data [Hash] Individual route data given by Chusaku::Routes
79
+ # @return [void]
80
80
  def annotate_group(group:, route_data:)
81
81
  whitespace = /^(\s*).*$/.match(group[:body])[1]
82
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"
83
+ comment = "#{whitespace}# #{annotate_route(**datum)}\n"
87
84
  group[:body] = comment + group[:body]
88
85
  end
89
86
  end
90
87
 
88
+ # Generate route annotation.
89
+ #
90
+ # @param verb [String] HTTP verb for route
91
+ # @param path [String] Rails path for route
92
+ # @param name [String] Name used in route helpers
93
+ # @param defaults [Hash] Default parameters for route
94
+ # @return [String] "@route <verb> <path> {<defaults>} (<name>)"
95
+ def annotate_route(verb:, path:, name:, defaults:)
96
+ annotation = "@route #{verb} #{path}"
97
+ if defaults&.any?
98
+ defaults_str =
99
+ defaults
100
+ .map { |key, value| "#{key}: #{value.inspect}" }
101
+ .join(', ')
102
+ annotation += " {#{defaults_str}}"
103
+ end
104
+ annotation += " (#{name})" unless name.nil?
105
+ annotation
106
+ end
107
+
91
108
  # Write annotated content to a file if it differs from the original.
92
109
  #
93
- # @param {String} path - File path to write to
94
- # @param {Hash} parsed_file - Hash mutated by `annotate_group`
95
- # @return {void}
110
+ # @param path [String] File path to write to
111
+ # @param parsed_file [Hash] Hash mutated by {#annotate_group}
112
+ # @return [void]
96
113
  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
114
+ new_content = new_content_for(parsed_file)
115
+ return unless parsed_file[:content] != new_content
116
+
117
+ !@flags.include?(:dry) && perform_write(path: path, content: new_content)
118
+ @annotated_paths.push(path)
119
+ end
120
+
121
+ # Extracts the new file content for the given parsed file.
122
+ #
123
+ # @param parsed_file [Hash] { groups => Array<Hash> }
124
+ # @return [String] New file content
125
+ def new_content_for(parsed_file)
126
+ parsed_file[:groups].map { |pf| pf[:body] }.join
127
+ end
128
+
129
+ # Wraps the write operation. Needed to clearly distinguish whether it's a
130
+ # write in the test suite or a write in actual use.
131
+ #
132
+ # @param path [String] File path
133
+ # @param content [String] File content
134
+ # @return [void]
135
+ def perform_write(path:, content:)
136
+ File.open(path, file_mode) do |file|
137
+ if file.respond_to?(:test_write)
138
+ file.test_write(content, path)
139
+ else
140
+ file.write(content)
107
141
  end
108
142
  end
143
+ end
109
144
 
110
- @annotated_paths.push(path)
145
+ # When running the test suite, we want to make sure we're not overwriting
146
+ # any files. `r` mode ensures that, and `w` is used for actual usage.
147
+ #
148
+ # @return [String] 'r' or 'w'
149
+ def file_mode
150
+ File.instance_methods.include?(:test_write) ? 'r' : 'w'
111
151
  end
112
152
 
113
153
  # Output results to user.
114
154
  #
115
- # @return {Integer} - 0 for success, 1 for error
155
+ # @return [Integer] 0 for success, 1 for error
116
156
  def output_results
117
- if @annotated_paths.any?
118
- puts("Annotated #{@annotated_paths.join(', ')}")
119
- @flags.include?(:error_on_annotation) ? 1 : 0
157
+ puts(output_copy)
158
+ exit_code = 0
159
+ exit_code = 1 if @annotated_paths.any? && @flags.include?(:error_on_annotation)
160
+ exit_code
161
+ end
162
+
163
+ # Determines the copy to be used in the program output.
164
+ #
165
+ # @return [String] Copy to be outputted to user
166
+ def output_copy
167
+ return 'Nothing to annotate.' if @annotated_paths.empty?
168
+
169
+ annotated_paths = @annotated_paths.join(', ')
170
+ dry_run = @flags.include?(:dry)
171
+ error_on_annotation = @flags.include?(:error_on_annotation)
172
+
173
+ if dry_run && error_on_annotation
174
+ <<~COPY
175
+ Annotations missing in the following files: #{annotated_paths}
176
+
177
+ Run `chusaku` to annotate them. Exiting with status code 1.
178
+ COPY
179
+ elsif dry_run
180
+ "The following files would be annotated without `--dry-run`: #{annotated_paths}"
181
+ elsif error_on_annotation
182
+ "Annotated #{annotated_paths}.\n\nExiting with status code 1."
120
183
  else
121
- puts('Nothing to annotate')
122
- 0
184
+ "Annotated #{annotated_paths}."
123
185
  end
124
186
  end
125
187
  end
data/lib/chusaku/cli.rb CHANGED
@@ -14,17 +14,17 @@ module Chusaku
14
14
  Finished = Class.new(RuntimeError)
15
15
  NotARailsProject = Class.new(RuntimeError)
16
16
 
17
- # Initializes a new instance of Chusaku::CLI.
17
+ # Initializes a new instance of `Chusaku::CLI`.
18
18
  #
19
- # @return {Chusaku::CLI} - Instance of this class
19
+ # @return [Chusaku::CLI] Instance of this class
20
20
  def initialize
21
21
  @options = {}
22
22
  end
23
23
 
24
24
  # Parse CLI flags, if any, and handle applicable behaviors.
25
25
  #
26
- # @param {Array<String>} args - CLI arguments
27
- # @return {Integer} - 0 on success, 1 on error
26
+ # @param args [Array<String>] CLI arguments
27
+ # @return [Integer] 0 on success, 1 on error
28
28
  def call(args = ARGV)
29
29
  optparser.parse!(args)
30
30
  check_for_rails_project
@@ -40,8 +40,8 @@ module Chusaku
40
40
 
41
41
  # Raises exception if Rails project cannot be detected.
42
42
  #
43
- # @raise {Chusaku::CLI::NotARailsProject} - Exception if not Rails project
44
- # @return {void}
43
+ # @raise [Chusaku::CLI::NotARailsProject] Exception if not Rails project
44
+ # @return [void]
45
45
  def check_for_rails_project
46
46
  has_controllers = File.directory?('./app/controllers')
47
47
  has_rakefile = File.exist?('./Rakefile')
@@ -50,7 +50,7 @@ module Chusaku
50
50
 
51
51
  # Returns an instance of OptionParser with supported flags.
52
52
  #
53
- # @return {OptionParser} - Preconfigured OptionParser instance
53
+ # @return [OptionParser] Preconfigured OptionParser instance
54
54
  def optparser
55
55
  OptionParser.new do |opts|
56
56
  opts.banner = 'Usage: chusaku [options]'
@@ -63,8 +63,8 @@ module Chusaku
63
63
 
64
64
  # Adds `--exit-with-error-on-annotation` flag.
65
65
  #
66
- # @param {OptionParser} opts - OptionParser instance
67
- # @return {void}
66
+ # @param opts [OptionParser] OptionParser instance
67
+ # @return [void]
68
68
  def add_error_on_annotation_flag(opts)
69
69
  opts.on(
70
70
  '--exit-with-error-on-annotation',
@@ -76,8 +76,8 @@ module Chusaku
76
76
 
77
77
  # Adds `--dry-run` flag.
78
78
  #
79
- # @param {OptionParser} opts - OptionParser instance
80
- # @return {void}
79
+ # @param opts [OptionParser] OptionParser instance
80
+ # @return [void]
81
81
  def add_dry_run_flag(opts)
82
82
  opts.on(
83
83
  '--dry-run',
@@ -89,8 +89,8 @@ module Chusaku
89
89
 
90
90
  # Adds `--version` flag.
91
91
  #
92
- # @param {OptionParser} opts - OptionParser instance
93
- # @return {void}
92
+ # @param opts [OptionParser] OptionParser instance
93
+ # @return [void]
94
94
  def add_version_flag(opts)
95
95
  opts.on(
96
96
  '-v',
@@ -104,8 +104,8 @@ module Chusaku
104
104
 
105
105
  # Adds `--help` flag.
106
106
  #
107
- # @param {OptionParser} opts - OptionParser instance
108
- # @return {void}
107
+ # @param opts [OptionParser] OptionParser instance
108
+ # @return [void]
109
109
  def add_help_flag(opts)
110
110
  opts.on(
111
111
  '-h',
@@ -3,6 +3,8 @@
3
3
  module Chusaku
4
4
  # Handles parsing a file and groups its lines into categories.
5
5
  module Parser
6
+ # Primary method to call.
7
+ #
6
8
  # Example output:
7
9
  #
8
10
  # {
@@ -31,9 +33,9 @@ module Chusaku
31
33
  # ]
32
34
  # }
33
35
  #
34
- # @param {String} path - File path to parse
35
- # @param {Array<String>} actions - List of valid actions for this route
36
- # @return {Hash} - { content: String, groups: Array<Hash> }
36
+ # @param path [String] File path to parse
37
+ # @param actions [Array<String>] List of valid actions for this route
38
+ # @return [Hash] { content => String, groups => Array<Hash> }
37
39
  def self.call(path:, actions:)
38
40
  groups = []
39
41
  group = {}
@@ -58,20 +60,22 @@ module Chusaku
58
60
  { content: content, groups: groups }
59
61
  end
60
62
 
61
- # Given a line and actions, returns the line's type:
63
+ # Given a line and actions, returns the line's type.
64
+ #
65
+ # A type can be one of:
62
66
  #
63
67
  # 1. comment - A line that is entirely commented. Lines that have trailing
64
68
  # comments do not fall under this category.
65
69
  # 2. action - A line that contains an action definition.
66
70
  # 3. code - Anything else.
67
71
  #
68
- # And give back a Hash in the form:
72
+ # Returns a Hash in the form:
69
73
  #
70
74
  # { type: :action, body: 'def foo', action: 'foo' }
71
75
  #
72
- # @param {String} line - A line of a file
73
- # @param {Array<String>} actions - List of valid actions for this route
74
- # @return {Hash} - { type: Symbol, body: String, action: String }
76
+ # @param line [String] A line of a file
77
+ # @param actions [Array<String>] List of valid actions for this route
78
+ # @return [Hash] { type => Symbol, body => String, action => String }
75
79
  def self.parse_line(line:, actions:)
76
80
  comment_match = /^\s*#.*$/.match(line)
77
81
  def_match = /^\s*def\s+(\w*)\s*\w*.*$/.match(line)
@@ -4,6 +4,8 @@ module Chusaku
4
4
  # Handles extracting information about the Rails project's routes.
5
5
  class Routes
6
6
  class << self
7
+ # Primary method to call.
8
+ #
7
9
  # Example output:
8
10
  #
9
11
  # {
@@ -23,15 +25,21 @@ module Chusaku
23
25
  # }
24
26
  # }
25
27
  #
26
- # @return {Hash} - Routes hash
28
+ # @return [Hash] Routes hash
27
29
  def call
28
30
  routes = {}
29
31
 
30
32
  Rails.application.routes.routes.each do |route|
31
- controller, action = extract_controller_and_action_from(route)
33
+ controller, action, defaults = extract_data_from(route)
32
34
  routes[controller] ||= {}
33
35
  routes[controller][action] ||= []
34
- routes[controller][action].push(format_route(route))
36
+
37
+ add_info_for \
38
+ route: route,
39
+ routes: routes,
40
+ controller: controller,
41
+ action: action,
42
+ defaults: defaults
35
43
  end
36
44
 
37
45
  backfill_routes(routes)
@@ -39,23 +47,56 @@ module Chusaku
39
47
 
40
48
  private
41
49
 
42
- # Extract information of a given route.
50
+ # Adds formatted route info for the given param combination.
51
+ #
52
+ # @param route [Hash] Route info
53
+ # @param routes [Hash] Collection of all route info
54
+ # @param controller [String] Controller key
55
+ # @param action [String] Action key
56
+ # @param defaults [Hash] Default parameters for route
57
+ # @return [void]
58
+ def add_info_for(route:, routes:, controller:, action:, defaults:)
59
+ verbs_for(route).each do |verb|
60
+ routes[controller][action]
61
+ .push(format(route: route, verb: verb, defaults: defaults))
62
+ routes[controller][action].uniq!
63
+ end
64
+ end
65
+
66
+ # Extract the HTTP verbs for a Rails route. Required for older versions of
67
+ # Rails that return regular expressions for a route verb which sometimes
68
+ # contains multiple verbs.
69
+ #
70
+ # @param route [ActionDispatch::Journey::Route] Route given by Rails
71
+ # @return [Array<String>] List of HTTP verbs for the given route
72
+ def verbs_for(route)
73
+ route_verb = route.verb.to_s
74
+
75
+ %w[GET POST PUT PATCH DELETE].select do |verb|
76
+ route_verb.include?(verb)
77
+ end
78
+ end
79
+
80
+ # Formats information for a given route.
43
81
  #
44
- # @param {ActionDispatch::Journey::Route} route - Route given by Rails
45
- # @return {Hash} - { verb: String, path: String, name: String }
46
- def format_route(route)
82
+ # @param route [ActionDispatch::Journey::Route] Route given by Rails
83
+ # @param verb [String] HTTP verb
84
+ # @param defaults [Hash] Default parameters for route
85
+ # @return [Hash] { verb => String, path => String, name => String }
86
+ def format(route:, verb:, defaults:)
47
87
  {
48
- verb: route.verb,
88
+ verb: verb,
49
89
  path: route.path.spec.to_s.gsub('(.:format)', ''),
50
- name: route.name
90
+ name: route.name,
91
+ defaults: defaults
51
92
  }
52
93
  end
53
94
 
54
95
  # Given a routes hash, backfill entries that aren't already filled by
55
96
  # `Rails.application.routes`.
56
97
  #
57
- # @param {Hash} routes - Routes hash generated by this class
58
- # @return {Hash} - Backfilled routes hash
98
+ # @param routes [Hash] Routes hash generated by this class
99
+ # @return [Hash] Backfilled routes hash
59
100
  def backfill_routes(routes)
60
101
  paths = {}
61
102
 
@@ -73,14 +114,14 @@ module Chusaku
73
114
 
74
115
  # Given a route, extract the controller and action strings.
75
116
  #
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]
117
+ # @param route [ActionDispatch::Journey::Route] Route instance
118
+ # @return [Array<Object>] (String, String, Hash)
119
+ def extract_data_from(route)
120
+ defaults = route.defaults.dup
121
+ controller = defaults.delete(:controller)
122
+ action = defaults.delete(:action)
82
123
 
83
- [controller, action]
124
+ [controller, action, defaults]
84
125
  end
85
126
  end
86
127
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chusaku
4
- VERSION = '0.3.0'
4
+ VERSION = '0.5.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.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nishiki Liu
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-16 00:00:00.000000000 Z
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,87 +16,87 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '5.0'
33
+ version: '5.14'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '5.0'
40
+ version: '5.14'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '13.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '13.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.77'
61
+ version: '1.7'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.77'
68
+ version: '1.7'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubocop-performance
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.5'
75
+ version: '1.9'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.5'
82
+ version: '1.9'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rails
84
+ name: railties
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '2.0'
89
+ version: '3.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '2.0'
96
+ version: '3.0'
97
97
  description: Annotate your Rails controllers with route info.
98
98
  email:
99
- - nishiki.liu@gmail.com
99
+ - nishiki@hey.com
100
100
  executables:
101
101
  - chusaku
102
102
  extensions: []
@@ -127,7 +127,7 @@ metadata:
127
127
  homepage_uri: https://github.com/nshki/chusaku
128
128
  source_code_uri: https://github.com/nshki/chusaku
129
129
  changelog_uri: https://github.com/nshki/chusaku
130
- post_install_message:
130
+ post_install_message:
131
131
  rdoc_options: []
132
132
  require_paths:
133
133
  - lib
@@ -142,8 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
- rubygems_version: 3.0.3
146
- signing_key:
145
+ rubygems_version: 3.2.15
146
+ signing_key:
147
147
  specification_version: 4
148
148
  summary: Annotate your Rails controllers with route info.
149
149
  test_files: []