sequel-annotate 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -0
- data/README.rdoc +5 -0
- data/Rakefile +2 -10
- data/lib/sequel/annotate.rb +26 -3
- data/spec/annotated_after/scomplexdataset.rb +7 -0
- data/spec/annotated_before/scomplexdataset.rb +7 -0
- data/spec/sequel-annotate_spec.rb +17 -2
- data/spec/unannotated/not_model.rb +4 -0
- data/spec/unannotated/scomplexdataset.rb +7 -0
- data/spec/unannotated/sitemwithmagiccomment.rb +4 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42122bfc730bb5345c90160c5a17b0861c3a5a8308dfc6a008c1fccc0b73fe3e
|
4
|
+
data.tar.gz: 7bbb33c84261d97a66c17b942c19fc0b432d4029b8e384f148ec79ddf96c196e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ee1e34b6317be4e57f113a33e47c83190157ee3cbbae9cfd209c8806895aacc5e44604bbf2f0cfcbee1114a8822ed0c36a9ccdad628cb66daab58873d9020b8
|
7
|
+
data.tar.gz: d27e5074fb1c7642993647185605d0d714482d1f9ce5bc9e7b58817872f69674d0e803fa68210d0d73b2c176a479a44224a3678c602b1681116acae8dbf16d8c
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.6.0 (2020-10-05)
|
2
|
+
|
3
|
+
* Add support for :namespace=>true option to attempt to automatically determine namespace (adam12) (#20)
|
4
|
+
|
5
|
+
* Skip models that select from a subquery (adam12, jeremyevans) (#17)
|
6
|
+
|
7
|
+
* Allow files to be skipped with sequel-annotate: false magic comment (adam12) (#18)
|
8
|
+
|
9
|
+
* Ignore opening of singleton classes with class << when looking for models (adam12) (#16)
|
10
|
+
|
1
11
|
=== 1.5.0 (2020-05-04)
|
2
12
|
|
3
13
|
* Add support for magic comments in model files when using the :position=>:before option (qortex, jeremyevans) (#15)
|
data/README.rdoc
CHANGED
@@ -93,6 +93,11 @@ The columns section can have a border on the top and bottom for easier visual di
|
|
93
93
|
|
94
94
|
Sequel::Annotate.annotate(Dir['models/*.rb'], border: true)
|
95
95
|
|
96
|
+
Models that use datasets that select from subqueries are automatically skipped,
|
97
|
+
as annotations don't really make sense for them since they are not backed by a
|
98
|
+
table. You can skip other models by using a <tt># sequel-annotate: false</tt>
|
99
|
+
magic comment somewhere in the file.
|
100
|
+
|
96
101
|
=== Rake Task
|
97
102
|
|
98
103
|
Here's an example rake task for sequel-annotate:
|
data/Rakefile
CHANGED
@@ -28,19 +28,11 @@ begin
|
|
28
28
|
rescue Gem::LoadError
|
29
29
|
end
|
30
30
|
|
31
|
-
rdoc_task_class = begin
|
32
|
-
require "rdoc/task"
|
33
|
-
RDoc::Task
|
34
|
-
rescue LoadError
|
35
|
-
require "rake/rdoctask"
|
36
|
-
Rake::RDocTask
|
37
|
-
end
|
38
|
-
|
39
31
|
RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
|
40
32
|
|
41
|
-
|
33
|
+
require "rdoc/task"
|
34
|
+
RDoc::Task.new do |rdoc|
|
42
35
|
rdoc.rdoc_dir = "rdoc"
|
43
36
|
rdoc.options += RDOC_OPTS
|
44
37
|
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
|
45
38
|
end
|
46
|
-
|
data/lib/sequel/annotate.rb
CHANGED
@@ -13,11 +13,22 @@ module Sequel
|
|
13
13
|
namespace = options[:namespace]
|
14
14
|
|
15
15
|
paths.each do |path|
|
16
|
-
|
16
|
+
text = File.read(path)
|
17
|
+
|
18
|
+
next if text.match(/^#\s+sequel-annotate:\s+false$/i)
|
19
|
+
|
20
|
+
name = nil
|
21
|
+
if namespace == true
|
22
|
+
constants = text.scan(/\bmodule ([^\s]+)|class ([^\s<]+)\s*</).flatten.compact
|
23
|
+
name = constants.join("::") if constants.any?
|
24
|
+
elsif match = text.match(/class ([^\s<]+)\s*</)
|
17
25
|
name = match[1]
|
18
26
|
if namespace
|
19
27
|
name = "#{namespace}::#{name}"
|
20
28
|
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if name
|
21
32
|
klass = name.constantize
|
22
33
|
if klass.ancestors.include?(Sequel::Model)
|
23
34
|
new(klass).annotate(path, options)
|
@@ -37,6 +48,8 @@ module Sequel
|
|
37
48
|
# Append the schema comment (or replace it if one already exists) to
|
38
49
|
# the file at the given path.
|
39
50
|
def annotate(path, options = {})
|
51
|
+
return if skip_model?
|
52
|
+
|
40
53
|
orig = current = File.read(path).rstrip
|
41
54
|
|
42
55
|
if options[:position] == :before
|
@@ -84,6 +97,8 @@ module Sequel
|
|
84
97
|
# this table if set to +false+.
|
85
98
|
# :triggers :: Do not include triggers in annotation if set to +false+.
|
86
99
|
def schema_comment(options = {})
|
100
|
+
return "" if skip_model?
|
101
|
+
|
87
102
|
output = []
|
88
103
|
output << "# Table: #{model.dataset.with_quote_identifiers(false).literal(model.table_name)}"
|
89
104
|
|
@@ -120,12 +135,12 @@ module Sequel
|
|
120
135
|
|
121
136
|
cols.times do |i|
|
122
137
|
rows.each do |r|
|
123
|
-
lengths[i] = r[i].length if r[i].length > lengths[i]
|
138
|
+
lengths[i] = r[i].length if r[i] && r[i].length > lengths[i]
|
124
139
|
end
|
125
140
|
end
|
126
141
|
|
127
142
|
rows.map do |r|
|
128
|
-
"# #{r.zip(lengths).map{|c, l| c.ljust(l).gsub("\n", "\n# ")}.join(' | ')}".strip
|
143
|
+
"# #{r.zip(lengths).map{|c, l| c.to_s.ljust(l).gsub("\n", "\n# ")}.join(' | ')}".strip
|
129
144
|
end
|
130
145
|
end
|
131
146
|
|
@@ -277,5 +292,13 @@ SQL
|
|
277
292
|
output.concat(align(rows).sort)
|
278
293
|
end
|
279
294
|
end
|
295
|
+
|
296
|
+
# Whether we should skip annotations for the model.
|
297
|
+
# True if the model selects from a dataset.
|
298
|
+
def skip_model?
|
299
|
+
model.dataset.joined_dataset? || model.dataset.first_source_table.is_a?(Dataset)
|
300
|
+
rescue Sequel::Error
|
301
|
+
true
|
302
|
+
end
|
280
303
|
end
|
281
304
|
end
|
@@ -101,10 +101,12 @@ class ::SItemWithCoding < Sequel::Model(SDB[:items]); end
|
|
101
101
|
class ::SItemWithEncoding < Sequel::Model(SDB[:items]); end
|
102
102
|
class ::SItemWithWarnIndent < Sequel::Model(SDB[:items]); end
|
103
103
|
class ::SItemWithWarnPastScope < Sequel::Model(SDB[:items]); end
|
104
|
+
class ::SItemWithMagicComment < Sequel::Model(SDB[:items]); end
|
104
105
|
class ::SCategory < Sequel::Model(SDB[:categories]); end
|
105
106
|
class ::SManufacturer < Sequel::Model(SDB[:manufacturers]); end
|
106
107
|
class ::NewlineTest < Sequel::Model; end
|
107
108
|
class ::QualifiedTableNameTest < Sequel::Model(Sequel.qualify(:public, :categories)); end
|
109
|
+
class SComplexDataset < Sequel::Model(SDB[:items].left_join(:categories, :id => :category_id).select{items[:name]}); end
|
108
110
|
|
109
111
|
# Abstract Base Class
|
110
112
|
ABC = Class.new(Sequel::Model)
|
@@ -133,6 +135,12 @@ describe Sequel::Annotate do
|
|
133
135
|
Dir['spec/tmp/*.rb'].each{|f| File.delete(f)}
|
134
136
|
end
|
135
137
|
|
138
|
+
it "skips files with the sequel-annotate magic comment set to false" do
|
139
|
+
FileUtils.cp('spec/unannotated/sitemwithmagiccomment.rb', 'spec/tmp/')
|
140
|
+
Sequel::Annotate.annotate(['spec/tmp/sitemwithmagiccomment.rb'])
|
141
|
+
File.read('spec/tmp/sitemwithmagiccomment.rb').must_equal File.read('spec/unannotated/sitemwithmagiccomment.rb')
|
142
|
+
end
|
143
|
+
|
136
144
|
it "#schema_info should not return sections we set to false" do
|
137
145
|
Sequel::Annotate.new(Item).schema_comment(:indexes => false, :constraints => false, :foreign_keys => false, :triggers => false).must_equal(fix_pg_comment((<<OUTPUT).chomp))
|
138
146
|
# Table: items
|
@@ -197,6 +205,7 @@ OUTPUT
|
|
197
205
|
# valid_price | BEFORE INSERT OR UPDATE ON items FOR EACH ROW EXECUTE PROCEDURE valid_price()
|
198
206
|
OUTPUT
|
199
207
|
|
208
|
+
Sequel::Annotate.new(SComplexDataset).schema_comment.must_equal("")
|
200
209
|
Sequel::Annotate.new(Category).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
|
201
210
|
# Table: categories
|
202
211
|
# Columns:
|
@@ -304,7 +313,7 @@ OUTPUT
|
|
304
313
|
it "#annotate #{desc} should annotate the file comment" do
|
305
314
|
FileUtils.cp(Dir['spec/unannotated/*.rb'], 'spec/tmp')
|
306
315
|
|
307
|
-
[Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope].each do |model|
|
316
|
+
[Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope, SComplexDataset].each do |model|
|
308
317
|
filename = model.name.downcase
|
309
318
|
2.times do
|
310
319
|
Sequel::Annotate.new(model).annotate("spec/tmp/#{filename}.rb", *args)
|
@@ -320,7 +329,7 @@ OUTPUT
|
|
320
329
|
|
321
330
|
2.times do
|
322
331
|
Sequel::Annotate.annotate(Dir["spec/tmp/*.rb"], *args)
|
323
|
-
[Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope].each do |model|
|
332
|
+
[Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope, SComplexDataset].each do |model|
|
324
333
|
filename = model.name.downcase
|
325
334
|
expected = File.read("spec/annotated_#{pos}/#{filename}.rb")
|
326
335
|
expected = fix_pg_comment(expected) if model.db == DB
|
@@ -338,4 +347,10 @@ OUTPUT
|
|
338
347
|
Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>'ModelNamespace')
|
339
348
|
File.read("spec/tmp/itm_unannotated.rb").must_equal fix_pg_comment(File.read('spec/namespaced/itm_annotated.rb'))
|
340
349
|
end
|
350
|
+
|
351
|
+
it ".annotate #{desc} should handle :namespace => true option" do
|
352
|
+
FileUtils.cp('spec/namespaced/itm_unannotated.rb', 'spec/tmp')
|
353
|
+
Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>true)
|
354
|
+
File.read("spec/tmp/itm_unannotated.rb").must_equal fix_pg_comment(File.read('spec/namespaced/itm_annotated.rb'))
|
355
|
+
end
|
341
356
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel-annotate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05
|
11
|
+
date: 2020-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- spec/annotated_after/item.rb
|
106
106
|
- spec/annotated_after/manufacturer.rb
|
107
107
|
- spec/annotated_after/scategory.rb
|
108
|
+
- spec/annotated_after/scomplexdataset.rb
|
108
109
|
- spec/annotated_after/sitem.rb
|
109
110
|
- spec/annotated_after/sitemwithcoding.rb
|
110
111
|
- spec/annotated_after/sitemwithencoding.rb
|
@@ -116,6 +117,7 @@ files:
|
|
116
117
|
- spec/annotated_before/item.rb
|
117
118
|
- spec/annotated_before/manufacturer.rb
|
118
119
|
- spec/annotated_before/scategory.rb
|
120
|
+
- spec/annotated_before/scomplexdataset.rb
|
119
121
|
- spec/annotated_before/sitem.rb
|
120
122
|
- spec/annotated_before/sitemwithcoding.rb
|
121
123
|
- spec/annotated_before/sitemwithencoding.rb
|
@@ -129,11 +131,14 @@ files:
|
|
129
131
|
- spec/unannotated/category.rb
|
130
132
|
- spec/unannotated/item.rb
|
131
133
|
- spec/unannotated/manufacturer.rb
|
134
|
+
- spec/unannotated/not_model.rb
|
132
135
|
- spec/unannotated/scategory.rb
|
136
|
+
- spec/unannotated/scomplexdataset.rb
|
133
137
|
- spec/unannotated/sitem.rb
|
134
138
|
- spec/unannotated/sitemwithcoding.rb
|
135
139
|
- spec/unannotated/sitemwithencoding.rb
|
136
140
|
- spec/unannotated/sitemwithfrozenliteral.rb
|
141
|
+
- spec/unannotated/sitemwithmagiccomment.rb
|
137
142
|
- spec/unannotated/sitemwithwarnindent.rb
|
138
143
|
- spec/unannotated/sitemwithwarnpastscope.rb
|
139
144
|
- spec/unannotated/smanufacturer.rb
|
@@ -166,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
171
|
- !ruby/object:Gem::Version
|
167
172
|
version: '0'
|
168
173
|
requirements: []
|
169
|
-
rubygems_version: 3.1.
|
174
|
+
rubygems_version: 3.1.4
|
170
175
|
signing_key:
|
171
176
|
specification_version: 4
|
172
177
|
summary: Annotate Sequel models with schema information
|