sequel 3.47.0 → 3.48.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 +4 -4
- data/CHANGELOG +230 -0
- data/README.rdoc +31 -40
- data/Rakefile +1 -14
- data/doc/active_record.rdoc +29 -29
- data/doc/association_basics.rdoc +4 -13
- data/doc/cheat_sheet.rdoc +8 -6
- data/doc/code_order.rdoc +89 -0
- data/doc/core_extensions.rdoc +3 -3
- data/doc/dataset_basics.rdoc +7 -8
- data/doc/dataset_filtering.rdoc +7 -2
- data/doc/mass_assignment.rdoc +2 -3
- data/doc/migration.rdoc +8 -8
- data/doc/model_hooks.rdoc +11 -7
- data/doc/object_model.rdoc +2 -2
- data/doc/opening_databases.rdoc +5 -14
- data/doc/prepared_statements.rdoc +5 -9
- data/doc/querying.rdoc +23 -28
- data/doc/reflection.rdoc +11 -0
- data/doc/release_notes/3.48.0.txt +477 -0
- data/doc/schema_modification.rdoc +12 -5
- data/doc/security.rdoc +2 -2
- data/doc/sharding.rdoc +1 -2
- data/doc/sql.rdoc +10 -13
- data/doc/testing.rdoc +8 -4
- data/doc/transactions.rdoc +2 -2
- data/doc/validations.rdoc +40 -17
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +25 -20
- data/lib/sequel/adapters/ado/access.rb +1 -0
- data/lib/sequel/adapters/ado/mssql.rb +1 -0
- data/lib/sequel/adapters/db2.rb +9 -7
- data/lib/sequel/adapters/dbi.rb +16 -16
- data/lib/sequel/adapters/do.rb +17 -18
- data/lib/sequel/adapters/do/mysql.rb +1 -0
- data/lib/sequel/adapters/do/postgres.rb +2 -0
- data/lib/sequel/adapters/do/sqlite.rb +1 -0
- data/lib/sequel/adapters/firebird.rb +5 -7
- data/lib/sequel/adapters/ibmdb.rb +23 -20
- data/lib/sequel/adapters/informix.rb +8 -2
- data/lib/sequel/adapters/jdbc.rb +39 -35
- data/lib/sequel/adapters/jdbc/as400.rb +1 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
- data/lib/sequel/adapters/jdbc/db2.rb +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
- data/lib/sequel/adapters/jdbc/h2.rb +1 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
- data/lib/sequel/adapters/jdbc/informix.rb +1 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
- data/lib/sequel/adapters/jdbc/progress.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
- data/lib/sequel/adapters/mock.rb +30 -31
- data/lib/sequel/adapters/mysql.rb +6 -7
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/odbc.rb +22 -20
- data/lib/sequel/adapters/odbc/mssql.rb +1 -0
- data/lib/sequel/adapters/openbase.rb +4 -1
- data/lib/sequel/adapters/oracle.rb +10 -8
- data/lib/sequel/adapters/postgres.rb +12 -10
- data/lib/sequel/adapters/shared/access.rb +6 -0
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/db2.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +14 -8
- data/lib/sequel/adapters/shared/mysql.rb +6 -0
- data/lib/sequel/adapters/shared/oracle.rb +2 -0
- data/lib/sequel/adapters/shared/postgres.rb +14 -4
- data/lib/sequel/adapters/shared/progress.rb +1 -0
- data/lib/sequel/adapters/shared/sqlite.rb +4 -3
- data/lib/sequel/adapters/sqlite.rb +6 -7
- data/lib/sequel/adapters/swift.rb +20 -21
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +2 -0
- data/lib/sequel/adapters/swift/sqlite.rb +1 -0
- data/lib/sequel/adapters/tinytds.rb +5 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +57 -50
- data/lib/sequel/database/connecting.rb +9 -10
- data/lib/sequel/database/dataset.rb +11 -6
- data/lib/sequel/database/dataset_defaults.rb +61 -69
- data/lib/sequel/database/features.rb +21 -0
- data/lib/sequel/database/misc.rb +23 -3
- data/lib/sequel/database/query.rb +13 -7
- data/lib/sequel/database/schema_methods.rb +6 -6
- data/lib/sequel/database/transactions.rb +1 -0
- data/lib/sequel/dataset/actions.rb +51 -38
- data/lib/sequel/dataset/features.rb +1 -0
- data/lib/sequel/dataset/graph.rb +9 -33
- data/lib/sequel/dataset/misc.rb +30 -5
- data/lib/sequel/dataset/mutation.rb +2 -3
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/query.rb +91 -27
- data/lib/sequel/dataset/sql.rb +40 -6
- data/lib/sequel/deprecated.rb +74 -0
- data/lib/sequel/deprecated_core_extensions.rb +135 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -5
- data/lib/sequel/extensions/core_extensions.rb +10 -3
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
- data/lib/sequel/extensions/filter_having.rb +58 -0
- data/lib/sequel/extensions/graph_each.rb +63 -0
- data/lib/sequel/extensions/hash_aliases.rb +44 -0
- data/lib/sequel/extensions/looser_typecasting.rb +14 -3
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/extensions/named_timezones.rb +14 -1
- data/lib/sequel/extensions/null_dataset.rb +7 -1
- data/lib/sequel/extensions/pagination.rb +15 -5
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
- data/lib/sequel/extensions/pg_json.rb +7 -7
- data/lib/sequel/extensions/pg_range_ops.rb +8 -2
- data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
- data/lib/sequel/extensions/pretty_table.rb +13 -4
- data/lib/sequel/extensions/query.rb +21 -4
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -7
- data/lib/sequel/extensions/schema_dumper.rb +35 -48
- data/lib/sequel/extensions/select_remove.rb +13 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
- data/lib/sequel/extensions/set_overrides.rb +43 -0
- data/lib/sequel/extensions/to_dot.rb +6 -0
- data/lib/sequel/model.rb +12 -6
- data/lib/sequel/model/associations.rb +80 -38
- data/lib/sequel/model/base.rb +137 -52
- data/lib/sequel/model/errors.rb +7 -2
- data/lib/sequel/plugins/active_model.rb +13 -0
- data/lib/sequel/plugins/after_initialize.rb +43 -0
- data/lib/sequel/plugins/association_proxies.rb +63 -7
- data/lib/sequel/plugins/auto_validations.rb +56 -16
- data/lib/sequel/plugins/blacklist_security.rb +63 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
- data/lib/sequel/plugins/constraint_validations.rb +50 -8
- data/lib/sequel/plugins/dataset_associations.rb +2 -0
- data/lib/sequel/plugins/hook_class_methods.rb +7 -1
- data/lib/sequel/plugins/identity_map.rb +4 -0
- data/lib/sequel/plugins/json_serializer.rb +32 -13
- data/lib/sequel/plugins/optimistic_locking.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/scissors.rb +33 -0
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
- data/lib/sequel/plugins/tree.rb +5 -1
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +15 -11
- data/lib/sequel/plugins/xml_serializer.rb +12 -3
- data/lib/sequel/sql.rb +12 -2
- data/lib/sequel/timezones.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/mssql_spec.rb +24 -57
- data/spec/adapters/postgres_spec.rb +27 -55
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/bin_spec.rb +251 -0
- data/spec/core/database_spec.rb +46 -32
- data/spec/core/dataset_spec.rb +233 -181
- data/spec/core/deprecated_spec.rb +78 -0
- data/spec/core/expression_filters_spec.rb +3 -4
- data/spec/core/mock_adapter_spec.rb +9 -9
- data/spec/core/object_graph_spec.rb +9 -19
- data/spec/core/schema_spec.rb +3 -1
- data/spec/core/spec_helper.rb +19 -0
- data/spec/core_extensions_spec.rb +80 -30
- data/spec/extensions/after_initialize_spec.rb +24 -0
- data/spec/extensions/association_proxies_spec.rb +37 -1
- data/spec/extensions/auto_validations_spec.rb +20 -4
- data/spec/extensions/blacklist_security_spec.rb +87 -0
- data/spec/extensions/boolean_readers_spec.rb +2 -1
- data/spec/extensions/class_table_inheritance_spec.rb +7 -0
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
- data/spec/extensions/core_refinements_spec.rb +7 -7
- data/spec/extensions/dataset_associations_spec.rb +2 -2
- data/spec/extensions/date_arithmetic_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -1
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
- data/spec/extensions/filter_having_spec.rb +40 -0
- data/spec/extensions/graph_each_spec.rb +109 -0
- data/spec/extensions/hash_aliases_spec.rb +16 -0
- data/spec/extensions/hook_class_methods_spec.rb +2 -2
- data/spec/extensions/identity_map_spec.rb +3 -3
- data/spec/extensions/json_serializer_spec.rb +19 -19
- data/spec/extensions/lazy_attributes_spec.rb +1 -0
- data/spec/extensions/list_spec.rb +13 -13
- data/spec/extensions/looser_typecasting_spec.rb +10 -3
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +7 -7
- data/spec/extensions/named_timezones_spec.rb +6 -0
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
- data/spec/extensions/pg_range_ops_spec.rb +4 -2
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_caching_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +27 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +26 -0
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
- data/spec/extensions/set_overrides_spec.rb +45 -0
- data/spec/extensions/single_table_inheritance_spec.rb +10 -0
- data/spec/extensions/spec_helper.rb +24 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +2 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +3 -2
- data/spec/extensions/update_primary_key_spec.rb +2 -2
- data/spec/extensions/validation_class_methods_spec.rb +19 -19
- data/spec/extensions/validation_helpers_spec.rb +30 -21
- data/spec/extensions/xml_serializer_spec.rb +5 -5
- data/spec/integration/associations_test.rb +10 -30
- data/spec/integration/dataset_test.rb +20 -24
- data/spec/integration/eager_loader_test.rb +5 -5
- data/spec/integration/model_test.rb +3 -3
- data/spec/integration/plugin_test.rb +7 -39
- data/spec/integration/schema_test.rb +4 -38
- data/spec/integration/spec_helper.rb +2 -1
- data/spec/model/association_reflection_spec.rb +70 -5
- data/spec/model/associations_spec.rb +11 -11
- data/spec/model/base_spec.rb +25 -8
- data/spec/model/class_dataset_methods_spec.rb +143 -0
- data/spec/model/dataset_methods_spec.rb +1 -1
- data/spec/model/eager_loading_spec.rb +25 -25
- data/spec/model/hooks_spec.rb +1 -1
- data/spec/model/model_spec.rb +22 -7
- data/spec/model/plugins_spec.rb +1 -6
- data/spec/model/record_spec.rb +37 -29
- data/spec/model/spec_helper.rb +23 -1
- data/spec/model/validations_spec.rb +15 -17
- metadata +32 -3
|
@@ -39,7 +39,13 @@ module Sequel
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
module ClassMethods
|
|
42
|
-
Model::HOOKS.each{|h| class_eval("def #{h}(method = nil, &block); add_hook(:#{h}, method, &block) end", __FILE__, __LINE__)}
|
|
42
|
+
(Model::HOOKS - [:after_initialize]).each{|h| class_eval("def #{h}(method = nil, &block); add_hook(:#{h}, method, &block) end", __FILE__, __LINE__)}
|
|
43
|
+
|
|
44
|
+
# REMOVE40
|
|
45
|
+
def after_initialize(method = nil, &block)
|
|
46
|
+
Sequel::Deprecation.deprecate('The Model after_initialize hook', 'The hook_class_methods plugin will no longer support the hook. Please use the after_initialize plugin and define the after_initialize hook directly')
|
|
47
|
+
add_hook(:after_initialize, method, &block)
|
|
48
|
+
end
|
|
43
49
|
|
|
44
50
|
# This adds a new hook type. It will define both a class
|
|
45
51
|
# method that you can use to add hooks, as well as an instance method
|
|
@@ -33,6 +33,10 @@ module Sequel
|
|
|
33
33
|
# Album.plugin :identity_map
|
|
34
34
|
# # would need to do Album.with_identity_map{} to use the identity map
|
|
35
35
|
module IdentityMap
|
|
36
|
+
def self.apply(mod)
|
|
37
|
+
Sequel::Deprecation.deprecate('The identity_map plugin', 'Please stop loading it') unless defined?(SEQUEL_EXTENSIONS_NO_DEPRECATION_WARNING)
|
|
38
|
+
end
|
|
39
|
+
|
|
36
40
|
module ClassMethods
|
|
37
41
|
# Override the default :eager_loader option for many_*_many associations to work
|
|
38
42
|
# with an identity_map. If the :eager_graph association option is used, you'll probably have to use
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
tsk_require 'json'
|
|
1
|
+
require 'json'
|
|
3
2
|
|
|
3
|
+
module Sequel
|
|
4
4
|
module Plugins
|
|
5
5
|
# The json_serializer plugin handles serializing entire Sequel::Model
|
|
6
6
|
# objects to JSON, as well as support for deserializing JSON directly
|
|
@@ -143,6 +143,9 @@ module Sequel
|
|
|
143
143
|
# Attempt to parse a single instance from the given JSON string,
|
|
144
144
|
# with options passed to InstanceMethods#from_json_node.
|
|
145
145
|
def from_json(json, opts={})
|
|
146
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
147
|
+
Sequel::Deprecation.deprecate("The from_json :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
148
|
+
end
|
|
146
149
|
v = Sequel.parse_json(json)
|
|
147
150
|
case v
|
|
148
151
|
when self
|
|
@@ -157,6 +160,9 @@ module Sequel
|
|
|
157
160
|
# Attempt to parse an array of instances from the given JSON string,
|
|
158
161
|
# with options passed to InstanceMethods#from_json_node.
|
|
159
162
|
def array_from_json(json, opts={})
|
|
163
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
164
|
+
Sequel::Deprecation.deprecate("The from_json :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
165
|
+
end
|
|
160
166
|
v = Sequel.parse_json(json)
|
|
161
167
|
if v.is_a?(Array)
|
|
162
168
|
raise(Error, 'parsed json returned an array containing non-hashes') unless v.all?{|ve| ve.is_a?(Hash) || ve.is_a?(self)}
|
|
@@ -172,6 +178,7 @@ module Sequel
|
|
|
172
178
|
# :all_columns and :all_associations options. Not recommended for usage
|
|
173
179
|
# in new code, consider calling the from_json method directly with the JSON string.
|
|
174
180
|
def json_create(hash, opts={})
|
|
181
|
+
Sequel::Deprecation.deprecate("Model.json_create", 'Switch to Model.from_json')
|
|
175
182
|
new.from_json_node(hash, {:all_columns=>true, :all_associations=>true}.merge(opts))
|
|
176
183
|
end
|
|
177
184
|
|
|
@@ -188,6 +195,9 @@ module Sequel
|
|
|
188
195
|
# Parse the provided JSON, which should return a hash,
|
|
189
196
|
# and process the hash with from_json_node.
|
|
190
197
|
def from_json(json, opts={})
|
|
198
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
199
|
+
Sequel::Deprecation.deprecate("The from_json :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
200
|
+
end
|
|
191
201
|
from_json_node(Sequel.parse_json(json), opts)
|
|
192
202
|
end
|
|
193
203
|
|
|
@@ -214,7 +224,10 @@ module Sequel
|
|
|
214
224
|
unless hash.is_a?(Hash)
|
|
215
225
|
raise Error, "parsed json doesn't return a hash"
|
|
216
226
|
end
|
|
217
|
-
hash.
|
|
227
|
+
if hash.has_key?(JSON.create_id)
|
|
228
|
+
Sequel::Deprecation.deprecate('Attempting to use Model#from_json with a hash value that includes JSON.create_id is deprecated. Starting in Sequel 4.0, the create_id will not be removed automatically.')
|
|
229
|
+
hash.delete(JSON.create_id)
|
|
230
|
+
end
|
|
218
231
|
|
|
219
232
|
unless assocs = opts[:associations]
|
|
220
233
|
if opts[:all_associations]
|
|
@@ -289,9 +302,6 @@ module Sequel
|
|
|
289
302
|
# to include in the JSON output. Using a nested
|
|
290
303
|
# hash, you can pass options to associations
|
|
291
304
|
# to affect the JSON used for associated objects.
|
|
292
|
-
# :naked :: Not to add the JSON.create_id (json_class) key to the JSON
|
|
293
|
-
# output hash, so when the JSON is parsed, it
|
|
294
|
-
# will yield a hash instead of a model object.
|
|
295
305
|
# :only :: Symbol or Array of Symbols of columns to only
|
|
296
306
|
# include in the JSON output, ignoring all other
|
|
297
307
|
# columns.
|
|
@@ -310,7 +320,13 @@ module Sequel
|
|
|
310
320
|
else
|
|
311
321
|
vals.keys - Array(opts[:except])
|
|
312
322
|
end
|
|
313
|
-
|
|
323
|
+
|
|
324
|
+
h = {}
|
|
325
|
+
if JSON.create_id && !opts[:naked] && !opts[:root]
|
|
326
|
+
Sequel::Deprecation.deprecate('The :naked and :root options have not been used, so adding JSON.create_id to the to_json output. This is deprecated, starting in Sequel 4, the JSON.create_id will never be added.')
|
|
327
|
+
h[JSON.create_id] = model.name
|
|
328
|
+
end
|
|
329
|
+
|
|
314
330
|
cols.each{|c| h[c.to_s] = send(c)}
|
|
315
331
|
if inc = opts[:include]
|
|
316
332
|
if inc.is_a?(Hash)
|
|
@@ -318,9 +334,9 @@ module Sequel
|
|
|
318
334
|
v = v.empty? ? [] : [v]
|
|
319
335
|
h[k.to_s] = case objs = send(k)
|
|
320
336
|
when Array
|
|
321
|
-
objs.map{|obj| Literal.new(
|
|
337
|
+
objs.map{|obj| Literal.new(Sequel.object_to_json(obj, *v))}
|
|
322
338
|
else
|
|
323
|
-
Literal.new(
|
|
339
|
+
Literal.new(Sequel.object_to_json(objs, *v))
|
|
324
340
|
end
|
|
325
341
|
end
|
|
326
342
|
else
|
|
@@ -328,7 +344,7 @@ module Sequel
|
|
|
328
344
|
end
|
|
329
345
|
end
|
|
330
346
|
h = {model.send(:underscore, model.to_s) => h} if opts[:root]
|
|
331
|
-
|
|
347
|
+
Sequel.object_to_json(h, *a)
|
|
332
348
|
end
|
|
333
349
|
end
|
|
334
350
|
|
|
@@ -366,7 +382,10 @@ module Sequel
|
|
|
366
382
|
opts.delete(:root)
|
|
367
383
|
opts[:naked] = true unless opts.has_key?(:naked)
|
|
368
384
|
true
|
|
385
|
+
when :both
|
|
386
|
+
true
|
|
369
387
|
else
|
|
388
|
+
Sequel::Deprecation.deprecate('The to_json :root=>true option will mean :root=>:collection starting in Sequel 4. Use :root=>:both if you want to wrap both the collection and each item in a wrapper.')
|
|
370
389
|
true
|
|
371
390
|
end
|
|
372
391
|
|
|
@@ -377,15 +396,15 @@ module Sequel
|
|
|
377
396
|
else
|
|
378
397
|
all
|
|
379
398
|
end
|
|
380
|
-
array.map{|obj| Literal.new(
|
|
399
|
+
array.map{|obj| Literal.new(Sequel.object_to_json(obj, opts))}
|
|
381
400
|
else
|
|
382
401
|
all
|
|
383
402
|
end
|
|
384
403
|
|
|
385
404
|
if collection_root
|
|
386
|
-
{model.send(:pluralize, model.send(:underscore, model.to_s)) => res}
|
|
405
|
+
Sequel.object_to_json({model.send(:pluralize, model.send(:underscore, model.to_s)) => res}, *a)
|
|
387
406
|
else
|
|
388
|
-
|
|
407
|
+
Sequel.object_to_json(res, *a)
|
|
389
408
|
end
|
|
390
409
|
end
|
|
391
410
|
end
|
|
@@ -132,7 +132,7 @@ module Sequel
|
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
135
|
-
model.from(t
|
|
135
|
+
model.from(SQL::AliasedExpression.new(t, table_alias)).
|
|
136
136
|
with_recursive(t, col_aliases ? base_ds.select(*col_aliases) : base_ds.select_all,
|
|
137
137
|
recursive_ds.select(*c_all),
|
|
138
138
|
:args=>col_aliases)
|
|
@@ -181,7 +181,7 @@ module Sequel
|
|
|
181
181
|
end
|
|
182
182
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
183
183
|
elds = model.eager_loading_dataset(r,
|
|
184
|
-
model.from(t
|
|
184
|
+
model.from(SQL::AliasedExpression.new(t, table_alias)).
|
|
185
185
|
with_recursive(t, base_case,
|
|
186
186
|
recursive_case,
|
|
187
187
|
:args=>(([ka] + col_aliases) if col_aliases)),
|
|
@@ -232,7 +232,7 @@ module Sequel
|
|
|
232
232
|
end
|
|
233
233
|
end
|
|
234
234
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
235
|
-
model.from(t
|
|
235
|
+
model.from(SQL::AliasedExpression.new(t, table_alias)).
|
|
236
236
|
with_recursive(t, col_aliases ? base_ds.select(*col_aliases) : base_ds.select_all,
|
|
237
237
|
recursive_ds.select(*c_all),
|
|
238
238
|
:args=>col_aliases)
|
|
@@ -287,7 +287,7 @@ module Sequel
|
|
|
287
287
|
end
|
|
288
288
|
table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
|
|
289
289
|
elds = model.eager_loading_dataset(r,
|
|
290
|
-
model.from(t
|
|
290
|
+
model.from(SQL::AliasedExpression.new(t, table_alias)).with_recursive(t, base_case, recursive_case,
|
|
291
291
|
:args=>(([ka] + col_aliases + (level ? [la] : [])) if col_aliases)),
|
|
292
292
|
r.select,
|
|
293
293
|
associations, eo)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Sequel
|
|
2
|
+
module Plugins
|
|
3
|
+
# The scissors plugin adds class methods for update, delete, and destroy.
|
|
4
|
+
# It is so named because this is considered dangerous, since it is easy
|
|
5
|
+
# to write:
|
|
6
|
+
#
|
|
7
|
+
# Album.delete
|
|
8
|
+
#
|
|
9
|
+
# and delete all rows in the table, when you meant to write:
|
|
10
|
+
#
|
|
11
|
+
# album.delete
|
|
12
|
+
#
|
|
13
|
+
# and only delete a single row.
|
|
14
|
+
#
|
|
15
|
+
# This plugin is mostly useful for backwards compatibility, and not
|
|
16
|
+
# recommended for use in production. However, it can cut down on
|
|
17
|
+
# verbosity in non-transactional test code, so it may be appropriate
|
|
18
|
+
# to use when testing.
|
|
19
|
+
#
|
|
20
|
+
# Usage:
|
|
21
|
+
#
|
|
22
|
+
# # Make all model subclass run with scissors
|
|
23
|
+
# Sequel::Model.plugin :scissors
|
|
24
|
+
#
|
|
25
|
+
# # Make the Album class run with scissors
|
|
26
|
+
# Album.plugin :scissors
|
|
27
|
+
module Scissors
|
|
28
|
+
module ClassMethods
|
|
29
|
+
Plugins.def_dataset_methods(self, [:update, :delete, :destroy])
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -96,7 +96,7 @@ module Sequel
|
|
|
96
96
|
end
|
|
97
97
|
end)
|
|
98
98
|
register_format(:yaml, lambda{|v| v.to_yaml}, lambda{|v| YAML.load(v)})
|
|
99
|
-
register_format(:json, lambda{|v| v
|
|
99
|
+
register_format(:json, lambda{|v| Sequel.object_to_json(v)}, lambda{|v| Sequel.parse_json(v)})
|
|
100
100
|
|
|
101
101
|
module ClassMethods
|
|
102
102
|
# A hash with column name symbols and callable values, with the value
|
|
@@ -181,6 +181,12 @@ module Sequel
|
|
|
181
181
|
|
|
182
182
|
private
|
|
183
183
|
|
|
184
|
+
# If calling set_dataset manually, make sure to set the dataset
|
|
185
|
+
# row proc to one that handles inheritance correctly.
|
|
186
|
+
def set_dataset_row_proc(ds)
|
|
187
|
+
ds.row_proc = @dataset.row_proc if @dataset
|
|
188
|
+
end
|
|
189
|
+
|
|
184
190
|
# Return a class object. If a class is given, return it directly.
|
|
185
191
|
# Treat strings and symbols as class names. If nil is given or
|
|
186
192
|
# an invalid class name string or symbol is used, return self.
|
data/lib/sequel/plugins/tree.rb
CHANGED
|
@@ -38,10 +38,14 @@ module Sequel
|
|
|
38
38
|
|
|
39
39
|
par = opts.merge(opts.fetch(:parent, {}))
|
|
40
40
|
parent = par.fetch(:name, :parent)
|
|
41
|
-
model.many_to_one parent, par
|
|
42
41
|
|
|
43
42
|
chi = opts.merge(opts.fetch(:children, {}))
|
|
44
43
|
children = chi.fetch(:name, :children)
|
|
44
|
+
|
|
45
|
+
par[:reciprocal] = children
|
|
46
|
+
chi[:recripocal] = parent
|
|
47
|
+
|
|
48
|
+
model.many_to_one parent, par
|
|
45
49
|
model.one_to_many children, chi
|
|
46
50
|
|
|
47
51
|
model.plugin SingleRoot if opts[:single_root]
|
|
@@ -76,7 +76,7 @@ module Sequel
|
|
|
76
76
|
|
|
77
77
|
# Instructs the model to skip validations defined in superclasses
|
|
78
78
|
def skip_superclass_validations?
|
|
79
|
-
|
|
79
|
+
@skip_superclass_validations
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
# Defines validations by converting a longhand block into a series of
|
|
@@ -274,6 +274,7 @@ module Sequel
|
|
|
274
274
|
# Possible Options:
|
|
275
275
|
# * :message - The message to use (default: 'is a string' or 'is not a valid (integer|datetime|etc.)' if the type is known)
|
|
276
276
|
def validates_not_string(*atts)
|
|
277
|
+
Sequel::Deprecation.deprecate('validates_not_string', "Please switch to validates_schema_type")
|
|
277
278
|
opts = {
|
|
278
279
|
:tag => :not_string,
|
|
279
280
|
}.merge!(extract_options!(atts))
|
|
@@ -11,8 +11,7 @@ module Sequel
|
|
|
11
11
|
# end
|
|
12
12
|
# end
|
|
13
13
|
#
|
|
14
|
-
# The validates_unique
|
|
15
|
-
# validations have the API explained here:
|
|
14
|
+
# The validates_unique method has a unique API, but the other validations have the API explained here:
|
|
16
15
|
#
|
|
17
16
|
# Arguments:
|
|
18
17
|
# atts :: Single attribute symbol or an array of attribute symbols specifying the
|
|
@@ -95,7 +94,7 @@ module Sequel
|
|
|
95
94
|
module InstanceMethods
|
|
96
95
|
# Check that the attribute values are the given exact length.
|
|
97
96
|
def validates_exact_length(exact, atts, opts={})
|
|
98
|
-
validatable_attributes_for_type(:exact_length, atts, opts){|a,v,m| validation_error_message(m, exact)
|
|
97
|
+
validatable_attributes_for_type(:exact_length, atts, opts){|a,v,m| validation_error_message(m, exact) if v.nil? || v.length != exact}
|
|
99
98
|
end
|
|
100
99
|
|
|
101
100
|
# Check the string representation of the attribute value(s) against the regular expression with.
|
|
@@ -122,7 +121,7 @@ module Sequel
|
|
|
122
121
|
|
|
123
122
|
# Check that the attribute values length is in the specified range.
|
|
124
123
|
def validates_length_range(range, atts, opts={})
|
|
125
|
-
validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range)
|
|
124
|
+
validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range) if v.nil? || !range.send(range.respond_to?(:cover?) ? :cover? : :include?, v.length)}
|
|
126
125
|
end
|
|
127
126
|
|
|
128
127
|
# Check that the attribute values are not longer than the given max length.
|
|
@@ -130,12 +129,12 @@ module Sequel
|
|
|
130
129
|
# Accepts a :nil_message option that is the error message to use when the
|
|
131
130
|
# value is nil instead of being too long.
|
|
132
131
|
def validates_max_length(max, atts, opts={})
|
|
133
|
-
validatable_attributes_for_type(:max_length, atts, opts){|a,v,m| v ? validation_error_message(m, max) : validation_error_message(opts[:nil_message] || DEFAULT_OPTIONS[:max_length][:nil_message])
|
|
132
|
+
validatable_attributes_for_type(:max_length, atts, opts){|a,v,m| v ? validation_error_message(m, max) : validation_error_message(opts[:nil_message] || DEFAULT_OPTIONS[:max_length][:nil_message]) if v.nil? || v.length > max}
|
|
134
133
|
end
|
|
135
134
|
|
|
136
135
|
# Check that the attribute values are not shorter than the given min length.
|
|
137
136
|
def validates_min_length(min, atts, opts={})
|
|
138
|
-
validatable_attributes_for_type(:min_length, atts, opts){|a,v,m| validation_error_message(m, min)
|
|
137
|
+
validatable_attributes_for_type(:min_length, atts, opts){|a,v,m| validation_error_message(m, min) if v.nil? || v.length < min}
|
|
139
138
|
end
|
|
140
139
|
|
|
141
140
|
# Check attribute value(s) are not NULL/nil.
|
|
@@ -150,6 +149,7 @@ module Sequel
|
|
|
150
149
|
# be a string in an invalid format, and if typecasting succeeds, the value will
|
|
151
150
|
# not be a string.
|
|
152
151
|
def validates_not_string(atts, opts={})
|
|
152
|
+
Sequel::Deprecation.deprecate('validates_not_string', "Please switch to validates_schema_types")
|
|
153
153
|
validatable_attributes_for_type(:not_string, atts, opts){|a,v,m| validation_error_message(m, (db_schema[a]||{})[:type]) if v.is_a?(String)}
|
|
154
154
|
end
|
|
155
155
|
|
|
@@ -168,10 +168,11 @@ module Sequel
|
|
|
168
168
|
# Validates for all of the model columns (or just the given columns)
|
|
169
169
|
# that the column value is an instance of the expected class based on
|
|
170
170
|
# the column's schema type.
|
|
171
|
-
def validates_schema_types(atts=keys)
|
|
171
|
+
def validates_schema_types(atts=keys, opts={})
|
|
172
172
|
Array(atts).each do |k|
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
if type = schema_type_class(k)
|
|
174
|
+
validates_type(type, k, {:allow_nil=>true}.merge(opts))
|
|
175
|
+
end
|
|
175
176
|
end
|
|
176
177
|
end
|
|
177
178
|
|
|
@@ -180,7 +181,10 @@ module Sequel
|
|
|
180
181
|
def validates_type(klass, atts, opts={})
|
|
181
182
|
klass = klass.to_s.constantize if klass.is_a?(String) || klass.is_a?(Symbol)
|
|
182
183
|
validatable_attributes_for_type(:type, atts, opts) do |a,v,m|
|
|
183
|
-
|
|
184
|
+
if v.nil?
|
|
185
|
+
Sequel::Deprecation.deprecate('validates_type will no longer allow nil values by default in Sequel 4. Use the :allow_nil=>true option to allow nil values.')
|
|
186
|
+
next
|
|
187
|
+
end
|
|
184
188
|
if klass.is_a?(Array) ? !klass.any?{|kls| v.is_a?(kls)} : !v.is_a?(klass)
|
|
185
189
|
validation_error_message(m, klass)
|
|
186
190
|
end
|
|
@@ -249,7 +253,7 @@ module Sequel
|
|
|
249
253
|
where.call(model.dataset, self, arr)
|
|
250
254
|
else
|
|
251
255
|
vals = arr.map{|x| send(x)}
|
|
252
|
-
next
|
|
256
|
+
next if vals.any?{|v| v.nil?}
|
|
253
257
|
model.where(arr.zip(vals))
|
|
254
258
|
end
|
|
255
259
|
ds = yield(ds) if block_given?
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
tsk_require 'nokogiri'
|
|
1
|
+
require 'nokogiri'
|
|
3
2
|
|
|
3
|
+
module Sequel
|
|
4
4
|
module Plugins
|
|
5
5
|
# The xml_serializer plugin handles serializing entire Sequel::Model
|
|
6
6
|
# objects to XML, and deserializing XML into a single Sequel::Model
|
|
@@ -45,7 +45,7 @@ module Sequel
|
|
|
45
45
|
# You can use a hash value with <tt>:include</tt> to pass options
|
|
46
46
|
# to associations:
|
|
47
47
|
#
|
|
48
|
-
# album.
|
|
48
|
+
# album.to_xml(:include=>{:artist=>{:only=>:name}})
|
|
49
49
|
# # Output:
|
|
50
50
|
# <?xml version="1.0"?>
|
|
51
51
|
# <album>
|
|
@@ -131,6 +131,9 @@ module Sequel
|
|
|
131
131
|
# Return an array of instances of this class based on
|
|
132
132
|
# the provided XML.
|
|
133
133
|
def array_from_xml(xml, opts={})
|
|
134
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
135
|
+
Sequel::Deprecation.deprecate("The array_from_xml :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
136
|
+
end
|
|
134
137
|
node = Nokogiri::XML(xml).children.first
|
|
135
138
|
unless node
|
|
136
139
|
raise Error, "Malformed XML used"
|
|
@@ -141,6 +144,9 @@ module Sequel
|
|
|
141
144
|
# Return an instance of this class based on the provided
|
|
142
145
|
# XML.
|
|
143
146
|
def from_xml(xml, opts={})
|
|
147
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
148
|
+
Sequel::Deprecation.deprecate("The from_xml :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
149
|
+
end
|
|
144
150
|
from_xml_node(Nokogiri::XML(xml).children.first, opts)
|
|
145
151
|
end
|
|
146
152
|
|
|
@@ -211,6 +217,9 @@ module Sequel
|
|
|
211
217
|
# on the input string. Requires that you load the inflector
|
|
212
218
|
# extension or another library that adds String#underscore.
|
|
213
219
|
def from_xml(xml, opts={})
|
|
220
|
+
if opts[:all_associations] || opts[:all_columns]
|
|
221
|
+
Sequel::Deprecation.deprecate("The from_xml :all_associations and :all_columns", 'You need to explicitly specify the associations and columns via the :associations and :fields options')
|
|
222
|
+
end
|
|
214
223
|
from_xml_node(Nokogiri::XML(xml).children.first, opts)
|
|
215
224
|
end
|
|
216
225
|
|
data/lib/sequel/sql.rb
CHANGED
|
@@ -93,7 +93,15 @@ module Sequel
|
|
|
93
93
|
# Do not call this method with untrusted input, as that can result in
|
|
94
94
|
# arbitrary code execution.
|
|
95
95
|
def to_s_method(meth, args=:self) # :nodoc:
|
|
96
|
-
|
|
96
|
+
# REMOVE40
|
|
97
|
+
class_eval(<<-END, __FILE__, __LINE__+1)
|
|
98
|
+
def to_s(ds)
|
|
99
|
+
Sequel::Deprecation.deprecate('SQL::Expression#to_s', "Please switch to using Dataset#literal to literalize expressions")
|
|
100
|
+
s = ''
|
|
101
|
+
to_s_append(ds, s)
|
|
102
|
+
s
|
|
103
|
+
end
|
|
104
|
+
END
|
|
97
105
|
class_eval("def to_s_append(ds, sql) ds.#{meth}_append(sql, #{args}) end", __FILE__, __LINE__)
|
|
98
106
|
end
|
|
99
107
|
end
|
|
@@ -127,7 +135,9 @@ module Sequel
|
|
|
127
135
|
|
|
128
136
|
# Alias of +to_s+
|
|
129
137
|
def sql_literal(ds)
|
|
130
|
-
|
|
138
|
+
s = ''
|
|
139
|
+
to_s_append(ds, s)
|
|
140
|
+
s
|
|
131
141
|
end
|
|
132
142
|
end
|
|
133
143
|
|