sequel 5.36.0 → 5.41.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +56 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/cheat_sheet.rdoc +5 -5
  6. data/doc/code_order.rdoc +0 -12
  7. data/doc/fork_safety.rdoc +84 -0
  8. data/doc/opening_databases.rdoc +5 -1
  9. data/doc/postgresql.rdoc +1 -1
  10. data/doc/querying.rdoc +3 -3
  11. data/doc/release_notes/5.37.0.txt +30 -0
  12. data/doc/release_notes/5.38.0.txt +28 -0
  13. data/doc/release_notes/5.39.0.txt +19 -0
  14. data/doc/release_notes/5.40.0.txt +40 -0
  15. data/doc/release_notes/5.41.0.txt +25 -0
  16. data/doc/sql.rdoc +1 -1
  17. data/doc/transactions.rdoc +0 -8
  18. data/lib/sequel/adapters/jdbc.rb +15 -3
  19. data/lib/sequel/adapters/jdbc/mysql.rb +4 -4
  20. data/lib/sequel/adapters/shared/mssql.rb +21 -1
  21. data/lib/sequel/adapters/shared/oracle.rb +1 -1
  22. data/lib/sequel/adapters/shared/postgres.rb +6 -4
  23. data/lib/sequel/adapters/shared/sqlite.rb +35 -1
  24. data/lib/sequel/core.rb +5 -6
  25. data/lib/sequel/database/connecting.rb +0 -1
  26. data/lib/sequel/database/misc.rb +14 -0
  27. data/lib/sequel/database/schema_generator.rb +6 -0
  28. data/lib/sequel/database/schema_methods.rb +16 -6
  29. data/lib/sequel/database/transactions.rb +1 -1
  30. data/lib/sequel/dataset/actions.rb +10 -6
  31. data/lib/sequel/dataset/features.rb +10 -0
  32. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  33. data/lib/sequel/dataset/sql.rb +32 -10
  34. data/lib/sequel/extensions/blank.rb +8 -0
  35. data/lib/sequel/extensions/date_arithmetic.rb +8 -9
  36. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  37. data/lib/sequel/extensions/inflector.rb +8 -0
  38. data/lib/sequel/extensions/migration.rb +9 -1
  39. data/lib/sequel/extensions/named_timezones.rb +5 -1
  40. data/lib/sequel/extensions/pg_array.rb +1 -0
  41. data/lib/sequel/extensions/pg_interval.rb +34 -8
  42. data/lib/sequel/extensions/pg_row.rb +1 -0
  43. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  44. data/lib/sequel/extensions/query.rb +2 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +3 -3
  46. data/lib/sequel/model/associations.rb +28 -4
  47. data/lib/sequel/model/base.rb +21 -4
  48. data/lib/sequel/model/plugins.rb +5 -0
  49. data/lib/sequel/plugins/association_proxies.rb +2 -0
  50. data/lib/sequel/plugins/auto_validations.rb +15 -1
  51. data/lib/sequel/plugins/class_table_inheritance.rb +0 -5
  52. data/lib/sequel/plugins/composition.rb +5 -1
  53. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  54. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  55. data/lib/sequel/plugins/dirty.rb +44 -0
  56. data/lib/sequel/plugins/nested_attributes.rb +3 -1
  57. data/lib/sequel/plugins/pg_array_associations.rb +4 -0
  58. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +2 -0
  59. data/lib/sequel/plugins/single_table_inheritance.rb +7 -0
  60. data/lib/sequel/plugins/tree.rb +9 -4
  61. data/lib/sequel/plugins/validation_helpers.rb +6 -2
  62. data/lib/sequel/timezones.rb +8 -3
  63. data/lib/sequel/version.rb +1 -1
  64. metadata +33 -21
@@ -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
@@ -14,7 +14,9 @@ module Sequel
14
14
  # the plugin looks at the database schema for the model's table. To determine
15
15
  # the unique validations, Sequel looks at the indexes on the table. In order
16
16
  # for this plugin to be fully functional, the underlying database adapter needs
17
- # to support both schema and index parsing.
17
+ # to support both schema and index parsing. Additionally, unique validations are
18
+ # only added for models that select from a simple table, they are not added for models
19
+ # that select from a subquery or joined dataset.
18
20
  #
19
21
  # This plugin uses the validation_helpers plugin underneath to implement the
20
22
  # validations. It does not allow for any per-column validation message
@@ -51,6 +53,11 @@ module Sequel
51
53
  # This works for unique_opts, max_length_opts, schema_types_opts,
52
54
  # explicit_not_null_opts, and not_null_opts.
53
55
  #
56
+ # If you only want auto_validations to add validations to columns that do not already
57
+ # have an error associated with them, you can use the skip_invalid option:
58
+ #
59
+ # Model.plugin :auto_validations, skip_invalid: true
60
+ #
54
61
  # Usage:
55
62
  #
56
63
  # # Make all model subclass use auto validations (called before loading subclasses)
@@ -100,6 +107,13 @@ module Sequel
100
107
  h[type] = h[type].merge(type_opts).freeze
101
108
  end
102
109
  end
110
+
111
+ if opts[:skip_invalid]
112
+ [:not_null, :explicit_not_null, :max_length, :schema_types].each do |type|
113
+ h[type] = h[type].merge(:skip_invalid=>true).freeze
114
+ end
115
+ end
116
+
103
117
  @auto_validate_options = h.freeze
104
118
  end
105
119
  end
@@ -433,11 +433,6 @@ module Sequel
433
433
  end
434
434
  end
435
435
  end
436
-
437
- # Don't allow use of prepared statements.
438
- def use_prepared_statements_for?(type)
439
- false
440
- end
441
436
  end
442
437
  end
443
438
  end
@@ -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
 
@@ -41,6 +41,15 @@ module Sequel
41
41
  # artist.column_changes # => {}
42
42
  # artist.previous_changes # => {:name=>['Foo', 'Bar']}
43
43
  #
44
+ # artist.column_previously_was(:name)
45
+ # # => 'Foo'
46
+ # artist.column_previously_changed?(:name)
47
+ # # => true
48
+ # artist.column_previously_changed?(:name, from: 'Foo', to: 'Bar')
49
+ # # => true
50
+ # artist.column_previously_changed?(:name, from: 'Foo', to: 'Baz')
51
+ # # => false
52
+ #
44
53
  # There is one caveat; when used with a column that also uses the
45
54
  # serialization plugin, setting the column back to its original value
46
55
  # after changing it is not correctly detected and will leave an entry
@@ -105,6 +114,41 @@ module Sequel
105
114
  initial_values.has_key?(column)
106
115
  end
107
116
 
117
+ # Whether the column was previously changed.
118
+ # Options:
119
+ # :from :: If given, the previous initial value of the column must match this
120
+ # :to :: If given, the previous changed value of the column must match this
121
+ #
122
+ # update(name: 'Current')
123
+ # previous_changes # => {:name=>['Initial', 'Current']}
124
+ # column_previously_changed?(:name) # => true
125
+ # column_previously_changed?(:id) # => false
126
+ # column_previously_changed?(:name, from: 'Initial', to: 'Current') # => true
127
+ # column_previously_changed?(:name, from: 'Foo', to: 'Current') # => false
128
+ def column_previously_changed?(column, opts=OPTS)
129
+ return false unless (pc = @previous_changes) && (val = pc[column])
130
+
131
+ if opts.has_key?(:from)
132
+ return false unless val[0] == opts[:from]
133
+ end
134
+
135
+ if opts.has_key?(:to)
136
+ return false unless val[1] == opts[:to]
137
+ end
138
+
139
+ true
140
+ end
141
+
142
+ # The previous value of the column, which is the initial value of
143
+ # the column before the object was previously saved.
144
+ #
145
+ # initial_value(:name) # => 'Initial'
146
+ # update(name: 'Current')
147
+ # column_previously_was(:name) # => 'Initial'
148
+ def column_previously_was(column)
149
+ (pc = @previous_changes) && (val = pc[column]) && val[0]
150
+ end
151
+
108
152
  # Freeze internal data structures
109
153
  def freeze
110
154
  initial_values.freeze
@@ -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])
@@ -250,6 +250,13 @@ module Sequel
250
250
  end
251
251
  super
252
252
  end
253
+
254
+ private
255
+
256
+ # Don't allow use of prepared statements.
257
+ def use_prepared_statements_for?(type)
258
+ false
259
+ end
253
260
  end
254
261
  end
255
262
  end
@@ -45,6 +45,7 @@ module Sequel
45
45
 
46
46
  model.instance_exec do
47
47
  @parent_column = opts[:key]
48
+ @qualified_parent_column = Sequel.deep_qualify(table_name, opts[:key])
48
49
  @tree_order = opts[:order]
49
50
  @parent_association_name = parent
50
51
  @children_association_name = children
@@ -59,17 +60,21 @@ module Sequel
59
60
  # The column symbol or array of column symbols on which to order the tree.
60
61
  attr_accessor :tree_order
61
62
 
62
- # The symbol for the column containing the value pointing to the
63
- # parent of the leaf.
63
+ # The symbol or array of symbols for the column containing the value pointing to the
64
+ # parent of the node.
64
65
  attr_accessor :parent_column
65
66
 
67
+ # The qualified identifier or array of qualified identifiers for the column
68
+ # containing the value pointing to the parent of the node.
69
+ attr_accessor :qualified_parent_column
70
+
66
71
  # The association name for the parent association
67
72
  attr_reader :parent_association_name
68
73
 
69
74
  # The association name for the children association
70
75
  attr_reader :children_association_name
71
76
 
72
- Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@tree_order=>nil, :@parent_association_name=>nil, :@children_association_name=>nil)
77
+ Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@qualified_parent_column=>nil, :@tree_order=>nil, :@parent_association_name=>nil, :@children_association_name=>nil)
73
78
  Plugins.def_dataset_methods(self, [:roots, :roots_dataset])
74
79
 
75
80
  # Should freeze tree order if it is an array when freezing the model class.
@@ -151,7 +156,7 @@ module Sequel
151
156
  #
152
157
  # TreeClass.roots_dataset # => Sequel::Dataset instance
153
158
  def roots_dataset
154
- ds = where(Sequel.or(Array(model.parent_column).zip([])))
159
+ ds = where(Sequel.or(Array(model.qualified_parent_column).zip([])))
155
160
  ds = ds.order(*model.tree_order) if model.tree_order
156
161
  ds
157
162
  end
@@ -36,6 +36,7 @@ module Sequel
36
36
  # :message :: The message to use. Can be a string which is used directly, or a
37
37
  # proc which is called. If the validation method takes a argument before the array of attributes,
38
38
  # that argument is passed as an argument to the proc.
39
+ # :skip_invalid :: Do not try to validate columns that are already invalid.
39
40
  #
40
41
  # The default validation options for all models can be modified by
41
42
  # overridding the Model#default_validation_helpers_options private method.
@@ -281,14 +282,17 @@ module Sequel
281
282
  DEFAULT_OPTIONS[type]
282
283
  end
283
284
 
284
- # Skip validating any attribute that matches one of the allow_* options.
285
+ # Skip validating any attribute that matches one of the allow_* options,
286
+ # or already has an error if the skip_invalid option is given.
287
+ #
285
288
  # Otherwise, yield the attribute, value, and passed option :message to
286
289
  # the block. If the block returns anything except nil or false, add it as
287
290
  # an error message for that attributes.
288
291
  def validatable_attributes(atts, opts)
289
- am, an, ab, m = opts.values_at(:allow_missing, :allow_nil, :allow_blank, :message)
292
+ am, an, ab, m, si = opts.values_at(:allow_missing, :allow_nil, :allow_blank, :message, :skip_invalid)
290
293
  from_values = opts[:from] == :values
291
294
  Array(atts).each do |a|
295
+ next if si && errors.on(a)
292
296
  next if am && !values.has_key?(a)
293
297
  v = from_values ? values[a] : get_column_value(a)
294
298
  next if an && v.nil?
@@ -10,9 +10,14 @@ module Sequel
10
10
  Timezones = SequelMethods
11
11
  Deprecation.deprecate_constant(self, :Timezones)
12
12
 
13
- # Sequel doesn't pay much attention to timezones by default, but you can set it
14
- # handle timezones if you want. There are three separate timezone settings, application_timezone,
15
- # database_timezone, and typecast_timezone. All three timezones have getter and setter methods.
13
+ # Sequel doesn't pay much attention to timezones by default, but you can set it to
14
+ # handle timezones if you want. There are three separate timezone settings:
15
+ #
16
+ # * application_timezone
17
+ # * database_timezone
18
+ # * typecast_timezone
19
+ #
20
+ # All three timezones have getter and setter methods.
16
21
  # You can set all three timezones to the same value at once via <tt>Sequel.default_timezone=</tt>.
17
22
  #
18
23
  # The only timezone values that are supported by default are <tt>:utc</tt> (convert to UTC),
@@ -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 = 36
9
+ MINOR = 41
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.36.0
4
+ version: 5.41.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-09-01 00:00:00.000000000 Z
11
+ date: 2021-02-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,36 +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/release_notes/5.5.0.txt
151
- - doc/release_notes/5.6.0.txt
149
+ - doc/validations.rdoc
150
+ - doc/virtual_rows.rdoc
152
151
  - doc/release_notes/5.0.0.txt
153
152
  - doc/release_notes/5.1.0.txt
154
- - doc/release_notes/5.2.0.txt
155
- - doc/release_notes/5.3.0.txt
156
- - doc/release_notes/5.4.0.txt
157
- - doc/release_notes/5.8.0.txt
158
- - doc/release_notes/5.7.0.txt
159
- - doc/release_notes/5.9.0.txt
160
153
  - doc/release_notes/5.10.0.txt
161
154
  - doc/release_notes/5.11.0.txt
162
155
  - doc/release_notes/5.12.0.txt
@@ -167,6 +160,7 @@ extra_rdoc_files:
167
160
  - doc/release_notes/5.17.0.txt
168
161
  - doc/release_notes/5.18.0.txt
169
162
  - doc/release_notes/5.19.0.txt
163
+ - doc/release_notes/5.2.0.txt
170
164
  - doc/release_notes/5.20.0.txt
171
165
  - doc/release_notes/5.21.0.txt
172
166
  - doc/release_notes/5.22.0.txt
@@ -177,6 +171,7 @@ extra_rdoc_files:
177
171
  - doc/release_notes/5.27.0.txt
178
172
  - doc/release_notes/5.28.0.txt
179
173
  - doc/release_notes/5.29.0.txt
174
+ - doc/release_notes/5.3.0.txt
180
175
  - doc/release_notes/5.30.0.txt
181
176
  - doc/release_notes/5.31.0.txt
182
177
  - doc/release_notes/5.32.0.txt
@@ -184,6 +179,17 @@ extra_rdoc_files:
184
179
  - doc/release_notes/5.34.0.txt
185
180
  - doc/release_notes/5.35.0.txt
186
181
  - doc/release_notes/5.36.0.txt
182
+ - doc/release_notes/5.37.0.txt
183
+ - doc/release_notes/5.38.0.txt
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.41.0.txt
188
+ - doc/release_notes/5.5.0.txt
189
+ - doc/release_notes/5.6.0.txt
190
+ - doc/release_notes/5.7.0.txt
191
+ - doc/release_notes/5.8.0.txt
192
+ - doc/release_notes/5.9.0.txt
187
193
  files:
188
194
  - CHANGELOG
189
195
  - MIT-LICENSE
@@ -198,6 +204,7 @@ files:
198
204
  - doc/dataset_basics.rdoc
199
205
  - doc/dataset_filtering.rdoc
200
206
  - doc/extensions.rdoc
207
+ - doc/fork_safety.rdoc
201
208
  - doc/mass_assignment.rdoc
202
209
  - doc/migration.rdoc
203
210
  - doc/model_dataset_method_design.rdoc
@@ -241,7 +248,12 @@ files:
241
248
  - doc/release_notes/5.34.0.txt
242
249
  - doc/release_notes/5.35.0.txt
243
250
  - doc/release_notes/5.36.0.txt
251
+ - doc/release_notes/5.37.0.txt
252
+ - doc/release_notes/5.38.0.txt
253
+ - doc/release_notes/5.39.0.txt
244
254
  - doc/release_notes/5.4.0.txt
255
+ - doc/release_notes/5.40.0.txt
256
+ - doc/release_notes/5.41.0.txt
245
257
  - doc/release_notes/5.5.0.txt
246
258
  - doc/release_notes/5.6.0.txt
247
259
  - doc/release_notes/5.7.0.txt
@@ -547,7 +559,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
547
559
  - !ruby/object:Gem::Version
548
560
  version: '0'
549
561
  requirements: []
550
- rubygems_version: 3.1.2
562
+ rubygems_version: 3.2.3
551
563
  signing_key:
552
564
  specification_version: 4
553
565
  summary: The Database Toolkit for Ruby