@@ -25,14 +25,53 @@ module AnnotateRoutes
25
25
HEADER_ROW = [ 'Prefix' , 'Verb' , 'URI Pattern' , 'Controller#Action' ]
26
26
27
27
class << self
28
- def content ( line , maxs , options = { } )
29
- return line . rstrip unless options [ :format_markdown ]
28
+ def do_annotations ( options = { } )
29
+ return unless routes_exists?
30
+ existing_text = File . read ( routes_file )
30
31
31
- line . each_with_index . map do |elem , index |
32
- min_length = maxs . map { |arr | arr [ index ] } . max || 0
32
+ if rewrite_contents_with_header ( existing_text , header ( options ) , options )
33
+ puts "#{ routes_file } annotated."
34
+ end
35
+ end
33
36
34
- sprintf ( "%-#{ min_length } .#{ min_length } s" , elem . tr ( '|' , '-' ) )
35
- end . join ( ' | ' )
37
+ def remove_annotations ( _options = { } )
38
+ return unless routes_exists?
39
+ existing_text = File . read ( routes_file )
40
+ content , where_header_found = strip_annotations ( existing_text )
41
+ new_content = strip_on_removal ( content , where_header_found )
42
+ if rewrite_contents ( existing_text , new_content )
43
+ puts "Removed annotations from #{ routes_file } ."
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def routes_exists?
50
+ routes_exists = File . exists? ( routes_file )
51
+ puts "Can't find routes.rb" unless routes_exists
52
+
53
+ routes_exists
54
+ end
55
+
56
+ def routes_file
57
+ @routes_rb ||= File . join ( 'config' , 'routes.rb' )
58
+ end
59
+
60
+ def rewrite_contents_with_header ( existing_text , header , options = { } )
61
+ content , where_header_found = strip_annotations ( existing_text )
62
+ new_content = annotate_routes ( header , content , where_header_found , options )
63
+
64
+ # Make sure we end on a trailing newline.
65
+ new_content << '' unless new_content . last == ''
66
+ new_text = new_content . join ( "\n " )
67
+
68
+ if existing_text == new_text
69
+ puts "#{ routes_file } unchanged."
70
+ false
71
+ else
72
+ File . open ( routes_file , 'wb' ) { |f | f . puts ( new_text ) }
73
+ true
74
+ end
36
75
end
37
76
38
77
def header ( options = { } )
@@ -70,180 +109,143 @@ def header(options = {})
70
109
out
71
110
end
72
111
73
- def do_annotations ( options = { } )
74
- return unless routes_exists?
75
- existing_text = File . read ( routes_file )
76
-
77
- if rewrite_contents_with_header ( existing_text , header ( options ) , options )
78
- puts "#{ routes_file } annotated."
112
+ # TODO: write the method doc using ruby rdoc formats
113
+ # where_header_found => This will either be :before, :after, or
114
+ # a number. If the number is > 0, the
115
+ # annotation was found somewhere in the
116
+ # middle of the file. If the number is
117
+ # zero, no annotation was found.
118
+ def strip_annotations ( content )
119
+ real_content = [ ]
120
+ mode = :content
121
+ header_found_at = 0
122
+
123
+ content . split ( /\n / , -1 ) . each_with_index do |line , line_number |
124
+ if mode == :header && line !~ /\s *#/
125
+ mode = :content
126
+ real_content << line unless line . blank?
127
+ elsif mode == :content
128
+ if line =~ /^\s *#\s *== Route.*$/
129
+ header_found_at = line_number + 1 # index start's at 0
130
+ mode = :header
131
+ else
132
+ real_content << line
133
+ end
134
+ end
79
135
end
136
+
137
+ where_header_found ( real_content , header_found_at )
80
138
end
81
139
82
- def remove_annotations ( _options = { } )
83
- return unless routes_exists?
84
- existing_text = File . read ( routes_file )
85
- content , where_header_found = strip_annotations ( existing_text )
86
- new_content = strip_on_removal ( content , where_header_found )
87
- if rewrite_contents ( existing_text , new_content )
88
- puts "Removed annotations from #{ routes_file } ."
140
+ def strip_on_removal ( content , where_header_found )
141
+ if where_header_found == :before
142
+ content . shift while content . first == ''
143
+ elsif where_header_found == :after
144
+ content . pop while content . last == ''
89
145
end
90
- end
91
- end
92
146
93
- def self . magic_comment_matcher
94
- Regexp . new ( /(^#\s *encoding:.*)|(^# coding:.*)|(^# -\* - coding:.*)|(^# -\* - encoding\s ?:.*)|(^#\s *frozen_string_literal:.+)|(^# -\* - frozen_string_literal\s *:.+-\* -)/ )
95
- end
147
+ # TODO: If the user buried it in the middle, we should probably see about
148
+ # TODO: preserving a single line of space between the content above and
149
+ # TODO: below...
150
+ content
151
+ end
96
152
97
- # @param [Array<String>] content
98
- # @return [Array<String>] all found magic comments
99
- # @return [Array<String>] content without magic comments
100
- def self . extract_magic_comments_from_array ( content_array )
101
- magic_comments = [ ]
102
- new_content = [ ]
153
+ # @param [String, Array<String>]
154
+ def rewrite_contents ( existing_text , new_content )
155
+ # Make sure we end on a trailing newline.
156
+ new_content << '' unless new_content . last == ''
157
+ new_text = new_content . join ( "\n " )
103
158
104
- content_array . map do | row |
105
- if row =~ magic_comment_matcher
106
- magic_comments << row . strip
159
+ if existing_text == new_text
160
+ puts " #{ routes_file } unchanged."
161
+ false
107
162
else
108
- new_content << row
163
+ File . open ( routes_file , 'wb' ) { |f | f . puts ( new_text ) }
164
+ true
109
165
end
110
166
end
111
167
112
- [ magic_comments , new_content ]
113
- end
114
-
115
- def self . app_routes_map ( options )
116
- routes_map = `rake routes` . chomp ( "\n " ) . split ( /\n / , -1 )
117
-
118
- # In old versions of Rake, the first line of output was the cwd. Not so
119
- # much in newer ones. We ditch that line if it exists, and if not, we
120
- # keep the line around.
121
- routes_map . shift if routes_map . first =~ /^\( in \/ /
122
-
123
- # Skip routes which match given regex
124
- # Note: it matches the complete line (route_name, path, controller/action)
125
- if options [ :ignore_routes ]
126
- routes_map . reject! { |line | line =~ /#{ options [ :ignore_routes ] } / }
127
- end
128
-
129
- routes_map
130
- end
131
-
132
- def self . routes_file
133
- @routes_rb ||= File . join ( 'config' , 'routes.rb' )
134
- end
168
+ def annotate_routes ( header , content , where_header_found , options = { } )
169
+ magic_comments_map , content = extract_magic_comments_from_array ( content )
170
+ if %w( before top ) . include? ( options [ :position_in_routes ] )
171
+ header = header << '' if content . first != ''
172
+ magic_comments_map << '' if magic_comments_map . any?
173
+ new_content = magic_comments_map + header + content
174
+ else
175
+ # Ensure we have adequate trailing newlines at the end of the file to
176
+ # ensure a blank line separating the content from the annotation.
177
+ content << '' unless content . last == ''
135
178
136
- def self . routes_exists?
137
- routes_exists = File . exists? ( routes_file )
138
- puts "Can't find routes.rb" unless routes_exists
179
+ # We're moving something from the top of the file to the bottom, so ditch
180
+ # the spacer we put in the first time around.
181
+ content . shift if where_header_found == :before && content . first == ''
139
182
140
- routes_exists
141
- end
183
+ new_content = magic_comments_map + content + header
184
+ end
142
185
143
- # @param [String, Array<String>]
144
- def self . rewrite_contents ( existing_text , new_content )
145
- # Make sure we end on a trailing newline.
146
- new_content << '' unless new_content . last == ''
147
- new_text = new_content . join ( "\n " )
148
-
149
- if existing_text == new_text
150
- puts "#{ routes_file } unchanged."
151
- false
152
- else
153
- File . open ( routes_file , 'wb' ) { |f | f . puts ( new_text ) }
154
- true
186
+ new_content
155
187
end
156
- end
157
188
158
- def self . rewrite_contents_with_header ( existing_text , header , options = { } )
159
- content , where_header_found = strip_annotations ( existing_text )
160
- new_content = annotate_routes ( header , content , where_header_found , options )
189
+ def app_routes_map ( options )
190
+ routes_map = `rake routes` . chomp ( "\n " ) . split ( /\n / , -1 )
161
191
162
- # Make sure we end on a trailing newline.
163
- new_content << '' unless new_content . last == ''
164
- new_text = new_content . join ( "\n " )
192
+ # In old versions of Rake, the first line of output was the cwd. Not so
193
+ # much in newer ones. We ditch that line if it exists, and if not, we
194
+ # keep the line around.
195
+ routes_map . shift if routes_map . first =~ /^\( in \/ /
165
196
166
- if existing_text == new_text
167
- puts "#{ routes_file } unchanged."
168
- false
169
- else
170
- File . open ( routes_file , 'wb' ) { |f | f . puts ( new_text ) }
171
- true
172
- end
173
- end
197
+ # Skip routes which match given regex
198
+ # Note: it matches the complete line (route_name, path, controller/action)
199
+ if options [ :ignore_routes ]
200
+ routes_map . reject! { |line | line =~ /#{ options [ :ignore_routes ] } / }
201
+ end
174
202
175
- def self . annotate_routes ( header , content , where_header_found , options = { } )
176
- magic_comments_map , content = extract_magic_comments_from_array ( content )
177
- if %w( before top ) . include? ( options [ :position_in_routes ] )
178
- header = header << '' if content . first != ''
179
- magic_comments_map << '' if magic_comments_map . any?
180
- new_content = magic_comments_map + header + content
181
- else
182
- # Ensure we have adequate trailing newlines at the end of the file to
183
- # ensure a blank line separating the content from the annotation.
184
- content << '' unless content . last == ''
185
-
186
- # We're moving something from the top of the file to the bottom, so ditch
187
- # the spacer we put in the first time around.
188
- content . shift if where_header_found == :before && content . first == ''
189
-
190
- new_content = magic_comments_map + content + header
203
+ routes_map
191
204
end
192
205
193
- new_content
194
- end
206
+ # @param [Array<String>] content
207
+ # @return [Array<String>] all found magic comments
208
+ # @return [Array<String>] content without magic comments
209
+ def extract_magic_comments_from_array ( content_array )
210
+ magic_comments = [ ]
211
+ new_content = [ ]
195
212
196
- # TODO: write the method doc using ruby rdoc formats
197
- # where_header_found => This will either be :before, :after, or
198
- # a number. If the number is > 0, the
199
- # annotation was found somewhere in the
200
- # middle of the file. If the number is
201
- # zero, no annotation was found.
202
- def self . strip_annotations ( content )
203
- real_content = [ ]
204
- mode = :content
205
- header_found_at = 0
206
-
207
- content . split ( /\n / , -1 ) . each_with_index do |line , line_number |
208
- if mode == :header && line !~ /\s *#/
209
- mode = :content
210
- real_content << line unless line . blank?
211
- elsif mode == :content
212
- if line =~ /^\s *#\s *== Route.*$/
213
- header_found_at = line_number + 1 # index start's at 0
214
- mode = :header
213
+ content_array . map do |row |
214
+ if row =~ magic_comment_matcher
215
+ magic_comments << row . strip
215
216
else
216
- real_content << line
217
+ new_content << row
217
218
end
218
219
end
220
+
221
+ [ magic_comments , new_content ]
219
222
end
220
223
221
- where_header_found ( real_content , header_found_at )
222
- end
224
+ def content ( line , maxs , options = { } )
225
+ return line . rstrip unless options [ :format_markdown ]
226
+
227
+ line . each_with_index . map do |elem , index |
228
+ min_length = maxs . map { |arr | arr [ index ] } . max || 0
223
229
224
- def self . where_header_found ( real_content , header_found_at )
225
- # By default assume the annotation was found in the middle of the file
230
+ sprintf ( "%-#{ min_length } .#{ min_length } s" , elem . tr ( '|' , '-' ) )
231
+ end . join ( ' | ' )
232
+ end
226
233
227
- # ... unless we have evidence it was at the beginning ...
228
- return real_content , :before if header_found_at == 1
234
+ def where_header_found ( real_content , header_found_at )
235
+ # By default assume the annotation was found in the middle of the file
229
236
230
- # ... or that it was at the end .
231
- return real_content , :after if header_found_at >= real_content . count
237
+ # ... unless we have evidence it was at the beginning .. .
238
+ return real_content , :before if header_found_at == 1
232
239
233
- # and the default
234
- return real_content , header_found_at
235
- end
240
+ # ... or that it was at the end.
241
+ return real_content , :after if header_found_at >= real_content . count
236
242
237
- def self . strip_on_removal ( content , where_header_found )
238
- if where_header_found == :before
239
- content . shift while content . first == ''
240
- elsif where_header_found == :after
241
- content . pop while content . last == ''
243
+ # and the default
244
+ return real_content , header_found_at
242
245
end
243
246
244
- # TODO: If the user buried it in the middle, we should probably see about
245
- # TODO: preserving a single line of space between the content above and
246
- # TODO: below...
247
- content
247
+ def magic_comment_matcher
248
+ Regexp . new ( /(^#\s *encoding:.*)|(^# coding:.*)|(^# -\* - coding:.*)|(^# -\* - encoding\s ?:.*)|(^#\s *frozen_string_literal:.+)|(^# -\* - frozen_string_literal\s *:.+-\* -)/ )
249
+ end
248
250
end
249
251
end
0 commit comments