sequel-annotate 1.3.0 → 1.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 024d60493f6cff6f11e88759519c7bea3527e085d0bd888f8cc84ed74dba112c
4
- data.tar.gz: 722da23fe55ebe66b84377ff62ac851d20417950173bb977f21bd7678710f279
3
+ metadata.gz: 1af766f00a25bee67411ffb02da42718bfca2a4f6da4054470916559f03af2fd
4
+ data.tar.gz: 798ae4e7a20c53d3114358aff783ce97f2ad43f4ee66044b1df3f6ebcafa5b33
5
5
  SHA512:
6
- metadata.gz: 1340b7bc98e1650fc91075a5cdd34d4e5f56c21a6c58b8b9c460b68d0bb8fb0997b82f7294d04d9f90b377b2b236057901f711c16a0233ff951948f1f48f39da
7
- data.tar.gz: e64ebdcbe577333c76b94fbd45ea795eb918193e46493dd8dba76789214250faba6ab97b5c765d4143be68ecf28d7f29cc7bc76b52750b0ad1ff96e445b4a211
6
+ metadata.gz: a1bb2645eaf30455d1a55eaf79cd50d7410544d5de75db501ba5d62523d2de8b0d12464291b887fd7c0b7a34adf3622231c6ca81e2ad70f23ae1a923773ccfd8
7
+ data.tar.gz: b57d33307b4295bf3a120d162ea1850cf008092ca21e16127e2cf07874d49dc35df18b44b57512aaea9ac6255ce694ba3cdd3004a3dde90282fc7c6b69b39fe3
data/CHANGELOG CHANGED
@@ -1,3 +1,37 @@
1
+ === 1.7.0 (2021-05-20)
2
+
3
+ * Add support for table comments on PostgreSQL (TSMMark) (#21)
4
+
5
+ === 1.6.0 (2020-10-05)
6
+
7
+ * Add support for :namespace=>true option to attempt to automatically determine namespace (adam12) (#20)
8
+
9
+ * Skip models that select from a subquery (adam12, jeremyevans) (#17)
10
+
11
+ * Allow files to be skipped with sequel-annotate: false magic comment (adam12) (#18)
12
+
13
+ * Ignore opening of singleton classes with class << when looking for models (adam12) (#16)
14
+
15
+ === 1.5.0 (2020-05-04)
16
+
17
+ * Add support for magic comments in model files when using the :position=>:before option (qortex, jeremyevans) (#15)
18
+
19
+ * Add support for PostgreSQL column comments (rgalanakis, jeremyevans) (#14)
20
+
21
+ * Respect domain types on PostgreSQL (chanks) (#13)
22
+
23
+ * Make schema comments handle table names that aren't just symbols (chanks) (#12)
24
+
25
+ === 1.4.0 (2018-11-15)
26
+
27
+ * Support adding borders to the beginning and end of comments via :border option (kreynolds) (#9)
28
+
29
+ * Support excluding indexes, constraints, and triggers from annotation via options (kreynolds) (#9)
30
+
31
+ === 1.3.1 (2018-09-27)
32
+
33
+ * Make sure all annotation lines are commented by handling newlines inside annotations (jeremyevans)
34
+
1
35
  === 1.3.0 (2018-07-17)
2
36
 
3
37
  * Support :namespace option to specify namespace to add for models nested in namespaces (jeremyevans)
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ default, it includes information on columns, indexes, and foreign key
5
5
  constraints for the current table.
6
6
 
7
7
  On PostgreSQL, this includes more advanced information, including
8
- check constraints, triggers, and foreign keys constraints for other
8
+ check constraints, triggers, comments, and foreign keys constraints for other
9
9
  tables that reference the current table.
10
10
 
11
11
  == Example
@@ -83,6 +83,21 @@ Then you can use the +:namespace+ option to set the namespace to use:
83
83
 
84
84
  Sequel::Annotate.annotate(Dir['models/*.rb'], namespace: 'ModelNamespace')
85
85
 
86
+ For PostgreSQL, you can optionally leave out indexes, foreign_keys, references,
87
+ triggers, comments, and constraints by passing in false as a parameter as follows:
88
+
89
+ Sequel::Annotate.annotate(Dir['models/*.rb'], foreign_keys: false,
90
+ :indexes: false, constraints: false, comments: false)
91
+
92
+ The columns section can have a border on the top and bottom for easier visual distinction by setting the :border option to true
93
+
94
+ Sequel::Annotate.annotate(Dir['models/*.rb'], border: true)
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
+
86
101
  === Rake Task
87
102
 
88
103
  Here's an example rake task for sequel-annotate:
data/Rakefile CHANGED
@@ -17,6 +17,17 @@ end
17
17
 
18
18
  task :default => :spec
19
19
 
20
+ desc "Run specs in CI"
21
+ task :spec_ci do
22
+ ENV['SEQUEL_ANNOTATE_SPEC_CI'] = '1'
23
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
24
+ ENV['SEQUEL_ANNOTATE_SPEC_POSTGRES_URL'] = "jdbc:postgresql://localhost/?user=postgres"
25
+ else
26
+ ENV['SEQUEL_ANNOTATE_SPEC_POSTGRES_URL'] = "postgres://localhost/?user=postgres"
27
+ end
28
+ Rake::Task['spec'].invoke
29
+ end
30
+
20
31
  ### RDoc
21
32
 
22
33
  RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'sequel-annotate: Annotate Sequel models with schema information']
@@ -28,19 +39,11 @@ begin
28
39
  rescue Gem::LoadError
29
40
  end
30
41
 
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
42
  RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
40
43
 
41
- rdoc_task_class.new do |rdoc|
44
+ require "rdoc/task"
45
+ RDoc::Task.new do |rdoc|
42
46
  rdoc.rdoc_dir = "rdoc"
43
47
  rdoc.options += RDOC_OPTS
44
48
  rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
45
49
  end
46
-
@@ -13,11 +13,22 @@ module Sequel
13
13
  namespace = options[:namespace]
14
14
 
15
15
  paths.each do |path|
16
- if match = File.read(path).match(/class (\S+)\s*</)
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,11 +48,18 @@ 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
56
+ if current =~ /\A((?:^\s*$|^#\s*(?:frozen_string_literal|coding|encoding|warn_indent|warn_past_scope)[^\n]*\s*)*)/m
57
+ magic_comments = $1
58
+ current.slice!(0, magic_comments.length)
59
+ end
60
+
43
61
  current = current.gsub(/\A#\sTable[^\n\r]+\r?\n(?:#[^\n\r]*\r?\n)*/m, '').lstrip
44
- current = "#{schema_comment}#{$/}#{$/}#{current}"
62
+ current = "#{magic_comments}#{schema_comment(options)}#{$/}#{$/}#{current}"
45
63
  else
46
64
  if m = current.reverse.match(/#{"#{$/}# Table: ".reverse}/m)
47
65
  offset = current.length - m.end(0) + 1
@@ -52,7 +70,7 @@ module Sequel
52
70
  current = current[0...offset].rstrip
53
71
  end
54
72
  end
55
- current += "#{$/}#{$/}#{schema_comment}"
73
+ current += "#{$/}#{$/}#{schema_comment(options)}"
56
74
  end
57
75
 
58
76
  if orig != current
@@ -67,17 +85,38 @@ module Sequel
67
85
  # key constraints in this table referencing other tables.
68
86
  # On PostgreSQL, also includes check constraints, triggers,
69
87
  # and foreign key constraints in other tables referencing this table.
70
- def schema_comment
88
+ #
89
+ # Options:
90
+ # :border :: Include a border above and below the comment.
91
+ # :indexes :: Do not include indexes in annotation if set to +false+.
92
+ # :foreign_keys :: Do not include foreign key constraints in annotation if set to +false+.
93
+ #
94
+ # PostgreSQL-specific options:
95
+ # :constraints :: Do not include check constraints if set to +false+.
96
+ # :references :: Do not include foreign key constraints in other tables referencing
97
+ # this table if set to +false+.
98
+ # :triggers :: Do not include triggers in annotation if set to +false+.
99
+ def schema_comment(options = {})
100
+ return "" if skip_model?
101
+
71
102
  output = []
72
- output << "# Table: #{model.table_name}"
103
+ output << "# Table: #{model.dataset.with_quote_identifiers(false).literal(model.table_name)}"
73
104
 
74
105
  meth = :"_schema_comment_#{model.db.database_type}"
75
106
  if respond_to?(meth, true)
76
- send(meth, output)
107
+ send(meth, output, options)
77
108
  else
78
109
  schema_comment_columns(output)
79
- schema_comment_indexes(output)
80
- schema_comment_foreign_keys(output)
110
+ schema_comment_indexes(output) unless options[:indexes] == false
111
+ schema_comment_foreign_keys(output) unless options[:foreign_keys] == false
112
+ end
113
+
114
+
115
+ # Add beginning and end to the table if specified
116
+ if options[:border]
117
+ border = "# #{'-' * (output.map(&:size).max - 2)}"
118
+ output.push(border)
119
+ output.insert(1, border)
81
120
  end
82
121
 
83
122
  output.join($/)
@@ -96,105 +135,151 @@ module Sequel
96
135
 
97
136
  cols.times do |i|
98
137
  rows.each do |r|
99
- 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]
100
139
  end
101
140
  end
102
141
 
103
142
  rows.map do |r|
104
- "# #{r.zip(lengths).map{|c, l| c.ljust(l)}.join(' | ')}".strip
143
+ "# #{r.zip(lengths).map{|c, l| c.to_s.ljust(l).gsub("\n", "\n# ")}.join(' | ')}".strip
105
144
  end
106
145
  end
107
146
 
108
147
  # Use the standard columns schema output, but use PostgreSQL specific
109
148
  # code for additional schema information.
110
- def _schema_comment_postgres(output)
111
- schema_comment_columns(output)
149
+ def _schema_comment_postgres(output, options = {})
150
+ _table_comment_postgres(output, options)
151
+ schema_comment_columns(output, options)
112
152
  oid = model.db.send(:regclass_oid, model.table_name)
113
153
 
114
154
  # These queries below are all based on the queries that psql
115
155
  # uses, captured using the -E option to psql.
116
156
 
117
- rows = model.db.fetch(<<SQL, :oid=>oid).all
157
+ unless options[:indexes] == false
158
+ rows = model.db.fetch(<<SQL, :oid=>oid).all
118
159
  SELECT c2.relname, i.indisprimary, i.indisunique, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true)
119
160
  FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
120
161
  LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x'))
121
162
  WHERE c.oid = :oid AND c.oid = i.indrelid AND i.indexrelid = c2.oid AND indisvalid
122
163
  ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname;
123
164
  SQL
124
- unless rows.empty?
125
- output << "# Indexes:"
126
- rows = rows.map do |r|
127
- [r[:relname], "#{"PRIMARY KEY " if r[:indisprimary]}#{"UNIQUE " if r[:indisunique] && !r[:indisprimary]}#{r[:pg_get_indexdef].match(/USING (.+)\z/m)[1]}"]
165
+ unless rows.empty?
166
+ output << "# Indexes:"
167
+ rows = rows.map do |r|
168
+ [r[:relname], "#{"PRIMARY KEY " if r[:indisprimary]}#{"UNIQUE " if r[:indisunique] && !r[:indisprimary]}#{r[:pg_get_indexdef].match(/USING (.+)\z/m)[1]}"]
169
+ end
170
+ output.concat(align(rows))
128
171
  end
129
- output.concat(align(rows))
130
172
  end
131
173
 
132
- rows = model.db.fetch(<<SQL, :oid=>oid).all
174
+ unless options[:constraints] == false
175
+ rows = model.db.fetch(<<SQL, :oid=>oid).all
133
176
  SELECT r.conname, pg_catalog.pg_get_constraintdef(r.oid, true)
134
177
  FROM pg_catalog.pg_constraint r
135
178
  WHERE r.conrelid = :oid AND r.contype = 'c'
136
179
  ORDER BY 1;
137
180
  SQL
138
- unless rows.empty?
139
- output << "# Check constraints:"
140
- rows = rows.map do |r|
141
- [r[:conname], r[:pg_get_constraintdef].match(/CHECK (.+)\z/m)[1]]
181
+ unless rows.empty?
182
+ output << "# Check constraints:"
183
+ rows = rows.map do |r|
184
+ [r[:conname], r[:pg_get_constraintdef].match(/CHECK (.+)\z/m)[1]]
185
+ end
186
+ output.concat(align(rows))
142
187
  end
143
- output.concat(align(rows))
144
188
  end
145
189
 
146
- rows = model.db.fetch(<<SQL, :oid=>oid).all
190
+ unless options[:foreign_keys] == false
191
+ rows = model.db.fetch(<<SQL, :oid=>oid).all
147
192
  SELECT conname,
148
193
  pg_catalog.pg_get_constraintdef(r.oid, true) as condef
149
194
  FROM pg_catalog.pg_constraint r
150
195
  WHERE r.conrelid = :oid AND r.contype = 'f' ORDER BY 1;
151
196
  SQL
152
- unless rows.empty?
153
- output << "# Foreign key constraints:"
154
- rows = rows.map do |r|
155
- [r[:conname], r[:condef].match(/FOREIGN KEY (.+)\z/m)[1]]
197
+ unless rows.empty?
198
+ output << "# Foreign key constraints:"
199
+ rows = rows.map do |r|
200
+ [r[:conname], r[:condef].match(/FOREIGN KEY (.+)\z/m)[1]]
201
+ end
202
+ output.concat(align(rows))
156
203
  end
157
- output.concat(align(rows))
158
204
  end
159
205
 
160
- rows = model.db.fetch(<<SQL, :oid=>oid).all
161
- SELECT conname, conrelid::pg_catalog.regclass,
206
+ unless options[:references] == false
207
+ rows = model.db.fetch(<<SQL, :oid=>oid).all
208
+ SELECT conname, conrelid::pg_catalog.regclass::text,
162
209
  pg_catalog.pg_get_constraintdef(c.oid, true) as condef
163
210
  FROM pg_catalog.pg_constraint c
164
211
  WHERE c.confrelid = :oid AND c.contype = 'f' ORDER BY 2, 1;
165
212
  SQL
166
- unless rows.empty?
167
- output << "# Referenced By:"
168
- rows = rows.map do |r|
169
- [r[:conrelid], r[:conname], r[:condef].match(/FOREIGN KEY (.+)\z/m)[1]]
213
+ unless rows.empty?
214
+ output << "# Referenced By:"
215
+ rows = rows.map do |r|
216
+ [r[:conrelid], r[:conname], r[:condef].match(/FOREIGN KEY (.+)\z/m)[1]]
217
+ end
218
+ output.concat(align(rows))
170
219
  end
171
- output.concat(align(rows))
172
220
  end
173
221
 
174
- rows = model.db.fetch(<<SQL, :oid=>oid).all
222
+ unless options[:triggers] == false
223
+ rows = model.db.fetch(<<SQL, :oid=>oid).all
175
224
  SELECT t.tgname, pg_catalog.pg_get_triggerdef(t.oid, true), t.tgenabled, t.tgisinternal
176
225
  FROM pg_catalog.pg_trigger t
177
226
  WHERE t.tgrelid = :oid AND (NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D'))
178
227
  ORDER BY 1;
179
228
  SQL
180
- unless rows.empty?
181
- output << "# Triggers:"
182
- rows = rows.map do |r|
183
- [r[:tgname], r[:pg_get_triggerdef].match(/((?:BEFORE|AFTER) .+)\z/m)[1]]
229
+ unless rows.empty?
230
+ output << "# Triggers:"
231
+ rows = rows.map do |r|
232
+ [r[:tgname], r[:pg_get_triggerdef].match(/((?:BEFORE|AFTER) .+)\z/m)[1]]
233
+ end
234
+ output.concat(align(rows))
184
235
  end
185
- output.concat(align(rows))
236
+ end
237
+ end
238
+
239
+ def _column_comments_postgres
240
+ model.db.fetch(<<SQL, :oid=>model.db.send(:regclass_oid, model.table_name)).to_hash(:attname, :description)
241
+ SELECT a.attname, d.description
242
+ FROM pg_description d
243
+ JOIN pg_attribute a ON (d.objoid = a.attrelid AND d.objsubid = a.attnum)
244
+ WHERE d.objoid = :oid AND COALESCE(d.description, '') != '';
245
+ SQL
246
+ end
247
+
248
+ def _table_comment_postgres(output, options = {})
249
+ return if options[:comments] == false
250
+
251
+ if table_comment = model.db.fetch(<<SQL, :oid=>model.db.send(:regclass_oid, model.table_name)).single_value
252
+ SELECT obj_description(CAST(:oid AS regclass), 'pg_class') AS "comment" LIMIT 1;
253
+ SQL
254
+ text = align([["Comment: #{table_comment}"]])
255
+ text[0][1] = ''
256
+ output.concat(text)
186
257
  end
187
258
  end
188
259
 
189
260
  # The standard column schema information to output.
190
- def schema_comment_columns(output)
261
+ def schema_comment_columns(output, options = {})
191
262
  if cpk = model.primary_key.is_a?(Array)
192
263
  output << "# Primary Key: (#{model.primary_key.join(', ')})"
193
264
  end
194
265
  output << "# Columns:"
266
+
267
+ meth = :"_column_comments_#{model.db.database_type}"
268
+ column_comments = if options[:comments] != false && respond_to?(meth, true)
269
+ send(meth)
270
+ else
271
+ {}
272
+ end
273
+
195
274
  rows = model.columns.map do |col|
196
275
  sch = model.db_schema[col]
197
- [col.to_s, sch[:db_type], "#{"PRIMARY KEY #{"AUTOINCREMENT " if sch[:auto_increment] && model.db.database_type != :postgres}" if sch[:primary_key] && !cpk}#{"NOT NULL " if sch[:allow_null] == false && !sch[:primary_key]}#{"DEFAULT #{sch[:default]}" if sch[:default]}#{"GENERATED BY DEFAULT AS IDENTITY" if sch[:auto_increment] && !sch[:default] && model.db.database_type == :postgres && model.db.server_version >= 100000}"]
276
+ parts = [
277
+ col.to_s,
278
+ sch[:db_domain_type] || sch[:db_type],
279
+ "#{"PRIMARY KEY #{"AUTOINCREMENT " if sch[:auto_increment] && model.db.database_type != :postgres}" if sch[:primary_key] && !cpk}#{"NOT NULL " if sch[:allow_null] == false && !sch[:primary_key]}#{"DEFAULT #{sch[:default]}" if sch[:default]}#{"GENERATED BY DEFAULT AS IDENTITY" if sch[:auto_increment] && !sch[:default] && model.db.database_type == :postgres && model.db.server_version >= 100000}",
280
+ ]
281
+ parts << (column_comments[col.to_s] || '') unless column_comments.empty?
282
+ parts
198
283
  end
199
284
  output.concat(align(rows))
200
285
  end
@@ -220,5 +305,13 @@ SQL
220
305
  output.concat(align(rows).sort)
221
306
  end
222
307
  end
308
+
309
+ # Whether we should skip annotations for the model.
310
+ # True if the model selects from a dataset.
311
+ def skip_model?
312
+ model.dataset.joined_dataset? || model.dataset.first_source_table.is_a?(Dataset)
313
+ rescue Sequel::Error
314
+ true
315
+ end
223
316
  end
224
317
  end
@@ -0,0 +1,7 @@
1
+ dataset =
2
+ SDB[:items]
3
+ .left_join(:categories, { id: :category_id })
4
+ .select { Sequel[:items][:name] }
5
+
6
+ class SComplexDataset < Sequel::Model(dataset)
7
+ end
@@ -0,0 +1,20 @@
1
+ # coding: xyz
2
+
3
+ class SItemWithCoding < Sequel::Model(SDB[:items])
4
+ end
5
+
6
+ # Table: items
7
+ # Columns:
8
+ # id | integer | PRIMARY KEY AUTOINCREMENT
9
+ # category_id | integer | NOT NULL
10
+ # manufacturer_name | varchar(50) |
11
+ # manufacturer_location | varchar(255) |
12
+ # in_stock | boolean | DEFAULT 0
13
+ # name | varchar(255) | DEFAULT 'John'
14
+ # price | double precision | DEFAULT 0
15
+ # Indexes:
16
+ # manufacturer_name | (manufacturer_name)
17
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
18
+ # Foreign key constraints:
19
+ # (category_id) REFERENCES categories
20
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ class SItemWithEncoding < Sequel::Model(SDB[:items])
4
+ end
5
+
6
+ # Table: items
7
+ # Columns:
8
+ # id | integer | PRIMARY KEY AUTOINCREMENT
9
+ # category_id | integer | NOT NULL
10
+ # manufacturer_name | varchar(50) |
11
+ # manufacturer_location | varchar(255) |
12
+ # in_stock | boolean | DEFAULT 0
13
+ # name | varchar(255) | DEFAULT 'John'
14
+ # price | double precision | DEFAULT 0
15
+ # Indexes:
16
+ # manufacturer_name | (manufacturer_name)
17
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
18
+ # Foreign key constraints:
19
+ # (category_id) REFERENCES categories
20
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SItemWithFrozenLiteral < Sequel::Model(SDB[:items])
4
+ end
5
+
6
+ # Table: items
7
+ # Columns:
8
+ # id | integer | PRIMARY KEY AUTOINCREMENT
9
+ # category_id | integer | NOT NULL
10
+ # manufacturer_name | varchar(50) |
11
+ # manufacturer_location | varchar(255) |
12
+ # in_stock | boolean | DEFAULT 0
13
+ # name | varchar(255) | DEFAULT 'John'
14
+ # price | double precision | DEFAULT 0
15
+ # Indexes:
16
+ # manufacturer_name | (manufacturer_name)
17
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
18
+ # Foreign key constraints:
19
+ # (category_id) REFERENCES categories
20
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
@@ -0,0 +1,20 @@
1
+ # warn_indent: true
2
+
3
+ class SItemWithWarnIndent < Sequel::Model(SDB[:items])
4
+ end
5
+
6
+ # Table: items
7
+ # Columns:
8
+ # id | integer | PRIMARY KEY AUTOINCREMENT
9
+ # category_id | integer | NOT NULL
10
+ # manufacturer_name | varchar(50) |
11
+ # manufacturer_location | varchar(255) |
12
+ # in_stock | boolean | DEFAULT 0
13
+ # name | varchar(255) | DEFAULT 'John'
14
+ # price | double precision | DEFAULT 0
15
+ # Indexes:
16
+ # manufacturer_name | (manufacturer_name)
17
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
18
+ # Foreign key constraints:
19
+ # (category_id) REFERENCES categories
20
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
@@ -0,0 +1,21 @@
1
+ # warn_past_scope: true
2
+ # warn_indent: false
3
+ # Additional comment that should stay
4
+ class SItemWithWarnPastScope < Sequel::Model(SDB[:items])
5
+ end
6
+
7
+ # Table: items
8
+ # Columns:
9
+ # id | integer | PRIMARY KEY AUTOINCREMENT
10
+ # category_id | integer | NOT NULL
11
+ # manufacturer_name | varchar(50) |
12
+ # manufacturer_location | varchar(255) |
13
+ # in_stock | boolean | DEFAULT 0
14
+ # name | varchar(255) | DEFAULT 'John'
15
+ # price | double precision | DEFAULT 0
16
+ # Indexes:
17
+ # manufacturer_name | (manufacturer_name)
18
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
19
+ # Foreign key constraints:
20
+ # (category_id) REFERENCES categories
21
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
@@ -0,0 +1,7 @@
1
+ dataset =
2
+ SDB[:items]
3
+ .left_join(:categories, { id: :category_id })
4
+ .select { Sequel[:items][:name] }
5
+
6
+ class SComplexDataset < Sequel::Model(dataset)
7
+ end
@@ -0,0 +1,20 @@
1
+ # coding: xyz
2
+
3
+ # Table: items
4
+ # Columns:
5
+ # id | integer | PRIMARY KEY AUTOINCREMENT
6
+ # category_id | integer | NOT NULL
7
+ # manufacturer_name | varchar(50) |
8
+ # manufacturer_location | varchar(255) |
9
+ # in_stock | boolean | DEFAULT 0
10
+ # name | varchar(255) | DEFAULT 'John'
11
+ # price | double precision | DEFAULT 0
12
+ # Indexes:
13
+ # manufacturer_name | (manufacturer_name)
14
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
15
+ # Foreign key constraints:
16
+ # (category_id) REFERENCES categories
17
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
18
+
19
+ class SItemWithCoding < Sequel::Model(SDB[:items])
20
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ # Table: items
4
+ # Columns:
5
+ # id | integer | PRIMARY KEY AUTOINCREMENT
6
+ # category_id | integer | NOT NULL
7
+ # manufacturer_name | varchar(50) |
8
+ # manufacturer_location | varchar(255) |
9
+ # in_stock | boolean | DEFAULT 0
10
+ # name | varchar(255) | DEFAULT 'John'
11
+ # price | double precision | DEFAULT 0
12
+ # Indexes:
13
+ # manufacturer_name | (manufacturer_name)
14
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
15
+ # Foreign key constraints:
16
+ # (category_id) REFERENCES categories
17
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
18
+
19
+ class SItemWithEncoding < Sequel::Model(SDB[:items])
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Table: items
4
+ # Columns:
5
+ # id | integer | PRIMARY KEY AUTOINCREMENT
6
+ # category_id | integer | NOT NULL
7
+ # manufacturer_name | varchar(50) |
8
+ # manufacturer_location | varchar(255) |
9
+ # in_stock | boolean | DEFAULT 0
10
+ # name | varchar(255) | DEFAULT 'John'
11
+ # price | double precision | DEFAULT 0
12
+ # Indexes:
13
+ # manufacturer_name | (manufacturer_name)
14
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
15
+ # Foreign key constraints:
16
+ # (category_id) REFERENCES categories
17
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
18
+
19
+ class SItemWithFrozenLiteral < Sequel::Model(SDB[:items])
20
+ end
@@ -0,0 +1,20 @@
1
+ # warn_indent: true
2
+
3
+ # Table: items
4
+ # Columns:
5
+ # id | integer | PRIMARY KEY AUTOINCREMENT
6
+ # category_id | integer | NOT NULL
7
+ # manufacturer_name | varchar(50) |
8
+ # manufacturer_location | varchar(255) |
9
+ # in_stock | boolean | DEFAULT 0
10
+ # name | varchar(255) | DEFAULT 'John'
11
+ # price | double precision | DEFAULT 0
12
+ # Indexes:
13
+ # manufacturer_name | (manufacturer_name)
14
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
15
+ # Foreign key constraints:
16
+ # (category_id) REFERENCES categories
17
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
18
+
19
+ class SItemWithWarnIndent < Sequel::Model(SDB[:items])
20
+ end
@@ -0,0 +1,21 @@
1
+ # warn_past_scope: true
2
+ # warn_indent: false
3
+ # Table: items
4
+ # Columns:
5
+ # id | integer | PRIMARY KEY AUTOINCREMENT
6
+ # category_id | integer | NOT NULL
7
+ # manufacturer_name | varchar(50) |
8
+ # manufacturer_location | varchar(255) |
9
+ # in_stock | boolean | DEFAULT 0
10
+ # name | varchar(255) | DEFAULT 'John'
11
+ # price | double precision | DEFAULT 0
12
+ # Indexes:
13
+ # manufacturer_name | (manufacturer_name)
14
+ # name | UNIQUE (manufacturer_name, manufacturer_location)
15
+ # Foreign key constraints:
16
+ # (category_id) REFERENCES categories
17
+ # (manufacturer_name, manufacturer_location) REFERENCES manufacturers
18
+
19
+ # Additional comment that should stay
20
+ class SItemWithWarnPastScope < Sequel::Model(SDB[:items])
21
+ end
@@ -4,10 +4,12 @@ require File.join(File.dirname(File.expand_path(__FILE__)), '../lib/sequel/annot
4
4
 
5
5
  ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
6
6
  gem 'minitest'
7
- require 'minitest/autorun'
7
+ require 'minitest/global_expectations/autorun'
8
8
 
9
9
  DB = Sequel.connect(ENV['SEQUEL_ANNOTATE_SPEC_POSTGRES_URL'] || 'postgres:///sequel_annotate_test?user=sequel_annotate&password=sequel_annotate')
10
- raise "test database name doesn't end with test" unless DB.get{current_database.function} =~ /test\z/
10
+ unless ENV['SEQUEL_ANNOTATE_SPEC_CI'] == '1' || DB.get{current_database.function} =~ /test\z/
11
+ raise "test database name doesn't end with test"
12
+ end
11
13
  if defined?(JRUBY_VERSION)
12
14
  SDB = Sequel.connect('jdbc:sqlite::memory:')
13
15
  else
@@ -16,7 +18,7 @@ end
16
18
 
17
19
  DB.drop_function(:valid_price) rescue nil
18
20
  [DB, SDB].each do |db|
19
- db.drop_table?(:items, :manufacturers, :categories)
21
+ db.drop_table?(:newline_tests, :items, :manufacturers, :categories, :comment_tests)
20
22
 
21
23
  db.create_table :categories do
22
24
  primary_key :id
@@ -32,7 +34,7 @@ DB.drop_function(:valid_price) rescue nil
32
34
  db.create_table :items do
33
35
  primary_key :id
34
36
  foreign_key :category_id, :categories, :null => false
35
- foreign_key [:manufacturer_name, :manufacturer_location], :manufacturers
37
+ foreign_key [:manufacturer_name, :manufacturer_location], :manufacturers, :name=>:items_manufacturer_name_fkey
36
38
 
37
39
  String :manufacturer_name, :size => 50
38
40
  String :manufacturer_location
@@ -45,6 +47,12 @@ DB.drop_function(:valid_price) rescue nil
45
47
  index [:manufacturer_name, :manufacturer_location], :name=>:name, :unique=>true
46
48
  index [:manufacturer_name], :name=>:manufacturer_name
47
49
  end
50
+
51
+ db.create_table :newline_tests do
52
+ Integer :abcde_fghi_id
53
+ Integer :jkl_mnopqr_id
54
+ constraint(:valid_stuvw_xyz0, Sequel.case({{:abcde_fghi_id=>[5,6]}=>Sequel.~(:jkl_mnopqr_id=>nil)}, :jkl_mnopqr_id=>nil))
55
+ end
48
56
  end
49
57
 
50
58
  DB.run <<SQL
@@ -64,17 +72,44 @@ CREATE TRIGGER valid_price BEFORE INSERT OR UPDATE ON items
64
72
  FOR EACH ROW EXECUTE PROCEDURE valid_price();
65
73
  SQL
66
74
 
75
+ DB.run "CREATE DOMAIN test_domain AS text"
76
+
77
+ DB.create_table :domain_tests do
78
+ primary_key :id
79
+ test_domain :test_column
80
+ end
81
+
82
+ DB.create_table :comment_tests do
83
+ primary_key :id
84
+ String :name
85
+ end
86
+
87
+ DB.run "COMMENT ON COLUMN comment_tests.name IS 'name column comment'"
88
+ DB.run "COMMENT ON TABLE comment_tests IS 'comment_tests table comment'"
89
+
67
90
  Minitest.after_run do
68
- DB.drop_table(:items, :manufacturers, :categories)
91
+ DB.drop_table(:items, :manufacturers, :categories, :domain_tests, :comment_tests)
92
+ DB.run "DROP DOMAIN test_domain"
69
93
  DB.drop_function(:valid_price)
70
94
  end
71
95
 
72
96
  class ::Item < Sequel::Model; end
73
97
  class ::Category < Sequel::Model; end
74
98
  class ::Manufacturer < Sequel::Model; end
99
+ class ::DomainTest < Sequel::Model; end
100
+ class ::CommentTest < Sequel::Model; end
75
101
  class ::SItem < Sequel::Model(SDB[:items]); end
102
+ class ::SItemWithFrozenLiteral < Sequel::Model(SDB[:items]); end
103
+ class ::SItemWithCoding < Sequel::Model(SDB[:items]); end
104
+ class ::SItemWithEncoding < Sequel::Model(SDB[:items]); end
105
+ class ::SItemWithWarnIndent < Sequel::Model(SDB[:items]); end
106
+ class ::SItemWithWarnPastScope < Sequel::Model(SDB[:items]); end
107
+ class ::SItemWithMagicComment < Sequel::Model(SDB[:items]); end
76
108
  class ::SCategory < Sequel::Model(SDB[:categories]); end
77
109
  class ::SManufacturer < Sequel::Model(SDB[:manufacturers]); end
110
+ class ::NewlineTest < Sequel::Model; end
111
+ class ::QualifiedTableNameTest < Sequel::Model(Sequel.qualify(:public, :categories)); end
112
+ class SComplexDataset < Sequel::Model(SDB[:items].left_join(:categories, :id => :category_id).select{items[:name]}); end
78
113
 
79
114
  # Abstract Base Class
80
115
  ABC = Class.new(Sequel::Model)
@@ -90,6 +125,9 @@ describe Sequel::Annotate do
90
125
  if DB.server_version >= 100002 && (Sequel::MAJOR > 5 || (Sequel::MAJOR == 5 && Sequel::MINOR >= 7))
91
126
  comment = comment.sub(/DEFAULT nextval\('[a-z]+_id_seq'::regclass\)/, 'GENERATED BY DEFAULT AS IDENTITY')
92
127
  end
128
+ if DB.server_version >= 120000
129
+ comment = comment.gsub(/FOR EACH ROW EXECUTE PROCEDURE/, 'FOR EACH ROW EXECUTE FUNCTION')
130
+ end
93
131
  comment
94
132
  end
95
133
 
@@ -100,6 +138,52 @@ describe Sequel::Annotate do
100
138
  Dir['spec/tmp/*.rb'].each{|f| File.delete(f)}
101
139
  end
102
140
 
141
+ it "skips files with the sequel-annotate magic comment set to false" do
142
+ FileUtils.cp('spec/unannotated/sitemwithmagiccomment.rb', 'spec/tmp/')
143
+ Sequel::Annotate.annotate(['spec/tmp/sitemwithmagiccomment.rb'])
144
+ File.read('spec/tmp/sitemwithmagiccomment.rb').must_equal File.read('spec/unannotated/sitemwithmagiccomment.rb')
145
+ end
146
+
147
+ it "#schema_info should not return sections we set to false" do
148
+ Sequel::Annotate.new(Item).schema_comment(:indexes => false, :constraints => false, :foreign_keys => false, :triggers => false).must_equal(fix_pg_comment((<<OUTPUT).chomp))
149
+ # Table: items
150
+ # Columns:
151
+ # id | integer | PRIMARY KEY DEFAULT nextval('items_id_seq'::regclass)
152
+ # category_id | integer | NOT NULL
153
+ # manufacturer_name | character varying(50) |
154
+ # manufacturer_location | text |
155
+ # in_stock | boolean | DEFAULT false
156
+ # name | text | DEFAULT 'John'::text
157
+ # price | double precision | DEFAULT 0
158
+ OUTPUT
159
+
160
+ Sequel::Annotate.new(Category).schema_comment(:references => false).must_equal(fix_pg_comment((<<OUTPUT).chomp))
161
+ # Table: categories
162
+ # Columns:
163
+ # id | integer | PRIMARY KEY DEFAULT nextval('categories_id_seq'::regclass)
164
+ # name | text | NOT NULL
165
+ # Indexes:
166
+ # categories_pkey | PRIMARY KEY btree (id)
167
+ # categories_name_key | UNIQUE btree (name)
168
+ OUTPUT
169
+ end
170
+
171
+ it "#schema_info should return a border if we want one" do
172
+ Sequel::Annotate.new(Item).schema_comment(:border => true, :indexes => false, :constraints => false, :foreign_keys => false, :triggers => false).gsub(/----+/, '---').must_equal(fix_pg_comment((<<OUTPUT).chomp))
173
+ # Table: items
174
+ # ---
175
+ # Columns:
176
+ # id | integer | PRIMARY KEY DEFAULT nextval('items_id_seq'::regclass)
177
+ # category_id | integer | NOT NULL
178
+ # manufacturer_name | character varying(50) |
179
+ # manufacturer_location | text |
180
+ # in_stock | boolean | DEFAULT false
181
+ # name | text | DEFAULT 'John'::text
182
+ # price | double precision | DEFAULT 0
183
+ # ---
184
+ OUTPUT
185
+ end
186
+
103
187
  it "#schema_info should return the model schema comment" do
104
188
  Sequel::Annotate.new(Item).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
105
189
  # Table: items
@@ -124,6 +208,7 @@ describe Sequel::Annotate do
124
208
  # valid_price | BEFORE INSERT OR UPDATE ON items FOR EACH ROW EXECUTE PROCEDURE valid_price()
125
209
  OUTPUT
126
210
 
211
+ Sequel::Annotate.new(SComplexDataset).schema_comment.must_equal("")
127
212
  Sequel::Annotate.new(Category).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
128
213
  # Table: categories
129
214
  # Columns:
@@ -146,6 +231,19 @@ OUTPUT
146
231
  # manufacturers_pkey | PRIMARY KEY btree (name, location)
147
232
  # Referenced By:
148
233
  # items | items_manufacturer_name_fkey | (manufacturer_name, manufacturer_location) REFERENCES manufacturers(name, location)
234
+ OUTPUT
235
+
236
+ Sequel::Annotate.new(NewlineTest).schema_comment.must_equal((<<OUTPUT).chomp)
237
+ # Table: newline_tests
238
+ # Columns:
239
+ # abcde_fghi_id | integer |
240
+ # jkl_mnopqr_id | integer |
241
+ # Check constraints:
242
+ # valid_stuvw_xyz0 | (
243
+ # CASE
244
+ # WHEN abcde_fghi_id = ANY (ARRAY[5, 6]) THEN jkl_mnopqr_id IS NOT NULL
245
+ # ELSE jkl_mnopqr_id IS NULL
246
+ # END)
149
247
  OUTPUT
150
248
 
151
249
  Sequel::Annotate.new(SItem).schema_comment.must_equal((<<OUTPUT).chomp)
@@ -181,6 +279,37 @@ OUTPUT
181
279
  # Columns:
182
280
  # name | varchar(255) |
183
281
  # location | varchar(255) |
282
+ OUTPUT
283
+
284
+ Sequel::Annotate.new(QualifiedTableNameTest).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
285
+ # Table: public.categories
286
+ # Columns:
287
+ # id | integer | PRIMARY KEY DEFAULT nextval('categories_id_seq'::regclass)
288
+ # name | text | NOT NULL
289
+ # Indexes:
290
+ # categories_pkey | PRIMARY KEY btree (id)
291
+ # categories_name_key | UNIQUE btree (name)
292
+ # Referenced By:
293
+ # items | items_category_id_fkey | (category_id) REFERENCES categories(id)
294
+ OUTPUT
295
+
296
+ Sequel::Annotate.new(DomainTest).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
297
+ # Table: domain_tests
298
+ # Columns:
299
+ # id | integer | PRIMARY KEY DEFAULT nextval('categories_id_seq'::regclass)
300
+ # test_column | test_domain |
301
+ # Indexes:
302
+ # domain_tests_pkey | PRIMARY KEY btree (id)
303
+ OUTPUT
304
+
305
+ Sequel::Annotate.new(CommentTest).schema_comment.must_equal(fix_pg_comment((<<OUTPUT).chomp))
306
+ # Table: comment_tests
307
+ # Comment: comment_tests table comment
308
+ # Columns:
309
+ # id | integer | PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY |
310
+ # name | text | | name column comment
311
+ # Indexes:
312
+ # comment_tests_pkey | PRIMARY KEY btree (id)
184
313
  OUTPUT
185
314
  end
186
315
 
@@ -188,7 +317,7 @@ OUTPUT
188
317
  it "#annotate #{desc} should annotate the file comment" do
189
318
  FileUtils.cp(Dir['spec/unannotated/*.rb'], 'spec/tmp')
190
319
 
191
- [Item, Category, Manufacturer, SItem, SCategory, SManufacturer].each do |model|
320
+ [Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope, SComplexDataset].each do |model|
192
321
  filename = model.name.downcase
193
322
  2.times do
194
323
  Sequel::Annotate.new(model).annotate("spec/tmp/#{filename}.rb", *args)
@@ -204,7 +333,7 @@ OUTPUT
204
333
 
205
334
  2.times do
206
335
  Sequel::Annotate.annotate(Dir["spec/tmp/*.rb"], *args)
207
- [Item, Category, Manufacturer, SItem, SCategory, SManufacturer].each do |model|
336
+ [Item, Category, Manufacturer, SItem, SCategory, SManufacturer, SItemWithFrozenLiteral, SItemWithCoding, SItemWithEncoding, SItemWithWarnIndent, SItemWithWarnPastScope, SComplexDataset].each do |model|
208
337
  filename = model.name.downcase
209
338
  expected = File.read("spec/annotated_#{pos}/#{filename}.rb")
210
339
  expected = fix_pg_comment(expected) if model.db == DB
@@ -218,5 +347,14 @@ OUTPUT
218
347
  FileUtils.cp('spec/namespaced/itm_unannotated.rb', 'spec/tmp/')
219
348
  Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>'ModelNamespace')
220
349
  File.read("spec/tmp/itm_unannotated.rb").must_equal fix_pg_comment(File.read('spec/namespaced/itm_annotated.rb'))
350
+ Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>'ModelNamespace', :border=>true)
351
+ Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>'ModelNamespace')
352
+ File.read("spec/tmp/itm_unannotated.rb").must_equal fix_pg_comment(File.read('spec/namespaced/itm_annotated.rb'))
353
+ end
354
+
355
+ it ".annotate #{desc} should handle :namespace => true option" do
356
+ FileUtils.cp('spec/namespaced/itm_unannotated.rb', 'spec/tmp')
357
+ Sequel::Annotate.annotate(["spec/tmp/itm_unannotated.rb"], :namespace=>true)
358
+ File.read("spec/tmp/itm_unannotated.rb").must_equal fix_pg_comment(File.read('spec/namespaced/itm_annotated.rb'))
221
359
  end
222
360
  end
@@ -0,0 +1,4 @@
1
+ class NotModel
2
+ class << self
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ dataset =
2
+ SDB[:items]
3
+ .left_join(:categories, { id: :category_id })
4
+ .select { Sequel[:items][:name] }
5
+
6
+ class SComplexDataset < Sequel::Model(dataset)
7
+ end
@@ -0,0 +1,4 @@
1
+ # coding: xyz
2
+
3
+ class SItemWithCoding < Sequel::Model(SDB[:items])
4
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+
3
+ class SItemWithEncoding < Sequel::Model(SDB[:items])
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SItemWithFrozenLiteral < Sequel::Model(SDB[:items])
4
+ end
@@ -0,0 +1,4 @@
1
+ # sequel-annotate: false
2
+
3
+ class SItemWithMagicComment < Sequel::Model(SDB[:items])
4
+ end
@@ -0,0 +1,4 @@
1
+ # warn_indent: true
2
+
3
+ class SItemWithWarnIndent < Sequel::Model(SDB[:items])
4
+ end
@@ -0,0 +1,5 @@
1
+ # warn_past_scope: true
2
+ # warn_indent: false
3
+ # Additional comment that should stay
4
+ class SItemWithWarnPastScope < Sequel::Model(SDB[:items])
5
+ 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.3.0
4
+ version: 1.7.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: 2018-07-17 00:00:00.000000000 Z
11
+ date: 2021-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-global_expectations
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pg
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,7 +86,7 @@ description: |
72
86
  constraints for the current table.
73
87
 
74
88
  On PostgreSQL, this includes more advanced information, including
75
- check constraints, triggers, and foreign keys constraints for other
89
+ check constraints, triggers, comments, and foreign keys constraints for other
76
90
  tables that reference the current table.
77
91
  email: code@jeremyevans.net
78
92
  executables: []
@@ -91,13 +105,25 @@ files:
91
105
  - spec/annotated_after/item.rb
92
106
  - spec/annotated_after/manufacturer.rb
93
107
  - spec/annotated_after/scategory.rb
108
+ - spec/annotated_after/scomplexdataset.rb
94
109
  - spec/annotated_after/sitem.rb
110
+ - spec/annotated_after/sitemwithcoding.rb
111
+ - spec/annotated_after/sitemwithencoding.rb
112
+ - spec/annotated_after/sitemwithfrozenliteral.rb
113
+ - spec/annotated_after/sitemwithwarnindent.rb
114
+ - spec/annotated_after/sitemwithwarnpastscope.rb
95
115
  - spec/annotated_after/smanufacturer.rb
96
116
  - spec/annotated_before/category.rb
97
117
  - spec/annotated_before/item.rb
98
118
  - spec/annotated_before/manufacturer.rb
99
119
  - spec/annotated_before/scategory.rb
120
+ - spec/annotated_before/scomplexdataset.rb
100
121
  - spec/annotated_before/sitem.rb
122
+ - spec/annotated_before/sitemwithcoding.rb
123
+ - spec/annotated_before/sitemwithencoding.rb
124
+ - spec/annotated_before/sitemwithfrozenliteral.rb
125
+ - spec/annotated_before/sitemwithwarnindent.rb
126
+ - spec/annotated_before/sitemwithwarnpastscope.rb
101
127
  - spec/annotated_before/smanufacturer.rb
102
128
  - spec/namespaced/itm_annotated.rb
103
129
  - spec/namespaced/itm_unannotated.rb
@@ -105,13 +131,24 @@ files:
105
131
  - spec/unannotated/category.rb
106
132
  - spec/unannotated/item.rb
107
133
  - spec/unannotated/manufacturer.rb
134
+ - spec/unannotated/not_model.rb
108
135
  - spec/unannotated/scategory.rb
136
+ - spec/unannotated/scomplexdataset.rb
109
137
  - spec/unannotated/sitem.rb
138
+ - spec/unannotated/sitemwithcoding.rb
139
+ - spec/unannotated/sitemwithencoding.rb
140
+ - spec/unannotated/sitemwithfrozenliteral.rb
141
+ - spec/unannotated/sitemwithmagiccomment.rb
142
+ - spec/unannotated/sitemwithwarnindent.rb
143
+ - spec/unannotated/sitemwithwarnpastscope.rb
110
144
  - spec/unannotated/smanufacturer.rb
111
145
  homepage: http://github.com/jeremyevans/sequel-annotate
112
146
  licenses:
113
147
  - MIT
114
- metadata: {}
148
+ metadata:
149
+ bug_tracker_uri: https://github.com/jeremyevans/sequel-annotate/issues
150
+ changelog_uri: https://github.com/jeremyevans/sequel-annotate/blob/master/CHANGELOG
151
+ source_code_uri: https://github.com/jeremyevans/sequel-annotate
115
152
  post_install_message:
116
153
  rdoc_options:
117
154
  - "--quiet"
@@ -134,8 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
171
  - !ruby/object:Gem::Version
135
172
  version: '0'
136
173
  requirements: []
137
- rubyforge_project:
138
- rubygems_version: 2.7.6
174
+ rubygems_version: 3.2.15
139
175
  signing_key:
140
176
  specification_version: 4
141
177
  summary: Annotate Sequel models with schema information