sequel 4.35.0 → 4.36.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +32 -0
  3. data/doc/association_basics.rdoc +27 -4
  4. data/doc/migration.rdoc +24 -0
  5. data/doc/release_notes/4.36.0.txt +116 -0
  6. data/lib/sequel/adapters/jdbc/h2.rb +1 -1
  7. data/lib/sequel/adapters/mysql2.rb +11 -1
  8. data/lib/sequel/adapters/oracle.rb +3 -5
  9. data/lib/sequel/adapters/postgres.rb +2 -2
  10. data/lib/sequel/adapters/shared/access.rb +1 -1
  11. data/lib/sequel/adapters/shared/oracle.rb +1 -1
  12. data/lib/sequel/adapters/shared/postgres.rb +1 -1
  13. data/lib/sequel/adapters/shared/sqlite.rb +1 -1
  14. data/lib/sequel/connection_pool.rb +5 -0
  15. data/lib/sequel/connection_pool/sharded_single.rb +1 -1
  16. data/lib/sequel/connection_pool/sharded_threaded.rb +29 -14
  17. data/lib/sequel/connection_pool/single.rb +1 -1
  18. data/lib/sequel/connection_pool/threaded.rb +5 -3
  19. data/lib/sequel/database/schema_methods.rb +7 -1
  20. data/lib/sequel/dataset/sql.rb +4 -0
  21. data/lib/sequel/extensions/arbitrary_servers.rb +1 -1
  22. data/lib/sequel/extensions/connection_expiration.rb +89 -0
  23. data/lib/sequel/extensions/connection_validator.rb +11 -3
  24. data/lib/sequel/extensions/constraint_validations.rb +28 -0
  25. data/lib/sequel/extensions/string_agg.rb +178 -0
  26. data/lib/sequel/model.rb +13 -56
  27. data/lib/sequel/model/associations.rb +3 -1
  28. data/lib/sequel/model/base.rb +104 -7
  29. data/lib/sequel/plugins/constraint_validations.rb +17 -3
  30. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  31. data/lib/sequel/sql.rb +8 -0
  32. data/lib/sequel/version.rb +1 -1
  33. data/spec/adapters/postgres_spec.rb +4 -0
  34. data/spec/core/dataset_spec.rb +4 -0
  35. data/spec/core/expression_filters_spec.rb +4 -0
  36. data/spec/extensions/connection_expiration_spec.rb +121 -0
  37. data/spec/extensions/connection_validator_spec.rb +7 -0
  38. data/spec/extensions/constraint_validations_plugin_spec.rb +14 -0
  39. data/spec/extensions/constraint_validations_spec.rb +64 -0
  40. data/spec/extensions/string_agg_spec.rb +85 -0
  41. data/spec/extensions/validation_helpers_spec.rb +2 -0
  42. data/spec/integration/plugin_test.rb +37 -2
  43. data/spec/model/association_reflection_spec.rb +10 -0
  44. data/spec/model/model_spec.rb +49 -0
  45. metadata +8 -2
@@ -78,6 +78,13 @@ connection_validator_specs = shared_description do
78
78
  c3.wont_be_same_as(c2)
79
79
  end
80
80
 
81
+ it "should not leak connection references during disconnect" do
82
+ @db.synchronize{}
83
+ @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 1
84
+ @db.disconnect
85
+ @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 0
86
+ end
87
+
81
88
  it "should not leak connection references" do
82
89
  c1 = @db.synchronize do |c|
83
90
  @db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
@@ -185,6 +185,20 @@ describe "Sequel::Plugins::ConstraintValidations" do
185
185
  @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Afoo\z/i}]])
186
186
  end
187
187
 
188
+ it "should handle operator validation" do
189
+ [[:str_lt, :<], [:str_lte, :<=], [:str_gt, :>], [:str_gte, :>=]].each do |vt, op|
190
+ model_class(:validation_type=>vt.to_s, :argument=>'a').constraint_validations.must_equal [[:validates_operator, op, 'a', :name]]
191
+ @c.constraint_validation_reflections.must_equal(:name=>[[:operator, {:operator=>op, :argument=>'a'}]])
192
+ @c = @c.db.constraint_validations = nil
193
+ end
194
+
195
+ [[:int_lt, :<], [:int_lte, :<=], [:int_gt, :>], [:int_gte, :>=]].each do |vt, op|
196
+ model_class(:validation_type=>vt.to_s, :argument=>'1').constraint_validations.must_equal [[:validates_operator, op, 1, :name]]
197
+ @c.constraint_validation_reflections.must_equal(:name=>[[:operator, {:operator=>op, :argument=>1}]])
198
+ @c = @c.db.constraint_validations = nil
199
+ end
200
+ end
201
+
188
202
  it "should handle like validation with % metacharacter" do
189
203
  model_class(:validation_type=>'like', :argument=>'%foo%').constraint_validations.must_equal [[:validates_format, /\A.*foo.*\z/, :name]]
190
204
  @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A.*foo.*\z/}]])
@@ -252,6 +252,62 @@ describe "constraint_validations extension" do
252
252
  sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (UPPER(name) LIKE UPPER('foo%') ESCAPE '\\')))"]
253
253
  end
254
254
 
255
+ it "should support :operator :< constraint validation with string" do
256
+ @db.create_table(:foo){String :name; validate{operator :<, 'a', :name}}
257
+ sqls = @db.sqls
258
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"str_lt", :column=>"name", :table=>"foo", :argument=>'a')
259
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name < 'a')))"]
260
+ end
261
+
262
+ it "should support :operator :<= constraint validation with string" do
263
+ @db.create_table(:foo){String :name; validate{operator :<=, 'a', :name}}
264
+ sqls = @db.sqls
265
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"str_lte", :column=>"name", :table=>"foo", :argument=>'a')
266
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name <= 'a')))"]
267
+ end
268
+
269
+ it "should support :operator :> constraint validation with string" do
270
+ @db.create_table(:foo){String :name; validate{operator :>, 'a', :name}}
271
+ sqls = @db.sqls
272
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"str_gt", :column=>"name", :table=>"foo", :argument=>'a')
273
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name > 'a')))"]
274
+ end
275
+
276
+ it "should support :operator :>= constraint validation with string" do
277
+ @db.create_table(:foo){String :name; validate{operator :>=, 'a', :name}}
278
+ sqls = @db.sqls
279
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"str_gte", :column=>"name", :table=>"foo", :argument=>'a')
280
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name >= 'a')))"]
281
+ end
282
+
283
+ it "should support :operator :< constraint validation with integer" do
284
+ @db.create_table(:foo){Integer :name; validate{operator :<, 2, :name}}
285
+ sqls = @db.sqls
286
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"int_lt", :column=>"name", :table=>"foo", :argument=>'2')
287
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK ((name IS NOT NULL) AND (name < 2)))"]
288
+ end
289
+
290
+ it "should support :operator :<= constraint validation with integer" do
291
+ @db.create_table(:foo){Integer :name; validate{operator :<=, 2, :name}}
292
+ sqls = @db.sqls
293
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"int_lte", :column=>"name", :table=>"foo", :argument=>'2')
294
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK ((name IS NOT NULL) AND (name <= 2)))"]
295
+ end
296
+
297
+ it "should support :operator :> constraint validation with integer" do
298
+ @db.create_table(:foo){Integer :name; validate{operator :>, 2, :name}}
299
+ sqls = @db.sqls
300
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"int_gt", :column=>"name", :table=>"foo", :argument=>'2')
301
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK ((name IS NOT NULL) AND (name > 2)))"]
302
+ end
303
+
304
+ it "should support :operator :>= constraint validation with integer" do
305
+ @db.create_table(:foo){Integer :name; validate{operator :>=, 2, :name}}
306
+ sqls = @db.sqls
307
+ parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"int_gte", :column=>"name", :table=>"foo", :argument=>'2')
308
+ sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK ((name IS NOT NULL) AND (name >= 2)))"]
309
+ end
310
+
255
311
  it "should support :unique constraint validation" do
256
312
  @db.create_table(:foo){String :name; validate{unique :name}}
257
313
  sqls = @db.sqls
@@ -297,6 +353,14 @@ describe "constraint_validations extension" do
297
353
  proc{@db.create_table(:foo){String :name; validate{includes 'a', :name}}}.must_raise(Sequel::Error)
298
354
  end
299
355
 
356
+ it "should raise an error if attempting attempting to process an operator validation with an unsupported operator" do
357
+ proc{@db.alter_table(:foo){String :name; validate{operator :===, 'a', :name}}}.must_raise(Sequel::Error)
358
+ end
359
+
360
+ it "should raise an error if attempting attempting to process an operator validation with an unsupported argument" do
361
+ proc{@db.alter_table(:foo){String :name; validate{operator :>, [], :name}}}.must_raise(Sequel::Error)
362
+ end
363
+
300
364
  it "should raise an error if attempting to drop a constraint validation in a create_table generator" do
301
365
  proc{@db.create_table(:foo){String :name; validate{drop :foo}}}.must_raise(Sequel::Error)
302
366
  end
@@ -0,0 +1,85 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+
4
+ describe "string_agg extension" do
5
+ dbf = lambda do |db_type|
6
+ db = Sequel.connect("mock://#{db_type}")
7
+ db.extension :string_agg
8
+ db
9
+ end
10
+
11
+ before(:all) do
12
+ Sequel.extension :string_agg
13
+ end
14
+ before do
15
+ @sa1 = Sequel.string_agg(:c)
16
+ @sa2 = Sequel.string_agg(:c, '-')
17
+ @sa3 = Sequel.string_agg(:c, '-').order(:o)
18
+ @sa4 = Sequel.string_agg(:c).order(:o).distinct
19
+ end
20
+
21
+ it "should use existing method" do
22
+ db = Sequel.mock
23
+ db.extend_datasets do
24
+ def string_agg_sql_append(sql, sa)
25
+ sql << "sa(#{sa.expr})"
26
+ end
27
+ end
28
+ db.extension :string_agg
29
+ db.literal(Sequel.string_agg(:c)).must_equal "sa(c)"
30
+ end
31
+
32
+ it "should correctly literalize on Postgres" do
33
+ db = dbf.call(:postgres)
34
+ db.literal(@sa1).must_equal "string_agg(c, ',')"
35
+ db.literal(@sa2).must_equal "string_agg(c, '-')"
36
+ db.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
37
+ db.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
38
+ end
39
+
40
+ it "should correctly literalize on SQLAnywhere" do
41
+ db = dbf.call(:sqlanywhere)
42
+ db.literal(@sa1).must_equal "list(c, ',')"
43
+ db.literal(@sa2).must_equal "list(c, '-')"
44
+ db.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
45
+ db.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
46
+ end
47
+
48
+ it "should correctly literalize on MySQL, H2, HSQLDB, CUBRID" do
49
+ [:mysql, :h2, :hsqldb, :cubrid].each do |type|
50
+ db = dbf.call(type)
51
+ db.meta_def(:database_type){type}
52
+ db.literal(@sa1).must_equal "GROUP_CONCAT(c SEPARATOR ',')"
53
+ db.literal(@sa2).must_equal "GROUP_CONCAT(c SEPARATOR '-')"
54
+ db.literal(@sa3).must_equal "GROUP_CONCAT(c ORDER BY o SEPARATOR '-')"
55
+ db.literal(@sa4).must_equal "GROUP_CONCAT(DISTINCT c ORDER BY o SEPARATOR ',')"
56
+ end
57
+ end
58
+
59
+ it "should correctly literalize on Oracle and DB2" do
60
+ [:oracle, :db2].each do |type|
61
+ db = dbf.call(type)
62
+ db.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
63
+ db.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
64
+ db.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
65
+ proc{db.literal(@sa4)}.must_raise Sequel::Error
66
+ end
67
+ end
68
+
69
+ it "should handle order without arguments" do
70
+ db = dbf.call(:postgres)
71
+ db.literal(@sa1.order).must_equal "string_agg(c, ',')"
72
+ end
73
+
74
+ it "should handle operations on object" do
75
+ db = dbf.call(:postgres)
76
+ db.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
77
+ db.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
78
+ db.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
79
+ db.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
80
+ db.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
81
+ db.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
82
+ db.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
83
+ db.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
84
+ end
85
+ end
@@ -546,6 +546,8 @@ describe "Sequel::Plugins::ValidationHelpers" do
546
546
  @m.errors.full_messages.must_equal ['value is not > 3']
547
547
  @m.value = 3
548
548
  @m.wont_be :valid?
549
+ @m.value = nil
550
+ @m.wont_be :valid?
549
551
  @m.value = 4
550
552
  @m.must_be :valid?
551
553
  end
@@ -2014,17 +2014,20 @@ describe "Sequel::Plugins::ConstraintValidations" do
2014
2014
  includes %w'abc def', :inc, opts.merge(:name=>:i)
2015
2015
  unique :uniq, opts.merge(:name=>:u)
2016
2016
  max_length 6, :minlen, opts.merge(:name=>:maxl2)
2017
+ operator :<, 'm', :exactlen, opts.merge(:name=>:lt)
2018
+ operator :>=, 5, :num, opts.merge(:name=>:gte)
2017
2019
  end
2018
- @valid_row = {:pre=>'a', :exactlen=>'12345', :minlen=>'12345', :maxlen=>'12345', :lenrange=>'1234', :lik=>'fooabc', :ilik=>'FooABC', :inc=>'abc', :uniq=>'u'}
2020
+ @valid_row = {:pre=>'a', :exactlen=>'12345', :minlen=>'12345', :maxlen=>'12345', :lenrange=>'1234', :lik=>'fooabc', :ilik=>'FooABC', :inc=>'abc', :uniq=>'u', :num=>5}
2019
2021
  @violations = [
2020
2022
  [:pre, [nil, '', ' ']],
2021
- [:exactlen, [nil, '', '1234', '123456']],
2023
+ [:exactlen, [nil, '', '1234', '123456', 'n1234']],
2022
2024
  [:minlen, [nil, '', '1234']],
2023
2025
  [:maxlen, [nil, '123456']],
2024
2026
  [:lenrange, [nil, '', '12', '123456']],
2025
2027
  [:lik, [nil, '', 'fo', 'fotabc', 'FOOABC']],
2026
2028
  [:ilik, [nil, '', 'fo', 'fotabc']],
2027
2029
  [:inc, [nil, '', 'ab', 'abcd']],
2030
+ [:num, [nil, 3, 4]],
2028
2031
  ]
2029
2032
 
2030
2033
  if @regexp
@@ -2101,6 +2104,7 @@ describe "Sequel::Plugins::ConstraintValidations" do
2101
2104
  String :ilik
2102
2105
  String :inc
2103
2106
  String :uniq, :null=>false
2107
+ Integer :num
2104
2108
  validate(&validate_block)
2105
2109
  end
2106
2110
  end
@@ -2146,6 +2150,7 @@ describe "Sequel::Plugins::ConstraintValidations" do
2146
2150
  if regexp
2147
2151
  add_column :form, String
2148
2152
  end
2153
+ add_column :num, Integer
2149
2154
  validate(&validate_block)
2150
2155
  end
2151
2156
  end
@@ -2260,3 +2265,33 @@ describe "date_arithmetic extension" do
2260
2265
  @check.call(:date_sub, @dt, @h2, @s2)
2261
2266
  end
2262
2267
  end
2268
+
2269
+ describe "string_agg extension" do
2270
+ before(:all) do
2271
+ @db = DB
2272
+ @db.extension(:string_agg)
2273
+ @db.create_table!(:string_agg_test) do
2274
+ Integer :id
2275
+ String :s
2276
+ Integer :o
2277
+ end
2278
+ @db[:string_agg_test].import([:id, :s, :o], [[1, 'a', 3], [1, 'a', 3], [1, 'b', 5], [1, 'c', 4], [2, 'aa', 2], [2, 'bb', 1]])
2279
+ @ds = @db[:string_agg_test].select_group(:id).order(:id)
2280
+ end
2281
+ after(:all) do
2282
+ @db.drop_table?(:string_agg_test)
2283
+ end
2284
+
2285
+ cspecify "should have string_agg return aggregated concatenation", :mssql, :sqlite, :derby do
2286
+ h = @ds.select_append(Sequel.string_agg(:s).as(:v)).to_hash(:id, :v)
2287
+ h[1].must_match(/\A[abc],[abc],[abc],[abc]\z/)
2288
+ h[2].must_match(/\A(aa|bb),(aa|bb)\z/)
2289
+
2290
+ @ds.select_append(Sequel.string_agg(:s).order(:o).as(:v)).map([:id, :v]).must_equal [[1, 'a,a,c,b'], [2, 'bb,aa']]
2291
+ @ds.select_append(Sequel.string_agg(:s, '-').order(:o).as(:v)).map([:id, :v]).must_equal [[1, 'a-a-c-b'], [2, 'bb-aa']]
2292
+ end
2293
+
2294
+ cspecify "should have string_agg return aggregated concatenation for distinct values", :mssql, :sqlite, :oracle, :db2, :derby do
2295
+ @ds.select_group(:id).select_append(Sequel.string_agg(:s).order(:s).distinct.as(:v)).map([:id, :v]).must_equal [[1, 'a,b,c'], [2, 'aa,bb']]
2296
+ end
2297
+ end
@@ -20,6 +20,16 @@ describe Sequel::Model::Associations::AssociationReflection, "#associated_class"
20
20
  @c.association_reflection(:c).keys.wont_include(:class)
21
21
  @c.association_reflection(:c).associated_class.must_equal ParParent
22
22
  end
23
+
24
+ it "should respect :class_namespace option for specifying the namespace" do
25
+ class ::ParParent
26
+ class ParParent < Sequel::Model; end
27
+ end
28
+ ParParent.many_to_one :par_parent, :class=>'ParParent'
29
+ ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent
30
+ ParParent.many_to_one :par_parent, :class=>'ParParent', :class_namespace=>'ParParent'
31
+ ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent::ParParent
32
+ end
23
33
  end
24
34
 
25
35
  describe Sequel::Model::Associations::AssociationReflection, "#primary_key" do
@@ -54,6 +54,40 @@ describe "Sequel::Model()" do
54
54
  c.dataset.must_equal ds
55
55
  end
56
56
 
57
+ it "should be callable on Sequel::Model" do
58
+ ds = @db[:blah]
59
+ c = Sequel::Model::Model(ds)
60
+ c.superclass.must_equal Sequel::Model
61
+ c.dataset.must_equal ds
62
+ end
63
+
64
+ it "should be callable on subclasses of Sequel::Model" do
65
+ ds = @db[:blah]
66
+ c = Class.new(Sequel::Model)
67
+ sc = c::Model(ds)
68
+ sc.superclass.must_equal c
69
+ sc.dataset.must_equal ds
70
+ end
71
+
72
+ it "should be callable on other modules if def_Model is used" do
73
+ m = Module.new
74
+ Sequel::Model.def_Model(m)
75
+ ds = @db[:blah]
76
+ c = m::Model(ds)
77
+ c.superclass.must_equal Sequel::Model
78
+ c.dataset.must_equal ds
79
+ end
80
+
81
+ it "should be callable using model subclasses on other modules if def_Model is used" do
82
+ m = Module.new
83
+ c = Class.new(Sequel::Model)
84
+ c.def_Model(m)
85
+ ds = @db[:blah]
86
+ sc = m::Model(ds)
87
+ sc.superclass.must_equal c
88
+ sc.dataset.must_equal ds
89
+ end
90
+
57
91
  it "should return a model subclass associated to the given database if given a database" do
58
92
  db = Sequel.mock
59
93
  c = Sequel::Model(db)
@@ -122,6 +156,21 @@ describe "Sequel::Model()" do
122
156
  class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
123
157
  end.must_raise TypeError
124
158
  end
159
+
160
+ it "should use separate cache and cache settings for subclasses" do
161
+ c = Class.new(Sequel::Model)
162
+ c.cache_anonymous_models.must_equal true
163
+ class ::Album < c::Model(:table); end
164
+ class ::Album < c::Model(:table); end
165
+
166
+ c1 = c::Model(:t1)
167
+ c1.must_equal c::Model(:t1)
168
+ c1.wont_equal Sequel::Model(:t1)
169
+
170
+ c.cache_anonymous_models = false
171
+ Sequel::Model.cache_anonymous_models.must_equal true
172
+ c1.wont_equal c::Model(:t1)
173
+ end
125
174
  end
126
175
  end
127
176
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.35.0
4
+ version: 4.36.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: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -236,6 +236,7 @@ extra_rdoc_files:
236
236
  - doc/release_notes/4.33.0.txt
237
237
  - doc/release_notes/4.34.0.txt
238
238
  - doc/release_notes/4.35.0.txt
239
+ - doc/release_notes/4.36.0.txt
239
240
  files:
240
241
  - CHANGELOG
241
242
  - MIT-LICENSE
@@ -360,6 +361,7 @@ files:
360
361
  - doc/release_notes/4.33.0.txt
361
362
  - doc/release_notes/4.34.0.txt
362
363
  - doc/release_notes/4.35.0.txt
364
+ - doc/release_notes/4.36.0.txt
363
365
  - doc/release_notes/4.4.0.txt
364
366
  - doc/release_notes/4.5.0.txt
365
367
  - doc/release_notes/4.6.0.txt
@@ -475,6 +477,7 @@ files:
475
477
  - lib/sequel/extensions/arbitrary_servers.rb
476
478
  - lib/sequel/extensions/blank.rb
477
479
  - lib/sequel/extensions/columns_introspection.rb
480
+ - lib/sequel/extensions/connection_expiration.rb
478
481
  - lib/sequel/extensions/connection_validator.rb
479
482
  - lib/sequel/extensions/constraint_validations.rb
480
483
  - lib/sequel/extensions/core_extensions.rb
@@ -531,6 +534,7 @@ files:
531
534
  - lib/sequel/extensions/split_array_nil.rb
532
535
  - lib/sequel/extensions/sql_comments.rb
533
536
  - lib/sequel/extensions/sql_expr.rb
537
+ - lib/sequel/extensions/string_agg.rb
534
538
  - lib/sequel/extensions/string_date_time.rb
535
539
  - lib/sequel/extensions/thread_local_timezones.rb
536
540
  - lib/sequel/extensions/to_dot.rb
@@ -671,6 +675,7 @@ files:
671
675
  - spec/extensions/column_select_spec.rb
672
676
  - spec/extensions/columns_introspection_spec.rb
673
677
  - spec/extensions/composition_spec.rb
678
+ - spec/extensions/connection_expiration_spec.rb
674
679
  - spec/extensions/connection_validator_spec.rb
675
680
  - spec/extensions/constraint_validations_plugin_spec.rb
676
681
  - spec/extensions/constraint_validations_spec.rb
@@ -767,6 +772,7 @@ files:
767
772
  - spec/extensions/sql_comments_spec.rb
768
773
  - spec/extensions/sql_expr_spec.rb
769
774
  - spec/extensions/static_cache_spec.rb
775
+ - spec/extensions/string_agg_spec.rb
770
776
  - spec/extensions/string_date_time_spec.rb
771
777
  - spec/extensions/string_stripper_spec.rb
772
778
  - spec/extensions/subclasses_spec.rb