annotate 3.0.0 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +8 -0
- data/README.rdoc +7 -7
- data/annotate.gemspec +2 -0
- data/lib/annotate.rb +5 -6
- data/lib/annotate/annotate_models.rb +3 -3
- data/lib/annotate/constants.rb +5 -0
- data/lib/annotate/parser.rb +251 -0
- data/lib/annotate/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ed01c42404ffa9b87f256ce671d68a47065b6dc6880bf2e351a2ca94bc01e24
|
4
|
+
data.tar.gz: 62fa4fa3174f2a32b3d045d50ab3be26ff4647053c3e455f2fce70e8d4f8e24e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec228f10fb750acdc34f8708385daa5943e0cda4ebe1f59633d67c29b906ff70e13880c800b5e8778d242007cec75e123e67969cdc61e6a2c84af9c2122d1613
|
7
|
+
data.tar.gz: 492a844a0e1be69e77a689c79e3b5896d187813b02be71c0a16d8666dedc29aabae91387f0c0031b103338dbaae0ee4dac3cf2d13e7aecee3ba1bfae865b9fd6
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 3.0.2
|
2
|
+
* Fixes `LoadError` due to gemspec not referencing `parser.rb`, issue #657 (#660)
|
3
|
+
* Changes `--additional_file_patterns` to use dashes `--additional-file-patterns` for consistency (#649)
|
4
|
+
* Refactor: moving constants into `constants.rb` (#653)
|
5
|
+
|
6
|
+
== 3.0.1
|
7
|
+
* Skipped as an official release, used the 3.0.1 patch for setting up Github Actions (#619)
|
8
|
+
|
1
9
|
== 3.0.0
|
2
10
|
* Added `--models` CLI option fixing issue #563 (#647)
|
3
11
|
* Added `--additional_file_patterns` option for additional file patterns (#633) #636) #637)
|
data/README.rdoc
CHANGED
@@ -163,7 +163,7 @@ you can do so with a simple environment variable, instead of editing the
|
|
163
163
|
== Options
|
164
164
|
|
165
165
|
Usage: annotate [options] [model_file]*
|
166
|
-
--
|
166
|
+
--additional-file-patterns Additional file paths or globs to annotate, separated by commas (e.g. `/foo/bar/%model_name%/*.rb,/baz/%model_name%.rb`)
|
167
167
|
-d, --delete Remove annotations from all model files or the routes.rb file
|
168
168
|
-p [before|top|after|bottom], Place the annotations at the top (before) or the bottom (after) of the model/test/fixture/factory/route/serializer file(s)
|
169
169
|
--position
|
@@ -216,18 +216,18 @@ you can do so with a simple environment variable, instead of editing the
|
|
216
216
|
--ignore-unknown-models don't display warnings for bad model files
|
217
217
|
--with-comment include database comments in model annotations
|
218
218
|
|
219
|
-
=== Option: +
|
219
|
+
=== Option: +additional-file-patterns+
|
220
220
|
|
221
|
-
CLI: +--
|
222
|
-
Ruby: +:
|
221
|
+
CLI: +--additional-file-patterns+<br>
|
222
|
+
Ruby: +:additional-file-patterns+
|
223
223
|
|
224
224
|
Provide additional paths for the gem to annotate. These paths can include globs.
|
225
225
|
It is recommended to use absolute paths. Here are some examples:
|
226
226
|
|
227
227
|
|
228
|
-
- <code>/app/lib/decorates/%MODEL_NAME
|
229
|
-
- <code>/app/lib/forms/%PLURALIZED_MODEL_NAME
|
230
|
-
- <code>/app/lib/forms/%TABLE_NAME
|
228
|
+
- <code>/app/lib/decorates/%MODEL_NAME%/*.rb</code>
|
229
|
+
- <code>/app/lib/forms/%PLURALIZED_MODEL_NAME%/**/*.rb</code>
|
230
|
+
- <code>/app/lib/forms/%TABLE_NAME%/*.rb</code>
|
231
231
|
|
232
232
|
The appropriate model will be inferred using the <code>%*%</code> syntax, annotating any matching files.
|
233
233
|
It works with existing filename resolutions (options for which can be found in the +resolve_filename+ method of
|
data/annotate.gemspec
CHANGED
@@ -26,6 +26,8 @@ Gem::Specification.new do |s|
|
|
26
26
|
'lib/annotate/active_record_patch.rb',
|
27
27
|
'lib/annotate/annotate_models.rb',
|
28
28
|
'lib/annotate/annotate_routes.rb',
|
29
|
+
'lib/annotate/constants.rb',
|
30
|
+
'lib/annotate/parser.rb',
|
29
31
|
'lib/annotate/tasks.rb',
|
30
32
|
'lib/annotate/version.rb',
|
31
33
|
'lib/generators/annotate/USAGE',
|
data/lib/annotate.rb
CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
4
4
|
require 'annotate/version'
|
5
5
|
require 'annotate/annotate_models'
|
6
6
|
require 'annotate/annotate_routes'
|
7
|
+
require 'annotate/constants'
|
7
8
|
|
8
9
|
begin
|
9
10
|
# ActiveSupport 3.x...
|
@@ -16,8 +17,6 @@ rescue StandardError
|
|
16
17
|
end
|
17
18
|
|
18
19
|
module Annotate
|
19
|
-
TRUE_RE = /^(true|t|yes|y|1)$/i
|
20
|
-
|
21
20
|
##
|
22
21
|
# The set of available options to customize the behavior of Annotate.
|
23
22
|
#
|
@@ -107,15 +106,15 @@ module Annotate
|
|
107
106
|
end
|
108
107
|
|
109
108
|
def self.skip_on_migration?
|
110
|
-
ENV['ANNOTATE_SKIP_ON_DB_MIGRATE'] =~ TRUE_RE || ENV['skip_on_db_migrate'] =~ TRUE_RE
|
109
|
+
ENV['ANNOTATE_SKIP_ON_DB_MIGRATE'] =~ Constants::TRUE_RE || ENV['skip_on_db_migrate'] =~ Constants::TRUE_RE
|
111
110
|
end
|
112
111
|
|
113
112
|
def self.include_routes?
|
114
|
-
ENV['routes'] =~ TRUE_RE
|
113
|
+
ENV['routes'] =~ Constants::TRUE_RE
|
115
114
|
end
|
116
115
|
|
117
116
|
def self.include_models?
|
118
|
-
ENV['models'] =~ TRUE_RE
|
117
|
+
ENV['models'] =~ Constants::TRUE_RE
|
119
118
|
end
|
120
119
|
|
121
120
|
def self.loaded_tasks=(val)
|
@@ -199,7 +198,7 @@ module Annotate
|
|
199
198
|
|
200
199
|
def self.true?(val)
|
201
200
|
return false if val.blank?
|
202
|
-
return false unless val =~ TRUE_RE
|
201
|
+
return false unless val =~ Constants::TRUE_RE
|
203
202
|
true
|
204
203
|
end
|
205
204
|
end
|
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'bigdecimal'
|
4
4
|
|
5
|
-
|
6
|
-
TRUE_RE = /^(true|t|yes|y|1)$/i
|
5
|
+
require 'annotate/constants'
|
7
6
|
|
7
|
+
module AnnotateModels
|
8
8
|
# Annotate Models plugin use this header
|
9
9
|
COMPAT_PREFIX = '== Schema Info'.freeze
|
10
10
|
COMPAT_PREFIX_MD = '## Schema Info'.freeze
|
@@ -590,7 +590,7 @@ module AnnotateModels
|
|
590
590
|
|
591
591
|
def matched_types(options)
|
592
592
|
types = MATCHED_TYPES.dup
|
593
|
-
types << 'admin' if options[:active_admin] =~ TRUE_RE && !types.include?('admin')
|
593
|
+
types << 'admin' if options[:active_admin] =~ Annotate::Constants::TRUE_RE && !types.include?('admin')
|
594
594
|
types << 'additional_file_patterns' if options[:additional_file_patterns].present?
|
595
595
|
|
596
596
|
types
|
@@ -0,0 +1,251 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Annotate
|
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
|
+
ANNOTATION_POSITIONS = %w[before top after bottom].freeze
|
13
|
+
FILE_TYPE_POSITIONS = %w[position_in_class position_in_factory position_in_fixture position_in_test position_in_routes position_in_serializer].freeze
|
14
|
+
EXCLUSION_LIST = %w[tests fixtures factories serializers].freeze
|
15
|
+
FORMAT_TYPES = %w[bare rdoc markdown].freeze
|
16
|
+
|
17
|
+
def initialize(args, env)
|
18
|
+
@args = args
|
19
|
+
@options = default_options
|
20
|
+
@env = env
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse
|
24
|
+
# To split up because right now this method parses and commits
|
25
|
+
parser.parse!(args)
|
26
|
+
|
27
|
+
commit
|
28
|
+
|
29
|
+
options
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def commit
|
35
|
+
env.each_pair do |key, value|
|
36
|
+
ENV[key] = value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parser
|
41
|
+
OptionParser.new do |option_parser|
|
42
|
+
add_options_to_parser(option_parser)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_options_to_parser(option_parser) # rubocop:disable Metrics/MethodLength
|
47
|
+
has_set_position = {}
|
48
|
+
positions = ANNOTATION_POSITIONS
|
49
|
+
|
50
|
+
option_parser.banner = 'Usage: annotate [options] [model_file]*'
|
51
|
+
|
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|
|
53
|
+
ENV['additional_file_patterns'] = additional_file_patterns
|
54
|
+
end
|
55
|
+
|
56
|
+
option_parser.on('-d', '--delete', 'Remove annotations from all model files or the routes.rb file') do
|
57
|
+
@options[:target_action] = :remove_annotations
|
58
|
+
end
|
59
|
+
|
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
|
63
|
+
|
64
|
+
FILE_TYPE_POSITIONS.each do |key|
|
65
|
+
env[key] = p unless has_set_position[key]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
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
|
72
|
+
has_set_position['position_in_class'] = true
|
73
|
+
end
|
74
|
+
|
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
|
78
|
+
has_set_position['position_in_factory'] = true
|
79
|
+
end
|
80
|
+
|
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
|
84
|
+
has_set_position['position_in_fixture'] = true
|
85
|
+
end
|
86
|
+
|
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
|
90
|
+
has_set_position['position_in_test'] = true
|
91
|
+
end
|
92
|
+
|
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
|
96
|
+
has_set_position['position_in_routes'] = true
|
97
|
+
end
|
98
|
+
|
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
|
102
|
+
has_set_position['position_in_serializer'] = true
|
103
|
+
end
|
104
|
+
|
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
|
108
|
+
end
|
109
|
+
|
110
|
+
option_parser.on('--wo', '--wrapper-open STR', 'Annotation wrapper opening.') do |p|
|
111
|
+
env['wrapper_open'] = p
|
112
|
+
end
|
113
|
+
|
114
|
+
option_parser.on('--wc', '--wrapper-close STR', 'Annotation wrapper closing') do |p|
|
115
|
+
env['wrapper_close'] = p
|
116
|
+
end
|
117
|
+
|
118
|
+
option_parser.on('-r', '--routes', "Annotate routes.rb with the output of 'rake routes'") do
|
119
|
+
env['routes'] = 'true'
|
120
|
+
end
|
121
|
+
|
122
|
+
option_parser.on('--models', "Annotate ActiveRecord models") do
|
123
|
+
env['models'] = 'true'
|
124
|
+
end
|
125
|
+
|
126
|
+
option_parser.on('-a', '--active-admin', 'Annotate active_admin models') do
|
127
|
+
env['active_admin'] = 'true'
|
128
|
+
end
|
129
|
+
|
130
|
+
option_parser.on('-v', '--version', 'Show the current version of this gem') do
|
131
|
+
puts "annotate v#{Annotate.version}"
|
132
|
+
@options[:exit] = true
|
133
|
+
end
|
134
|
+
|
135
|
+
option_parser.on('-m', '--show-migration', 'Include the migration version number in the annotation') do
|
136
|
+
env['include_version'] = 'yes'
|
137
|
+
end
|
138
|
+
|
139
|
+
option_parser.on('-k', '--show-foreign-keys',
|
140
|
+
"List the table's foreign key constraints in the annotation") do
|
141
|
+
env['show_foreign_keys'] = 'yes'
|
142
|
+
end
|
143
|
+
|
144
|
+
option_parser.on('--ck',
|
145
|
+
'--complete-foreign-keys', 'Complete foreign key names in the annotation') do
|
146
|
+
env['show_foreign_keys'] = 'yes'
|
147
|
+
env['show_complete_foreign_keys'] = 'yes'
|
148
|
+
end
|
149
|
+
|
150
|
+
option_parser.on('-i', '--show-indexes',
|
151
|
+
"List the table's database indexes in the annotation") do
|
152
|
+
env['show_indexes'] = 'yes'
|
153
|
+
end
|
154
|
+
|
155
|
+
option_parser.on('-s', '--simple-indexes',
|
156
|
+
"Concat the column's related indexes in the annotation") do
|
157
|
+
env['simple_indexes'] = 'yes'
|
158
|
+
end
|
159
|
+
|
160
|
+
option_parser.on('--model-dir dir',
|
161
|
+
"Annotate model files stored in dir rather than app/models, separate multiple dirs with commas") do |dir|
|
162
|
+
env['model_dir'] = dir
|
163
|
+
end
|
164
|
+
|
165
|
+
option_parser.on('--root-dir dir',
|
166
|
+
"Annotate files stored within root dir projects, separate multiple dirs with commas") do |dir|
|
167
|
+
env['root_dir'] = dir
|
168
|
+
end
|
169
|
+
|
170
|
+
option_parser.on('--ignore-model-subdirects',
|
171
|
+
"Ignore subdirectories of the models directory") do |_dir|
|
172
|
+
env['ignore_model_sub_dir'] = 'yes'
|
173
|
+
end
|
174
|
+
|
175
|
+
option_parser.on('--sort',
|
176
|
+
"Sort columns alphabetically, rather than in creation order") do |_dir|
|
177
|
+
env['sort'] = 'yes'
|
178
|
+
end
|
179
|
+
|
180
|
+
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|
|
182
|
+
env['classified_sort'] = 'yes'
|
183
|
+
end
|
184
|
+
|
185
|
+
option_parser.on('-R', '--require path',
|
186
|
+
"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}"
|
189
|
+
else
|
190
|
+
path
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
option_parser.on('-e', '--exclude [tests,fixtures,factories,serializers]', Array, "Do not annotate fixtures, test files, factories, and/or serializers") do |exclusions|
|
195
|
+
exclusions ||= EXCLUSION_LIST
|
196
|
+
exclusions.each { |exclusion| env["exclude_#{exclusion}"] = 'yes' }
|
197
|
+
end
|
198
|
+
|
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'
|
201
|
+
end
|
202
|
+
|
203
|
+
option_parser.on('--force', 'Force new annotations even if there are no changes.') do |_force|
|
204
|
+
env['force'] = 'yes'
|
205
|
+
end
|
206
|
+
|
207
|
+
option_parser.on('--frozen', 'Do not allow to change annotations. Exits non-zero if there are going to be changes to files.') do
|
208
|
+
env['frozen'] = 'yes'
|
209
|
+
end
|
210
|
+
|
211
|
+
option_parser.on('--timestamp', 'Include timestamp in (routes) annotation') do
|
212
|
+
env['timestamp'] = 'true'
|
213
|
+
end
|
214
|
+
|
215
|
+
option_parser.on('--trace', 'If unable to annotate a file, print the full stack trace, not just the exception message.') do |_value|
|
216
|
+
env['trace'] = 'yes'
|
217
|
+
end
|
218
|
+
|
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|
|
220
|
+
env['ignore_columns'] = regex
|
221
|
+
end
|
222
|
+
|
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|
|
224
|
+
env['ignore_routes'] = regex
|
225
|
+
end
|
226
|
+
|
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|
|
228
|
+
env['hide_limit_column_types'] = values.to_s
|
229
|
+
end
|
230
|
+
|
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|
|
232
|
+
env['hide_default_column_types'] = values.to_s
|
233
|
+
end
|
234
|
+
|
235
|
+
option_parser.on('--ignore-unknown-models', "don't display warnings for bad model files") do |_values|
|
236
|
+
env['ignore_unknown_models'] = 'true'
|
237
|
+
end
|
238
|
+
|
239
|
+
option_parser.on('--with-comment', "include database comments in model annotations") do |_values|
|
240
|
+
env['with_comment'] = 'true'
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def default_options
|
245
|
+
{
|
246
|
+
target_action: :do_annotations,
|
247
|
+
exit: false
|
248
|
+
}
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
data/lib/annotate/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: annotate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Chaffee
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2019-09-
|
15
|
+
date: 2019-09-29 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rake
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- lib/annotate/active_record_patch.rb
|
82
82
|
- lib/annotate/annotate_models.rb
|
83
83
|
- lib/annotate/annotate_routes.rb
|
84
|
+
- lib/annotate/constants.rb
|
85
|
+
- lib/annotate/parser.rb
|
84
86
|
- lib/annotate/tasks.rb
|
85
87
|
- lib/annotate/version.rb
|
86
88
|
- lib/generators/annotate/USAGE
|