annotate 3.0.3 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- return unless routes_exists?
30
- existing_text = File.read(routes_file)
31
-
32
- if rewrite_contents_with_header(existing_text, header(options), options)
33
- puts "#{routes_file} annotated."
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
- 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}."
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 routes_exists?
50
- routes_exists = File.exists?(routes_file)
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 += ["# #{options[:wrapper_open]}"] if options[:wrapper_open]
85
+ out << comment(options[:wrapper_open]) if options[:wrapper_open]
90
86
 
91
- out += ["# #{options[:format_markdown] ? PREFIX_MD : PREFIX}" + (options[:timestamp] ? " (Updated #{Time.now.strftime('%Y-%m-%d %H:%M')})" : '')]
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 += ["# #{content(HEADER_ROW, maxs, options)}"]
101
- out += ["# #{content(['-' * max, '-' * max, '-' * max, '-' * max], maxs, options)}"]
96
+ out << comment(content(HEADER_ROW, maxs, options))
97
+ out << comment(content(['-' * max, '-' * max, '-' * max, '-' * max], maxs, options))
102
98
  else
103
- out += ["# #{content(routes_map[0], maxs, options)}"]
99
+ out << comment(content(routes_map[0], maxs, options))
104
100
  end
105
101
 
106
- out += routes_map[1..-1].map { |line| "# #{content(options[:format_markdown] ? line.split(' ') : line, maxs, options)}" }
107
- out += ["# #{options[:wrapper_close]}"] if options[:wrapper_close]
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
- # where_header_found => This will either be :before, :after, or
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
- header_found_at = 0
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
- header_found_at = line_number + 1 # index start's at 0
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
- where_header_found(real_content, header_found_at)
142
+ real_content_and_header_position(real_content, header_position)
138
143
  end
139
144
 
140
- def strip_on_removal(content, where_header_found)
141
- if where_header_found == :before
145
+ def strip_on_removal(content, header_position)
146
+ if header_position == :before
142
147
  content.shift while content.first == ''
143
- elsif where_header_found == :after
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
- # @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")
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, where_header_found, options = {})
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 where_header_found == :before && content.first == ''
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.map do |row|
214
- if row =~ magic_comment_matcher
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 where_header_found(real_content, header_found_at)
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 header_found_at == 1
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 header_found_at >= real_content.count
246
+ return real_content, :after if header_position >= real_content.count
242
247
 
243
248
  # and the default
244
- return real_content, header_found_at
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
@@ -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
@@ -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 = default_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', Array, "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|
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', '--delete', 'Remove annotations from all model files or the routes.rb file') do
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', '--position [before|top|after|bottom]', positions,
61
- 'Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/route/serializer file(s)') do |p|
62
- env['position'] = p
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] = p unless has_set_position[key]
75
+ env[key] = position unless has_set_position[key]
66
76
  end
67
77
  end
68
78
 
69
- option_parser.on('--pc', '--position-in-class [before|top|after|bottom]', positions,
70
- 'Place the annotations at the top (before) or the bottom (after) of the model file') do |p|
71
- env['position_in_class'] = p
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', '--position-in-factory [before|top|after|bottom]', positions,
76
- 'Place the annotations at the top (before) or the bottom (after) of any factory files') do |p|
77
- env['position_in_factory'] = p
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', '--position-in-fixture [before|top|after|bottom]', positions,
82
- 'Place the annotations at the top (before) or the bottom (after) of any fixture files') do |p|
83
- env['position_in_fixture'] = p
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', '--position-in-test [before|top|after|bottom]', positions,
88
- 'Place the annotations at the top (before) or the bottom (after) of any test files') do |p|
89
- env['position_in_test'] = p
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', '--position-in-routes [before|top|after|bottom]', positions,
94
- 'Place the annotations at the top (before) or the bottom (after) of the routes.rb file') do |p|
95
- env['position_in_routes'] = p
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', '--position-in-serializer [before|top|after|bottom]', positions,
100
- 'Place the annotations at the top (before) or the bottom (after) of the serializer files') do |p|
101
- env['position_in_serializer'] = p
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', '--wrapper STR', 'Wrap annotation with the text passed as parameter.',
106
- 'If --w option is used, the same text will be used as opening and closing') do |p|
107
- env['wrapper'] = p
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', '--wrapper-open STR', 'Annotation wrapper opening.') do |p|
111
- env['wrapper_open'] = p
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', '--wrapper-close STR', 'Annotation wrapper closing') do |p|
115
- env['wrapper_close'] = p
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', '--routes', "Annotate routes.rb with the output of 'rake routes'") do
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', "Annotate ActiveRecord models") do
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', '--active-admin', 'Annotate active_admin models') do
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', '--version', 'Show the current version of this gem') do
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', '--show-migration', 'Include the migration version number in the annotation') do
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', '--show-foreign-keys',
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', 'Complete foreign key names in the annotation') do
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', '--show-indexes',
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', '--simple-indexes',
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 |_dir|
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 |_dir|
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 |_dir|
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', '--require path',
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 !env['require'].blank?
188
- env['require'] + ",#{path}"
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', '--exclude [tests,fixtures,factories,serializers]', Array, "Do not annotate fixtures, test files, factories, and/or serializers") do |exclusions|
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', '--format [bare|rdoc|markdown]', FORMAT_TYPES, 'Render Schema Infomation as plain/RDoc/Markdown') do |fmt|
200
- env["format_#{fmt}"] = 'yes'
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', 'Force new annotations even if there are no changes.') do |_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', 'Do not allow to change annotations. Exits non-zero if there are going to be changes to files.') do
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', 'Include timestamp in (routes) annotation') do
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', 'If unable to annotate a file, print the full stack trace, not just the exception message.') do |_value|
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', '--ignore-columns REGEX', "don't annotate columns that match a given REGEX (i.e., `annotate -I '^(id|updated_at|created_at)'`") do |regex|
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', "don't annotate routes that match a given REGEX (i.e., `annotate -I '(mobile|resque|pghero)'`") do |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', "don't show limit for given column types, separated by commas (i.e., `integer,boolean,text`)") do |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', "don't show default for given column types, separated by commas (i.e., `json,jsonb,hstore`)") do |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', "don't display warnings for bad model files") do |_values|
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', "include database comments in model annotations") do |_values|
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