annotate 2.6.5 → 2.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OWJjZmE2N2E0NDFhOGU5MmFjZGJlZjZmNTg4YjI4MWZmYjhlZDUxNw==
4
+ MzQ3ZjQ5NmY5Njc0ZjZiYjIyODVjODY3NDdlZjhlODYwMDAwZjMxYw==
5
5
  data.tar.gz: !binary |-
6
- ZDViMWZlYjVlZWMxN2IzMjM2NWFlYmJmYTc2NGEyY2FlYmIyOWYxNQ==
6
+ ZDNlMGM0YWFmMWMxZjFjZjE1N2U4MTc3NTVhNjMwMDE3MTlhMzI1ZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NDBlMTlmZTczYjk0YjUxYzg1ZTljOWE3YmE1MjYxOGNhZjhmOGNlZWZhMDlh
10
- N2EzNDRjMjcwZWRiYzk4ZmFlM2U5OGQ1ZDJlNTQ2YmM0ZTQwZDg5NzdmMDMx
11
- NTU4NjM2OWY1ZmI3OTk3MTc2MTVkMTE4ZDNiMTJkZTk5NzA5M2I=
9
+ ZGRhYTFjOGUwOWVlZThhNGY1MzY4OWMwZGIwYTgxMjE4ZmZmZjE0ZmFjYjE1
10
+ ZGJkOGJmZmNjODRkZTRlNTc0MDg1Nzk4Y2Q5Y2QwZTc3MTBlNzJhZGU0NDIx
11
+ ZjM0MTJlOWI2MWJhMTY3YWY4Nzc5YTkyZWEzYTlmM2U1N2E0NjE=
12
12
  data.tar.gz: !binary |-
13
- YzIzY2ZmNDA1YWEzYTVlZDY0ZDg4MDg3YThhYjBiYTQ1MjQ4ZTQwYzY2Mjc1
14
- YmRjNjMxMTUwMDQ2OTIzZmFmNWI1ODM2Mzk5MjYwYmY2OWIzZTk0YmM5ODll
15
- MDlmNTEwYjk2M2E1ZGZjOTUzZDE2ODJhYTQ1N2JlYzBjZTU4M2I=
13
+ YzEzMDgwNmUyMzk5ODA1ZjRlMTZkMDY3MzQ0ZmYwM2U1YTliMzcxZjU3ZGUw
14
+ NzU1NjMwNDMxNGI0OTZiMTA3NjVkNzZjNGJjMDQ2YmZhNGZlYWIzZjdmNWMx
15
+ MzE4NmE1ZGViZmM5MTJmOTNkYmFjYTRiMTAxMjRiMDE4MjFkZmM=
@@ -1,3 +1,10 @@
1
+ == 2.6.6
2
+ * Makes it possible to wrap annotations, #225
3
+ * Fix single model generation, #214
4
+ * Fix default value for Rails 4.2, #212
5
+ * Don't crash on inherited models in subdirectories, #232
6
+ * Process model_dir in rake task, #197
7
+
1
8
  == 2.6.4
2
9
  * Skip "models/concerns", #194
3
10
  * Fix #173 where annotate says "Nothing to annotate" in rails 4.2
@@ -51,7 +51,7 @@ Also, if you pass the -r option, it'll annotate routes.rb with the output of
51
51
 
52
52
  Into Gemfile from rubygems.org:
53
53
 
54
- gem 'annotate', ">=2.6.0"
54
+ gem 'annotate', '~> 2.6.5'
55
55
 
56
56
  Into Gemfile from Github:
57
57
 
@@ -86,13 +86,13 @@ To annotate just your models, tests, and factories:
86
86
 
87
87
  To annotate just your models:
88
88
 
89
- annotate --exclude tests,fixtures,factories
89
+ annotate --exclude tests,fixtures,factories,serializers
90
90
 
91
91
  To annotate routes.rb:
92
92
 
93
93
  annotate --routes
94
94
 
95
- To remove model/test/fixture/factory annotations:
95
+ To remove model/test/fixture/factory/serializer annotations:
96
96
 
97
97
  annotate --delete
98
98
 
@@ -137,11 +137,11 @@ executed whenever you run +rake db:migrate+ (but only in development mode).
137
137
  If you want to disable this behavior permanently, edit the +.rake+ file and
138
138
  change:
139
139
 
140
- 'skip_on_db_migrate' => "false",
140
+ 'skip_on_db_migrate' => 'false',
141
141
 
142
142
  To:
143
143
 
144
- 'skip_on_db_migrate' => "true",
144
+ 'skip_on_db_migrate' => 'true',
145
145
 
146
146
  If you want to run +rake db:migrate+ as a one-off without running annotate,
147
147
  you can do so with a simple environment variable, instead of editing the
@@ -154,33 +154,41 @@ you can do so with a simple environment variable, instead of editing the
154
154
 
155
155
  Usage: annotate [options] [model_file]*
156
156
  -d, --delete Remove annotations from all model files or the routes.rb file
157
- -p, --position [before|after] Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/routes file(s)
158
- --pc, --position-in-class [before|after]
157
+ -p, --position [before|top|after|bottom] Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/routes file(s)
158
+ --pc, --position-in-class [before|top|after|bottom]
159
159
  Place the annotations at the top (before) or the bottom (after) of the model file
160
- --pf, --position-in-factory [before|after]
160
+ --pf, --position-in-factory [before|top|after|bottom]
161
161
  Place the annotations at the top (before) or the bottom (after) of any factory files
162
- --px, --position-in-fixture [before|after]
162
+ --px, --position-in-fixture [before|top|after|bottom]
163
163
  Place the annotations at the top (before) or the bottom (after) of any fixture files
164
- --pt, --position-in-test [before|after]
164
+ --pt, --position-in-test [before|top|after|bottom]
165
165
  Place the annotations at the top (before) or the bottom (after) of any test files
166
- --pr, --position-in-routes [before|after]
166
+ --pr, --position-in-routes [before|top|after|bottom]
167
167
  Place the annotations at the top (before) or the bottom (after) of the routes.rb file
168
+ --ps, --position-in-serializer [before|top|after|bottom]
169
+ Place the annotations at the top (before) or the bottom (after) of the serializer files
170
+ --w, --wrapper STR Wrap annotation with the text passed as parameter.
171
+ If --w option is used, the same text will be used as opening and closing
172
+ --wo, --wrapper-open STR Annotation wrapper opening.
173
+ --wc, --wrapper-close STR Annotation wrapper closing
168
174
  -r, --routes Annotate routes.rb with the output of 'rake routes'
169
175
  -v, --version Show the current version of this gem
170
176
  -m, --show-migration Include the migration version number in the annotation
171
177
  -i, --show-indexes List the table's database indexes in the annotation
172
178
  -s, --simple-indexes Concat the column's related indexes in the annotation
173
- --model-dir dir Annotate model files stored in dir rather than app/models
179
+ --model-dir dir Annotate model files stored in dir rather than app/models, separate multiple dirs with comas
174
180
  --ignore-model-subdirects Ignore subdirectories of the models directory
175
181
  --sort Sort columns alphabetically, rather than in creation order
176
182
  -R, --require path Additional file to require before loading models, may be used multiple times
177
- -e [tests,fixtures,factories], Do not annotate fixtures, test files, and/or factories
178
- --exclude
183
+ -e [tests,fixtures,factories,serializers],
184
+ --exclude Do not annotate fixtures, test files, factories, and/or serializers
179
185
  -f [bare|rdoc|markdown], Render Schema Infomation as plain/RDoc/Markdown
180
186
  --format
181
187
  --force Force new annotations even if there are no changes.
188
+ --timestamp Include timestamp in (routes) annotation
182
189
  --trace If unable to annotate a file, print the full stack trace, not just the exception message.
183
- --timestamp Include an updated time in routes.rb
190
+ -I, --ignore-columns REGEX don't annotate columns that match a given REGEX (i.e., `annotate -I '^(id|updated_at|created_at)'`
191
+
184
192
 
185
193
 
186
194
  == Sorting
data/TODO.rdoc CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  - clean up history
4
4
  - change default position back to "top" for all annotations
5
- - add "top" and "bottom" as synonyms for "before" and "after"
6
5
  - change 'exclude' to 'only' (double negatives are not unconfusing)
7
6
 
8
7
  == TODO (proposed)
@@ -8,8 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.version = Annotate.version
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Cuong Tran", "Alex Chaffee", "Marcos Piccinini", "Turadg Aleahmad", "Jon Frisby"]
12
- s.date = "2014-06-16"
11
+ s.authors = ["Alex Chaffee", "Cuong Tran", "Marcos Piccinini", "Turadg Aleahmad", "Jon Frisby"]
13
12
  s.description = "Annotates Rails/ActiveRecord Models, routes, fixtures, and others based on the database schema."
14
13
  s.email = ["alex@stinky.com", "cuong.tran@gmail.com", "x@nofxx.com", "turadg@aleahmad.net", "jon@cloudability.com"]
15
14
  s.executables = ["annotate"]
@@ -26,7 +25,7 @@ Gem::Specification.new do |s|
26
25
  s.specification_version = 4
27
26
 
28
27
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
29
- s.add_runtime_dependency(%q<rake>, [">= 0.8.7"])
28
+ s.add_runtime_dependency(%q<rake>, ["~> 10.4.2", ">= 10.4.2"])
30
29
  s.add_runtime_dependency(%q<activerecord>, [">= 2.3.0"])
31
30
  else
32
31
  s.add_dependency(%q<rake>, [">= 0.8.7"])
@@ -32,46 +32,65 @@ OptionParser.new do |opts|
32
32
  target[:task] = :remove_annotations
33
33
  end
34
34
 
35
- opts.on('-p', '--position [before|after]', ['before', 'after'],
35
+ opts.on('-p', '--position [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
36
36
  "Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/routes file(s)") do |p|
37
37
  ENV['position'] = p
38
38
  [
39
- 'position_in_class','position_in_factory','position_in_fixture','position_in_test', 'position_in_routes'
39
+ 'position_in_class','position_in_factory','position_in_fixture','position_in_test', 'position_in_routes', 'position_in_serializer'
40
40
  ].each do |key|
41
41
  ENV[key] = p unless(has_set_position[key])
42
42
  end
43
43
  end
44
44
 
45
- opts.on('--pc', '--position-in-class [before|after]', ['before', 'after'],
45
+ opts.on('--pc', '--position-in-class [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
46
46
  "Place the annotations at the top (before) or the bottom (after) of the model file") do |p|
47
47
  ENV['position_in_class'] = p
48
48
  has_set_position['position_in_class'] = true
49
49
  end
50
50
 
51
- opts.on('--pf', '--position-in-factory [before|after]', ['before', 'after'],
51
+ opts.on('--pf', '--position-in-factory [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
52
52
  "Place the annotations at the top (before) or the bottom (after) of any factory files") do |p|
53
53
  ENV['position_in_factory'] = p
54
54
  has_set_position['position_in_factory'] = true
55
55
  end
56
56
 
57
- opts.on('--px', '--position-in-fixture [before|after]', ['before', 'after'],
57
+ opts.on('--px', '--position-in-fixture [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
58
58
  "Place the annotations at the top (before) or the bottom (after) of any fixture files") do |p|
59
59
  ENV['position_in_fixture'] = p
60
60
  has_set_position['position_in_fixture'] = true
61
61
  end
62
62
 
63
- opts.on('--pt', '--position-in-test [before|after]', ['before', 'after'],
63
+ opts.on('--pt', '--position-in-test [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
64
64
  "Place the annotations at the top (before) or the bottom (after) of any test files") do |p|
65
65
  ENV['position_in_test'] = p
66
66
  has_set_position['position_in_test'] = true
67
67
  end
68
68
 
69
- opts.on('--pr', '--position-in-routes [before|after]', ['before', 'after'],
69
+ opts.on('--pr', '--position-in-routes [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
70
70
  "Place the annotations at the top (before) or the bottom (after) of the routes.rb file") do |p|
71
71
  ENV['position_in_routes'] = p
72
72
  has_set_position['position_in_routes'] = true
73
73
  end
74
74
 
75
+ opts.on('--ps', '--position-in-serializer [before|top|after|bottom]', ['before', 'top', 'after', 'bottom'],
76
+ "Place the annotations at the top (before) or the bottom (after) of the serializer files") do |p|
77
+ ENV['position_in_serializer'] = p
78
+ has_set_position['position_in_serializer'] = true
79
+ end
80
+
81
+ opts.on('--w', '--wrapper STR', 'Wrap annotation with the text passed as parameter.',
82
+ 'If --w option is used, the same text will be used as opening and closing') do |p|
83
+ ENV['wrapper'] = p
84
+ end
85
+
86
+ opts.on('--wo', '--wrapper-open STR', 'Annotation wrapper opening.') do |p|
87
+ ENV['wrapper_open'] = p
88
+ end
89
+
90
+ opts.on('--wc', '--wrapper-close STR', 'Annotation wrapper closing') do |p|
91
+ ENV['wrapper_close'] = p
92
+ end
93
+
75
94
  opts.on('-r', '--routes',
76
95
  "Annotate routes.rb with the output of 'rake routes'") do
77
96
  target = {
@@ -101,7 +120,7 @@ OptionParser.new do |opts|
101
120
  end
102
121
 
103
122
  opts.on('--model-dir dir',
104
- "Annotate model files stored in dir rather than app/models") do |dir|
123
+ "Annotate model files stored in dir rather than app/models, separate multiple dirs with comas") do |dir|
105
124
  ENV['model_dir'] = dir
106
125
  end
107
126
 
@@ -115,6 +134,11 @@ OptionParser.new do |opts|
115
134
  ENV['sort'] = "yes"
116
135
  end
117
136
 
137
+ opts.on('--classified-sort',
138
+ "Sort columns alphabetically, but first goes id, then the rest columns, then the timestamp columns and then the association columns") do |dir|
139
+ ENV['classified_sort'] = "yes"
140
+ end
141
+
118
142
  opts.on('-R', '--require path',
119
143
  "Additional file to require before loading models, may be used multiple times") do |path|
120
144
  if !ENV['require'].blank?
@@ -124,7 +148,7 @@ OptionParser.new do |opts|
124
148
  end
125
149
  end
126
150
 
127
- opts.on('-e', '--exclude [tests,fixtures,factories]', Array, "Do not annotate fixtures, test files, and/or factories") do |exclusions|
151
+ opts.on('-e', '--exclude [tests,fixtures,factories,serializers]', Array, "Do not annotate fixtures, test files, factories, and/or serializers") do |exclusions|
128
152
  exclusions ||= %w(tests fixtures factories)
129
153
  exclusions.each { |exclusion| ENV["exclude_#{exclusion}"] = "yes" }
130
154
  end
@@ -6,9 +6,11 @@ require 'annotate/annotate_routes'
6
6
  begin
7
7
  # ActiveSupport 3.x...
8
8
  require 'active_support/hash_with_indifferent_access'
9
+ require 'active_support/core_ext/object/blank'
9
10
  rescue Exception => e
10
11
  # ActiveSupport 2.x...
11
12
  require 'active_support/core_ext/hash/indifferent_access'
13
+ require 'active_support/core_ext/blank'
12
14
  end
13
15
 
14
16
  module Annotate
@@ -18,17 +20,19 @@ module Annotate
18
20
  POSITION_OPTIONS=[
19
21
  :position_in_routes, :position_in_class, :position_in_test,
20
22
  :position_in_fixture, :position_in_factory, :position,
23
+ :position_in_serializer,
21
24
  ]
22
25
  FLAG_OPTIONS=[
23
26
  :show_indexes, :simple_indexes, :include_version, :exclude_tests,
24
27
  :exclude_fixtures, :exclude_factories, :ignore_model_sub_dir,
25
- :format_bare, :format_rdoc, :format_markdown, :sort, :force, :trace, :timestamp
28
+ :format_bare, :format_rdoc, :format_markdown, :sort, :force, :trace,
29
+ :timestamp, :exclude_serializers, :classified_sort
26
30
  ]
27
31
  OTHER_OPTIONS=[
28
- :model_dir, :ignore_columns
32
+ :ignore_columns
29
33
  ]
30
34
  PATH_OPTIONS=[
31
- :require,
35
+ :require, :model_dir
32
36
  ]
33
37
 
34
38
 
@@ -39,7 +43,7 @@ module Annotate
39
43
  return if(@has_set_defaults)
40
44
  @has_set_defaults = true
41
45
  options = HashWithIndifferentAccess.new(options)
42
- [POSITION_OPTIONS, FLAG_OPTIONS, PATH_OPTIONS].flatten.each do |key|
46
+ [POSITION_OPTIONS, FLAG_OPTIONS, PATH_OPTIONS, OTHER_OPTIONS].flatten.each do |key|
43
47
  if(options.has_key?(key))
44
48
  default_value = if(options[key].is_a?(Array))
45
49
  options[key].join(",")
@@ -68,7 +72,7 @@ module Annotate
68
72
  end
69
73
 
70
74
  if(!options[:model_dir])
71
- options[:model_dir] = 'app/models'
75
+ options[:model_dir] = ['app/models']
72
76
  end
73
77
 
74
78
  return options
@@ -109,8 +113,10 @@ module Annotate
109
113
  klass.eager_load!
110
114
  end
111
115
  else
112
- FileList["#{options[:model_dir]}/**/*.rb"].each do |fname|
113
- require File.expand_path(fname)
116
+ options[:model_dir].each do |dir|
117
+ FileList["#{dir}/**/*.rb"].each do |fname|
118
+ require File.expand_path(fname)
119
+ end
114
120
  end
115
121
  end
116
122
  end
@@ -1,3 +1,5 @@
1
+ require 'bigdecimal'
2
+
1
3
  module AnnotateModels
2
4
  # Annotate Models plugin use this header
3
5
  COMPAT_PREFIX = "== Schema Info"
@@ -31,6 +33,12 @@ module AnnotateModels
31
33
  FABRICATORS_TEST_DIR = File.join("test", "fabricators")
32
34
  FABRICATORS_SPEC_DIR = File.join("spec", "fabricators")
33
35
 
36
+ # Serializers https://github.com/rails-api/active_model_serializers
37
+ SERIALIZERS_DIR = File.join("app", "serializers")
38
+ SERIALIZERS_TEST_DIR = File.join("test", "serializers")
39
+ SERIALIZERS_SPEC_DIR = File.join("spec", "serializers")
40
+
41
+
34
42
  TEST_PATTERNS = [
35
43
  File.join(UNIT_TEST_DIR, "%MODEL_NAME%_test.rb"),
36
44
  File.join(MODEL_TEST_DIR, "%MODEL_NAME%_test.rb"),
@@ -55,13 +63,19 @@ module AnnotateModels
55
63
  File.join(FABRICATORS_SPEC_DIR, "%MODEL_NAME%_fabricator.rb"),
56
64
  ]
57
65
 
66
+ SERIALIZER_PATTERNS = [
67
+ File.join(SERIALIZERS_DIR, "%MODEL_NAME%_serializer.rb"),
68
+ File.join(SERIALIZERS_TEST_DIR, "%MODEL_NAME%_serializer_spec.rb"),
69
+ File.join(SERIALIZERS_SPEC_DIR, "%MODEL_NAME%_serializer_spec.rb")
70
+ ]
71
+
58
72
  # Don't show limit (#) on these column types
59
73
  # Example: show "integer" instead of "integer(4)"
60
74
  NO_LIMIT_COL_TYPES = ["integer", "boolean"]
61
75
 
62
76
  class << self
63
77
  def model_dir
64
- @model_dir || "app/models"
78
+ @model_dir.is_a?(Array) ? @model_dir : [@model_dir || "app/models"]
65
79
  end
66
80
 
67
81
  def model_dir=(dir)
@@ -82,6 +96,10 @@ module AnnotateModels
82
96
  end
83
97
  end
84
98
 
99
+ def schema_default(klass, column)
100
+ quote(klass.column_defaults[column.name])
101
+ end
102
+
85
103
  # Use the column information in an ActiveRecord class
86
104
  # to create a comment block containing a line for
87
105
  # each column. The line contains the column name,
@@ -113,10 +131,12 @@ module AnnotateModels
113
131
  if options[:ignore_columns]
114
132
  cols.reject! { |col| col.name.match(/#{options[:ignore_columns]}/) }
115
133
  end
134
+
116
135
  cols = cols.sort_by(&:name) if(options[:sort])
136
+ cols = classified_sort(cols) if(options[:classified_sort])
117
137
  cols.each do |col|
118
138
  attrs = []
119
- attrs << "default(#{quote(col.default)})" unless col.default.nil?
139
+ attrs << "default(#{schema_default(klass, col)})" unless col.default.nil?
120
140
  attrs << "not null" unless col.null
121
141
  attrs << "primary key" if klass.primary_key && (klass.primary_key.is_a?(Array) ? klass.primary_key.collect{|c|c.to_sym}.include?(col.name.to_sym) : col.name.to_sym == klass.primary_key.to_sym)
122
142
 
@@ -151,7 +171,7 @@ module AnnotateModels
151
171
  if options[:simple_indexes] && klass.table_exists?# Check out if this column is indexed
152
172
  indices = klass.connection.indexes(klass.table_name)
153
173
  if indices = indices.select { |ind| ind.columns.include? col.name }
154
- indices.each do |ind|
174
+ indices.sort_by{|ind| ind.name}.each do |ind|
155
175
  ind = ind.columns.reject! { |i| i == col.name }
156
176
  attrs << (ind.length == 0 ? "indexed" : "indexed => [#{ind.join(", ")}]")
157
177
  end
@@ -212,7 +232,7 @@ module AnnotateModels
212
232
  # === Options (opts)
213
233
  # :force<Symbol>:: whether to update the file even if it doesn't seem to need it.
214
234
  # :position_in_*<Symbol>:: where to place the annotated section in fixture or model file,
215
- # :before or :after. Default is :before.
235
+ # :before, :top, :after or :bottom. Default is :before.
216
236
  #
217
237
  def annotate_one_file(file_name, info_block, position, options={})
218
238
  if File.exist?(file_name)
@@ -241,15 +261,18 @@ module AnnotateModels
241
261
  new_content = old_content.sub(PATTERN, "\n" + info_block)
242
262
  end
243
263
 
264
+ wrapper_open = options[:wrapper_open] ? "# #{options[:wrapper_open]}\n" : ""
265
+ wrapper_close = options[:wrapper_close] ? "\n# #{options[:wrapper_close]}" : ""
266
+ wrapped_info_block = "#{wrapper_open}#{info_block}#{wrapper_close}"
244
267
  # if there *was* no old schema info (no substitution happened) or :force was passed,
245
268
  # we simply need to insert it in correct position
246
269
  if new_content == old_content || options[:force]
247
270
  old_content.sub!(encoding, '')
248
271
  old_content.sub!(PATTERN, '')
249
272
 
250
- new_content = options[position].to_s == 'after' ?
251
- (encoding_header + (old_content.rstrip + "\n\n" + info_block)) :
252
- (encoding_header + info_block + "\n" + old_content)
273
+ new_content = %w(after bottom).include?(options[position].to_s) ?
274
+ (encoding_header + (old_content.rstrip + "\n\n" + wrapped_info_block)) :
275
+ (encoding_header + wrapped_info_block + "\n" + old_content)
253
276
  end
254
277
 
255
278
  File.open(file_name, "wb") { |f| f.puts new_content }
@@ -296,31 +319,23 @@ module AnnotateModels
296
319
  did_annotate = false
297
320
  model_name = klass.name.underscore
298
321
  table_name = klass.table_name
299
- model_file_name = File.join(model_dir, file)
322
+ model_file_name = File.join(file)
300
323
 
301
324
  if annotate_one_file(model_file_name, info, :position_in_class, options_with_position(options, :position_in_class))
302
325
  did_annotate = true
303
326
  end
304
327
 
305
- unless options[:exclude_tests]
306
- did_annotate = TEST_PATTERNS.
307
- map { |file| resolve_filename(file, model_name, table_name) }.
308
- map { |file| annotate_one_file(file, info, :position_in_test, options_with_position(options, :position_in_test)) }.
309
- detect { |result| result } || did_annotate
310
- end
311
-
312
- unless options[:exclude_fixtures]
313
- did_annotate = FIXTURE_PATTERNS.
314
- map { |file| resolve_filename(file, model_name, table_name) }.
315
- map { |file| annotate_one_file(file, info, :position_in_fixture, options_with_position(options, :position_in_fixture)) }.
316
- detect { |result| result } || did_annotate
317
- end
328
+ %w(test fixture factory serializer).each do |key|
329
+ exclusion_key = "exclude_#{key.pluralize}".to_sym
330
+ patterns_constant = "#{key.upcase}_PATTERNS".to_sym
331
+ position_key = "position_in_#{key}".to_sym
318
332
 
319
- unless options[:exclude_factories]
320
- did_annotate = FACTORY_PATTERNS.
321
- map { |file| resolve_filename(file, model_name, table_name) }.
322
- map { |file| annotate_one_file(file, info, :position_in_factory, options_with_position(options, :position_in_factory)) }.
323
- detect { |result| result } || did_annotate
333
+ unless options[exclusion_key]
334
+ did_annotate = self.const_get(patterns_constant).
335
+ map { |file| resolve_filename(file, model_name, table_name) }.
336
+ map { |file| annotate_one_file(file, info, position_key, options_with_position(options, position_key)) }.
337
+ detect { |result| result } || did_annotate
338
+ end
324
339
  end
325
340
 
326
341
  return did_annotate
@@ -335,35 +350,37 @@ module AnnotateModels
335
350
  options.merge(:position=>(options[position_in] || options[:position]))
336
351
  end
337
352
 
338
- # Return a list of the model files to annotate. If we have
339
- # command line arguments, they're assumed to be either
340
- # the underscore or CamelCase versions of model names.
341
- # Otherwise we take all the model files in the
342
- # model_dir directory.
353
+ # Return a list of the model files to annotate.
354
+ # If we have command line arguments, they're assumed to the path
355
+ # of model files from root dir. Otherwise we take all the model files
356
+ # in the model_dir directory.
343
357
  def get_model_files(options)
358
+ models = []
344
359
  if(!options[:is_rake])
345
- models = ARGV.dup
346
- models.shift
347
- else
348
- models = []
360
+ models = ARGV.dup.reject{|m| m.match(/^(.*)=/)}
349
361
  end
350
- models.reject!{|m| m.match(/^(.*)=/)}
362
+
351
363
  if models.empty?
352
364
  begin
353
- Dir.chdir(model_dir) do
354
- models = if options[:ignore_model_sub_dir]
355
- Dir["*.rb"]
356
- else
357
- Dir["**/*.rb"].reject{ |f| f["concerns/"] }
365
+ model_dir.each do |dir|
366
+ Dir.chdir(dir) do
367
+ lst =
368
+ if options[:ignore_model_sub_dir]
369
+ Dir["*.rb"].map{ |f| [dir, f] }
370
+ else
371
+ Dir["**/*.rb"].reject{ |f| f["concerns/"] }.map{ |f| [dir, f] }
372
+ end
373
+ models.concat(lst)
358
374
  end
359
375
  end
360
376
  rescue SystemCallError
361
- puts "No models found in directory '#{model_dir}'."
377
+ puts "No models found in directory '#{model_dir.join("', '")}'."
362
378
  puts "Either specify models on the command line, or use the --model-dir option."
363
379
  puts "Call 'annotate --help' for more info."
364
380
  exit 1
365
381
  end
366
382
  end
383
+
367
384
  models
368
385
  end
369
386
 
@@ -372,11 +389,13 @@ module AnnotateModels
372
389
  # in subdirectories without namespacing.
373
390
  def get_model_class(file)
374
391
  model_path = file.gsub(/\.rb$/, '')
392
+ model_dir.each { |dir| model_path = model_path.gsub(/^#{dir}/, '').gsub(/^\//, '') }
375
393
  begin
376
394
  get_loaded_model(model_path) or raise LoadError.new("cannot load a model from #{file}")
377
395
  rescue LoadError
378
396
  # this is for non-rails projects, which don't get Rails auto-require magic
379
- if Kernel.require(File.expand_path("#{model_dir}/#{model_path}"))
397
+ file_path = File.expand_path(file)
398
+ if File.file?(file_path) && Kernel.require(file_path)
380
399
  retry
381
400
  elsif model_path.match(/\//)
382
401
  model_path = model_path.split('/')[1..-1].join('/').to_s
@@ -421,10 +440,10 @@ module AnnotateModels
421
440
 
422
441
  annotated = []
423
442
  get_model_files(options).each do |file|
424
- annotate_model_file(annotated, file, header, options)
443
+ annotate_model_file(annotated, File.join(file), header, options)
425
444
  end
426
445
  if annotated.empty?
427
- puts "Nothing annotated."
446
+ puts "Nothing to annotate."
428
447
  else
429
448
  puts "Annotated (#{annotated.length}): #{annotated.join(', ')}"
430
449
  end
@@ -449,12 +468,13 @@ module AnnotateModels
449
468
  deannotated = []
450
469
  deannotated_klass = false
451
470
  get_model_files(options).each do |file|
471
+ file = File.join(file)
452
472
  begin
453
473
  klass = get_model_class(file)
454
474
  if klass < ActiveRecord::Base && !klass.abstract_class?
455
475
  model_name = klass.name.underscore
456
476
  table_name = klass.table_name
457
- model_file_name = File.join(model_dir, file)
477
+ model_file_name = file
458
478
  deannotated_klass = true if(remove_annotation_of_file(model_file_name))
459
479
 
460
480
  (TEST_PATTERNS + FIXTURE_PATTERNS + FACTORY_PATTERNS).
@@ -468,7 +488,7 @@ module AnnotateModels
468
488
  end
469
489
  deannotated << klass if(deannotated_klass)
470
490
  rescue Exception => e
471
- puts "Unable to deannotate #{file}: #{e.message}"
491
+ puts "Unable to deannotate #{File.join(file)}: #{e.message}"
472
492
  puts "\t" + e.backtrace.join("\n\t") if options[:trace]
473
493
  end
474
494
  end
@@ -480,5 +500,27 @@ module AnnotateModels
480
500
  gsub('%MODEL_NAME%', model_name).
481
501
  gsub('%TABLE_NAME%', table_name || model_name.pluralize)
482
502
  end
503
+
504
+ def classified_sort(cols)
505
+ rest_cols = []
506
+ timestamps = []
507
+ associations = []
508
+ id = nil
509
+
510
+ cols = cols.each do |c|
511
+ if c.name.eql?("id")
512
+ id = c
513
+ elsif (c.name.eql?("created_at") || c.name.eql?("updated_at"))
514
+ timestamps << c
515
+ elsif c.name[-3,3].eql?("_id")
516
+ associations << c
517
+ else
518
+ rest_cols << c
519
+ end
520
+ end
521
+ [rest_cols, timestamps, associations].each {|a| a.sort_by!(&:name) }
522
+
523
+ return ([id] << rest_cols << timestamps << associations).flatten
524
+ end
483
525
  end
484
526
  end
@@ -23,7 +23,7 @@ module AnnotateRoutes
23
23
  def self.do_annotations(options={})
24
24
  return unless(routes_exists?)
25
25
 
26
- position_after = options[:position_in_routes] != 'before'
26
+ position_after = ! %w(before top).include?(options[:position_in_routes])
27
27
 
28
28
  routes_map = `rake routes`.split(/\n/, -1)
29
29
 
@@ -1,5 +1,5 @@
1
1
  module Annotate
2
2
  def self.version
3
- '2.6.5'
3
+ '2.6.6'
4
4
  end
5
5
  end
@@ -18,7 +18,7 @@ task :annotate_models => :environment do
18
18
  options[:position_in_test] = Annotate.fallback(ENV['position_in_test'], ENV['position'])
19
19
  options[:show_indexes] = Annotate.true?(ENV['show_indexes'])
20
20
  options[:simple_indexes] = Annotate.true?(ENV['simple_indexes'])
21
- options[:model_dir] = ENV['model_dir']
21
+ options[:model_dir] = ENV['model_dir'] ? ENV['model_dir'].split(',') : []
22
22
  options[:include_version] = Annotate.true?(ENV['include_version'])
23
23
  options[:require] = ENV['require'] ? ENV['require'].split(',') : []
24
24
  options[:exclude_tests] = Annotate.true?(ENV['exclude_tests'])
@@ -30,7 +30,10 @@ task :annotate_models => :environment do
30
30
  options[:format_markdown] = Annotate.true?(ENV['format_markdown'])
31
31
  options[:sort] = Annotate.true?(ENV['sort'])
32
32
  options[:force] = Annotate.true?(ENV['force'])
33
+ options[:classified_sort] = Annotate.true?(ENV['classified_sort'])
33
34
  options[:trace] = Annotate.true?(ENV['trace'])
35
+ options[:wrapper_open] = Annotate.fallback(ENV['wrapper_open'], ENV['wrapper'])
36
+ options[:wrapper_close] = Annotate.fallback(ENV['wrapper_close'], ENV['wrapper'])
34
37
  AnnotateModels.do_annotations(options)
35
38
  end
36
39
 
metadata CHANGED
@@ -1,49 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: annotate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.5
4
+ version: 2.6.6
5
5
  platform: ruby
6
6
  authors:
7
- - Cuong Tran
8
7
  - Alex Chaffee
8
+ - Cuong Tran
9
9
  - Marcos Piccinini
10
10
  - Turadg Aleahmad
11
11
  - Jon Frisby
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-06-16 00:00:00.000000000 Z
15
+ date: 2015-03-08 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rake
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: !binary |-
24
+ MTAuNC4y
21
25
  - - ! '>='
22
26
  - !ruby/object:Gem::Version
23
27
  version: !binary |-
24
- MC44Ljc=
28
+ MTAuNC4y
25
29
  type: :runtime
26
30
  prerelease: false
27
31
  version_requirements: !ruby/object:Gem::Requirement
28
32
  requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: !binary |-
36
+ MTAuNC4y
29
37
  - - ! '>='
30
38
  - !ruby/object:Gem::Version
31
39
  version: !binary |-
32
- MC44Ljc=
40
+ MTAuNC4y
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: activerecord
35
43
  requirement: !ruby/object:Gem::Requirement
36
44
  requirements:
37
45
  - - ! '>='
38
46
  - !ruby/object:Gem::Version
39
- version: 2.3.0
47
+ version: !binary |-
48
+ Mi4zLjA=
40
49
  type: :runtime
41
50
  prerelease: false
42
51
  version_requirements: !ruby/object:Gem::Requirement
43
52
  requirements:
44
53
  - - ! '>='
45
54
  - !ruby/object:Gem::Version
46
- version: 2.3.0
55
+ version: !binary |-
56
+ Mi4zLjA=
47
57
  description: Annotates Rails/ActiveRecord Models, routes, fixtures, and others based
48
58
  on the database schema.
49
59
  email:
@@ -99,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
109
  version: '0'
100
110
  requirements: []
101
111
  rubyforge_project: annotate
102
- rubygems_version: 2.3.0
112
+ rubygems_version: 2.4.1
103
113
  signing_key:
104
114
  specification_version: 4
105
115
  summary: Annotates Rails Models, routes, fixtures, and others based on the database