sequel 5.39.0 → 5.40.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/lib/sequel/adapters/jdbc.rb +2 -2
- data/lib/sequel/adapters/shared/sqlite.rb +35 -1
- data/lib/sequel/dataset/features.rb +10 -0
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/sql.rb +32 -10
- data/lib/sequel/extensions/blank.rb +6 -0
- data/lib/sequel/extensions/date_arithmetic.rb +6 -3
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/inflector.rb +6 -0
- data/lib/sequel/extensions/migration.rb +2 -0
- data/lib/sequel/extensions/pg_array.rb +1 -0
- data/lib/sequel/extensions/pg_interval.rb +22 -6
- data/lib/sequel/extensions/pg_row.rb +1 -0
- data/lib/sequel/extensions/query.rb +2 -0
- data/lib/sequel/model/associations.rb +1 -0
- data/lib/sequel/model/base.rb +21 -4
- data/lib/sequel/model/plugins.rb +5 -0
- data/lib/sequel/plugins/association_proxies.rb +2 -0
- data/lib/sequel/plugins/composition.rb +5 -1
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/nested_attributes.rb +3 -1
- data/lib/sequel/plugins/pg_array_associations.rb +4 -0
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +2 -0
- data/lib/sequel/version.rb +1 -1
- metadata +24 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3391bf9fe9e592892ad8ba6b39f7016fe94524908243e7c85fdf5b1cbf9a62a
|
4
|
+
data.tar.gz: 3b3c946fefa8c16b8f657c191debf49f8db84cb9cadb5a91ecdb01739c2ec1e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e7812b8851cdcc9e374bcd8439cc4e3dbbedfd550c72b54aa9d6aa16e3bad1e5f59eed824bdef026d784b67450d2f861be8776ddb762be58406cca75f7a0ea9
|
7
|
+
data.tar.gz: a60bcc72355a1916a0639c5a99ec806f157d60b515112ec24c1757f9a43efc587593a0b11a1e5312d3f40431b313f8f6fc241eee7e7a37c5362565db7c4c8d3c
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 5.40.0 (2021-01-01)
|
2
|
+
|
3
|
+
* Support UPDATE FROM syntax in SQLite 3.33.0+ (jeremyevans)
|
4
|
+
|
5
|
+
* Have pg_interval extension work with ActiveSupport 6.1 (jeremyevans)
|
6
|
+
|
7
|
+
* Have date_arithmetic extension work with ActiveSupport 6.1 (jeremyevans)
|
8
|
+
|
9
|
+
* Avoid method redefinition warnings in verbose warning mode (jeremyevans)
|
10
|
+
|
1
11
|
=== 5.39.0 (2020-12-01)
|
2
12
|
|
3
13
|
* Support :clustered option for primary key and unique constraints on Microsoft SQL Server (jeremyevans)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On SQLite 3.33.0+, the UPDATE FROM syntax is now supported. This
|
4
|
+
allows you to update one table based on a join to another table.
|
5
|
+
The SQLite syntax is based on the PostgreSQL syntax, and the
|
6
|
+
Sequel API is the same for both. You need to pass multiple tables
|
7
|
+
to Dataset#from. The first table is the table to update, and the
|
8
|
+
remaining tables are used to construct the UPDATE FROM clause:
|
9
|
+
|
10
|
+
DB[:a, :b].where{{a[:c]=>b[:d]}}.update(:e=>'f')
|
11
|
+
# UPDATE a SET e = 'f' FROM b WHERE (a.c = b.d)
|
12
|
+
|
13
|
+
Unlike PostgreSQL, SQLite does not support the deletion of joined
|
14
|
+
datasets. Related to this, the following methods for testing
|
15
|
+
database support for modifying joined datasets have been added:
|
16
|
+
|
17
|
+
* supports_updating_joins?
|
18
|
+
* supports_deleting_joins?
|
19
|
+
|
20
|
+
= Other Improvements
|
21
|
+
|
22
|
+
* The pg_interval and date_arithmetic extensions now support
|
23
|
+
ActiveSupport 6.1.
|
24
|
+
|
25
|
+
* Sequel no longer issues method redefinition warnings in verbose
|
26
|
+
mode. As Ruby 3 has dropped uninitialized instance variable
|
27
|
+
warnings, Sequel is now verbose warning free on Ruby 3.
|
28
|
+
|
29
|
+
= Backwards Compatibility
|
30
|
+
|
31
|
+
* Trying to truncate or insert into a joined dataset now correctly
|
32
|
+
raises an exception even if the joined dataset supports updates.
|
33
|
+
|
34
|
+
* The private Dataset#check_modification_allowed! method is now
|
35
|
+
deprecated, and users (custom adapters) should now switch to one
|
36
|
+
of the more specific methods introduced in this version:
|
37
|
+
|
38
|
+
* check_insert_allowed!
|
39
|
+
* check_update_allowed!
|
40
|
+
* check_delete_allowed!
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
@@ -71,11 +71,11 @@ module Sequel
|
|
71
71
|
class TypeConvertor
|
72
72
|
CONVERTORS = convertors = {}
|
73
73
|
%w'Boolean Float Double Int Long Short'.each do |meth|
|
74
|
-
x = convertors[meth.to_sym] = Object.new
|
74
|
+
x = x = convertors[meth.to_sym] = Object.new
|
75
75
|
class_eval("def x.call(r, i) v = r.get#{meth}(i); v unless r.wasNull end", __FILE__, __LINE__)
|
76
76
|
end
|
77
77
|
%w'Object Array String Time Date Timestamp BigDecimal Blob Bytes Clob'.each do |meth|
|
78
|
-
x = convertors[meth.to_sym] = Object.new
|
78
|
+
x = x = convertors[meth.to_sym] = Object.new
|
79
79
|
class_eval("def x.call(r, i) r.get#{meth}(i) end", __FILE__, __LINE__)
|
80
80
|
end
|
81
81
|
x = convertors[:RubyTime] = Object.new
|
@@ -561,7 +561,7 @@ module Sequel
|
|
561
561
|
Dataset.def_sql_method(self, :delete, [['if db.sqlite_version >= 30803', %w'with delete from where'], ["else", %w'delete from where']])
|
562
562
|
Dataset.def_sql_method(self, :insert, [['if db.sqlite_version >= 30803', %w'with insert conflict into columns values on_conflict'], ["else", %w'insert conflict into columns values']])
|
563
563
|
Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'with values compounds'], ['else', %w'with select distinct columns from join where group having window compounds order limit lock']])
|
564
|
-
Dataset.def_sql_method(self, :update, [['if db.sqlite_version >= 30803', %w'with update table set where'], ["else", %w'update table set where']])
|
564
|
+
Dataset.def_sql_method(self, :update, [['if db.sqlite_version >= 33300', %w'with update table set from where'], ['elsif db.sqlite_version >= 30803', %w'with update table set where'], ["else", %w'update table set where']])
|
565
565
|
|
566
566
|
def cast_sql_append(sql, expr, type)
|
567
567
|
if type == Time or type == DateTime
|
@@ -753,6 +753,11 @@ module Sequel
|
|
753
753
|
false
|
754
754
|
end
|
755
755
|
|
756
|
+
# SQLite does not support deleting from a joined dataset
|
757
|
+
def supports_deleting_joins?
|
758
|
+
false
|
759
|
+
end
|
760
|
+
|
756
761
|
# SQLite does not support INTERSECT ALL or EXCEPT ALL
|
757
762
|
def supports_intersect_except_all?
|
758
763
|
false
|
@@ -763,6 +768,11 @@ module Sequel
|
|
763
768
|
false
|
764
769
|
end
|
765
770
|
|
771
|
+
# SQLite 3.33.0 supports modifying joined datasets
|
772
|
+
def supports_modifying_joins?
|
773
|
+
db.sqlite_version >= 33300
|
774
|
+
end
|
775
|
+
|
766
776
|
# SQLite does not support multiple columns for the IN/NOT IN operators
|
767
777
|
def supports_multiple_column_in?
|
768
778
|
false
|
@@ -825,6 +835,13 @@ module Sequel
|
|
825
835
|
end
|
826
836
|
end
|
827
837
|
|
838
|
+
# Raise an InvalidOperation exception if insert is not allowed for this dataset.
|
839
|
+
def check_insert_allowed!
|
840
|
+
raise(InvalidOperation, "Grouped datasets cannot be modified") if opts[:group]
|
841
|
+
raise(InvalidOperation, "Joined datasets cannot be modified") if joined_dataset?
|
842
|
+
end
|
843
|
+
alias check_delete_allowed! check_insert_allowed!
|
844
|
+
|
828
845
|
# SQLite supports a maximum of 500 rows in a VALUES clause.
|
829
846
|
def default_import_slice
|
830
847
|
500
|
@@ -944,6 +961,23 @@ module Sequel
|
|
944
961
|
def _truncate_sql(table)
|
945
962
|
"DELETE FROM #{table}"
|
946
963
|
end
|
964
|
+
|
965
|
+
# Use FROM to specify additional tables in an update query
|
966
|
+
def update_from_sql(sql)
|
967
|
+
if(from = @opts[:from][1..-1]).empty?
|
968
|
+
raise(Error, 'Need multiple FROM tables if updating/deleting a dataset with JOINs') if @opts[:join]
|
969
|
+
else
|
970
|
+
sql << ' FROM '
|
971
|
+
source_list_append(sql, from)
|
972
|
+
select_join_sql(sql)
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
976
|
+
# Only include the primary table in the main update clause
|
977
|
+
def update_table_sql(sql)
|
978
|
+
sql << ' '
|
979
|
+
source_list_append(sql, @opts[:from][0..0])
|
980
|
+
end
|
947
981
|
end
|
948
982
|
end
|
949
983
|
end
|
@@ -51,6 +51,11 @@ module Sequel
|
|
51
51
|
false
|
52
52
|
end
|
53
53
|
|
54
|
+
# Whether deleting from joined datasets is supported, false by default.
|
55
|
+
def supports_deleting_joins?
|
56
|
+
supports_modifying_joins?
|
57
|
+
end
|
58
|
+
|
54
59
|
# Whether the database supports derived column lists (e.g.
|
55
60
|
# "table_expr AS table_alias(column_alias1, column_alias2, ...)"), true by
|
56
61
|
# default.
|
@@ -178,6 +183,11 @@ module Sequel
|
|
178
183
|
true
|
179
184
|
end
|
180
185
|
|
186
|
+
# Whether updating joined datasets is supported, false by default.
|
187
|
+
def supports_updating_joins?
|
188
|
+
supports_modifying_joins?
|
189
|
+
end
|
190
|
+
|
181
191
|
# Whether the dataset supports the WINDOW clause to define windows used by multiple
|
182
192
|
# window functions, false by default.
|
183
193
|
def supports_window_clause?
|
@@ -201,7 +201,9 @@ module Sequel
|
|
201
201
|
when :insert_pk
|
202
202
|
fetch_rows(prepared_sql){|r| return r.values.first}
|
203
203
|
when Array
|
204
|
+
# :nocov:
|
204
205
|
case prepared_type[0]
|
206
|
+
# :nocov:
|
205
207
|
when :map, :as_hash, :to_hash, :to_hash_groups
|
206
208
|
public_send(*prepared_type, &block)
|
207
209
|
end
|
data/lib/sequel/dataset/sql.rb
CHANGED
@@ -22,7 +22,7 @@ module Sequel
|
|
22
22
|
def insert_sql(*values)
|
23
23
|
return static_sql(@opts[:sql]) if @opts[:sql]
|
24
24
|
|
25
|
-
|
25
|
+
check_insert_allowed!
|
26
26
|
|
27
27
|
columns = []
|
28
28
|
|
@@ -172,7 +172,7 @@ module Sequel
|
|
172
172
|
# than one table.
|
173
173
|
def update_sql(values = OPTS)
|
174
174
|
return static_sql(opts[:sql]) if opts[:sql]
|
175
|
-
|
175
|
+
check_update_allowed!
|
176
176
|
check_not_limited!(:update)
|
177
177
|
|
178
178
|
case values
|
@@ -215,7 +215,7 @@ module Sequel
|
|
215
215
|
lines << "def #{'_' if priv}#{type}_sql"
|
216
216
|
lines << 'if sql = opts[:sql]; return static_sql(sql) end' unless priv
|
217
217
|
lines << "if sql = cache_get(:_#{type}_sql); return sql end" if cacheable
|
218
|
-
lines << '
|
218
|
+
lines << 'check_delete_allowed!' << 'check_not_limited!(:delete)' if type == :delete
|
219
219
|
lines << 'sql = @opts[:append_sql] || sql_string_origin'
|
220
220
|
|
221
221
|
if clauses.all?{|c| c.is_a?(Array)}
|
@@ -918,10 +918,35 @@ module Sequel
|
|
918
918
|
!@opts[:no_cache_sql] && !cache_get(:_no_cache_sql)
|
919
919
|
end
|
920
920
|
|
921
|
-
# Raise an InvalidOperation exception if
|
921
|
+
# Raise an InvalidOperation exception if modification is not allowed for this dataset.
|
922
|
+
# Check whether it is allowed to insert into this dataset.
|
923
|
+
# Only for backwards compatibility with older external adapters.
|
922
924
|
def check_modification_allowed!
|
925
|
+
# SEQUEL6: Remove
|
926
|
+
Sequel::Deprecation.deprecate("Dataset#check_modification_allowed!", "Use check_{insert,delete,update,truncation}_allowed! instead")
|
927
|
+
_check_modification_allowed!(supports_modifying_joins?)
|
928
|
+
end
|
929
|
+
|
930
|
+
# Check whether it is allowed to insert into this dataset.
|
931
|
+
def check_insert_allowed!
|
932
|
+
_check_modification_allowed!(false)
|
933
|
+
end
|
934
|
+
alias check_truncation_allowed! check_insert_allowed!
|
935
|
+
|
936
|
+
# Check whether it is allowed to delete from this dataset.
|
937
|
+
def check_delete_allowed!
|
938
|
+
_check_modification_allowed!(supports_deleting_joins?)
|
939
|
+
end
|
940
|
+
|
941
|
+
# Check whether it is allowed to update this dataset.
|
942
|
+
def check_update_allowed!
|
943
|
+
_check_modification_allowed!(supports_updating_joins?)
|
944
|
+
end
|
945
|
+
|
946
|
+
# Internals of the check_*_allowed! methods
|
947
|
+
def _check_modification_allowed!(modifying_joins_supported)
|
923
948
|
raise(InvalidOperation, "Grouped datasets cannot be modified") if opts[:group]
|
924
|
-
raise(InvalidOperation, "Joined datasets cannot be modified") if !
|
949
|
+
raise(InvalidOperation, "Joined datasets cannot be modified") if !modifying_joins_supported && joined_dataset?
|
925
950
|
end
|
926
951
|
|
927
952
|
# Raise error if the dataset uses limits or offsets.
|
@@ -930,11 +955,6 @@ module Sequel
|
|
930
955
|
raise InvalidOperation, "Dataset##{type} not supported on datasets with limits or offsets" if opts[:limit] || opts[:offset]
|
931
956
|
end
|
932
957
|
|
933
|
-
# Alias of check_modification_allowed!
|
934
|
-
def check_truncation_allowed!
|
935
|
-
check_modification_allowed!
|
936
|
-
end
|
937
|
-
|
938
958
|
# Append column list to SQL string.
|
939
959
|
# If the column list is empty, a wildcard (*) is appended.
|
940
960
|
def column_list_append(sql, columns)
|
@@ -971,7 +991,9 @@ module Sequel
|
|
971
991
|
# operators unsupported by some databases. Used by adapters for databases
|
972
992
|
# that don't support the operators natively.
|
973
993
|
def complex_expression_emulate_append(sql, op, args)
|
994
|
+
# :nocov:
|
974
995
|
case op
|
996
|
+
# :nocov:
|
975
997
|
when :%
|
976
998
|
complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(:MOD, a, b)}
|
977
999
|
when :>>
|
@@ -6,6 +6,12 @@
|
|
6
6
|
#
|
7
7
|
# Sequel.extension :blank
|
8
8
|
|
9
|
+
[FalseClass, Object, NilClass, Numeric, String, TrueClass].each do |klass|
|
10
|
+
if klass.method_defined?(:blank?)
|
11
|
+
klass.send(:alias_method, :blank?, :blank?)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
9
15
|
class FalseClass
|
10
16
|
# false is always blank
|
11
17
|
def blank?
|
@@ -49,7 +49,10 @@ module Sequel
|
|
49
49
|
# Options:
|
50
50
|
# :cast :: Cast to the specified type instead of the default if casting
|
51
51
|
def date_sub(expr, interval, opts=OPTS)
|
52
|
-
|
52
|
+
if defined?(ActiveSupport::Duration) && interval.is_a?(ActiveSupport::Duration)
|
53
|
+
interval = interval.parts
|
54
|
+
end
|
55
|
+
interval = if interval.is_a?(Enumerable)
|
53
56
|
h = {}
|
54
57
|
interval.each{|k,v| h[k] = -v unless v.nil?}
|
55
58
|
h
|
@@ -113,12 +116,12 @@ module Sequel
|
|
113
116
|
end
|
114
117
|
when :mssql, :h2, :access, :sqlanywhere
|
115
118
|
units = case db_type
|
116
|
-
when :mssql, :sqlanywhere
|
117
|
-
MSSQL_DURATION_UNITS
|
118
119
|
when :h2
|
119
120
|
H2_DURATION_UNITS
|
120
121
|
when :access
|
121
122
|
ACCESS_DURATION_UNITS
|
123
|
+
else
|
124
|
+
MSSQL_DURATION_UNITS
|
122
125
|
end
|
123
126
|
each_valid_interval_unit(h, units) do |value, sql_unit|
|
124
127
|
expr = Sequel.function(:DATEADD, sql_unit, value, expr)
|
@@ -105,6 +105,12 @@ class String
|
|
105
105
|
yield Inflections if block_given?
|
106
106
|
Inflections
|
107
107
|
end
|
108
|
+
|
109
|
+
%w'classify constantize dasherize demodulize foreign_key humanize pluralize singularize tableize underscore'.each do |m|
|
110
|
+
if method_defined?(m)
|
111
|
+
alias_method(m, m)
|
112
|
+
end
|
113
|
+
end
|
108
114
|
|
109
115
|
# By default, camelize converts the string to UpperCamelCase. If the argument to camelize
|
110
116
|
# is set to :lower then camelize produces lowerCamelCase.
|
@@ -68,7 +68,9 @@ module Sequel
|
|
68
68
|
# Allow calling private methods for backwards compatibility
|
69
69
|
@db.send(method_sym, *args, &block)
|
70
70
|
end
|
71
|
+
# :nocov:
|
71
72
|
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
73
|
+
# :nocov:
|
72
74
|
|
73
75
|
# This object responds to all methods the database responds to.
|
74
76
|
def respond_to_missing?(meth, include_private)
|
@@ -213,6 +213,7 @@ module Sequel
|
|
213
213
|
scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
|
214
214
|
define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
|
215
215
|
private meth
|
216
|
+
alias_method(meth, meth)
|
216
217
|
end
|
217
218
|
|
218
219
|
@schema_type_classes[:"#{type}_array"] = PGArray
|
@@ -34,6 +34,13 @@
|
|
34
34
|
|
35
35
|
require 'active_support/duration'
|
36
36
|
|
37
|
+
# :nocov:
|
38
|
+
begin
|
39
|
+
require 'active_support/version'
|
40
|
+
rescue LoadError
|
41
|
+
end
|
42
|
+
# :nocov:
|
43
|
+
|
37
44
|
module Sequel
|
38
45
|
module Postgres
|
39
46
|
module IntervalDatabaseMethods
|
@@ -61,34 +68,37 @@ module Sequel
|
|
61
68
|
|
62
69
|
# Creates callable objects that convert strings into ActiveSupport::Duration instances.
|
63
70
|
class Parser
|
71
|
+
# Whether ActiveSupport::Duration.new takes parts as array instead of hash
|
72
|
+
USE_PARTS_ARRAY = !defined?(ActiveSupport::VERSION::STRING) || ActiveSupport::VERSION::STRING < '5.1'
|
73
|
+
|
64
74
|
# Parse the interval input string into an ActiveSupport::Duration instance.
|
65
75
|
def call(string)
|
66
76
|
raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string)
|
67
77
|
|
68
78
|
value = 0
|
69
|
-
parts =
|
79
|
+
parts = {}
|
70
80
|
|
71
81
|
if v = matches[1]
|
72
82
|
v = v.to_i
|
73
83
|
value += 31557600 * v
|
74
|
-
parts
|
84
|
+
parts[:years] = v
|
75
85
|
end
|
76
86
|
if v = matches[2]
|
77
87
|
v = v.to_i
|
78
88
|
value += 2592000 * v
|
79
|
-
parts
|
89
|
+
parts[:months] = v
|
80
90
|
end
|
81
91
|
if v = matches[3]
|
82
92
|
v = v.to_i
|
83
93
|
value += 86400 * v
|
84
|
-
parts
|
94
|
+
parts[:days] = v
|
85
95
|
end
|
86
96
|
if matches[5]
|
87
97
|
seconds = matches[5].to_i * 3600 + matches[6].to_i * 60
|
88
98
|
seconds += matches[8] ? matches[7].to_f : matches[7].to_i
|
89
99
|
seconds *= -1 if matches[4] == '-'
|
90
100
|
value += seconds
|
91
|
-
parts
|
101
|
+
parts[:seconds] = seconds
|
92
102
|
elsif matches[9] || matches[10] || matches[11]
|
93
103
|
seconds = 0
|
94
104
|
if v = matches[9]
|
@@ -101,8 +111,14 @@ module Sequel
|
|
101
111
|
seconds += matches[12] ? v.to_f : v.to_i
|
102
112
|
end
|
103
113
|
value += seconds
|
104
|
-
parts
|
114
|
+
parts[:seconds] = seconds
|
115
|
+
end
|
116
|
+
|
117
|
+
# :nocov:
|
118
|
+
if USE_PARTS_ARRAY
|
119
|
+
parts = parts.to_a
|
105
120
|
end
|
121
|
+
# :nocov:
|
106
122
|
|
107
123
|
ActiveSupport::Duration.new(value, parts)
|
108
124
|
end
|
@@ -1930,6 +1930,7 @@ module Sequel
|
|
1930
1930
|
# super to be called.
|
1931
1931
|
def association_module_def(name, opts=OPTS, &block)
|
1932
1932
|
association_module(opts).send(:define_method, name, &block)
|
1933
|
+
association_module(opts).send(:alias_method, name, name)
|
1933
1934
|
end
|
1934
1935
|
|
1935
1936
|
# Add a private method to the module included in the class.
|
data/lib/sequel/model/base.rb
CHANGED
@@ -508,7 +508,9 @@ module Sequel
|
|
508
508
|
|
509
509
|
m.configure(self, *args, &block) if m.respond_to?(:configure)
|
510
510
|
end
|
511
|
+
# :nocov:
|
511
512
|
ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
|
513
|
+
# :nocov:
|
512
514
|
|
513
515
|
# Returns primary key attribute hash. If using a composite primary key
|
514
516
|
# value such be an array with values for each primary key in the correct
|
@@ -727,8 +729,14 @@ module Sequel
|
|
727
729
|
im = instance_methods
|
728
730
|
overridable_methods_module.module_eval do
|
729
731
|
meth = :"#{column}="
|
730
|
-
|
731
|
-
|
732
|
+
unless im.include?(column)
|
733
|
+
define_method(column){self[column]}
|
734
|
+
alias_method(column, column)
|
735
|
+
end
|
736
|
+
unless im.include?(meth)
|
737
|
+
define_method(meth){|v| self[column] = v}
|
738
|
+
alias_method(meth, meth)
|
739
|
+
end
|
732
740
|
end
|
733
741
|
end
|
734
742
|
|
@@ -741,8 +749,14 @@ module Sequel
|
|
741
749
|
im = instance_methods
|
742
750
|
columns.each do |column|
|
743
751
|
meth = :"#{column}="
|
744
|
-
|
745
|
-
|
752
|
+
unless im.include?(column)
|
753
|
+
overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__)
|
754
|
+
overridable_methods_module.send(:alias_method, column, column)
|
755
|
+
end
|
756
|
+
unless im.include?(meth)
|
757
|
+
overridable_methods_module.module_eval("def #{meth}(v); self[:#{column}] = v end", __FILE__, __LINE__)
|
758
|
+
overridable_methods_module.send(:alias_method, meth, meth)
|
759
|
+
end
|
746
760
|
end
|
747
761
|
end
|
748
762
|
|
@@ -757,7 +771,10 @@ module Sequel
|
|
757
771
|
else
|
758
772
|
define_singleton_method(meth){|*args, &block| dataset.public_send(meth, *args, &block)}
|
759
773
|
end
|
774
|
+
singleton_class.send(:alias_method, meth, meth)
|
775
|
+
# :nocov:
|
760
776
|
singleton_class.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
777
|
+
# :nocov:
|
761
778
|
end
|
762
779
|
|
763
780
|
# Get the schema from the database, fall back on checking the columns
|
data/lib/sequel/model/plugins.rb
CHANGED
@@ -31,7 +31,9 @@ module Sequel
|
|
31
31
|
def self.def_dataset_methods(mod, meths)
|
32
32
|
Array(meths).each do |meth|
|
33
33
|
mod.class_eval("def #{meth}(*args, &block); dataset.#{meth}(*args, &block) end", __FILE__, __LINE__)
|
34
|
+
# :nocov:
|
34
35
|
mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
36
|
+
# :nocov:
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
@@ -120,6 +122,7 @@ module Sequel
|
|
120
122
|
|
121
123
|
model.send(:define_method, meth, &block)
|
122
124
|
model.send(:private, meth)
|
125
|
+
model.send(:alias_method, meth, meth)
|
123
126
|
call_meth
|
124
127
|
end
|
125
128
|
|
@@ -141,6 +144,8 @@ module Sequel
|
|
141
144
|
keyword = :required
|
142
145
|
when :key, :keyrest
|
143
146
|
keyword ||= true
|
147
|
+
else
|
148
|
+
raise Error, "invalid arg_type passed to _define_sequel_method_arg_numbers: #{arg_type}"
|
144
149
|
end
|
145
150
|
end
|
146
151
|
arity = callable.arity
|
@@ -143,10 +143,14 @@ module Sequel
|
|
143
143
|
compositions[name] = send(composer_meth)
|
144
144
|
end
|
145
145
|
end
|
146
|
-
|
146
|
+
alias_method(name, name)
|
147
|
+
|
148
|
+
meth = :"#{name}="
|
149
|
+
define_method(meth) do |v|
|
147
150
|
modified!
|
148
151
|
compositions[name] = v
|
149
152
|
end
|
153
|
+
alias_method(meth, meth)
|
150
154
|
end
|
151
155
|
end
|
152
156
|
|
@@ -62,7 +62,10 @@ module Sequel
|
|
62
62
|
ret = super
|
63
63
|
r = association_reflection(name)
|
64
64
|
meth = r.returns_array? ? name : pluralize(name).to_sym
|
65
|
-
dataset_module
|
65
|
+
dataset_module do
|
66
|
+
define_method(meth){associated(name)}
|
67
|
+
alias_method(meth, meth)
|
68
|
+
end
|
66
69
|
ret
|
67
70
|
end
|
68
71
|
|
@@ -145,9 +145,11 @@ module Sequel
|
|
145
145
|
# class.
|
146
146
|
def def_nested_attribute_method(reflection)
|
147
147
|
@nested_attributes_module.class_eval do
|
148
|
-
|
148
|
+
meth = :"#{reflection[:name]}_attributes="
|
149
|
+
define_method(meth) do |v|
|
149
150
|
set_nested_attributes(reflection[:name], v)
|
150
151
|
end
|
152
|
+
alias_method meth, meth
|
151
153
|
end
|
152
154
|
end
|
153
155
|
end
|
@@ -520,7 +520,9 @@ module Sequel
|
|
520
520
|
def many_to_pg_array_association_filter_expression(op, ref, obj)
|
521
521
|
pk = ref.qualify(model.table_name, ref.primary_key)
|
522
522
|
key = ref[:key]
|
523
|
+
# :nocov:
|
523
524
|
expr = case obj
|
525
|
+
# :nocov:
|
524
526
|
when Sequel::Model
|
525
527
|
if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
|
526
528
|
Sequel[pk=>assoc_pks.to_a]
|
@@ -540,7 +542,9 @@ module Sequel
|
|
540
542
|
# Support filtering by pg_array_to_many associations using a subquery.
|
541
543
|
def pg_array_to_many_association_filter_expression(op, ref, obj)
|
542
544
|
key = ref.qualify(model.table_name, ref[:key_column])
|
545
|
+
# :nocov:
|
543
546
|
expr = case obj
|
547
|
+
# :nocov:
|
544
548
|
when Sequel::Model
|
545
549
|
if pkv = obj.get_column_value(ref.primary_key_method)
|
546
550
|
Sequel.pg_array_op(key).contains(Sequel.pg_array([pkv], ref.array_type))
|
@@ -250,7 +250,9 @@ module Sequel
|
|
250
250
|
messages = model.pg_auto_constraint_validations_messages
|
251
251
|
|
252
252
|
unless override
|
253
|
+
# :nocov:
|
253
254
|
case e
|
255
|
+
# :nocov:
|
254
256
|
when Sequel::NotNullConstraintViolation
|
255
257
|
if column = info[:column]
|
256
258
|
add_pg_constraint_validation_error([m.call(column)], messages[:not_null])
|
data/lib/sequel/version.rb
CHANGED
@@ -6,7 +6,7 @@ module Sequel
|
|
6
6
|
|
7
7
|
# The minor version of Sequel. Bumped for every non-patch level
|
8
8
|
# release, generally around once a month.
|
9
|
-
MINOR =
|
9
|
+
MINOR = 40
|
10
10
|
|
11
11
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
12
12
|
# releases that fix regressions from previous versions.
|
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.
|
4
|
+
version: 5.40.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:
|
11
|
+
date: 2021-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -117,9 +117,8 @@ extra_rdoc_files:
|
|
117
117
|
- README.rdoc
|
118
118
|
- CHANGELOG
|
119
119
|
- MIT-LICENSE
|
120
|
-
- doc/association_basics.rdoc
|
121
|
-
- doc/model_dataset_method_design.rdoc
|
122
120
|
- doc/advanced_associations.rdoc
|
121
|
+
- doc/association_basics.rdoc
|
123
122
|
- doc/bin_sequel.rdoc
|
124
123
|
- doc/cheat_sheet.rdoc
|
125
124
|
- doc/code_order.rdoc
|
@@ -127,37 +126,30 @@ extra_rdoc_files:
|
|
127
126
|
- doc/dataset_basics.rdoc
|
128
127
|
- doc/dataset_filtering.rdoc
|
129
128
|
- doc/extensions.rdoc
|
129
|
+
- doc/fork_safety.rdoc
|
130
130
|
- doc/mass_assignment.rdoc
|
131
131
|
- doc/migration.rdoc
|
132
|
-
- doc/
|
132
|
+
- doc/model_dataset_method_design.rdoc
|
133
133
|
- doc/model_hooks.rdoc
|
134
134
|
- doc/model_plugins.rdoc
|
135
|
-
- doc/object_model.rdoc
|
136
|
-
- doc/sql.rdoc
|
137
135
|
- doc/mssql_stored_procedures.rdoc
|
138
|
-
- doc/
|
136
|
+
- doc/object_model.rdoc
|
137
|
+
- doc/opening_databases.rdoc
|
139
138
|
- doc/postgresql.rdoc
|
140
|
-
- doc/querying.rdoc
|
141
139
|
- doc/prepared_statements.rdoc
|
140
|
+
- doc/querying.rdoc
|
142
141
|
- doc/reflection.rdoc
|
143
|
-
- doc/security.rdoc
|
144
|
-
- doc/virtual_rows.rdoc
|
145
142
|
- doc/schema_modification.rdoc
|
143
|
+
- doc/security.rdoc
|
146
144
|
- doc/sharding.rdoc
|
145
|
+
- doc/sql.rdoc
|
147
146
|
- doc/testing.rdoc
|
148
|
-
- doc/
|
147
|
+
- doc/thread_safety.rdoc
|
149
148
|
- doc/transactions.rdoc
|
150
|
-
- doc/
|
151
|
-
- doc/
|
152
|
-
- doc/release_notes/5.6.0.txt
|
149
|
+
- doc/validations.rdoc
|
150
|
+
- doc/virtual_rows.rdoc
|
153
151
|
- doc/release_notes/5.0.0.txt
|
154
152
|
- doc/release_notes/5.1.0.txt
|
155
|
-
- doc/release_notes/5.2.0.txt
|
156
|
-
- doc/release_notes/5.3.0.txt
|
157
|
-
- doc/release_notes/5.4.0.txt
|
158
|
-
- doc/release_notes/5.8.0.txt
|
159
|
-
- doc/release_notes/5.7.0.txt
|
160
|
-
- doc/release_notes/5.9.0.txt
|
161
153
|
- doc/release_notes/5.10.0.txt
|
162
154
|
- doc/release_notes/5.11.0.txt
|
163
155
|
- doc/release_notes/5.12.0.txt
|
@@ -168,6 +160,7 @@ extra_rdoc_files:
|
|
168
160
|
- doc/release_notes/5.17.0.txt
|
169
161
|
- doc/release_notes/5.18.0.txt
|
170
162
|
- doc/release_notes/5.19.0.txt
|
163
|
+
- doc/release_notes/5.2.0.txt
|
171
164
|
- doc/release_notes/5.20.0.txt
|
172
165
|
- doc/release_notes/5.21.0.txt
|
173
166
|
- doc/release_notes/5.22.0.txt
|
@@ -178,6 +171,7 @@ extra_rdoc_files:
|
|
178
171
|
- doc/release_notes/5.27.0.txt
|
179
172
|
- doc/release_notes/5.28.0.txt
|
180
173
|
- doc/release_notes/5.29.0.txt
|
174
|
+
- doc/release_notes/5.3.0.txt
|
181
175
|
- doc/release_notes/5.30.0.txt
|
182
176
|
- doc/release_notes/5.31.0.txt
|
183
177
|
- doc/release_notes/5.32.0.txt
|
@@ -188,6 +182,13 @@ extra_rdoc_files:
|
|
188
182
|
- doc/release_notes/5.37.0.txt
|
189
183
|
- doc/release_notes/5.38.0.txt
|
190
184
|
- doc/release_notes/5.39.0.txt
|
185
|
+
- doc/release_notes/5.4.0.txt
|
186
|
+
- doc/release_notes/5.40.0.txt
|
187
|
+
- doc/release_notes/5.5.0.txt
|
188
|
+
- doc/release_notes/5.6.0.txt
|
189
|
+
- doc/release_notes/5.7.0.txt
|
190
|
+
- doc/release_notes/5.8.0.txt
|
191
|
+
- doc/release_notes/5.9.0.txt
|
191
192
|
files:
|
192
193
|
- CHANGELOG
|
193
194
|
- MIT-LICENSE
|
@@ -250,6 +251,7 @@ files:
|
|
250
251
|
- doc/release_notes/5.38.0.txt
|
251
252
|
- doc/release_notes/5.39.0.txt
|
252
253
|
- doc/release_notes/5.4.0.txt
|
254
|
+
- doc/release_notes/5.40.0.txt
|
253
255
|
- doc/release_notes/5.5.0.txt
|
254
256
|
- doc/release_notes/5.6.0.txt
|
255
257
|
- doc/release_notes/5.7.0.txt
|
@@ -555,7 +557,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
555
557
|
- !ruby/object:Gem::Version
|
556
558
|
version: '0'
|
557
559
|
requirements: []
|
558
|
-
rubygems_version: 3.
|
560
|
+
rubygems_version: 3.2.3
|
559
561
|
signing_key:
|
560
562
|
specification_version: 4
|
561
563
|
summary: The Database Toolkit for Ruby
|