annotated 0.0.1

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.
@@ -0,0 +1,113 @@
1
+ require_relative "helpers"
2
+
3
+ module AnnotateRoutes
4
+ class HeaderGenerator
5
+ PREFIX = "== Route Map".freeze
6
+ PREFIX_MD = "## Route Map".freeze
7
+ HEADER_ROW = ["Prefix", "Verb", "URI Pattern", "Controller#Action"].freeze
8
+
9
+ class << self
10
+ def generate(options = {})
11
+ new(options, routes_map(options)).generate
12
+ end
13
+
14
+ private :new
15
+
16
+ private
17
+
18
+ def routes_map(options)
19
+ result = `rake routes`.chomp("\n").split("\n", -1)
20
+
21
+ # In old versions of Rake, the first line of output was the cwd. Not so
22
+ # much in newer ones. We ditch that line if it exists, and if not, we
23
+ # keep the line around.
24
+ result.shift if %r{^\(in /}.match?(result.first)
25
+
26
+ ignore_routes = options[:ignore_routes]
27
+ regexp_for_ignoring_routes = ignore_routes ? /#{ignore_routes}/ : nil
28
+
29
+ # Skip routes which match given regex
30
+ # Note: it matches the complete line (route_name, path, controller/action)
31
+ if regexp_for_ignoring_routes
32
+ result.reject { |line| line =~ regexp_for_ignoring_routes }
33
+ else
34
+ result
35
+ end
36
+ end
37
+ end
38
+
39
+ def initialize(options, routes_map)
40
+ @options = options
41
+ @routes_map = routes_map
42
+ end
43
+
44
+ def generate
45
+ magic_comments_map, contents_without_magic_comments = Helpers.extract_magic_comments_from_array(routes_map)
46
+
47
+ out = []
48
+
49
+ magic_comments_map.each do |magic_comment|
50
+ out << magic_comment
51
+ end
52
+ out << "" if magic_comments_map.any?
53
+
54
+ out << comment(options[:wrapper_open]) if options[:wrapper_open]
55
+
56
+ out << comment(markdown? ? PREFIX_MD : PREFIX) + timestamp_if_required
57
+ out << comment
58
+ return out if contents_without_magic_comments.size.zero?
59
+
60
+ maxs = [HEADER_ROW.map(&:size)] + contents_without_magic_comments[1..-1].map { |line| line.split.map(&:size) }
61
+
62
+ if markdown?
63
+ max = maxs.map(&:max).compact.max
64
+
65
+ out << comment(content(HEADER_ROW, maxs))
66
+ out << comment(content(["-" * max, "-" * max, "-" * max, "-" * max], maxs))
67
+ else
68
+ out << comment(content(contents_without_magic_comments[0], maxs))
69
+ end
70
+
71
+ out += contents_without_magic_comments[1..-1].map { |line| comment(content(markdown? ? line.split(" ") : line, maxs)) }
72
+ out << comment(options[:wrapper_close]) if options[:wrapper_close]
73
+
74
+ out
75
+ end
76
+
77
+ private
78
+
79
+ attr_reader :options, :routes_map
80
+
81
+ def comment(row = "")
82
+ if row == ""
83
+ "#"
84
+ else
85
+ "# #{row}"
86
+ end
87
+ end
88
+
89
+ def content(line, maxs)
90
+ return line.rstrip unless markdown?
91
+
92
+ line.each_with_index.map { |elem, index| format_line_element(elem, maxs, index) }.join(" | ")
93
+ end
94
+
95
+ def format_line_element(elem, maxs, index)
96
+ min_length = maxs.map { |arr| arr[index] }.max || 0
97
+ format("%-#{min_length}.#{min_length}s", elem.tr("|", "-"))
98
+ end
99
+
100
+ def markdown?
101
+ options[:format_markdown]
102
+ end
103
+
104
+ def timestamp_if_required(time = Time.now)
105
+ if options[:timestamp]
106
+ time_formatted = time.strftime("%Y-%m-%d %H:%M")
107
+ " (Updated #{time_formatted})"
108
+ else
109
+ ""
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,69 @@
1
+ module AnnotateRoutes
2
+ module Helpers
3
+ MAGIC_COMMENT_MATCHER = /(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/
4
+
5
+ class << self
6
+ # TODO: write the method doc using ruby rdoc formats
7
+ # This method returns an array of 'real_content' and 'header_position'.
8
+ # 'header_position' will either be :before, :after, or
9
+ # a number. If the number is > 0, the
10
+ # annotation was found somewhere in the
11
+ # middle of the file. If the number is
12
+ # zero, no annotation was found.
13
+ def strip_annotations(content)
14
+ real_content = []
15
+ mode = :content
16
+ header_position = 0
17
+
18
+ content.split("\n", -1).each_with_index do |line, line_number|
19
+ if mode == :header && line !~ /\s*#/
20
+ mode = :content
21
+ real_content << line unless line.blank?
22
+ elsif mode == :content
23
+ if /^\s*#\s*== Route.*$/.match?(line)
24
+ header_position = line_number + 1 # index start's at 0
25
+ mode = :header
26
+ else
27
+ real_content << line
28
+ end
29
+ end
30
+ end
31
+
32
+ real_content_and_header_position(real_content, header_position)
33
+ end
34
+
35
+ # @param [Array<String>] content
36
+ # @return [Array<String>] all found magic comments
37
+ # @return [Array<String>] content without magic comments
38
+ def extract_magic_comments_from_array(content_array)
39
+ magic_comments = []
40
+ new_content = []
41
+
42
+ content_array.each do |row|
43
+ if MAGIC_COMMENT_MATCHER.match?(row)
44
+ magic_comments << row.strip
45
+ else
46
+ new_content << row
47
+ end
48
+ end
49
+
50
+ [magic_comments, new_content]
51
+ end
52
+
53
+ private
54
+
55
+ def real_content_and_header_position(real_content, header_position)
56
+ # By default assume the annotation was found in the middle of the file
57
+
58
+ # ... unless we have evidence it was at the beginning ...
59
+ return real_content, :before if header_position == 1
60
+
61
+ # ... or that it was at the end.
62
+ return real_content, :after if header_position >= real_content.count
63
+
64
+ # and the default
65
+ [real_content, header_position]
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,119 @@
1
+ # == Annotate Routes
2
+ #
3
+ # Based on:
4
+ #
5
+ #
6
+ #
7
+ # Prepends the output of "rake routes" to the top of your routes.rb file.
8
+ # Yes, it's simple but I'm thick and often need a reminder of what my routes
9
+ # mean.
10
+ #
11
+ # Running this task will replace any existing route comment generated by the
12
+ # task. Best to back up your routes file before running:
13
+ #
14
+ # Author:
15
+ # Gavin Montague
16
+ # gavin@leftbrained.co.uk
17
+ #
18
+ # Released under the same license as Ruby. No Support. No Warranty.
19
+ #
20
+
21
+ require_relative "annotate_routes/helpers"
22
+ require_relative "annotate_routes/header_generator"
23
+
24
+ module AnnotateRoutes
25
+ class << self
26
+ def do_annotations(options = {})
27
+ if routes_file_exist?
28
+ existing_text = File.read(routes_file)
29
+ content, header_position = Helpers.strip_annotations(existing_text)
30
+ new_content = annotate_routes(HeaderGenerator.generate(options), content, header_position, options)
31
+ new_text = new_content.join("\n")
32
+ if rewrite_contents(existing_text, new_text, options[:frozen])
33
+ puts "#{routes_file} was annotated."
34
+ else
35
+ puts "#{routes_file} was not changed."
36
+ end
37
+ else
38
+ puts "#{routes_file} could not be found."
39
+ end
40
+ end
41
+
42
+ def remove_annotations(options = {})
43
+ if routes_file_exist?
44
+ existing_text = File.read(routes_file)
45
+ content, header_position = Helpers.strip_annotations(existing_text)
46
+ new_content = strip_on_removal(content, header_position)
47
+ new_text = new_content.join("\n")
48
+ if rewrite_contents(existing_text, new_text, options[:frozen])
49
+ puts "Annotations were removed from #{routes_file}."
50
+ else
51
+ puts "#{routes_file} was not changed (Annotation did not exist)."
52
+ end
53
+ else
54
+ puts "#{routes_file} could not be found."
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def routes_file_exist?
61
+ File.exist?(routes_file)
62
+ end
63
+
64
+ def routes_file
65
+ @routes_rb ||= File.join("config", "routes.rb")
66
+ end
67
+
68
+ def strip_on_removal(content, header_position)
69
+ if header_position == :before
70
+ content.shift while content.first == ""
71
+ elsif header_position == :after
72
+ content.pop while content.last == ""
73
+ end
74
+
75
+ # Make sure we end on a trailing newline.
76
+ content << "" unless content.last == ""
77
+
78
+ # TODO: If the user buried it in the middle, we should probably see about
79
+ # TODO: preserving a single line of space between the content above and
80
+ # TODO: below...
81
+ content
82
+ end
83
+
84
+ def rewrite_contents(existing_text, new_text, frozen)
85
+ content_changed = (existing_text != new_text)
86
+
87
+ if content_changed
88
+ abort "annotate error. #{routes_file} needs to be updated, but annotate was run with `--frozen`." if frozen
89
+ File.open(routes_file, "wb") { |f| f.puts(new_text) }
90
+ end
91
+
92
+ content_changed
93
+ end
94
+
95
+ def annotate_routes(header, content, header_position, options = {})
96
+ magic_comments_map, content = Helpers.extract_magic_comments_from_array(content)
97
+ if %w[before top].include?(options[:position_in_routes])
98
+ header <<= "" if content.first != ""
99
+ magic_comments_map << "" if magic_comments_map.any?
100
+ new_content = magic_comments_map + header + content
101
+ else
102
+ # Ensure we have adequate trailing newlines at the end of the file to
103
+ # ensure a blank line separating the content from the annotation.
104
+ content << "" unless content.last == ""
105
+
106
+ # We're moving something from the top of the file to the bottom, so ditch
107
+ # the spacer we put in the first time around.
108
+ content.shift if header_position == :before && content.first == ""
109
+
110
+ new_content = magic_comments_map + content + header
111
+ end
112
+
113
+ # Make sure we end on a trailing newline.
114
+ new_content << "" unless new_content.last == ""
115
+
116
+ new_content
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,39 @@
1
+ module Annotated
2
+ module Constants
3
+ TRUE_RE = /^(true|t|yes|y|1)$/i
4
+
5
+ ##
6
+ # The set of available options to customize the behavior of Annotated.
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, :with_comment_column,
22
+ :show_check_constraints
23
+ ].freeze
24
+
25
+ OTHER_OPTIONS = [
26
+ :additional_file_patterns, :ignore_columns, :skip_on_db_migrate, :wrapper_open, :wrapper_close,
27
+ :wrapper, :routes, :models, :hide_limit_column_types, :hide_default_column_types,
28
+ :ignore_routes, :active_admin
29
+ ].freeze
30
+
31
+ PATH_OPTIONS = [
32
+ :require, :model_dir, :root_dir
33
+ ].freeze
34
+
35
+ ALL_ANNOTATE_OPTIONS = [
36
+ POSITION_OPTIONS, FLAG_OPTIONS, OTHER_OPTIONS, PATH_OPTIONS
37
+ ].freeze
38
+ end
39
+ end
@@ -0,0 +1,30 @@
1
+ module Annotated
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
@@ -0,0 +1,314 @@
1
+ require "optparse"
2
+
3
+ module Annotated
4
+ # Class for handling command line arguments
5
+ class Parser # rubocop:disable Metrics/ClassLength
6
+ def self.parse(args, env = {})
7
+ new(args, env).parse
8
+ end
9
+
10
+ attr_reader :args, :options, :env
11
+
12
+ DEFAULT_OPTIONS = {
13
+ target_action: :do_annotations,
14
+ exit: false
15
+ }.freeze
16
+
17
+ ANNOTATION_POSITIONS = %w[before top after bottom].freeze
18
+ FILE_TYPE_POSITIONS = %w[position_in_class position_in_factory position_in_fixture position_in_test position_in_routes position_in_serializer].freeze
19
+ EXCLUSION_LIST = %w[tests fixtures factories serializers].freeze
20
+ FORMAT_TYPES = %w[bare rdoc yard markdown].freeze
21
+
22
+ def initialize(args, env)
23
+ @args = args
24
+ @options = DEFAULT_OPTIONS.dup
25
+ @env = env
26
+ end
27
+
28
+ def parse
29
+ # To split up because right now this method parses and commits
30
+ parser.parse!(args)
31
+
32
+ commit
33
+
34
+ options
35
+ end
36
+
37
+ private
38
+
39
+ def parser
40
+ OptionParser.new do |option_parser|
41
+ add_options_to_parser(option_parser)
42
+ end
43
+ end
44
+
45
+ def commit
46
+ env.each_pair do |key, value|
47
+ ENV[key] = value
48
+ end
49
+ end
50
+
51
+ def add_options_to_parser(option_parser) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
52
+ has_set_position = {}
53
+
54
+ option_parser.banner = "Usage: annotate [options] [model_file]*"
55
+
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|
59
+ ENV["additional_file_patterns"] = additional_file_patterns
60
+ end
61
+
62
+ option_parser.on("-d",
63
+ "--delete",
64
+ "Remove annotations from all model files or the routes.rb file") do
65
+ @options[:target_action] = :remove_annotations
66
+ end
67
+
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
73
+
74
+ FILE_TYPE_POSITIONS.each do |key|
75
+ env[key] = position unless has_set_position[key]
76
+ end
77
+ end
78
+
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
84
+ has_set_position["position_in_class"] = true
85
+ end
86
+
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
92
+ has_set_position["position_in_factory"] = true
93
+ end
94
+
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
100
+ has_set_position["position_in_fixture"] = true
101
+ end
102
+
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
108
+ has_set_position["position_in_test"] = true
109
+ end
110
+
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
116
+ has_set_position["position_in_routes"] = true
117
+ end
118
+
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
124
+ has_set_position["position_in_serializer"] = true
125
+ end
126
+
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
132
+ end
133
+
134
+ option_parser.on("--wo",
135
+ "--wrapper-open STR",
136
+ "Annotation wrapper opening.") do |wrapper_open|
137
+ env["wrapper_open"] = wrapper_open
138
+ end
139
+
140
+ option_parser.on("--wc",
141
+ "--wrapper-close STR",
142
+ "Annotation wrapper closing") do |wrapper_close|
143
+ env["wrapper_close"] = wrapper_close
144
+ end
145
+
146
+ option_parser.on("-r",
147
+ "--routes",
148
+ "Annotate routes.rb with the output of 'rake routes'") do
149
+ env["routes"] = "true"
150
+ end
151
+
152
+ option_parser.on("--models",
153
+ "Annotate ActiveRecord models") do
154
+ env["models"] = "true"
155
+ end
156
+
157
+ option_parser.on("-a",
158
+ "--active-admin",
159
+ "Annotate active_admin models") do
160
+ env["active_admin"] = "true"
161
+ end
162
+
163
+ option_parser.on("-v",
164
+ "--version",
165
+ "Show the current version of this gem") do
166
+ puts "annotate v#{Annotated.version}"
167
+ @options[:exit] = true
168
+ end
169
+
170
+ option_parser.on("-m",
171
+ "--show-migration",
172
+ "Include the migration version number in the annotation") do
173
+ env["include_version"] = "yes"
174
+ end
175
+
176
+ option_parser.on("-c",
177
+ "--show-check-constraints",
178
+ "List the table's check constraints in the annotation") do
179
+ env["show_check_constraints"] = "yes"
180
+ end
181
+
182
+ option_parser.on("-k",
183
+ "--show-foreign-keys",
184
+ "List the table's foreign key constraints in the annotation") do
185
+ env["show_foreign_keys"] = "yes"
186
+ end
187
+
188
+ option_parser.on("--ck",
189
+ "--complete-foreign-keys",
190
+ "Complete foreign key names in the annotation") do
191
+ env["show_foreign_keys"] = "yes"
192
+ env["show_complete_foreign_keys"] = "yes"
193
+ end
194
+
195
+ option_parser.on("-i",
196
+ "--show-indexes",
197
+ "List the table's database indexes in the annotation") do
198
+ env["show_indexes"] = "yes"
199
+ end
200
+
201
+ option_parser.on("-s",
202
+ "--simple-indexes",
203
+ "Concat the column's related indexes in the annotation") do
204
+ env["simple_indexes"] = "yes"
205
+ end
206
+
207
+ option_parser.on("--model-dir dir",
208
+ "Annotate model files stored in dir rather than app/models, separate multiple dirs with commas") do |dir|
209
+ env["model_dir"] = dir
210
+ end
211
+
212
+ option_parser.on("--root-dir dir",
213
+ "Annotate files stored within root dir projects, separate multiple dirs with commas") do |dir|
214
+ env["root_dir"] = dir
215
+ end
216
+
217
+ option_parser.on("--ignore-model-subdirects",
218
+ "Ignore subdirectories of the models directory") do
219
+ env["ignore_model_sub_dir"] = "yes"
220
+ end
221
+
222
+ option_parser.on("--sort",
223
+ "Sort columns alphabetically, rather than in creation order") do
224
+ env["sort"] = "yes"
225
+ end
226
+
227
+ option_parser.on("--classified-sort",
228
+ "Sort columns alphabetically, but first goes id, then the rest columns, then the timestamp columns and then the association columns") do
229
+ env["classified_sort"] = "yes"
230
+ end
231
+
232
+ option_parser.on("-R",
233
+ "--require path",
234
+ "Additional file to require before loading models, may be used multiple times") do |path|
235
+ env["require"] = if env["require"].present?
236
+ "#{env["require"]},#{path}"
237
+ else
238
+ path
239
+ end
240
+ end
241
+
242
+ option_parser.on("-e",
243
+ "--exclude [tests,fixtures,factories,serializers]",
244
+ Array,
245
+ "Do not annotate fixtures, test files, factories, and/or serializers") do |exclusions|
246
+ exclusions ||= EXCLUSION_LIST
247
+ exclusions.each { |exclusion| env["exclude_#{exclusion}"] = "yes" }
248
+ end
249
+
250
+ option_parser.on("-f",
251
+ "--format [bare|rdoc|yard|markdown]",
252
+ FORMAT_TYPES,
253
+ "Render Schema Infomation as plain/RDoc/Yard/Markdown") do |format_type|
254
+ env["format_#{format_type}"] = "yes"
255
+ end
256
+
257
+ option_parser.on("--force",
258
+ "Force new annotations even if there are no changes.") do
259
+ env["force"] = "yes"
260
+ end
261
+
262
+ option_parser.on("--frozen",
263
+ "Do not allow to change annotations. Exits non-zero if there are going to be changes to files.") do
264
+ env["frozen"] = "yes"
265
+ end
266
+
267
+ option_parser.on("--timestamp",
268
+ "Include timestamp in (routes) annotation") do
269
+ env["timestamp"] = "true"
270
+ end
271
+
272
+ option_parser.on("--trace",
273
+ "If unable to annotate a file, print the full stack trace, not just the exception message.") do
274
+ env["trace"] = "yes"
275
+ end
276
+
277
+ option_parser.on("-I",
278
+ "--ignore-columns REGEX",
279
+ "don't annotate columns that match a given REGEX (i.e., `annotate -I '^(id|updated_at|created_at)'`") do |regex|
280
+ env["ignore_columns"] = regex
281
+ end
282
+
283
+ option_parser.on("--ignore-routes REGEX",
284
+ "don't annotate routes that match a given REGEX (i.e., `annotate -I '(mobile|resque|pghero)'`") do |regex|
285
+ env["ignore_routes"] = regex
286
+ end
287
+
288
+ option_parser.on("--hide-limit-column-types VALUES",
289
+ "don't show limit for given column types, separated by commas (i.e., `integer,boolean,text`)") do |values|
290
+ env["hide_limit_column_types"] = values.to_s
291
+ end
292
+
293
+ option_parser.on("--hide-default-column-types VALUES",
294
+ "don't show default for given column types, separated by commas (i.e., `json,jsonb,hstore`)") do |values|
295
+ env["hide_default_column_types"] = values.to_s
296
+ end
297
+
298
+ option_parser.on("--ignore-unknown-models",
299
+ "don't display warnings for bad model files") do
300
+ env["ignore_unknown_models"] = "true"
301
+ end
302
+
303
+ option_parser.on("--with-comment",
304
+ "include database comments in model annotations") do
305
+ env["with_comment"] = "true"
306
+ end
307
+
308
+ option_parser.on("--with-comment-column",
309
+ "include database comments in model annotations, as its own column, after all others") do
310
+ env["with_comment_column"] = "true"
311
+ end
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,6 @@
1
+ require "rubygems"
2
+ require "rake"
3
+
4
+ # Make tasks visible for Rails also when used as gem.
5
+ Dir[File.join(File.dirname(__FILE__), "..", "tasks", "**/*.rake")].each { |rake| load rake }
6
+ Dir[File.join(File.dirname(__FILE__), "..", "..", "tasks", "**/*.rake")].each { |rake| load rake }
@@ -0,0 +1,5 @@
1
+ module Annotated
2
+ def self.version
3
+ "0.0.1"
4
+ end
5
+ end