sequel 5.39.0 → 5.40.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: b995589f8bb51611b490ae4cd1d84c2ecfbb5889cb4f940dd786a841fe9ecf9f
4
- data.tar.gz: afa86ae9dfc39cd21138aff35955fb4194c359a1ea56c9a80026f04b85b79a4a
3
+ metadata.gz: b3391bf9fe9e592892ad8ba6b39f7016fe94524908243e7c85fdf5b1cbf9a62a
4
+ data.tar.gz: 3b3c946fefa8c16b8f657c191debf49f8db84cb9cadb5a91ecdb01739c2ec1e9
5
5
  SHA512:
6
- metadata.gz: 553d5c2b92a49d079503c9e8e0f8dfecef1a4abf2ed2fe242c8aec19d53c918912de4f5d1453626a05c1b654c5582c508199df10aa7540ec590331b3ecb355da
7
- data.tar.gz: f0fc7bceadccc74651573f82ed957ab91061ecb05f5f30050d0814a0142b915a79175d146b3bcac6f7269cd4f3b3b69eb58a92a4df439a944c081b45f1deaa2c
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!
@@ -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
@@ -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
- check_modification_allowed!
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
- check_modification_allowed!
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 << 'check_modification_allowed!' << 'check_not_limited!(:delete)' if type == :delete
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 deletion is not allowed for this dataset.
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 !supports_modifying_joins? && joined_dataset?
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
- interval = if interval.is_a?(Hash)
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)
@@ -55,6 +55,8 @@ module Sequel
55
55
 
56
56
  module SQL
57
57
  class Expression
58
+ alias inspect inspect
59
+
58
60
  # Attempt to produce a string suitable for eval, such that:
59
61
  #
60
62
  # eval(obj.inspect) == obj
@@ -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 << [:years, v]
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 << [:months, v]
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 << [:days, v]
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 << [:seconds, seconds]
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 << [:seconds, seconds]
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
@@ -482,6 +482,7 @@ module Sequel
482
482
  row_type(db_type, v)
483
483
  end
484
484
  private meth
485
+ alias_method(meth, meth)
485
486
  end
486
487
 
487
488
  nil
@@ -74,7 +74,9 @@ module Sequel
74
74
  raise(Sequel::Error, "method #{method.inspect} did not return a dataset") unless @dataset.is_a?(Dataset)
75
75
  self
76
76
  end
77
+ # :nocov:
77
78
  ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
79
+ # :nocov:
78
80
  end
79
81
  end
80
82
 
@@ -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.
@@ -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
- define_method(column){self[column]} unless im.include?(column)
731
- define_method(meth){|v| self[column] = v} unless im.include?(meth)
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
- overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__) unless im.include?(column)
745
- overridable_methods_module.module_eval("def #{meth}(v); self[:#{column}] = v end", __FILE__, __LINE__) unless im.include?(meth)
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
@@ -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
@@ -99,7 +99,9 @@ module Sequel
99
99
  end
100
100
  v.public_send(meth, *args, &block)
101
101
  end
102
+ # :nocov:
102
103
  ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
104
+ # :nocov:
103
105
  end
104
106
 
105
107
  module ClassMethods
@@ -143,10 +143,14 @@ module Sequel
143
143
  compositions[name] = send(composer_meth)
144
144
  end
145
145
  end
146
- define_method("#{name}=") do |v|
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
 
@@ -220,7 +220,8 @@ module Sequel
220
220
  '%'
221
221
  when '%'
222
222
  '.*'
223
- when '_'
223
+ else
224
+ #when '_'
224
225
  '.'
225
226
  end
226
227
  end
@@ -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{define_method(meth){associated(name)}}
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
- define_method("#{reflection[:name]}_attributes=") do |v|
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])
@@ -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 = 39
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.39.0
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: 2020-12-01 00:00:00.000000000 Z
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/opening_databases.rdoc
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/thread_safety.rdoc
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/validations.rdoc
147
+ - doc/thread_safety.rdoc
149
148
  - doc/transactions.rdoc
150
- - doc/fork_safety.rdoc
151
- - doc/release_notes/5.5.0.txt
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.1.4
560
+ rubygems_version: 3.2.3
559
561
  signing_key:
560
562
  specification_version: 4
561
563
  summary: The Database Toolkit for Ruby