sequel 5.107.0 → 5.109.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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sequel +5 -5
  3. data/lib/sequel/adapters/ado.rb +1 -1
  4. data/lib/sequel/adapters/amalgalite.rb +34 -8
  5. data/lib/sequel/adapters/ibmdb.rb +2 -2
  6. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
  7. data/lib/sequel/adapters/jdbc/mssql.rb +28 -5
  8. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  9. data/lib/sequel/adapters/jdbc/postgresql.rb +14 -3
  10. data/lib/sequel/adapters/jdbc.rb +4 -3
  11. data/lib/sequel/adapters/mock.rb +1 -1
  12. data/lib/sequel/adapters/mysql.rb +7 -2
  13. data/lib/sequel/adapters/mysql2.rb +5 -4
  14. data/lib/sequel/adapters/postgres.rb +42 -39
  15. data/lib/sequel/adapters/shared/db2.rb +5 -2
  16. data/lib/sequel/adapters/shared/mssql.rb +11 -5
  17. data/lib/sequel/adapters/shared/mysql.rb +2 -2
  18. data/lib/sequel/adapters/shared/postgres.rb +80 -1028
  19. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -32
  20. data/lib/sequel/adapters/shared/sqlite.rb +3 -3
  21. data/lib/sequel/adapters/sqlite.rb +13 -9
  22. data/lib/sequel/adapters/trilogy.rb +2 -1
  23. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  24. data/lib/sequel/adapters/utils/mysql_mysql2.rb +11 -1
  25. data/lib/sequel/connection_pool/sharded_single.rb +1 -1
  26. data/lib/sequel/connection_pool/sharded_threaded.rb +7 -5
  27. data/lib/sequel/connection_pool/sharded_timed_queue.rb +3 -3
  28. data/lib/sequel/connection_pool/threaded.rb +9 -7
  29. data/lib/sequel/connection_pool/timed_queue.rb +2 -2
  30. data/lib/sequel/connection_pool.rb +3 -3
  31. data/lib/sequel/core.rb +44 -24
  32. data/lib/sequel/database/connecting.rb +1 -1
  33. data/lib/sequel/database/features.rb +1 -1
  34. data/lib/sequel/database/misc.rb +6 -11
  35. data/lib/sequel/database/query.rb +2 -2
  36. data/lib/sequel/database/schema_generator.rb +4 -4
  37. data/lib/sequel/database/schema_methods.rb +2 -2
  38. data/lib/sequel/database/transactions.rb +5 -7
  39. data/lib/sequel/dataset/actions.rb +2 -2
  40. data/lib/sequel/dataset/features.rb +4 -4
  41. data/lib/sequel/dataset/graph.rb +1 -1
  42. data/lib/sequel/dataset/misc.rb +3 -3
  43. data/lib/sequel/dataset/prepared_statements.rb +2 -2
  44. data/lib/sequel/dataset/query.rb +8 -8
  45. data/lib/sequel/dataset/sql.rb +32 -13
  46. data/lib/sequel/dataset.rb +2 -2
  47. data/lib/sequel/deprecated.rb +2 -2
  48. data/lib/sequel/exceptions.rb +2 -2
  49. data/lib/sequel/extensions/_pretty_table.rb +1 -1
  50. data/lib/sequel/extensions/async_thread_pool.rb +3 -3
  51. data/lib/sequel/extensions/auto_cast_date_and_time.rb +2 -2
  52. data/lib/sequel/extensions/blank.rb +2 -2
  53. data/lib/sequel/extensions/constraint_validations.rb +1 -1
  54. data/lib/sequel/extensions/core_refinements.rb +7 -10
  55. data/lib/sequel/extensions/date_arithmetic.rb +1 -1
  56. data/lib/sequel/extensions/datetime_parse_to_time.rb +2 -2
  57. data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -3
  58. data/lib/sequel/extensions/graph_each.rb +1 -1
  59. data/lib/sequel/extensions/index_caching.rb +1 -1
  60. data/lib/sequel/extensions/inflector.rb +5 -5
  61. data/lib/sequel/extensions/is_distinct_from.rb +2 -2
  62. data/lib/sequel/extensions/lit_require_frozen.rb +20 -4
  63. data/lib/sequel/extensions/migration.rb +21 -7
  64. data/lib/sequel/extensions/named_timezones.rb +9 -9
  65. data/lib/sequel/extensions/pg_array.rb +10 -8
  66. data/lib/sequel/extensions/pg_array_ops.rb +69 -14
  67. data/lib/sequel/extensions/pg_auto_parameterize.rb +2 -2
  68. data/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +3 -3
  69. data/lib/sequel/extensions/pg_enum.rb +2 -2
  70. data/lib/sequel/extensions/pg_extended_date_support.rb +5 -5
  71. data/lib/sequel/extensions/pg_extended_integer_support.rb +1 -1
  72. data/lib/sequel/extensions/pg_hstore.rb +2 -2
  73. data/lib/sequel/extensions/pg_hstore_ops.rb +5 -5
  74. data/lib/sequel/extensions/pg_inet.rb +2 -2
  75. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  76. data/lib/sequel/extensions/pg_interval.rb +6 -6
  77. data/lib/sequel/extensions/pg_json.rb +4 -4
  78. data/lib/sequel/extensions/pg_json_ops.rb +15 -13
  79. data/lib/sequel/extensions/pg_range.rb +6 -6
  80. data/lib/sequel/extensions/pg_range_ops.rb +7 -7
  81. data/lib/sequel/extensions/pg_row.rb +4 -4
  82. data/lib/sequel/extensions/pg_row_ops.rb +6 -6
  83. data/lib/sequel/extensions/provenance.rb +2 -2
  84. data/lib/sequel/extensions/query.rb +2 -2
  85. data/lib/sequel/extensions/s.rb +6 -10
  86. data/lib/sequel/extensions/schema_dumper.rb +10 -6
  87. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +2 -0
  88. data/lib/sequel/extensions/sql_comments.rb +1 -1
  89. data/lib/sequel/extensions/sql_log_normalizer.rb +1 -1
  90. data/lib/sequel/extensions/sqlite_json_ops.rb +2 -2
  91. data/lib/sequel/extensions/string_agg.rb +5 -5
  92. data/lib/sequel/extensions/symbol_aref.rb +12 -32
  93. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -5
  94. data/lib/sequel/extensions/symbol_as.rb +1 -2
  95. data/lib/sequel/extensions/symbol_as_refinement.rb +1 -5
  96. data/lib/sequel/extensions/transaction_connection_validator.rb +1 -1
  97. data/lib/sequel/model/associations.rb +17 -17
  98. data/lib/sequel/model/base.rb +18 -15
  99. data/lib/sequel/model/inflections.rb +1 -1
  100. data/lib/sequel/model/plugins.rb +2 -2
  101. data/lib/sequel/model.rb +2 -2
  102. data/lib/sequel/plugins/association_pks.rb +1 -1
  103. data/lib/sequel/plugins/association_proxies.rb +4 -4
  104. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +2 -0
  105. data/lib/sequel/plugins/caching.rb +28 -3
  106. data/lib/sequel/plugins/class_table_inheritance.rb +1 -1
  107. data/lib/sequel/plugins/column_encryption.rb +10 -10
  108. data/lib/sequel/plugins/concurrent_eager_loading.rb +2 -2
  109. data/lib/sequel/plugins/csv_serializer.rb +9 -20
  110. data/lib/sequel/plugins/deprecated_associations.rb +2 -2
  111. data/lib/sequel/plugins/eager_each.rb +1 -1
  112. data/lib/sequel/plugins/finder.rb +1 -1
  113. data/lib/sequel/plugins/forbid_lazy_load.rb +3 -3
  114. data/lib/sequel/plugins/insert_conflict.rb +1 -1
  115. data/lib/sequel/plugins/insert_returning_select.rb +1 -1
  116. data/lib/sequel/plugins/instance_filters.rb +8 -0
  117. data/lib/sequel/plugins/instance_hooks.rb +19 -0
  118. data/lib/sequel/plugins/json_serializer.rb +4 -4
  119. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  120. data/lib/sequel/plugins/many_through_many.rb +1 -1
  121. data/lib/sequel/plugins/mssql_optimistic_locking.rb +9 -0
  122. data/lib/sequel/plugins/optimistic_locking.rb +12 -2
  123. data/lib/sequel/plugins/optimistic_locking_base.rb +14 -0
  124. data/lib/sequel/plugins/pg_array_associations.rb +4 -4
  125. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +3 -3
  126. data/lib/sequel/plugins/pg_eager_any_typed_array.rb +2 -2
  127. data/lib/sequel/plugins/pg_xmin_optimistic_locking.rb +11 -2
  128. data/lib/sequel/plugins/prepared_statements.rb +2 -2
  129. data/lib/sequel/plugins/select_on_skipped_update.rb +63 -0
  130. data/lib/sequel/plugins/serialization.rb +1 -1
  131. data/lib/sequel/plugins/sharding.rb +1 -1
  132. data/lib/sequel/plugins/single_table_inheritance.rb +21 -3
  133. data/lib/sequel/plugins/skip_saving_columns.rb +2 -2
  134. data/lib/sequel/plugins/split_values.rb +1 -1
  135. data/lib/sequel/plugins/sql_comments.rb +8 -8
  136. data/lib/sequel/plugins/subclasses.rb +6 -6
  137. data/lib/sequel/plugins/subset_conditions.rb +5 -16
  138. data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
  139. data/lib/sequel/plugins/throw_failures.rb +3 -3
  140. data/lib/sequel/plugins/unused_associations.rb +5 -5
  141. data/lib/sequel/plugins/validate_associated.rb +7 -1
  142. data/lib/sequel/plugins/validate_associated_context.rb +52 -0
  143. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  144. data/lib/sequel/plugins/xml_serializer.rb +2 -0
  145. data/lib/sequel/sql.rb +120 -116
  146. data/lib/sequel/version.rb +1 -1
  147. metadata +5 -3
@@ -68,9 +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
+ # simplecov:disable
72
72
  ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
73
- # :nocov:
73
+ # simplecov:enable
74
74
 
75
75
  # This object responds to all methods the database responds to.
76
76
  def respond_to_missing?(meth, include_private)
@@ -410,6 +410,11 @@ module Sequel
410
410
  private_constant :MIGRATION_ADVISORY_LOCK_ID
411
411
 
412
412
  # Migrates the supplied database using the migration files in the specified directory. Options:
413
+ # :allow_migration_number :: Set to check each migration number. If set, calls the
414
+ # <tt>===</tt> method on the object with the migration number,
415
+ # allowing it to work with both ranges and procs. If the
416
+ # <tt>===</tt> method returns false, an exception is raised
417
+ # (TimestampMigrator only).
413
418
  # :allow_missing_migration_files :: Don't raise an error if there are missing migration files.
414
419
  # It is very risky to use this option, since it can result in
415
420
  # the database schema version number not matching the expected
@@ -699,6 +704,7 @@ module Sequel
699
704
 
700
705
  # Set up all state for the migrator instance
701
706
  def initialize(db, directory, opts=OPTS)
707
+ @allow_migration_number = opts[:allow_migration_number]
702
708
  super
703
709
  @target = opts[:target]
704
710
  @applied_migrations = get_applied_migrations
@@ -788,20 +794,28 @@ module Sequel
788
794
  # Returns any migration files found in the migrator's directory.
789
795
  def get_migration_files
790
796
  files = []
797
+ allow_migration_number = @allow_migration_number
798
+
791
799
  Dir.new(directory).each do |file|
792
800
  next unless MIGRATION_FILE_PATTERN.match(file)
793
801
  files << File.join(directory, file)
794
802
  end
795
- files.sort! do |a, b|
796
- a_ver, a_name = split_migration_filename(a)
797
- b_ver, b_name = split_migration_filename(b)
803
+
804
+ files.map! do |f|
805
+ ver, = split = split_migration_filename(f)
806
+ if allow_migration_number && !(allow_migration_number === ver)
807
+ raise Error, "Migration filename uses version number that is not allowed: #{f}"
808
+ end
809
+ [f, *split]
810
+ end.sort! do |a, b|
811
+ _, a_ver, a_name = a
812
+ _, b_ver, b_name = b
798
813
  x = a_ver <=> b_ver
799
814
  if x.zero?
800
815
  x = a_name <=> b_name
801
816
  end
802
817
  x
803
- end
804
- files
818
+ end.map!(&:first)
805
819
  end
806
820
 
807
821
  # Return an integer and name (without extension) for the given path.
@@ -69,7 +69,7 @@ module Sequel
69
69
 
70
70
  if RUBY_VERSION >= '2.6'
71
71
  # Whether Time.at with :nsec and :in is broken. True on JRuby < 9.3.9.0.
72
- BROKEN_TIME_AT_WITH_NSEC = defined?(JRUBY_VERSION) && (JRUBY_VERSION < '9.3' || (JRUBY_VERSION < '9.4' && JRUBY_VERSION.split('.')[2].to_i < 9))
72
+ BROKEN_TIME_AT_WITH_NSEC = defined?(JRUBY_VERSION) && (JRUBY_VERSION.to_r < Rational('9.3') || (JRUBY_VERSION.to_r < Rational('9.4') && JRUBY_VERSION.split('.')[2].to_i < 9))
73
73
  private_constant :BROKEN_TIME_AT_WITH_NSEC
74
74
 
75
75
  # Convert the given input Time (which must be in UTC) to the given input timezone,
@@ -80,10 +80,10 @@ module Sequel
80
80
  raise unless disamb = tzinfo_disambiguator_for(v)
81
81
  period = input_timezone.period_for_local(v, &disamb)
82
82
  offset = period.utc_total_offset
83
- # :nocov:
83
+ # simplecov:disable
84
84
  if BROKEN_TIME_AT_WITH_NSEC
85
85
  Time.at(v.to_i - offset, :in => input_timezone) + v.nsec/1000000000.0
86
- # :nocov:
86
+ # simplecov:enable
87
87
  else
88
88
  Time.at(v.to_i - offset, v.nsec, :nsec, :in => input_timezone)
89
89
  end
@@ -92,16 +92,16 @@ module Sequel
92
92
  # Convert the given input Time to the given output timezone,
93
93
  # which should be a TZInfo::Timezone instance.
94
94
  def convert_output_time_other(v, output_timezone)
95
- # :nocov:
95
+ # simplecov:disable
96
96
  if BROKEN_TIME_AT_WITH_NSEC
97
97
  Time.at(v.to_i, :in => output_timezone) + v.nsec/1000000000.0
98
- # :nocov:
98
+ # simplecov:enable
99
99
  else
100
100
  Time.at(v.to_i, v.nsec, :nsec, :in => output_timezone)
101
101
  end
102
102
  end
103
103
  # :nodoc:
104
- # :nocov:
104
+ # simplecov:disable
105
105
  else
106
106
  def convert_input_time_other(v, input_timezone)
107
107
  local_offset = input_timezone.period_for_local(v, &tzinfo_disambiguator_for(v)).utc_total_offset
@@ -122,7 +122,7 @@ module Sequel
122
122
  end
123
123
  end
124
124
  # :nodoc:
125
- # :nocov:
125
+ # simplecov:enable
126
126
  end
127
127
 
128
128
  # Handle both TZInfo 1 and TZInfo 2
@@ -139,7 +139,7 @@ module Sequel
139
139
  DateTime.civil(v.year, v.month, v.day, v.hour, v.minute, v.second + v.sec_fraction, v.offset, v.start)
140
140
  end
141
141
  # :nodoc:
142
- # :nocov:
142
+ # simplecov:disable
143
143
  else
144
144
  # Assume the given DateTime has a correct time but a wrong timezone. It is
145
145
  # currently in UTC timezone, but it should be converted to the input_timezone.
@@ -161,7 +161,7 @@ module Sequel
161
161
  (v - local_offset).new_offset(local_offset)
162
162
  end
163
163
  # :nodoc:
164
- # :nocov:
164
+ # simplecov:enable
165
165
  end
166
166
 
167
167
  # Returns TZInfo::Timezone instance if given a String.
@@ -77,6 +77,7 @@ module Sequel
77
77
  # Represents a PostgreSQL array column value.
78
78
  class PGArray < DelegateClass(Array)
79
79
  include Sequel::SQL::AliasMethods
80
+ include Sequel::SQL::CastMethods
80
81
 
81
82
  module DatabaseMethods
82
83
  BLOB_RANGE = 1...-1
@@ -362,18 +363,18 @@ module Sequel
362
363
  raise Sequel::Error, "invalid array, empty string" if eos?
363
364
  raise Sequel::Error, "invalid array, doesn't start with {" unless scan(/((\[\d+:\d+\])+=)?\{/)
364
365
 
365
- # :nocov:
366
+ # simplecov:disable
366
367
  while !eos?
367
- # :nocov:
368
+ # simplecov:enable
368
369
  char = scan(/[{}",]|[^{}",]+/)
369
370
  if char == ','
370
371
  # Comma outside quoted string indicates end of current entry
371
372
  new_entry
372
373
  elsif char == '"'
373
374
  raise Sequel::Error, "invalid array, opening quote with existing recorded data" unless @recorded.empty?
374
- # :nocov:
375
+ # simplecov:disable
375
376
  while true
376
- # :nocov:
377
+ # simplecov:enable
377
378
  char = scan(/["\\]|[^"\\]+/)
378
379
  if char == '\\'
379
380
  @recorded << getch
@@ -389,6 +390,7 @@ module Sequel
389
390
  elsif char == '{'
390
391
  raise Sequel::Error, "invalid array, opening brace with existing recorded data" unless @recorded.empty?
391
392
 
393
+ raise Sequel::Error, "cannot parse array with more than 6 dimensions" if @stack.length >= 6
392
394
  # Start of new array, add it to the stack
393
395
  new = []
394
396
  @stack.last << new
@@ -434,12 +436,12 @@ module Sequel
434
436
  end
435
437
 
436
438
  if Sequel::Postgres.respond_to?(:parse_pg_array)
437
- # :nocov:
439
+ # simplecov:disable
438
440
  # Use sequel_pg's C-based parser if it has already been defined.
439
441
  def call(string)
440
442
  PGArray.new(Sequel::Postgres.parse_pg_array(string, @converter), @type)
441
443
  end
442
- # :nocov:
444
+ # simplecov:enable
443
445
  else
444
446
  # Parse the string using Parser with the appropriate
445
447
  # converter, and return a PGArray with the appropriate database
@@ -531,7 +533,7 @@ module Sequel
531
533
  Database.register_extension(:pg_array, Postgres::PGArray::DatabaseMethods)
532
534
  end
533
535
 
534
- # :nocov:
536
+ # simplecov:disable
535
537
  if Sequel.core_extensions?
536
538
  class Array
537
539
  # Return a PGArray proxy to the receiver, using a
@@ -553,4 +555,4 @@ if defined?(Sequel::CoreRefinements)
553
555
  end
554
556
  end
555
557
  end
556
- # :nocov:
558
+ # simplecov:enable
@@ -54,15 +54,20 @@
54
54
  # ia.join # array_to_string(int_array_column, '')
55
55
  # ia.join(':') # array_to_string(int_array_column, ':')
56
56
  # ia.join(':', ' ') # array_to_string(int_array_column, ':', ' ')
57
- # ia.unnest # unnest(int_array_column)
58
- # ia.unnest(:b) # unnest(int_array_column, b)
59
- #
60
- # On PostgreSQL 18+, the following are supported:
61
- #
57
+ # ia.ndims # array_ndims(int_array_column)
58
+ # ia.position(3) # array_position(int_array_column, 3, 1)
59
+ # ia.position(3, 2) # array_position(int_array_column, 3, 2)
60
+ # ia.positions(3) # array_positions(int_array_column, 3)
61
+ # ia.prepend(3) # array_prepend(3, int_array_column)
62
+ # ia.reverse # array_reverse(int_array_column)
63
+ # ia.sample(3) # array_sample(int_array_column, 3)
64
+ # ia.shuffle # array_shuffle(int_array_column)
62
65
  # ia.sort # array_sort(int_array_column)
63
66
  # ia.sort(desc: true) # array_sort(int_array_column, true)
64
67
  # ia.sort(nulls: :first) # array_sort(int_array_column, false, true)
65
- # ia.reverse # array_reverse(int_array_column)
68
+ # ia.trim(1) # trim_array(int_array_column, 1)
69
+ # ia.unnest # unnest(int_array_column)
70
+ # ia.unnest(:b) # unnest(int_array_column, b)
66
71
  #
67
72
  # See the PostgreSQL array function and operator documentation for more
68
73
  # details on what these functions and operators do.
@@ -153,6 +158,13 @@ module Sequel
153
158
  function(:array_dims)
154
159
  end
155
160
 
161
+ # Call the array_ndims method:
162
+ #
163
+ # array_op.ndims # array_ndims(array)
164
+ def ndims
165
+ function(:array_ndims)
166
+ end
167
+
156
168
  # Convert the array into an hstore using the hstore function.
157
169
  # If given an argument, use the two array form:
158
170
  #
@@ -164,9 +176,9 @@ module Sequel
164
176
  else
165
177
  Sequel.function(:hstore, self, wrap_array(arg))
166
178
  end
167
- # :nocov:
179
+ # simplecov:disable
168
180
  if Sequel.respond_to?(:hstore_op)
169
- # :nocov:
181
+ # simplecov:enable
170
182
  v = Sequel.hstore_op(v)
171
183
  end
172
184
  v
@@ -188,6 +200,28 @@ module Sequel
188
200
  function(:array_lower, dimension)
189
201
  end
190
202
 
203
+ # Call the array_position method:
204
+ #
205
+ # array_op.position(1) # array_position(array, 1, 1)
206
+ # array_op.position(1, 2) # array_position(array, 1, 2)
207
+ def position(element, offset = 1)
208
+ function(:array_position, element, offset)
209
+ end
210
+
211
+ # Call the array_positions method:
212
+ #
213
+ # array_op.positions(1) # array_positions(array, 1)
214
+ def positions(element)
215
+ function(:array_positions, element)
216
+ end
217
+
218
+ # Call the array_prepend method:
219
+ #
220
+ # array_op.prepend(1) # array_prepend(1, array)
221
+ def prepend(element)
222
+ SQL::Function.new(:array_prepend, element, self)
223
+ end
224
+
191
225
  # Use the overlaps (&&) operator:
192
226
  #
193
227
  # array_op.overlaps(:a) # (array && a)
@@ -195,7 +229,7 @@ module Sequel
195
229
  bool_op(OVERLAPS, wrap_array(other))
196
230
  end
197
231
 
198
- # Use the concatentation (||) operator:
232
+ # Use the concatenation (||) operator:
199
233
  #
200
234
  # array_op.push(:a) # (array || a)
201
235
  # array_op.concat(:a) # (array || a)
@@ -231,6 +265,20 @@ module Sequel
231
265
  function(:array_reverse)
232
266
  end
233
267
 
268
+ # Call the array_sample method:
269
+ #
270
+ # array_op.sample(1) # array_sample(array, 1)
271
+ def sample(element)
272
+ function(:array_sample, element)
273
+ end
274
+
275
+ # Call the array_shuffle method:
276
+ #
277
+ # array_op.shuffle # array_shuffle
278
+ def shuffle
279
+ function(:array_shuffle)
280
+ end
281
+
234
282
  # Call the array_sort method. Options:
235
283
  #
236
284
  # :desc :: Sort in descending order instead of ascending order.
@@ -273,6 +321,13 @@ module Sequel
273
321
  end
274
322
  alias join to_string
275
323
 
324
+ # Call the trim_array method:
325
+ #
326
+ # array_op.trim(1) # array_trim(array, 1)
327
+ def trim(number)
328
+ function(:trim_array, number)
329
+ end
330
+
276
331
  # Call the unnest method:
277
332
  #
278
333
  # array_op.unnest # unnest(array)
@@ -280,7 +335,7 @@ module Sequel
280
335
  function(:unnest, *args.map{|a| wrap_array(a)})
281
336
  end
282
337
 
283
- # Use the concatentation (||) operator, reversing the order:
338
+ # Use the concatenation (||) operator, reversing the order:
284
339
  #
285
340
  # array_op.unshift(:a) # (a || array)
286
341
  def unshift(other)
@@ -326,9 +381,9 @@ module Sequel
326
381
  end
327
382
  end
328
383
 
329
- # :nocov:
384
+ # simplecov:disable
330
385
  if defined?(PGArray)
331
- # :nocov:
386
+ # simplecov:enable
332
387
  class PGArray
333
388
  # Wrap the PGArray instance in an ArrayOp, allowing you to easily use
334
389
  # the PostgreSQL array functions and operators with literal arrays.
@@ -360,7 +415,7 @@ module Sequel
360
415
  end
361
416
  end
362
417
 
363
- # :nocov:
418
+ # simplecov:disable
364
419
  if Sequel.core_extensions?
365
420
  class Symbol
366
421
  include Sequel::Postgres::ArrayOpMethods
@@ -374,4 +429,4 @@ if defined?(Sequel::CoreRefinements)
374
429
  end
375
430
  end
376
431
  end
377
- # :nocov:
432
+ # simplecov:enable
@@ -56,7 +56,7 @@
56
56
  # DB[:t].select{foo('a').as(:f)}.group{foo('a')}
57
57
  # # SELECT foo('a') AS "f" FROM "t" GROUP BY foo('a')
58
58
  #
59
- # Will get auto paramterized as:
59
+ # Will get auto parameterized as:
60
60
  #
61
61
  # # SELECT foo($1) AS "f" FROM "t" GROUP BY foo($2)
62
62
  #
@@ -180,7 +180,7 @@ module Sequel
180
180
  end
181
181
  end
182
182
 
183
- # PlacholderLiteralizer subclass with support for stored auto parameters.
183
+ # PlaceholderLiteralizer subclass with support for stored auto parameters.
184
184
  class PlaceholderLiteralizer < ::Sequel::Dataset::PlaceholderLiteralizer
185
185
  def initialize(dataset, fragments, final_sql, arity)
186
186
  s = dataset.sql.dup
@@ -49,7 +49,7 @@ module Sequel
49
49
  # Enable automatically parameterizing queries.
50
50
  module AutoParameterizeInArray
51
51
  module TreatStringListAsUntypedArray
52
- # Sentinal value to use as an auto param type to use auto parameterization
52
+ # Sentinel value to use as an auto param type to use auto parameterization
53
53
  # of a string array without an explicit type cast.
54
54
  NO_EXPLICIT_CAST = Object.new.freeze
55
55
 
@@ -64,7 +64,7 @@ module Sequel
64
64
 
65
65
  private
66
66
 
67
- # Recognize NO_EXPLICIT_CAST sentinal value and use wrapped
67
+ # Recognize NO_EXPLICIT_CAST sentinel value and use wrapped
68
68
  # PGArray that will be parameterized into the query.
69
69
  def _convert_array_to_pg_array_with_type(r, type)
70
70
  if NO_EXPLICIT_CAST.equal?(type)
@@ -158,7 +158,7 @@ module Sequel
158
158
  nil
159
159
  end
160
160
 
161
- # The minimium size of array to auto parameterize.
161
+ # The minimum size of array to auto parameterize.
162
162
  def pg_auto_parameterize_min_array_size
163
163
  2
164
164
  end
@@ -180,9 +180,9 @@ module Sequel
180
180
  end
181
181
 
182
182
  # support reversible create_enum statements if the migration extension is loaded
183
- # :nocov:
183
+ # simplecov:disable
184
184
  if defined?(MigrationReverser)
185
- # :nocov:
185
+ # simplecov:enable
186
186
  class MigrationReverser
187
187
  private
188
188
  def create_enum(name, _)
@@ -31,7 +31,7 @@ module Sequel
31
31
  RATIONAL_60 = Rational(60)
32
32
  TIME_CAN_PARSE_BC = RUBY_VERSION >= '2.5'
33
33
 
34
- # Add dataset methods and update the conversion proces for dates and timestamps.
34
+ # Add dataset methods and update the conversion process for dates and timestamps.
35
35
  def self.extended(db)
36
36
  db.extend_datasets(DatasetMethods)
37
37
  procs = db.conversion_procs
@@ -114,10 +114,10 @@ module Sequel
114
114
  DateTime.parse(value)
115
115
  elsif TIME_CAN_PARSE_BC
116
116
  Time.parse(value)
117
- # :nocov:
117
+ # simplecov:disable
118
118
  else
119
119
  DateTime.parse(value).to_time
120
- # :nocov:
120
+ # simplecov:enable
121
121
  end
122
122
 
123
123
  Sequel.convert_output_timestamp(dt, Sequel.application_timezone)
@@ -219,7 +219,7 @@ module Sequel
219
219
  end
220
220
 
221
221
  if RUBY_ENGINE == 'jruby'
222
- # :nocov:
222
+ # simplecov:disable
223
223
 
224
224
  ExtendedDateSupport::CONVERT_TYPES = [Java::JavaSQL::Types::DATE, Java::JavaSQL::Types::TIMESTAMP]
225
225
 
@@ -241,7 +241,7 @@ module Sequel
241
241
  super
242
242
  end
243
243
  end
244
- # :nocov:
244
+ # simplecov:enable
245
245
  else
246
246
  # Handle BC Time objects.
247
247
  def literal_time(time)
@@ -53,7 +53,7 @@
53
53
  # # => "numeric"
54
54
  #
55
55
  # The +:raw+ behavior was Sequel's historical behavior, but unless
56
- # you fully understand the reprecussions of PostgreSQL using a
56
+ # you fully understand the repercussions of PostgreSQL using a
57
57
  # numeric type for integer values, you should not use it.
58
58
  #
59
59
  # To get the current default behavior of raising an exception for
@@ -326,7 +326,7 @@ module Sequel
326
326
  Database.register_extension(:pg_hstore, Postgres::HStore::DatabaseMethods)
327
327
  end
328
328
 
329
- # :nocov:
329
+ # simplecov:disable
330
330
  if Sequel.core_extensions?
331
331
  class Hash
332
332
  # Create a new HStore using the receiver as the input
@@ -350,4 +350,4 @@ if defined?(Sequel::CoreRefinements)
350
350
  end
351
351
  end
352
352
  end
353
- # :nocov:
353
+ # simplecov:enable
@@ -63,7 +63,7 @@
63
63
  # DB[:tab].update(h: Sequel.hstore_op(:h).delete('k1'))
64
64
  #
65
65
  # On PostgreSQL 14+, The hstore <tt>[]</tt> method will use subscripts instead of being
66
- # the same as +get+, if the value being wrapped is an identifer:
66
+ # the same as +get+, if the value being wrapped is an identifier:
67
67
  #
68
68
  # Sequel.hstore_op(:hstore_column)['a'] # hstore_column['a']
69
69
  # Sequel.hstore_op(Sequel[:h][:s])['a'] # h.s['a']
@@ -367,9 +367,9 @@ module Sequel
367
367
  end
368
368
  end
369
369
 
370
- # :nocov:
370
+ # simplecov:disable
371
371
  if defined?(HStore)
372
- # :nocov:
372
+ # simplecov:enable
373
373
  class HStore
374
374
  # Wrap the receiver in an HStoreOp so you can easily use the PostgreSQL
375
375
  # hstore functions and operators with it.
@@ -401,7 +401,7 @@ module Sequel
401
401
  end
402
402
  end
403
403
 
404
- # :nocov:
404
+ # simplecov:disable
405
405
  if Sequel.core_extensions?
406
406
  class Symbol
407
407
  include Sequel::Postgres::HStoreOpMethods
@@ -415,4 +415,4 @@ if defined?(Sequel::CoreRefinements)
415
415
  end
416
416
  end
417
417
  end
418
- # :nocov:
418
+ # simplecov:enable
@@ -41,9 +41,9 @@ module Sequel
41
41
  db.instance_exec do
42
42
  extend_datasets(InetDatasetMethods)
43
43
 
44
- # :nocov:
44
+ # simplecov:disable
45
45
  if !defined?(SEQUEL_PG_VERSION_INTEGER) || SEQUEL_PG_VERSION_INTEGER >= 11300
46
- # :nocov:
46
+ # simplecov:enable
47
47
  # sequel_pg 1.13.0+ will use inet/cidr conversion procs, but doing so is
48
48
  # slower, so don't add the conversion procs if using sequel_pg 1.13.0+.
49
49
  meth = IPAddr.method(:new)
@@ -187,7 +187,7 @@ module Sequel
187
187
  end
188
188
  end
189
189
 
190
- # :nocov:
190
+ # simplecov:disable
191
191
  if Sequel.core_extensions?
192
192
  class Symbol
193
193
  include Sequel::Postgres::InetOpMethods
@@ -201,4 +201,4 @@ if defined?(Sequel::CoreRefinements)
201
201
  end
202
202
  end
203
203
  end
204
- # :nocov:
204
+ # simplecov:enable
@@ -35,12 +35,12 @@
35
35
  require 'active_support'
36
36
  require 'active_support/duration'
37
37
 
38
- # :nocov:
38
+ # simplecov:disable
39
39
  begin
40
40
  require 'active_support/version'
41
41
  rescue LoadError
42
42
  end
43
- # :nocov:
43
+ # simplecov:enable
44
44
 
45
45
  module Sequel
46
46
  module Postgres
@@ -75,11 +75,11 @@ module Sequel
75
75
  if defined?(ActiveSupport::Duration::SECONDS_PER_MONTH)
76
76
  SECONDS_PER_MONTH = ActiveSupport::Duration::SECONDS_PER_MONTH
77
77
  SECONDS_PER_YEAR = ActiveSupport::Duration::SECONDS_PER_YEAR
78
- # :nocov:
78
+ # simplecov:disable
79
79
  else
80
80
  SECONDS_PER_MONTH = 2592000
81
81
  SECONDS_PER_YEAR = 31557600
82
- # :nocov:
82
+ # simplecov:enable
83
83
  end
84
84
 
85
85
  # Parse the interval input string into an ActiveSupport::Duration instance.
@@ -125,11 +125,11 @@ module Sequel
125
125
  parts[:seconds] = seconds
126
126
  end
127
127
 
128
- # :nocov:
128
+ # simplecov:disable
129
129
  if USE_PARTS_ARRAY
130
130
  parts = parts.to_a
131
131
  end
132
- # :nocov:
132
+ # simplecov:enable
133
133
 
134
134
  ActiveSupport::Duration.new(value, parts)
135
135
  end
@@ -206,12 +206,12 @@ module Sequel
206
206
  }
207
207
 
208
208
  if RUBY_VERSION < '2.4'
209
- # :nocov:
209
+ # simplecov:disable
210
210
  JSON_PRIMITIVE_WRAPPER_MAPPING[Fixnum] = JSONInteger
211
211
  JSON_PRIMITIVE_WRAPPER_MAPPING[Bignum] = JSONInteger
212
212
  JSONB_PRIMITIVE_WRAPPER_MAPPING[Fixnum] = JSONBInteger
213
213
  JSONB_PRIMITIVE_WRAPPER_MAPPING[Bignum] = JSONBInteger
214
- # :nocov:
214
+ # simplecov:enable
215
215
  end
216
216
 
217
217
  JSON_PRIMITIVE_WRAPPER_MAPPING.freeze
@@ -583,7 +583,7 @@ module Sequel
583
583
  Database.register_extension(:pg_json, Postgres::JSONDatabaseMethods)
584
584
  end
585
585
 
586
- # :nocov:
586
+ # simplecov:disable
587
587
  if Sequel.core_extensions?
588
588
  class Array
589
589
  # Return a Sequel::Postgres::JSONArray proxy to the receiver.
@@ -641,4 +641,4 @@ if defined?(Sequel::CoreRefinements)
641
641
  end
642
642
  end
643
643
  end
644
- # :nocov:
644
+ # simplecov:enable