annotate 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{AUTHORS.rdoc → AUTHORS.md} +2 -2
- data/CHANGELOG.md +312 -0
- data/{README.rdoc → README.md} +138 -105
- data/RELEASE.md +19 -0
- data/annotate.gemspec +2 -2
- data/bin/annotate +3 -3
- data/lib/annotate.rb +21 -80
- data/lib/annotate/annotate_models.rb +101 -37
- data/lib/annotate/annotate_routes.rb +69 -68
- data/lib/annotate/constants.rb +33 -0
- data/lib/annotate/helpers.rb +30 -0
- data/lib/annotate/parser.rb +127 -75
- data/lib/annotate/version.rb +1 -1
- data/lib/generators/annotate/templates/auto_annotate_models.rake +2 -0
- data/lib/tasks/annotate_models.rake +36 -35
- data/lib/tasks/annotate_models_migrate.rake +3 -3
- data/lib/tasks/annotate_routes.rake +5 -5
- data/potato.md +41 -0
- metadata +10 -10
- data/CHANGELOG.rdoc +0 -245
- data/RELEASE.rdoc +0 -17
- data/TODO.rdoc +0 -11
@@ -22,58 +22,54 @@
|
|
22
22
|
module AnnotateRoutes
|
23
23
|
PREFIX = '== Route Map'.freeze
|
24
24
|
PREFIX_MD = '## Route Map'.freeze
|
25
|
-
HEADER_ROW = ['Prefix', 'Verb', 'URI Pattern', 'Controller#Action']
|
25
|
+
HEADER_ROW = ['Prefix', 'Verb', 'URI Pattern', 'Controller#Action'].freeze
|
26
|
+
|
27
|
+
MAGIC_COMMENT_MATCHER = Regexp.new(/(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/).freeze
|
26
28
|
|
27
29
|
class << self
|
28
30
|
def do_annotations(options = {})
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
if routes_file_exist?
|
32
|
+
existing_text = File.read(routes_file)
|
33
|
+
content, header_position = strip_annotations(existing_text)
|
34
|
+
new_content = annotate_routes(header(options), content, header_position, options)
|
35
|
+
new_text = new_content.join("\n")
|
36
|
+
|
37
|
+
if rewrite_contents(existing_text, new_text)
|
38
|
+
puts "#{routes_file} was annotated."
|
39
|
+
else
|
40
|
+
puts "#{routes_file} was not changed."
|
41
|
+
end
|
42
|
+
else
|
43
|
+
puts "#{routes_file} could not be found."
|
34
44
|
end
|
35
45
|
end
|
36
46
|
|
37
47
|
def remove_annotations(_options={})
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
if routes_file_exist?
|
49
|
+
existing_text = File.read(routes_file)
|
50
|
+
content, header_position = strip_annotations(existing_text)
|
51
|
+
new_content = strip_on_removal(content, header_position)
|
52
|
+
new_text = new_content.join("\n")
|
53
|
+
if rewrite_contents(existing_text, new_text)
|
54
|
+
puts "Annotations were removed from #{routes_file}."
|
55
|
+
else
|
56
|
+
puts "#{routes_file} was not changed (Annotation did not exist)."
|
57
|
+
end
|
58
|
+
else
|
59
|
+
puts "#{routes_file} could not be found."
|
44
60
|
end
|
45
61
|
end
|
46
62
|
|
47
63
|
private
|
48
64
|
|
49
|
-
def
|
50
|
-
|
51
|
-
puts "Can't find routes.rb" unless routes_exists
|
52
|
-
|
53
|
-
routes_exists
|
65
|
+
def routes_file_exist?
|
66
|
+
File.exist?(routes_file)
|
54
67
|
end
|
55
68
|
|
56
69
|
def routes_file
|
57
70
|
@routes_rb ||= File.join('config', 'routes.rb')
|
58
71
|
end
|
59
72
|
|
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
|
75
|
-
end
|
76
|
-
|
77
73
|
def header(options = {})
|
78
74
|
routes_map = app_routes_map(options)
|
79
75
|
|
@@ -86,10 +82,10 @@ module AnnotateRoutes
|
|
86
82
|
end
|
87
83
|
out << '' if magic_comments_map.any?
|
88
84
|
|
89
|
-
out
|
85
|
+
out << comment(options[:wrapper_open]) if options[:wrapper_open]
|
90
86
|
|
91
|
-
out
|
92
|
-
out
|
87
|
+
out << comment(options[:format_markdown] ? PREFIX_MD : PREFIX) + (options[:timestamp] ? " (Updated #{Time.now.strftime('%Y-%m-%d %H:%M')})" : '')
|
88
|
+
out << comment
|
93
89
|
return out if routes_map.size.zero?
|
94
90
|
|
95
91
|
maxs = [HEADER_ROW.map(&:size)] + routes_map[1..-1].map { |line| line.split.map(&:size) }
|
@@ -97,20 +93,29 @@ module AnnotateRoutes
|
|
97
93
|
if options[:format_markdown]
|
98
94
|
max = maxs.map(&:max).compact.max
|
99
95
|
|
100
|
-
out
|
101
|
-
out
|
96
|
+
out << comment(content(HEADER_ROW, maxs, options))
|
97
|
+
out << comment(content(['-' * max, '-' * max, '-' * max, '-' * max], maxs, options))
|
102
98
|
else
|
103
|
-
out
|
99
|
+
out << comment(content(routes_map[0], maxs, options))
|
104
100
|
end
|
105
101
|
|
106
|
-
out += routes_map[1..-1].map { |line|
|
107
|
-
out
|
102
|
+
out += routes_map[1..-1].map { |line| comment(content(options[:format_markdown] ? line.split(' ') : line, maxs, options)) }
|
103
|
+
out << comment(options[:wrapper_close]) if options[:wrapper_close]
|
108
104
|
|
109
105
|
out
|
110
106
|
end
|
111
107
|
|
108
|
+
def comment(row = '')
|
109
|
+
if row == ''
|
110
|
+
'#'
|
111
|
+
else
|
112
|
+
"# #{row}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
112
116
|
# TODO: write the method doc using ruby rdoc formats
|
113
|
-
#
|
117
|
+
# This method returns an array of 'real_content' and 'header_position'.
|
118
|
+
# 'header_position' will either be :before, :after, or
|
114
119
|
# a number. If the number is > 0, the
|
115
120
|
# annotation was found somewhere in the
|
116
121
|
# middle of the file. If the number is
|
@@ -118,7 +123,7 @@ module AnnotateRoutes
|
|
118
123
|
def strip_annotations(content)
|
119
124
|
real_content = []
|
120
125
|
mode = :content
|
121
|
-
|
126
|
+
header_position = 0
|
122
127
|
|
123
128
|
content.split(/\n/, -1).each_with_index do |line, line_number|
|
124
129
|
if mode == :header && line !~ /\s*#/
|
@@ -126,7 +131,7 @@ module AnnotateRoutes
|
|
126
131
|
real_content << line unless line.blank?
|
127
132
|
elsif mode == :content
|
128
133
|
if line =~ /^\s*#\s*== Route.*$/
|
129
|
-
|
134
|
+
header_position = line_number + 1 # index start's at 0
|
130
135
|
mode = :header
|
131
136
|
else
|
132
137
|
real_content << line
|
@@ -134,30 +139,27 @@ module AnnotateRoutes
|
|
134
139
|
end
|
135
140
|
end
|
136
141
|
|
137
|
-
|
142
|
+
real_content_and_header_position(real_content, header_position)
|
138
143
|
end
|
139
144
|
|
140
|
-
def strip_on_removal(content,
|
141
|
-
if
|
145
|
+
def strip_on_removal(content, header_position)
|
146
|
+
if header_position == :before
|
142
147
|
content.shift while content.first == ''
|
143
|
-
elsif
|
148
|
+
elsif header_position == :after
|
144
149
|
content.pop while content.last == ''
|
145
150
|
end
|
146
151
|
|
152
|
+
# Make sure we end on a trailing newline.
|
153
|
+
content << '' unless content.last == ''
|
154
|
+
|
147
155
|
# TODO: If the user buried it in the middle, we should probably see about
|
148
156
|
# TODO: preserving a single line of space between the content above and
|
149
157
|
# TODO: below...
|
150
158
|
content
|
151
159
|
end
|
152
160
|
|
153
|
-
|
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")
|
158
|
-
|
161
|
+
def rewrite_contents(existing_text, new_text)
|
159
162
|
if existing_text == new_text
|
160
|
-
puts "#{routes_file} unchanged."
|
161
163
|
false
|
162
164
|
else
|
163
165
|
File.open(routes_file, 'wb') { |f| f.puts(new_text) }
|
@@ -165,7 +167,7 @@ module AnnotateRoutes
|
|
165
167
|
end
|
166
168
|
end
|
167
169
|
|
168
|
-
def annotate_routes(header, content,
|
170
|
+
def annotate_routes(header, content, header_position, options = {})
|
169
171
|
magic_comments_map, content = extract_magic_comments_from_array(content)
|
170
172
|
if %w(before top).include?(options[:position_in_routes])
|
171
173
|
header = header << '' if content.first != ''
|
@@ -178,11 +180,14 @@ module AnnotateRoutes
|
|
178
180
|
|
179
181
|
# We're moving something from the top of the file to the bottom, so ditch
|
180
182
|
# the spacer we put in the first time around.
|
181
|
-
content.shift if
|
183
|
+
content.shift if header_position == :before && content.first == ''
|
182
184
|
|
183
185
|
new_content = magic_comments_map + content + header
|
184
186
|
end
|
185
187
|
|
188
|
+
# Make sure we end on a trailing newline.
|
189
|
+
new_content << '' unless new_content.last == ''
|
190
|
+
|
186
191
|
new_content
|
187
192
|
end
|
188
193
|
|
@@ -210,8 +215,8 @@ module AnnotateRoutes
|
|
210
215
|
magic_comments = []
|
211
216
|
new_content = []
|
212
217
|
|
213
|
-
content_array.
|
214
|
-
if row =~
|
218
|
+
content_array.each do |row|
|
219
|
+
if row =~ MAGIC_COMMENT_MATCHER
|
215
220
|
magic_comments << row.strip
|
216
221
|
else
|
217
222
|
new_content << row
|
@@ -231,21 +236,17 @@ module AnnotateRoutes
|
|
231
236
|
end.join(' | ')
|
232
237
|
end
|
233
238
|
|
234
|
-
def
|
239
|
+
def real_content_and_header_position(real_content, header_position)
|
235
240
|
# By default assume the annotation was found in the middle of the file
|
236
241
|
|
237
242
|
# ... unless we have evidence it was at the beginning ...
|
238
|
-
return real_content, :before if
|
243
|
+
return real_content, :before if header_position == 1
|
239
244
|
|
240
245
|
# ... or that it was at the end.
|
241
|
-
return real_content, :after if
|
246
|
+
return real_content, :after if header_position >= real_content.count
|
242
247
|
|
243
248
|
# and the default
|
244
|
-
return real_content,
|
245
|
-
end
|
246
|
-
|
247
|
-
def magic_comment_matcher
|
248
|
-
Regexp.new(/(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/)
|
249
|
+
return real_content, header_position
|
249
250
|
end
|
250
251
|
end
|
251
252
|
end
|
data/lib/annotate/constants.rb
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
module Annotate
|
2
2
|
module Constants
|
3
3
|
TRUE_RE = /^(true|t|yes|y|1)$/i.freeze
|
4
|
+
|
5
|
+
##
|
6
|
+
# The set of available options to customize the behavior of Annotate.
|
7
|
+
#
|
8
|
+
POSITION_OPTIONS = [
|
9
|
+
:position_in_routes, :position_in_class, :position_in_test,
|
10
|
+
:position_in_fixture, :position_in_factory, :position,
|
11
|
+
:position_in_serializer
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
FLAG_OPTIONS = [
|
15
|
+
:show_indexes, :simple_indexes, :include_version, :exclude_tests,
|
16
|
+
:exclude_fixtures, :exclude_factories, :ignore_model_sub_dir,
|
17
|
+
:format_bare, :format_rdoc, :format_yard, :format_markdown, :sort, :force, :frozen,
|
18
|
+
:trace, :timestamp, :exclude_serializers, :classified_sort,
|
19
|
+
:show_foreign_keys, :show_complete_foreign_keys,
|
20
|
+
:exclude_scaffolds, :exclude_controllers, :exclude_helpers,
|
21
|
+
:exclude_sti_subclasses, :ignore_unknown_models, :with_comment
|
22
|
+
].freeze
|
23
|
+
|
24
|
+
OTHER_OPTIONS = [
|
25
|
+
:additional_file_patterns, :ignore_columns, :skip_on_db_migrate, :wrapper_open, :wrapper_close,
|
26
|
+
:wrapper, :routes, :models, :hide_limit_column_types, :hide_default_column_types,
|
27
|
+
:ignore_routes, :active_admin
|
28
|
+
].freeze
|
29
|
+
|
30
|
+
PATH_OPTIONS = [
|
31
|
+
:require, :model_dir, :root_dir
|
32
|
+
].freeze
|
33
|
+
|
34
|
+
ALL_ANNOTATE_OPTIONS = [
|
35
|
+
POSITION_OPTIONS, FLAG_OPTIONS, OTHER_OPTIONS, PATH_OPTIONS
|
36
|
+
].freeze
|
4
37
|
end
|
5
38
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Annotate
|
2
|
+
# Class for holding helper methods. Done to make lib/annotate.rb less bloated.
|
3
|
+
class Helpers
|
4
|
+
class << self
|
5
|
+
def skip_on_migration?
|
6
|
+
ENV['ANNOTATE_SKIP_ON_DB_MIGRATE'] =~ Constants::TRUE_RE || ENV['skip_on_db_migrate'] =~ Constants::TRUE_RE
|
7
|
+
end
|
8
|
+
|
9
|
+
def include_routes?
|
10
|
+
ENV['routes'] =~ Constants::TRUE_RE
|
11
|
+
end
|
12
|
+
|
13
|
+
def include_models?
|
14
|
+
ENV['models'] =~ Constants::TRUE_RE
|
15
|
+
end
|
16
|
+
|
17
|
+
def true?(val)
|
18
|
+
val.present? && Constants::TRUE_RE.match?(val)
|
19
|
+
end
|
20
|
+
|
21
|
+
def fallback(*args)
|
22
|
+
args.detect(&:present?)
|
23
|
+
end
|
24
|
+
|
25
|
+
def reset_options(options)
|
26
|
+
options.flatten.each { |key| ENV[key.to_s] = nil }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/annotate/parser.rb
CHANGED
@@ -9,14 +9,19 @@ module Annotate
|
|
9
9
|
|
10
10
|
attr_reader :args, :options, :env
|
11
11
|
|
12
|
+
DEFAULT_OPTIONS = {
|
13
|
+
target_action: :do_annotations,
|
14
|
+
exit: false
|
15
|
+
}.freeze
|
16
|
+
|
12
17
|
ANNOTATION_POSITIONS = %w[before top after bottom].freeze
|
13
18
|
FILE_TYPE_POSITIONS = %w[position_in_class position_in_factory position_in_fixture position_in_test position_in_routes position_in_serializer].freeze
|
14
19
|
EXCLUSION_LIST = %w[tests fixtures factories serializers].freeze
|
15
|
-
FORMAT_TYPES = %w[bare rdoc markdown].freeze
|
20
|
+
FORMAT_TYPES = %w[bare rdoc yard markdown].freeze
|
16
21
|
|
17
22
|
def initialize(args, env)
|
18
23
|
@args = args
|
19
|
-
@options =
|
24
|
+
@options = DEFAULT_OPTIONS.dup
|
20
25
|
@env = env
|
21
26
|
end
|
22
27
|
|
@@ -31,128 +36,164 @@ module Annotate
|
|
31
36
|
|
32
37
|
private
|
33
38
|
|
34
|
-
def commit
|
35
|
-
env.each_pair do |key, value|
|
36
|
-
ENV[key] = value
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
39
|
def parser
|
41
40
|
OptionParser.new do |option_parser|
|
42
41
|
add_options_to_parser(option_parser)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
45
|
+
def commit
|
46
|
+
env.each_pair do |key, value|
|
47
|
+
ENV[key] = value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
46
51
|
def add_options_to_parser(option_parser) # rubocop:disable Metrics/MethodLength
|
47
52
|
has_set_position = {}
|
48
|
-
positions = ANNOTATION_POSITIONS
|
49
53
|
|
50
54
|
option_parser.banner = 'Usage: annotate [options] [model_file]*'
|
51
55
|
|
52
|
-
option_parser.on('--additional-file-patterns path1,path2,path3',
|
56
|
+
option_parser.on('--additional-file-patterns path1,path2,path3',
|
57
|
+
Array,
|
58
|
+
"Additional file paths or globs to annotate, separated by commas (e.g. `/foo/bar/%model_name%/*.rb,/baz/%model_name%.rb`)") do |additional_file_patterns|
|
53
59
|
ENV['additional_file_patterns'] = additional_file_patterns
|
54
60
|
end
|
55
61
|
|
56
|
-
option_parser.on('-d',
|
62
|
+
option_parser.on('-d',
|
63
|
+
'--delete',
|
64
|
+
'Remove annotations from all model files or the routes.rb file') do
|
57
65
|
@options[:target_action] = :remove_annotations
|
58
66
|
end
|
59
67
|
|
60
|
-
option_parser.on('-p',
|
61
|
-
'
|
62
|
-
|
68
|
+
option_parser.on('-p',
|
69
|
+
'--position [before|top|after|bottom]',
|
70
|
+
ANNOTATION_POSITIONS,
|
71
|
+
'Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/route/serializer file(s)') do |position|
|
72
|
+
env['position'] = position
|
63
73
|
|
64
74
|
FILE_TYPE_POSITIONS.each do |key|
|
65
|
-
env[key] =
|
75
|
+
env[key] = position unless has_set_position[key]
|
66
76
|
end
|
67
77
|
end
|
68
78
|
|
69
|
-
option_parser.on('--pc',
|
70
|
-
'
|
71
|
-
|
79
|
+
option_parser.on('--pc',
|
80
|
+
'--position-in-class [before|top|after|bottom]',
|
81
|
+
ANNOTATION_POSITIONS,
|
82
|
+
'Place the annotations at the top (before) or the bottom (after) of the model file') do |position_in_class|
|
83
|
+
env['position_in_class'] = position_in_class
|
72
84
|
has_set_position['position_in_class'] = true
|
73
85
|
end
|
74
86
|
|
75
|
-
option_parser.on('--pf',
|
76
|
-
'
|
77
|
-
|
87
|
+
option_parser.on('--pf',
|
88
|
+
'--position-in-factory [before|top|after|bottom]',
|
89
|
+
ANNOTATION_POSITIONS,
|
90
|
+
'Place the annotations at the top (before) or the bottom (after) of any factory files') do |position_in_factory|
|
91
|
+
env['position_in_factory'] = position_in_factory
|
78
92
|
has_set_position['position_in_factory'] = true
|
79
93
|
end
|
80
94
|
|
81
|
-
option_parser.on('--px',
|
82
|
-
'
|
83
|
-
|
95
|
+
option_parser.on('--px',
|
96
|
+
'--position-in-fixture [before|top|after|bottom]',
|
97
|
+
ANNOTATION_POSITIONS,
|
98
|
+
'Place the annotations at the top (before) or the bottom (after) of any fixture files') do |position_in_fixture|
|
99
|
+
env['position_in_fixture'] = position_in_fixture
|
84
100
|
has_set_position['position_in_fixture'] = true
|
85
101
|
end
|
86
102
|
|
87
|
-
option_parser.on('--pt',
|
88
|
-
'
|
89
|
-
|
103
|
+
option_parser.on('--pt',
|
104
|
+
'--position-in-test [before|top|after|bottom]',
|
105
|
+
ANNOTATION_POSITIONS,
|
106
|
+
'Place the annotations at the top (before) or the bottom (after) of any test files') do |position_in_test|
|
107
|
+
env['position_in_test'] = position_in_test
|
90
108
|
has_set_position['position_in_test'] = true
|
91
109
|
end
|
92
110
|
|
93
|
-
option_parser.on('--pr',
|
94
|
-
'
|
95
|
-
|
111
|
+
option_parser.on('--pr',
|
112
|
+
'--position-in-routes [before|top|after|bottom]',
|
113
|
+
ANNOTATION_POSITIONS,
|
114
|
+
'Place the annotations at the top (before) or the bottom (after) of the routes.rb file') do |position_in_routes|
|
115
|
+
env['position_in_routes'] = position_in_routes
|
96
116
|
has_set_position['position_in_routes'] = true
|
97
117
|
end
|
98
118
|
|
99
|
-
option_parser.on('--ps',
|
100
|
-
'
|
101
|
-
|
119
|
+
option_parser.on('--ps',
|
120
|
+
'--position-in-serializer [before|top|after|bottom]',
|
121
|
+
ANNOTATION_POSITIONS,
|
122
|
+
'Place the annotations at the top (before) or the bottom (after) of the serializer files') do |position_in_serializer|
|
123
|
+
env['position_in_serializer'] = position_in_serializer
|
102
124
|
has_set_position['position_in_serializer'] = true
|
103
125
|
end
|
104
126
|
|
105
|
-
option_parser.on('--w',
|
106
|
-
'
|
107
|
-
|
127
|
+
option_parser.on('--w',
|
128
|
+
'--wrapper STR',
|
129
|
+
'Wrap annotation with the text passed as parameter.',
|
130
|
+
'If --w option is used, the same text will be used as opening and closing') do |wrapper|
|
131
|
+
env['wrapper'] = wrapper
|
108
132
|
end
|
109
133
|
|
110
|
-
option_parser.on('--wo',
|
111
|
-
|
134
|
+
option_parser.on('--wo',
|
135
|
+
'--wrapper-open STR',
|
136
|
+
'Annotation wrapper opening.') do |wrapper_open|
|
137
|
+
env['wrapper_open'] = wrapper_open
|
112
138
|
end
|
113
139
|
|
114
|
-
option_parser.on('--wc',
|
115
|
-
|
140
|
+
option_parser.on('--wc',
|
141
|
+
'--wrapper-close STR',
|
142
|
+
'Annotation wrapper closing') do |wrapper_close|
|
143
|
+
env['wrapper_close'] = wrapper_close
|
116
144
|
end
|
117
145
|
|
118
|
-
option_parser.on('-r',
|
146
|
+
option_parser.on('-r',
|
147
|
+
'--routes',
|
148
|
+
"Annotate routes.rb with the output of 'rake routes'") do
|
119
149
|
env['routes'] = 'true'
|
120
150
|
end
|
121
151
|
|
122
|
-
option_parser.on('--models',
|
152
|
+
option_parser.on('--models',
|
153
|
+
"Annotate ActiveRecord models") do
|
123
154
|
env['models'] = 'true'
|
124
155
|
end
|
125
156
|
|
126
|
-
option_parser.on('-a',
|
157
|
+
option_parser.on('-a',
|
158
|
+
'--active-admin',
|
159
|
+
'Annotate active_admin models') do
|
127
160
|
env['active_admin'] = 'true'
|
128
161
|
end
|
129
162
|
|
130
|
-
option_parser.on('-v',
|
163
|
+
option_parser.on('-v',
|
164
|
+
'--version',
|
165
|
+
'Show the current version of this gem') do
|
131
166
|
puts "annotate v#{Annotate.version}"
|
132
167
|
@options[:exit] = true
|
133
168
|
end
|
134
169
|
|
135
|
-
option_parser.on('-m',
|
170
|
+
option_parser.on('-m',
|
171
|
+
'--show-migration',
|
172
|
+
'Include the migration version number in the annotation') do
|
136
173
|
env['include_version'] = 'yes'
|
137
174
|
end
|
138
175
|
|
139
|
-
option_parser.on('-k',
|
176
|
+
option_parser.on('-k',
|
177
|
+
'--show-foreign-keys',
|
140
178
|
"List the table's foreign key constraints in the annotation") do
|
141
179
|
env['show_foreign_keys'] = 'yes'
|
142
180
|
end
|
143
181
|
|
144
182
|
option_parser.on('--ck',
|
145
|
-
'--complete-foreign-keys',
|
183
|
+
'--complete-foreign-keys',
|
184
|
+
'Complete foreign key names in the annotation') do
|
146
185
|
env['show_foreign_keys'] = 'yes'
|
147
186
|
env['show_complete_foreign_keys'] = 'yes'
|
148
187
|
end
|
149
188
|
|
150
|
-
option_parser.on('-i',
|
189
|
+
option_parser.on('-i',
|
190
|
+
'--show-indexes',
|
151
191
|
"List the table's database indexes in the annotation") do
|
152
192
|
env['show_indexes'] = 'yes'
|
153
193
|
end
|
154
194
|
|
155
|
-
option_parser.on('-s',
|
195
|
+
option_parser.on('-s',
|
196
|
+
'--simple-indexes',
|
156
197
|
"Concat the column's related indexes in the annotation") do
|
157
198
|
env['simple_indexes'] = 'yes'
|
158
199
|
end
|
@@ -168,84 +209,95 @@ module Annotate
|
|
168
209
|
end
|
169
210
|
|
170
211
|
option_parser.on('--ignore-model-subdirects',
|
171
|
-
"Ignore subdirectories of the models directory") do
|
212
|
+
"Ignore subdirectories of the models directory") do
|
172
213
|
env['ignore_model_sub_dir'] = 'yes'
|
173
214
|
end
|
174
215
|
|
175
216
|
option_parser.on('--sort',
|
176
|
-
"Sort columns alphabetically, rather than in creation order") do
|
217
|
+
"Sort columns alphabetically, rather than in creation order") do
|
177
218
|
env['sort'] = 'yes'
|
178
219
|
end
|
179
220
|
|
180
221
|
option_parser.on('--classified-sort',
|
181
|
-
"Sort columns alphabetically, but first goes id, then the rest columns, then the timestamp columns and then the association columns") do
|
222
|
+
"Sort columns alphabetically, but first goes id, then the rest columns, then the timestamp columns and then the association columns") do
|
182
223
|
env['classified_sort'] = 'yes'
|
183
224
|
end
|
184
225
|
|
185
|
-
option_parser.on('-R',
|
226
|
+
option_parser.on('-R',
|
227
|
+
'--require path',
|
186
228
|
"Additional file to require before loading models, may be used multiple times") do |path|
|
187
|
-
env['require'] = if
|
188
|
-
env['require']
|
229
|
+
env['require'] = if env['require'].present?
|
230
|
+
"#{env['require']},#{path}"
|
189
231
|
else
|
190
232
|
path
|
191
233
|
end
|
192
234
|
end
|
193
235
|
|
194
|
-
option_parser.on('-e',
|
236
|
+
option_parser.on('-e',
|
237
|
+
'--exclude [tests,fixtures,factories,serializers]',
|
238
|
+
Array,
|
239
|
+
"Do not annotate fixtures, test files, factories, and/or serializers") do |exclusions|
|
195
240
|
exclusions ||= EXCLUSION_LIST
|
196
241
|
exclusions.each { |exclusion| env["exclude_#{exclusion}"] = 'yes' }
|
197
242
|
end
|
198
243
|
|
199
|
-
option_parser.on('-f',
|
200
|
-
|
244
|
+
option_parser.on('-f',
|
245
|
+
'--format [bare|rdoc|yard|markdown]',
|
246
|
+
FORMAT_TYPES,
|
247
|
+
'Render Schema Infomation as plain/RDoc/Yard/Markdown') do |format_type|
|
248
|
+
env["format_#{format_type}"] = 'yes'
|
201
249
|
end
|
202
250
|
|
203
|
-
option_parser.on('--force',
|
251
|
+
option_parser.on('--force',
|
252
|
+
'Force new annotations even if there are no changes.') do
|
204
253
|
env['force'] = 'yes'
|
205
254
|
end
|
206
255
|
|
207
|
-
option_parser.on('--frozen',
|
256
|
+
option_parser.on('--frozen',
|
257
|
+
'Do not allow to change annotations. Exits non-zero if there are going to be changes to files.') do
|
208
258
|
env['frozen'] = 'yes'
|
209
259
|
end
|
210
260
|
|
211
|
-
option_parser.on('--timestamp',
|
261
|
+
option_parser.on('--timestamp',
|
262
|
+
'Include timestamp in (routes) annotation') do
|
212
263
|
env['timestamp'] = 'true'
|
213
264
|
end
|
214
265
|
|
215
|
-
option_parser.on('--trace',
|
266
|
+
option_parser.on('--trace',
|
267
|
+
'If unable to annotate a file, print the full stack trace, not just the exception message.') do
|
216
268
|
env['trace'] = 'yes'
|
217
269
|
end
|
218
270
|
|
219
|
-
option_parser.on('-I',
|
271
|
+
option_parser.on('-I',
|
272
|
+
'--ignore-columns REGEX',
|
273
|
+
"don't annotate columns that match a given REGEX (i.e., `annotate -I '^(id|updated_at|created_at)'`") do |regex|
|
220
274
|
env['ignore_columns'] = regex
|
221
275
|
end
|
222
276
|
|
223
|
-
option_parser.on('--ignore-routes REGEX',
|
277
|
+
option_parser.on('--ignore-routes REGEX',
|
278
|
+
"don't annotate routes that match a given REGEX (i.e., `annotate -I '(mobile|resque|pghero)'`") do |regex|
|
224
279
|
env['ignore_routes'] = regex
|
225
280
|
end
|
226
281
|
|
227
|
-
option_parser.on('--hide-limit-column-types VALUES',
|
282
|
+
option_parser.on('--hide-limit-column-types VALUES',
|
283
|
+
"don't show limit for given column types, separated by commas (i.e., `integer,boolean,text`)") do |values|
|
228
284
|
env['hide_limit_column_types'] = values.to_s
|
229
285
|
end
|
230
286
|
|
231
|
-
option_parser.on('--hide-default-column-types VALUES',
|
287
|
+
option_parser.on('--hide-default-column-types VALUES',
|
288
|
+
"don't show default for given column types, separated by commas (i.e., `json,jsonb,hstore`)") do |values|
|
232
289
|
env['hide_default_column_types'] = values.to_s
|
233
290
|
end
|
234
291
|
|
235
|
-
option_parser.on('--ignore-unknown-models',
|
292
|
+
option_parser.on('--ignore-unknown-models',
|
293
|
+
"don't display warnings for bad model files") do
|
236
294
|
env['ignore_unknown_models'] = 'true'
|
237
295
|
end
|
238
296
|
|
239
|
-
option_parser.on('--with-comment',
|
297
|
+
option_parser.on('--with-comment',
|
298
|
+
"include database comments in model annotations") do
|
240
299
|
env['with_comment'] = 'true'
|
241
300
|
end
|
242
301
|
end
|
243
|
-
|
244
|
-
def default_options
|
245
|
-
{
|
246
|
-
target_action: :do_annotations,
|
247
|
-
exit: false
|
248
|
-
}
|
249
|
-
end
|
250
302
|
end
|
251
303
|
end
|