sequel 5.60.0 → 5.60.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +4 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +5 -5
- data/lib/sequel/adapters/mock.rb +1 -1
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/oracle.rb +1 -1
- data/lib/sequel/adapters/postgres.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +1 -1
- data/lib/sequel/adapters/shared/oracle.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/database/misc.rb +2 -2
- data/lib/sequel/dataset/sql.rb +2 -2
- data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +2 -2
- data/lib/sequel/extensions/pg_array_ops.rb +1 -1
- data/lib/sequel/extensions/pg_enum.rb +1 -1
- data/lib/sequel/extensions/pg_hstore_ops.rb +3 -3
- data/lib/sequel/extensions/pg_inet.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +1 -1
- data/lib/sequel/extensions/pg_json.rb +1 -1
- data/lib/sequel/extensions/pg_json_ops.rb +3 -3
- data/lib/sequel/extensions/pg_multirange.rb +2 -2
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/model/associations.rb +6 -6
- data/lib/sequel/model/base.rb +3 -3
- data/lib/sequel/model/exceptions.rb +1 -1
- data/lib/sequel/model/inflections.rb +6 -6
- data/lib/sequel/plugins/auto_validations.rb +1 -1
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +1 -1
- data/lib/sequel/plugins/insert_conflict.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +3 -3
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd8695696d6b55edf6337870f3ff172aeb6fe2ef9ba4bbc23daae0af26908649
|
4
|
+
data.tar.gz: 2483bbb3549adbcb9f179165119051b7bb234d6e714e4afa116c0ffddf379dc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0527cba1fcc06d8001cbd55473b3af5c23a9f5c004113fc24aa6f9e029c5ed2cf4f938bf184d79922164cdc3ea502d12860d46d64237bdbd306bf5ce50f59ffa
|
7
|
+
data.tar.gz: e13c17553592773e70c0e9a6753438444a5245f3cd0664c6c5a6c0a08a271d1d92180b110c7b7e5981f7ca6dc2b18d90da3feeb05a14ae863fcfd99d5673650e
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
=== 5.60.1 (2022-09-02)
|
2
|
+
|
3
|
+
* Revert conversion of respond_to? to defined?, as it breaks with unused refinements on Ruby 2 (jeremyevans) (#1919)
|
4
|
+
|
1
5
|
=== 5.60.0 (2022-09-01)
|
2
6
|
|
3
7
|
* Support arbitrary expressions for date_arithmetic interval values on PostgreSQL 9.4+ (jeremyevans)
|
@@ -125,7 +125,7 @@ module Sequel
|
|
125
125
|
|
126
126
|
# The result code for the exception, if the jdbc driver supports result codes for exceptions.
|
127
127
|
def sqlite_error_code(exception)
|
128
|
-
exception.resultCode.code if
|
128
|
+
exception.resultCode.code if exception.respond_to?(:resultCode)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
end
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
@@ -38,7 +38,7 @@ module Sequel
|
|
38
38
|
else
|
39
39
|
if defined?(::Jdbc) && ( ::Jdbc.const_defined?(name) rescue nil )
|
40
40
|
jdbc_module = ::Jdbc.const_get(name) # e.g. Jdbc::SQLite3
|
41
|
-
jdbc_module.load_driver if
|
41
|
+
jdbc_module.load_driver if jdbc_module.respond_to?(:load_driver)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -396,9 +396,9 @@ module Sequel
|
|
396
396
|
|
397
397
|
def database_exception_sqlstate(exception, opts)
|
398
398
|
if database_exception_use_sqlstates?
|
399
|
-
while
|
399
|
+
while exception.respond_to?(:cause)
|
400
400
|
exception = exception.cause
|
401
|
-
return exception.getSQLState if
|
401
|
+
return exception.getSQLState if exception.respond_to?(:getSQLState)
|
402
402
|
end
|
403
403
|
end
|
404
404
|
nil
|
@@ -415,8 +415,8 @@ module Sequel
|
|
415
415
|
|
416
416
|
# Raise a disconnect error if the SQL state of the cause of the exception indicates so.
|
417
417
|
def disconnect_error?(exception, opts)
|
418
|
-
cause =
|
419
|
-
super || (
|
418
|
+
cause = exception.respond_to?(:cause) ? exception.cause : exception
|
419
|
+
super || (cause.respond_to?(:getSQLState) && cause.getSQLState =~ /^08/)
|
420
420
|
end
|
421
421
|
|
422
422
|
# Execute the prepared statement. If the provided name is a
|
data/lib/sequel/adapters/mock.rb
CHANGED
@@ -72,7 +72,7 @@ module Sequel
|
|
72
72
|
def connect(server)
|
73
73
|
opts = server_opts(server)
|
74
74
|
|
75
|
-
if
|
75
|
+
if Mysql.respond_to?(:init)
|
76
76
|
conn = Mysql.init
|
77
77
|
conn.options(Mysql::READ_DEFAULT_GROUP, opts[:config_default_group] || "client")
|
78
78
|
conn.options(Mysql::OPT_LOCAL_INFILE, opts[:config_local_infile]) if opts.has_key?(:config_local_infile)
|
@@ -186,7 +186,7 @@ module Sequel
|
|
186
186
|
elsif defined?(yield)
|
187
187
|
yield conn
|
188
188
|
end
|
189
|
-
if
|
189
|
+
if conn.respond_to?(:more_results?)
|
190
190
|
while conn.more_results? do
|
191
191
|
if r
|
192
192
|
r.free
|
@@ -207,7 +207,7 @@ module Sequel
|
|
207
207
|
ensure
|
208
208
|
r.free if r
|
209
209
|
# Use up all results to avoid a commands out of sync message.
|
210
|
-
if
|
210
|
+
if conn.respond_to?(:more_results?)
|
211
211
|
while conn.more_results? do
|
212
212
|
begin
|
213
213
|
conn.next_result
|
@@ -149,7 +149,7 @@ module Sequel
|
|
149
149
|
end
|
150
150
|
|
151
151
|
def database_specific_error_class(exception, opts)
|
152
|
-
return super unless
|
152
|
+
return super unless exception.respond_to?(:code)
|
153
153
|
case exception.code
|
154
154
|
when 1400, 1407
|
155
155
|
NotNullConstraintViolation
|
@@ -160,7 +160,7 @@ module Sequel
|
|
160
160
|
begin
|
161
161
|
defined?(yield) ? yield(q) : q.cmd_tuples
|
162
162
|
ensure
|
163
|
-
q.clear if q &&
|
163
|
+
q.clear if q && q.respond_to?(:clear)
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
@@ -258,7 +258,7 @@ module Sequel
|
|
258
258
|
|
259
259
|
# :nocov:
|
260
260
|
if encoding = opts[:encoding] || opts[:charset]
|
261
|
-
if
|
261
|
+
if conn.respond_to?(:set_client_encoding)
|
262
262
|
conn.set_client_encoding(encoding)
|
263
263
|
else
|
264
264
|
conn.async_exec("set client_encoding to '#{encoding}'")
|
@@ -492,12 +492,12 @@ module Sequel
|
|
492
492
|
opts[:after_listen].call(conn) if opts[:after_listen]
|
493
493
|
timeout = opts[:timeout]
|
494
494
|
if timeout
|
495
|
-
timeout_block =
|
495
|
+
timeout_block = timeout.respond_to?(:call) ? timeout : proc{timeout}
|
496
496
|
end
|
497
497
|
|
498
498
|
if l = opts[:loop]
|
499
499
|
raise Error, 'calling #listen with :loop requires a block' unless block
|
500
|
-
loop_call =
|
500
|
+
loop_call = l.respond_to?(:call)
|
501
501
|
catch(:stop) do
|
502
502
|
while true
|
503
503
|
t = timeout_block ? [timeout_block.call] : []
|
@@ -582,7 +582,7 @@ module Sequel
|
|
582
582
|
|
583
583
|
def database_exception_sqlstate(exception, opts)
|
584
584
|
# :nocov:
|
585
|
-
if
|
585
|
+
if exception.respond_to?(:result) && (result = exception.result)
|
586
586
|
# :nocov:
|
587
587
|
result.error_field(PGresult::PG_DIAG_SQLSTATE)
|
588
588
|
end
|
@@ -625,7 +625,7 @@ module Sequel
|
|
625
625
|
begin
|
626
626
|
defined?(yield) ? yield(q) : q.cmd_tuples
|
627
627
|
ensure
|
628
|
-
q.clear if q &&
|
628
|
+
q.clear if q && q.respond_to?(:clear)
|
629
629
|
end
|
630
630
|
end
|
631
631
|
|
@@ -205,7 +205,7 @@ module Sequel
|
|
205
205
|
return @server_version = Integer(@opts[:server_version])
|
206
206
|
end
|
207
207
|
@server_version = synchronize(server) do |conn|
|
208
|
-
(conn.server_version rescue nil) if
|
208
|
+
(conn.server_version rescue nil) if conn.respond_to?(:server_version)
|
209
209
|
end
|
210
210
|
unless @server_version
|
211
211
|
m = /^(\d+)\.(\d+)\.(\d+)/.match(fetch("SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar)").single_value.to_s)
|
@@ -121,7 +121,7 @@ module Sequel
|
|
121
121
|
def server_version(server=nil)
|
122
122
|
return @server_version if @server_version
|
123
123
|
@server_version = synchronize(server) do |conn|
|
124
|
-
(conn.server_version rescue nil) if
|
124
|
+
(conn.server_version rescue nil) if conn.respond_to?(:server_version)
|
125
125
|
end
|
126
126
|
unless @server_version
|
127
127
|
@server_version = if m = /(\d+)\.(\d+)\.?(\d+)?\.?(\d+)?/.match(fetch("select version from PRODUCT_COMPONENT_VERSION where lower(product) like 'oracle%'").single_value)
|
@@ -305,7 +305,7 @@ module Sequel
|
|
305
305
|
if USE_EXTENDED_RESULT_CODES
|
306
306
|
# Support SQLite exception codes if ruby-sqlite3 supports them.
|
307
307
|
def sqlite_error_code(exception)
|
308
|
-
exception.code if
|
308
|
+
exception.code if exception.respond_to?(:code)
|
309
309
|
end
|
310
310
|
end
|
311
311
|
end
|
data/lib/sequel/database/misc.rb
CHANGED
@@ -350,7 +350,7 @@ module Sequel
|
|
350
350
|
# strings with all whitespace, and ones that respond
|
351
351
|
# true to empty?
|
352
352
|
def blank_object?(obj)
|
353
|
-
return obj.blank? if
|
353
|
+
return obj.blank? if obj.respond_to?(:blank?)
|
354
354
|
case obj
|
355
355
|
when NilClass, FalseClass
|
356
356
|
true
|
@@ -359,7 +359,7 @@ module Sequel
|
|
359
359
|
when String
|
360
360
|
obj.strip.empty?
|
361
361
|
else
|
362
|
-
|
362
|
+
obj.respond_to?(:empty?) ? obj.empty? : false
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
data/lib/sequel/dataset/sql.rb
CHANGED
@@ -1398,9 +1398,9 @@ module Sequel
|
|
1398
1398
|
# don't cache SQL for a dataset that uses this.
|
1399
1399
|
disable_sql_caching!
|
1400
1400
|
|
1401
|
-
if
|
1401
|
+
if v.respond_to?(:sql_literal_append)
|
1402
1402
|
v.sql_literal_append(self, sql)
|
1403
|
-
elsif
|
1403
|
+
elsif v.respond_to?(:sql_literal)
|
1404
1404
|
sql << v.sql_literal(self)
|
1405
1405
|
else
|
1406
1406
|
raise Error, "can't express #{v.inspect} as a SQL literal"
|
@@ -301,7 +301,7 @@ module Sequel
|
|
301
301
|
end
|
302
302
|
end
|
303
303
|
|
304
|
-
unless
|
304
|
+
unless Sequel::Postgres.respond_to?(:parse_pg_array)
|
305
305
|
require 'strscan'
|
306
306
|
|
307
307
|
# PostgreSQL array parser that handles PostgreSQL array output format.
|
@@ -412,7 +412,7 @@ module Sequel
|
|
412
412
|
@converter = converter
|
413
413
|
end
|
414
414
|
|
415
|
-
if
|
415
|
+
if Sequel::Postgres.respond_to?(:parse_pg_array)
|
416
416
|
# :nocov:
|
417
417
|
# Use sequel_pg's C-based parser if it has already been defined.
|
418
418
|
def call(string)
|
@@ -144,7 +144,7 @@ module Sequel
|
|
144
144
|
select_hash_groups(Sequel.cast(:enumtypid, Integer).as(:v), :enumlabel).freeze
|
145
145
|
enum_labels.each_value(&:freeze)
|
146
146
|
|
147
|
-
if
|
147
|
+
if respond_to?(:register_array_type)
|
148
148
|
array_types = metadata_dataset.
|
149
149
|
from(:pg_type).
|
150
150
|
where(:oid=>enum_labels.keys).
|
@@ -296,7 +296,7 @@ module Sequel
|
|
296
296
|
|
297
297
|
# Wrap argument in a PGArray if it is an array
|
298
298
|
def wrap_input_array(obj)
|
299
|
-
if obj.is_a?(Array) &&
|
299
|
+
if obj.is_a?(Array) && Sequel.respond_to?(:pg_array)
|
300
300
|
Sequel.pg_array(obj)
|
301
301
|
else
|
302
302
|
obj
|
@@ -305,7 +305,7 @@ module Sequel
|
|
305
305
|
|
306
306
|
# Wrap argument in an Hstore if it is a hash
|
307
307
|
def wrap_input_hash(obj)
|
308
|
-
if obj.is_a?(Hash) &&
|
308
|
+
if obj.is_a?(Hash) && Sequel.respond_to?(:hstore)
|
309
309
|
Sequel.hstore(obj)
|
310
310
|
else
|
311
311
|
obj
|
@@ -314,7 +314,7 @@ module Sequel
|
|
314
314
|
|
315
315
|
# Wrap argument in a PGArrayOp if supported
|
316
316
|
def wrap_output_array(obj)
|
317
|
-
if
|
317
|
+
if Sequel.respond_to?(:pg_array_op)
|
318
318
|
Sequel.pg_array_op(obj)
|
319
319
|
else
|
320
320
|
obj
|
@@ -49,13 +49,13 @@ module Sequel
|
|
49
49
|
meth = IPAddr.method(:new)
|
50
50
|
add_conversion_proc(869, meth)
|
51
51
|
add_conversion_proc(650, meth)
|
52
|
-
if
|
52
|
+
if respond_to?(:register_array_type)
|
53
53
|
register_array_type('inet', :oid=>1041, :scalar_oid=>869)
|
54
54
|
register_array_type('cidr', :oid=>651, :scalar_oid=>650)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
if
|
58
|
+
if respond_to?(:register_array_type)
|
59
59
|
register_array_type('macaddr', :oid=>1040, :scalar_oid=>829)
|
60
60
|
end
|
61
61
|
@schema_type_classes[:ipaddr] = IPAddr
|
@@ -144,7 +144,7 @@ module Sequel
|
|
144
144
|
db.instance_exec do
|
145
145
|
extend_datasets(IntervalDatasetMethods)
|
146
146
|
add_conversion_proc(1186, Postgres::IntervalDatabaseMethods::PARSER)
|
147
|
-
if
|
147
|
+
if respond_to?(:register_array_type)
|
148
148
|
register_array_type('interval', :oid=>1187, :scalar_oid=>1186)
|
149
149
|
end
|
150
150
|
@schema_type_classes[:interval] = ActiveSupport::Duration
|
@@ -227,7 +227,7 @@ module Sequel
|
|
227
227
|
db.instance_exec do
|
228
228
|
add_conversion_proc(114, method(:_db_parse_json))
|
229
229
|
add_conversion_proc(3802, method(:_db_parse_jsonb))
|
230
|
-
if
|
230
|
+
if respond_to?(:register_array_type)
|
231
231
|
register_array_type('json', :oid=>199, :scalar_oid=>114)
|
232
232
|
register_array_type('jsonb', :oid=>3807, :scalar_oid=>3802)
|
233
233
|
end
|
@@ -358,7 +358,7 @@ module Sequel
|
|
358
358
|
# Automatically wrap argument in a PGArray if it is a plain Array.
|
359
359
|
# Requires that the pg_array extension has been loaded to work.
|
360
360
|
def wrap_array(arg)
|
361
|
-
if arg.instance_of?(Array) &&
|
361
|
+
if arg.instance_of?(Array) && Sequel.respond_to?(:pg_array)
|
362
362
|
Sequel.pg_array(arg)
|
363
363
|
else
|
364
364
|
arg
|
@@ -652,7 +652,7 @@ module Sequel
|
|
652
652
|
|
653
653
|
# Wrap argument in a PGArray if it is an array
|
654
654
|
def wrap_input_array(obj)
|
655
|
-
if obj.is_a?(Array) &&
|
655
|
+
if obj.is_a?(Array) && Sequel.respond_to?(:pg_array)
|
656
656
|
Sequel.pg_array(obj)
|
657
657
|
else
|
658
658
|
obj
|
@@ -661,7 +661,7 @@ module Sequel
|
|
661
661
|
|
662
662
|
# Wrap argument in a JSONBArray or JSONBHash if it is an array or hash.
|
663
663
|
def wrap_input_jsonb(obj)
|
664
|
-
if
|
664
|
+
if Sequel.respond_to?(:pg_jsonb) && (obj.is_a?(Array) || obj.is_a?(Hash))
|
665
665
|
Sequel.pg_jsonb(obj)
|
666
666
|
else
|
667
667
|
obj
|
@@ -124,7 +124,7 @@ module Sequel
|
|
124
124
|
register_multirange_type('datemultirange', :range_oid=>3912, :oid=>4535)
|
125
125
|
register_multirange_type('int8multirange', :range_oid=>3926, :oid=>4536)
|
126
126
|
|
127
|
-
if
|
127
|
+
if respond_to?(:register_array_type)
|
128
128
|
register_array_type('int4multirange', :oid=>6150, :scalar_oid=>4451, :scalar_typecast=>:int4multirange)
|
129
129
|
register_array_type('nummultirange', :oid=>6151, :scalar_oid=>4532, :scalar_typecast=>:nummultirange)
|
130
130
|
register_array_type('tsmultirange', :oid=>6152, :scalar_oid=>4533, :scalar_typecast=>:tsmultirange)
|
@@ -141,7 +141,7 @@ module Sequel
|
|
141
141
|
add_conversion_proc(4533, PGMultiRange::Creator.new("tsmultirange", procs[3908]))
|
142
142
|
add_conversion_proc(4534, PGMultiRange::Creator.new("tstzmultirange", procs[3910]))
|
143
143
|
|
144
|
-
if
|
144
|
+
if respond_to?(:register_array_type) && defined?(PGArray::Creator)
|
145
145
|
add_conversion_proc(6152, PGArray::Creator.new("tsmultirange", procs[4533]))
|
146
146
|
add_conversion_proc(6153, PGArray::Creator.new("tstzmultirange", procs[4534]))
|
147
147
|
end
|
@@ -139,7 +139,7 @@ module Sequel
|
|
139
139
|
register_range_type('tstzrange', :oid=>3910, :subtype_oid=>1184)
|
140
140
|
register_range_type('daterange', :oid=>3912, :subtype_oid=>1082)
|
141
141
|
register_range_type('int8range', :oid=>3926, :subtype_oid=>20)
|
142
|
-
if
|
142
|
+
if respond_to?(:register_array_type)
|
143
143
|
register_array_type('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range)
|
144
144
|
register_array_type('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange)
|
145
145
|
register_array_type('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange)
|
@@ -154,7 +154,7 @@ module Sequel
|
|
154
154
|
procs = conversion_procs
|
155
155
|
add_conversion_proc(3908, Parser.new("tsrange", procs[1114]))
|
156
156
|
add_conversion_proc(3910, Parser.new("tstzrange", procs[1184]))
|
157
|
-
if
|
157
|
+
if respond_to?(:register_array_type) && defined?(PGArray::Creator)
|
158
158
|
add_conversion_proc(3909, PGArray::Creator.new("tsrange", procs[3908]))
|
159
159
|
add_conversion_proc(3911, PGArray::Creator.new("tstzrange", procs[3910]))
|
160
160
|
end
|
@@ -375,7 +375,7 @@ module Sequel
|
|
375
375
|
@row_schema_types = {}
|
376
376
|
extend(@row_type_method_module = Module.new)
|
377
377
|
add_conversion_proc(2249, PGRow::Parser.new(:converter=>PGRow::ArrayRow))
|
378
|
-
if
|
378
|
+
if respond_to?(:register_array_type)
|
379
379
|
register_array_type('record', :oid=>2287, :scalar_oid=>2249)
|
380
380
|
end
|
381
381
|
end
|
@@ -464,7 +464,7 @@ module Sequel
|
|
464
464
|
parser = Parser.new(parser_opts)
|
465
465
|
add_conversion_proc(parser.oid, parser)
|
466
466
|
|
467
|
-
if
|
467
|
+
if respond_to?(:register_array_type) && array_oid && array_oid > 0
|
468
468
|
array_type_name = if type_schema
|
469
469
|
"#{type_schema}.#{type_name}"
|
470
470
|
else
|
@@ -115,13 +115,13 @@ SQL
|
|
115
115
|
# :before_thread_exit :: An object that responds to +call+ that is called before the
|
116
116
|
# the created thread exits.
|
117
117
|
def listen_for_static_cache_updates(models, opts=OPTS)
|
118
|
-
raise Error, "this database object does not respond to listen, use the postgres adapter with the pg driver" unless
|
118
|
+
raise Error, "this database object does not respond to listen, use the postgres adapter with the pg driver" unless respond_to?(:listen)
|
119
119
|
models = [models] unless models.is_a?(Array)
|
120
120
|
raise Error, "array of models to listen for changes cannot be empty" if models.empty?
|
121
121
|
|
122
122
|
oid_map = {}
|
123
123
|
models.each do |model|
|
124
|
-
raise Error, "#{model.inspect} does not use the static_cache plugin" unless
|
124
|
+
raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache)
|
125
125
|
oid_map[get(regclass_oid(model.dataset.first_source_table))] = model
|
126
126
|
end
|
127
127
|
|
@@ -3016,7 +3016,7 @@ module Sequel
|
|
3016
3016
|
def complex_expression_sql_append(sql, op, args)
|
3017
3017
|
r = args[1]
|
3018
3018
|
if (((op == :'=' || op == :'!=') && r.is_a?(Sequel::Model)) ||
|
3019
|
-
(multiple = ((op == :IN || op == :'NOT IN') && ((is_ds = r.is_a?(Sequel::Dataset)) || (
|
3019
|
+
(multiple = ((op == :IN || op == :'NOT IN') && ((is_ds = r.is_a?(Sequel::Dataset)) || (r.respond_to?(:all?) && r.all?{|x| x.is_a?(Sequel::Model)})))))
|
3020
3020
|
l = args[0]
|
3021
3021
|
if ar = model.association_reflections[l]
|
3022
3022
|
raise Error, "filtering by associations is not allowed for #{ar.inspect}" if ar[:allow_filtering_by] == false
|
@@ -3024,7 +3024,7 @@ module Sequel
|
|
3024
3024
|
if multiple
|
3025
3025
|
klass = ar.associated_class
|
3026
3026
|
if is_ds
|
3027
|
-
if
|
3027
|
+
if r.respond_to?(:model)
|
3028
3028
|
unless r.model <= klass
|
3029
3029
|
# A dataset for a different model class, could be a valid regular query
|
3030
3030
|
return super
|
@@ -3356,10 +3356,10 @@ module Sequel
|
|
3356
3356
|
assoc_table_alias = ds.unused_table_alias(alias_base)
|
3357
3357
|
loader = r[:eager_grapher]
|
3358
3358
|
if !associations.empty?
|
3359
|
-
if
|
3359
|
+
if associations.first.respond_to?(:call)
|
3360
3360
|
callback = associations.first
|
3361
3361
|
associations = {}
|
3362
|
-
elsif associations.length == 1 && (assocs = associations.first).is_a?(Hash) && assocs.length == 1 && (pr_assoc = assocs.to_a.first) &&
|
3362
|
+
elsif associations.length == 1 && (assocs = associations.first).is_a?(Hash) && assocs.length == 1 && (pr_assoc = assocs.to_a.first) && pr_assoc.first.respond_to?(:call)
|
3363
3363
|
callback, assoc = pr_assoc
|
3364
3364
|
associations = assoc.is_a?(Array) ? assoc : [assoc]
|
3365
3365
|
end
|
@@ -3601,10 +3601,10 @@ module Sequel
|
|
3601
3601
|
end
|
3602
3602
|
|
3603
3603
|
associations = eager_assoc[r[:name]]
|
3604
|
-
if
|
3604
|
+
if associations.respond_to?(:call)
|
3605
3605
|
eager_block = associations
|
3606
3606
|
associations = OPTS
|
3607
|
-
elsif associations.is_a?(Hash) && associations.length == 1 && (pr_assoc = associations.to_a.first) &&
|
3607
|
+
elsif associations.is_a?(Hash) && associations.length == 1 && (pr_assoc = associations.to_a.first) && pr_assoc.first.respond_to?(:call)
|
3608
3608
|
eager_block, associations = pr_assoc
|
3609
3609
|
end
|
3610
3610
|
|
data/lib/sequel/model/base.rb
CHANGED
@@ -492,13 +492,13 @@ module Sequel
|
|
492
492
|
def plugin(plugin, *args, &block)
|
493
493
|
m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
|
494
494
|
|
495
|
-
if !
|
495
|
+
if !m.respond_to?(:apply) && !m.respond_to?(:configure) && (!args.empty? || block)
|
496
496
|
Deprecation.deprecate("Plugin #{plugin} accepts no arguments or block, and passing arguments/block to it", "Remove arguments and block when loading the plugin")
|
497
497
|
end
|
498
498
|
|
499
499
|
unless @plugins.include?(m)
|
500
500
|
@plugins << m
|
501
|
-
m.apply(self, *args, &block) if
|
501
|
+
m.apply(self, *args, &block) if m.respond_to?(:apply)
|
502
502
|
extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
|
503
503
|
include(m::InstanceMethods) if m.const_defined?(:InstanceMethods, false)
|
504
504
|
if m.const_defined?(:DatasetMethods, false)
|
@@ -506,7 +506,7 @@ module Sequel
|
|
506
506
|
end
|
507
507
|
end
|
508
508
|
|
509
|
-
m.configure(self, *args, &block) if
|
509
|
+
m.configure(self, *args, &block) if m.respond_to?(:configure)
|
510
510
|
end
|
511
511
|
# :nocov:
|
512
512
|
ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
|
@@ -99,7 +99,7 @@ module Sequel
|
|
99
99
|
# Convert the given string to CamelCase. Will also convert '/' to '::' which is useful for converting paths to namespaces.
|
100
100
|
def camelize(s)
|
101
101
|
s = s.to_s
|
102
|
-
return s.camelize if
|
102
|
+
return s.camelize if s.respond_to?(:camelize)
|
103
103
|
s = s.gsub(/\/(.?)/){|x| "::#{x[-1..-1].upcase unless x == '/'}"}.gsub(/(^|_)(.)/){|x| x[-1..-1].upcase}
|
104
104
|
s
|
105
105
|
end
|
@@ -109,7 +109,7 @@ module Sequel
|
|
109
109
|
# or is not initialized.
|
110
110
|
def constantize(s)
|
111
111
|
s = s.to_s
|
112
|
-
return s.constantize if
|
112
|
+
return s.constantize if s.respond_to?(:constantize)
|
113
113
|
raise(NameError, "#{s.inspect} is not a valid constant name!") unless m = /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/.match(s)
|
114
114
|
Object.module_eval("::#{m[1]}", __FILE__, __LINE__)
|
115
115
|
end
|
@@ -117,14 +117,14 @@ module Sequel
|
|
117
117
|
# Removes the module part from the expression in the string
|
118
118
|
def demodulize(s)
|
119
119
|
s = s.to_s
|
120
|
-
return s.demodulize if
|
120
|
+
return s.demodulize if s.respond_to?(:demodulize)
|
121
121
|
s.gsub(/^.*::/, '')
|
122
122
|
end
|
123
123
|
|
124
124
|
# Returns the plural form of the word in the string.
|
125
125
|
def pluralize(s)
|
126
126
|
s = s.to_s
|
127
|
-
return s.pluralize if
|
127
|
+
return s.pluralize if s.respond_to?(:pluralize)
|
128
128
|
result = s.dup
|
129
129
|
Inflections.plurals.each{|(rule, replacement)| break if result.gsub!(rule, replacement)} unless Inflections.uncountables.include?(s.downcase)
|
130
130
|
result
|
@@ -133,7 +133,7 @@ module Sequel
|
|
133
133
|
# The reverse of pluralize, returns the singular form of a word in a string.
|
134
134
|
def singularize(s)
|
135
135
|
s = s.to_s
|
136
|
-
return s.singularize if
|
136
|
+
return s.singularize if s.respond_to?(:singularize)
|
137
137
|
result = s.dup
|
138
138
|
Inflections.singulars.each{|(rule, replacement)| break if result.gsub!(rule, replacement)} unless Inflections.uncountables.include?(s.downcase)
|
139
139
|
result
|
@@ -143,7 +143,7 @@ module Sequel
|
|
143
143
|
# Also changes '::' to '/' to convert namespaces to paths.
|
144
144
|
def underscore(s)
|
145
145
|
s = s.to_s
|
146
|
-
return s.underscore if
|
146
|
+
return s.underscore if s.respond_to?(:underscore)
|
147
147
|
s.gsub('::', '/').gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
148
148
|
gsub(/([a-z\d])([A-Z])/, '\1_\2').tr('-', '_').downcase
|
149
149
|
end
|
@@ -252,7 +252,7 @@ module Sequel
|
|
252
252
|
|
253
253
|
unless skip.include?(:unique)
|
254
254
|
unique_opts = Hash[opts[:unique]]
|
255
|
-
if
|
255
|
+
if model.respond_to?(:sti_dataset)
|
256
256
|
unique_opts[:dataset] = model.sti_dataset
|
257
257
|
end
|
258
258
|
model.auto_validate_unique_columns.each{|cols| validates_unique(cols, unique_opts)}
|
data/lib/sequel/plugins/dirty.rb
CHANGED
@@ -203,7 +203,7 @@ module Sequel
|
|
203
203
|
get_column_value(column)
|
204
204
|
end
|
205
205
|
|
206
|
-
initial_values[column] = if value && value != true &&
|
206
|
+
initial_values[column] = if value && value != true && value.respond_to?(:clone)
|
207
207
|
begin
|
208
208
|
value.clone
|
209
209
|
rescue TypeError
|
@@ -36,7 +36,7 @@ module Sequel
|
|
36
36
|
module InsertConflict
|
37
37
|
def self.configure(model)
|
38
38
|
model.instance_exec do
|
39
|
-
if @dataset &&
|
39
|
+
if @dataset && !@dataset.respond_to?(:insert_conflict)
|
40
40
|
raise Error, "#{self}'s dataset does not support insert_conflict"
|
41
41
|
end
|
42
42
|
end
|
@@ -259,7 +259,7 @@ module Sequel
|
|
259
259
|
# specific :fields if configured.
|
260
260
|
def nested_attributes_set_attributes(meta, obj, attributes)
|
261
261
|
if fields = meta[:fields]
|
262
|
-
fields = fields.call(obj) if
|
262
|
+
fields = fields.call(obj) if fields.respond_to?(:call)
|
263
263
|
obj.set_fields(attributes, fields, :missing=>:skip)
|
264
264
|
else
|
265
265
|
obj.set(attributes)
|
@@ -159,7 +159,7 @@ module Sequel
|
|
159
159
|
|
160
160
|
case @dataset.first_source_table
|
161
161
|
when Symbol, String, SQL::Identifier, SQL::QualifiedIdentifier
|
162
|
-
convert_errors =
|
162
|
+
convert_errors = db.respond_to?(:error_info)
|
163
163
|
end
|
164
164
|
|
165
165
|
unless convert_errors
|
@@ -162,7 +162,7 @@ module Sequel
|
|
162
162
|
if !cc.include?(column) && (new? || get_column_value(column) != v)
|
163
163
|
cc << column
|
164
164
|
|
165
|
-
will_change_column(column) if
|
165
|
+
will_change_column(column) if respond_to?(:will_change_column)
|
166
166
|
end
|
167
167
|
|
168
168
|
deserialized_values[column] = v
|
@@ -91,7 +91,7 @@ module Sequel
|
|
91
91
|
# +many_to_many+ association, make sure the associated object is created on the
|
92
92
|
# current object's shard, unless the passed object already has an assigned shard.
|
93
93
|
def ensure_associated_primary_key(opts, o, *args)
|
94
|
-
o.set_server?(@server) if
|
94
|
+
o.set_server?(@server) if o.respond_to?(:set_server?)
|
95
95
|
super
|
96
96
|
end
|
97
97
|
|
@@ -35,7 +35,7 @@ module Sequel
|
|
35
35
|
# class B < Sequel::Model; end
|
36
36
|
# a # => [A, B]
|
37
37
|
module Subclasses
|
38
|
-
NEED_SUBCLASSES = !
|
38
|
+
NEED_SUBCLASSES = !Object.respond_to?(:subclasses) || Object.method(:subclasses).source_location
|
39
39
|
private_constant :NEED_SUBCLASSES
|
40
40
|
|
41
41
|
# Initialize the subclasses instance variable for the model.
|
@@ -282,7 +282,7 @@ module Sequel
|
|
282
282
|
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && v.size == i
|
283
283
|
end
|
284
284
|
if w = opts[:within]
|
285
|
-
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.public_send(
|
285
|
+
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.public_send(w.respond_to?(:cover?) ? :cover? : :include?, v.size)
|
286
286
|
end
|
287
287
|
end
|
288
288
|
end
|
@@ -337,14 +337,14 @@ module Sequel
|
|
337
337
|
def validates_inclusion_of(*atts)
|
338
338
|
opts = extract_options!(atts)
|
339
339
|
n = opts[:in]
|
340
|
-
unless n && (
|
340
|
+
unless n && (n.respond_to?(:cover?) || n.respond_to?(:include?))
|
341
341
|
raise ArgumentError, "The :in parameter is required, and must respond to cover? or include?"
|
342
342
|
end
|
343
343
|
opts[:message] ||= "is not in range or set: #{n.inspect}"
|
344
344
|
reflect_validation(:inclusion, opts, atts)
|
345
345
|
atts << opts
|
346
346
|
validates_each(*atts) do |o, a, v|
|
347
|
-
o.errors.add(a, opts[:message]) unless n.public_send(
|
347
|
+
o.errors.add(a, opts[:message]) unless n.public_send(n.respond_to?(:cover?) ? :cover? : :include?, v)
|
348
348
|
end
|
349
349
|
end
|
350
350
|
|
@@ -107,7 +107,7 @@ module Sequel
|
|
107
107
|
|
108
108
|
# Check attribute value(s) is included in the given set.
|
109
109
|
def validates_includes(set, atts, opts=OPTS)
|
110
|
-
validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.public_send(
|
110
|
+
validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.public_send(set.respond_to?(:cover?) ? :cover? : :include?, v)}
|
111
111
|
end
|
112
112
|
|
113
113
|
# Check attribute value(s) string representation is a valid integer.
|
data/lib/sequel/sql.rb
CHANGED
@@ -1347,7 +1347,7 @@ module Sequel
|
|
1347
1347
|
# underlying callable only accepts a single argument, call it
|
1348
1348
|
# with the given dataset.
|
1349
1349
|
def call(ds)
|
1350
|
-
if
|
1350
|
+
if @callable.respond_to?(:arity) && @callable.arity == 1
|
1351
1351
|
@callable.call(ds)
|
1352
1352
|
else
|
1353
1353
|
@callable.call
|
data/lib/sequel/version.rb
CHANGED
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
|
11
11
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
12
12
|
# releases that fix regressions from previous versions.
|
13
|
-
TINY =
|
13
|
+
TINY = 1
|
14
14
|
|
15
15
|
# The version of Sequel you are using, as a string (e.g. "2.11.0")
|
16
16
|
VERSION = [MAJOR, MINOR, TINY].join('.').freeze
|
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: 5.60.
|
4
|
+
version: 5.60.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|