annotate 3.0.3 → 3.1.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/{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
|