sequel 4.46.0 → 4.47.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +20 -0
- data/doc/release_notes/4.47.0.txt +56 -0
- data/lib/sequel/adapters/jdbc/as400.rb +1 -1
- data/lib/sequel/adapters/shared/postgres.rb +3 -1
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +6 -2
- data/lib/sequel/extensions/server_block.rb +32 -15
- data/lib/sequel/model.rb +1 -1
- data/lib/sequel/model/associations.rb +19 -3
- data/lib/sequel/model/base.rb +10 -3
- data/lib/sequel/plugins/association_autoreloading.rb +2 -0
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/boolean_readers.rb +1 -1
- data/lib/sequel/plugins/boolean_subsets.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -3
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/defaults_setter.rb +3 -1
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
- data/lib/sequel/plugins/rcte_tree.rb +0 -20
- data/lib/sequel/plugins/serialization.rb +5 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +2 -0
- data/spec/extensions/column_select_spec.rb +1 -0
- data/spec/extensions/defaults_setter_spec.rb +14 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
- data/spec/extensions/schema_dumper_spec.rb +16 -0
- data/spec/extensions/server_block_spec.rb +7 -0
- data/spec/integration/model_test.rb +53 -4
- data/spec/integration/plugin_test.rb +0 -1
- data/spec/model/association_reflection_spec.rb +42 -0
- data/spec/model/model_spec.rb +37 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d1bdb365601ad2d67120764a7211a4c12ecff3
|
4
|
+
data.tar.gz: 1e1a3e0d8fb915792b66a91e96577ba0c522c9b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47bd614656335d42c4d5f2dbe1fbf9ead5143975b2d57b06c982a26039e5d7bb359470e1ffead7993be9651bafb706a174cd99e26fff7786833d96d02b311275
|
7
|
+
data.tar.gz: 2ab2a499dc1cd2dd45fa7f9bf3a58e902742a4a087f297918b634f535c59953d26bee14aee90e8111142d38d703a5c8bc05966139d93f410f79ea236af5e0f11
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
=== 4.47.0 (2017-06-01)
|
2
|
+
|
3
|
+
* Deprecate pg_typecast_on_load plugin, only useful on deprecated do and swift adapters (jeremyevans)
|
4
|
+
|
5
|
+
* Deprecate association_autoreloading and many_to_one_pk_lookup plugins, which were made the default model behavior in Sequel 4 (jeremyevans)
|
6
|
+
|
7
|
+
* Deprecate setting invalid datasets for models unless required_valid_table = false (jeremyevans)
|
8
|
+
|
9
|
+
* Make Model.require_valid_table = true not raise for datasets where Database#schema raises an error but Dataset#columns works (jeremyevans)
|
10
|
+
|
11
|
+
* Make Database#with_server in the server_block extension accept a second argument for a different read_only shard (jeremyevans) (#1355)
|
12
|
+
|
13
|
+
* Make schema_dumper extension handle Oracle 11g XE inclusion of not null in the db_type (StevenCregan, jeremyevans) (#1351)
|
14
|
+
|
15
|
+
* Add Model.default_association_type_options for changing default association options per association type (jeremyevans)
|
16
|
+
|
17
|
+
* Add :materialized option to Database#views on PostgreSQL to return materialized views (Blargel) (#1348)
|
18
|
+
|
19
|
+
* Make defaults_setter plugin inherit custom default values when subclassing (jeremyevans)
|
20
|
+
|
1
21
|
=== 4.46.0 (2017-05-01)
|
2
22
|
|
3
23
|
* Recognize additional disconnect error on MySQL (jeremyevans)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
= Deprecated Features
|
2
|
+
|
3
|
+
* Setting an invalid dataset for a model is now deprecated.
|
4
|
+
Historically, Sequel has swallowed exceptions for this to keep
|
5
|
+
backwards compatibility, but it generally just results in code
|
6
|
+
breaking later. To allow invalid datasets to be used:
|
7
|
+
|
8
|
+
Sequel::Model.require_valid_table = false
|
9
|
+
|
10
|
+
* The association_autoreloading and many_to_one_pk_lookup plugins
|
11
|
+
are now deprecated. They were moved from plugins to standard
|
12
|
+
model behavior in Sequel 4.0, and have been no-ops since.
|
13
|
+
|
14
|
+
* The pg_typecast_on_load plugin is now deprecated. It is only useful
|
15
|
+
on the already deprecated do and swift adapters.
|
16
|
+
|
17
|
+
= New Features
|
18
|
+
|
19
|
+
* Database#with_server in the server_block extension now accepts an
|
20
|
+
optional second argument for the read only server to use. This
|
21
|
+
allows for overriding the default server while providing a separate
|
22
|
+
default for read only queries:
|
23
|
+
|
24
|
+
DB.with_server(:server1, :server1ro) do
|
25
|
+
DB[:a].all # Uses server1ro
|
26
|
+
DB[:b].insert(1) # Uses server1
|
27
|
+
end
|
28
|
+
|
29
|
+
* Model.default_association_type_options has been added, allowing the
|
30
|
+
ability to set default options per association type. This can be
|
31
|
+
used to make some association types read_only by default:
|
32
|
+
|
33
|
+
opts = Sequel::Model.default_association_type_options
|
34
|
+
opts[:one_to_many] = opts[:many_to_many] = {:read_only=>true}
|
35
|
+
|
36
|
+
* Database#views on PostgreSQL now accepts a :materialized option to
|
37
|
+
return materialized views instead of regular views.
|
38
|
+
|
39
|
+
= Other Improvements
|
40
|
+
|
41
|
+
* Setting Sequel::Model.require_valid_table = true no longer raises
|
42
|
+
an exception when using a valid dataset that selects from a subquery
|
43
|
+
or table returning function or uses a join.
|
44
|
+
|
45
|
+
* The defaults_setter plugin now inherits any custom default
|
46
|
+
values when subclassing.
|
47
|
+
|
48
|
+
* The schema_dumper extension now handles Oracle 11g XE behavior of
|
49
|
+
appending not null to the database type.
|
50
|
+
|
51
|
+
= Backwards Compatibility
|
52
|
+
|
53
|
+
* External callers of Database#check_non_connection_error (private
|
54
|
+
method) should update their code to call it with a true or false
|
55
|
+
argument specifying whether to raise an error for exceptions that
|
56
|
+
are not connection errors.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::Deprecation.deprecate("The jdbc/as400 adapter", "
|
3
|
+
Sequel::Deprecation.deprecate("The jdbc/as400 adapter", "This gem will replace it: https://github.com/ecraft/sequel-jdbc-as400")
|
4
4
|
|
5
5
|
Sequel::JDBC.load_driver('com.ibm.as400.access.AS400JDBCDriver')
|
6
6
|
Sequel.require 'adapters/jdbc/transactions'
|
@@ -614,12 +614,14 @@ module Sequel
|
|
614
614
|
# Array of symbols specifying view names in the current database.
|
615
615
|
#
|
616
616
|
# Options:
|
617
|
+
# :materialized :: Return materialized views
|
617
618
|
# :qualify :: Return the views as Sequel::SQL::QualifiedIdentifier instances,
|
618
619
|
# using the schema the view is located in as the qualifier.
|
619
620
|
# :schema :: The schema to search
|
620
621
|
# :server :: The server to use
|
621
622
|
def views(opts=OPTS)
|
622
|
-
|
623
|
+
relkind = opts[:materialized] ? 'm' : 'v'
|
624
|
+
pg_class_relname(relkind, opts)
|
623
625
|
end
|
624
626
|
|
625
627
|
private
|
@@ -93,7 +93,7 @@ module Sequel
|
|
93
93
|
def initialize(table, unused=nil)
|
94
94
|
if unused
|
95
95
|
# :nocov:
|
96
|
-
Sequel::Deprecation.deprecate("Passing two arguments to Sequel::Qualifier.new", 'Pass only the second
|
96
|
+
Sequel::Deprecation.deprecate("Passing two arguments to Sequel::Qualifier.new", 'Pass only the second argument specifying the table used for qualification')
|
97
97
|
@table = unused
|
98
98
|
# :nocov:
|
99
99
|
else
|
@@ -20,7 +20,11 @@ module Sequel
|
|
20
20
|
# be :type. The other options added should modify that type (e.g. :size). If a
|
21
21
|
# database type is not recognized, return it as a String type.
|
22
22
|
def column_schema_to_ruby_type(schema)
|
23
|
-
|
23
|
+
type = schema[:db_type].downcase
|
24
|
+
if database_type == :oracle
|
25
|
+
type = type.sub(/ not null\z/, '')
|
26
|
+
end
|
27
|
+
case type
|
24
28
|
when /\A(medium|small)?int(?:eger)?(?:\((\d+)\))?( unsigned)?\z/o
|
25
29
|
if !$1 && $2 && $2.to_i >= 10 && $3
|
26
30
|
# Unsigned integer type with 10 digits can potentially contain values which
|
@@ -49,7 +53,7 @@ module Sequel
|
|
49
53
|
{:type=>Time, :only_time=>true}
|
50
54
|
when /\An?char(?:acter)?(?:\((\d+)\))?\z/o
|
51
55
|
{:type=>String, :size=>($1.to_i if $1), :fixed=>true}
|
52
|
-
when /\A(?:n?
|
56
|
+
when /\A(?:n?varchar2?|character varying|bpchar|string)(?:\((\d+)\))?\z/o
|
53
57
|
{:type=>String, :size=>($1.to_i if $1)}
|
54
58
|
when /\A(?:small)?money\z/o
|
55
59
|
{:type=>BigDecimal, :size=>[19,2]}
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# end
|
17
17
|
# DB[:a].all # Uses default
|
18
18
|
#
|
19
|
-
# You can
|
19
|
+
# You can nest calls to with_server:
|
20
20
|
#
|
21
21
|
# DB.with_server(:shard1) do
|
22
22
|
# DB[:a].all # Uses shard1
|
@@ -39,6 +39,19 @@
|
|
39
39
|
# DB[:a].server(:read_only).all # Uses shard1
|
40
40
|
# end
|
41
41
|
#
|
42
|
+
# If you pass two separate shards to with_server, the second shard will
|
43
|
+
# be used instead of the :read_only shard, and the first shard will be
|
44
|
+
# used instead of the :default shard:
|
45
|
+
#
|
46
|
+
# DB.with_server(:shard1, :shard2) do
|
47
|
+
# DB[:a].all # Uses shard2
|
48
|
+
# DB[:a].delete # Uses shard1
|
49
|
+
# DB[:a].server(:shard3).all # Uses shard3
|
50
|
+
# DB[:a].server(:shard3).delete # Uses shard3
|
51
|
+
# DB[:a].server(:default).all # Uses shard1
|
52
|
+
# DB[:a].server(:read_only).delete # Uses shard2
|
53
|
+
# end
|
54
|
+
#
|
42
55
|
# Related modules: Sequel::ServerBlock, Sequel::UnthreadedServerBlock,
|
43
56
|
# Sequel::ThreadedServerBlock
|
44
57
|
|
@@ -60,17 +73,17 @@ module Sequel
|
|
60
73
|
end
|
61
74
|
|
62
75
|
# Delegate to the connection pool
|
63
|
-
def with_server(
|
64
|
-
pool.with_server(
|
76
|
+
def with_server(default_server, read_only_server=default_server, &block)
|
77
|
+
pool.with_server(default_server, read_only_server, &block)
|
65
78
|
end
|
66
79
|
end
|
67
80
|
|
68
81
|
# Adds with_server support for the sharded single connection pool.
|
69
82
|
module UnthreadedServerBlock
|
70
83
|
# Set a default server/shard to use inside the block.
|
71
|
-
def with_server(
|
84
|
+
def with_server(default_server, read_only_server=default_server)
|
72
85
|
begin
|
73
|
-
set_default_server(
|
86
|
+
set_default_server(default_server, read_only_server)
|
74
87
|
yield
|
75
88
|
ensure
|
76
89
|
clear_default_server
|
@@ -80,8 +93,8 @@ module Sequel
|
|
80
93
|
private
|
81
94
|
|
82
95
|
# Make the given server the new default server.
|
83
|
-
def set_default_server(
|
84
|
-
@default_servers <<
|
96
|
+
def set_default_server(default_server, read_only_server=default_server)
|
97
|
+
@default_servers << [default_server, read_only_server]
|
85
98
|
end
|
86
99
|
|
87
100
|
# Remove the current default server, restoring the
|
@@ -96,8 +109,10 @@ module Sequel
|
|
96
109
|
super
|
97
110
|
else
|
98
111
|
case server
|
99
|
-
when :default, nil
|
100
|
-
@default_servers
|
112
|
+
when :default, nil
|
113
|
+
@default_servers[-1][0]
|
114
|
+
when :read_only
|
115
|
+
@default_servers[-1][1]
|
101
116
|
else
|
102
117
|
super
|
103
118
|
end
|
@@ -109,9 +124,9 @@ module Sequel
|
|
109
124
|
module ThreadedServerBlock
|
110
125
|
# Set a default server/shard to use inside the block for the current
|
111
126
|
# thread.
|
112
|
-
def with_server(
|
127
|
+
def with_server(default_server, read_only_server=default_server)
|
113
128
|
begin
|
114
|
-
set_default_server(
|
129
|
+
set_default_server(default_server, read_only_server)
|
115
130
|
yield
|
116
131
|
ensure
|
117
132
|
clear_default_server
|
@@ -121,8 +136,8 @@ module Sequel
|
|
121
136
|
private
|
122
137
|
|
123
138
|
# Make the given server the new default server for the current thread.
|
124
|
-
def set_default_server(
|
125
|
-
sync{(@default_servers[Thread.current] ||= [])} <<
|
139
|
+
def set_default_server(default_server, read_only_server=default_server)
|
140
|
+
sync{(@default_servers[Thread.current] ||= [])} << [default_server, read_only_server]
|
126
141
|
end
|
127
142
|
|
128
143
|
# Remove the current default server for the current thread, restoring the
|
@@ -141,8 +156,10 @@ module Sequel
|
|
141
156
|
super
|
142
157
|
else
|
143
158
|
case server
|
144
|
-
when :default, nil
|
145
|
-
a
|
159
|
+
when :default, nil
|
160
|
+
a[-1][0]
|
161
|
+
when :read_only
|
162
|
+
a[-1][1]
|
146
163
|
else
|
147
164
|
super
|
148
165
|
end
|
data/lib/sequel/model.rb
CHANGED
@@ -106,7 +106,7 @@ module Sequel
|
|
106
106
|
@raise_on_save_failure = true
|
107
107
|
@raise_on_typecast_failure = false
|
108
108
|
@require_modification = nil
|
109
|
-
@require_valid_table =
|
109
|
+
@require_valid_table = nil
|
110
110
|
@restrict_primary_key = true
|
111
111
|
@setter_methods = nil
|
112
112
|
@simple_pk = nil
|
@@ -15,6 +15,7 @@ module Sequel
|
|
15
15
|
@autoreloading_associations = {}
|
16
16
|
@cache_associations = true
|
17
17
|
@default_association_options = {}
|
18
|
+
@default_association_type_options = {}
|
18
19
|
@dataset_module_class = DatasetModule
|
19
20
|
end
|
20
21
|
end
|
@@ -1526,9 +1527,15 @@ module Sequel
|
|
1526
1527
|
# the previous class.
|
1527
1528
|
attr_accessor :cache_associations
|
1528
1529
|
|
1529
|
-
# The default options to use for all associations.
|
1530
|
+
# The default options to use for all associations. This hash is merged into the association reflection hash for
|
1531
|
+
# all association reflections.
|
1530
1532
|
attr_accessor :default_association_options
|
1531
1533
|
|
1534
|
+
# The default options to use for all associations of a given type. This is a hash keyed by association type
|
1535
|
+
# symbol. If there is a value for the association type symbol key, the resulting hash will be merged into the
|
1536
|
+
# association reflection hash for all association reflections of that type.
|
1537
|
+
attr_accessor :default_association_type_options
|
1538
|
+
|
1532
1539
|
# The default :eager_limit_strategy option to use for limited or offset associations (default: true, causing Sequel
|
1533
1540
|
# to use what it considers the most appropriate strategy).
|
1534
1541
|
attr_accessor :default_eager_limit_strategy
|
@@ -1768,7 +1775,14 @@ module Sequel
|
|
1768
1775
|
orig_opts = cloned_assoc[:orig_opts].merge(orig_opts)
|
1769
1776
|
end
|
1770
1777
|
|
1771
|
-
opts = default_association_options
|
1778
|
+
opts = Hash[default_association_options]
|
1779
|
+
if type_options = default_association_type_options[type]
|
1780
|
+
opts.merge!(type_options)
|
1781
|
+
end
|
1782
|
+
opts.merge!(orig_opts)
|
1783
|
+
opts.merge!(:type => type, :name => name, :cache=>({} if cache_associations), :model => self)
|
1784
|
+
|
1785
|
+
opts
|
1772
1786
|
opts[:block] = block if block
|
1773
1787
|
if !opts.has_key?(:instance_specific) && (block || orig_opts[:block] || orig_opts[:dataset])
|
1774
1788
|
# It's possible the association is instance specific, in that it depends on
|
@@ -1832,6 +1846,8 @@ module Sequel
|
|
1832
1846
|
@association_reflections.freeze.each_value(&:freeze)
|
1833
1847
|
@autoreloading_associations.freeze.each_value(&:freeze)
|
1834
1848
|
@default_association_options.freeze
|
1849
|
+
@default_association_type_options.freeze
|
1850
|
+
@default_association_type_options.each_value(&:freeze)
|
1835
1851
|
|
1836
1852
|
super
|
1837
1853
|
end
|
@@ -1869,7 +1885,7 @@ module Sequel
|
|
1869
1885
|
associate(:one_to_one, name, opts, &block)
|
1870
1886
|
end
|
1871
1887
|
|
1872
|
-
Plugins.inherited_instance_variables(self, :@association_reflections=>:dup, :@autoreloading_associations=>:hash_dup, :@default_association_options=>:dup, :@cache_associations=>nil, :@default_eager_limit_strategy=>nil)
|
1888
|
+
Plugins.inherited_instance_variables(self, :@association_reflections=>:dup, :@autoreloading_associations=>:hash_dup, :@default_association_options=>:dup, :@default_association_type_options=>:hash_dup, :@cache_associations=>nil, :@default_eager_limit_strategy=>nil)
|
1873
1889
|
Plugins.def_dataset_methods(self, [:eager, :eager_graph, :eager_graph_with_options, :association_join, :association_full_join, :association_inner_join, :association_left_join, :association_right_join])
|
1874
1890
|
|
1875
1891
|
private
|
data/lib/sequel/model/base.rb
CHANGED
@@ -981,13 +981,20 @@ module Sequel
|
|
981
981
|
private
|
982
982
|
|
983
983
|
# Yield to the passed block and swallow all errors other than DatabaseConnectionErrors.
|
984
|
-
def check_non_connection_error
|
984
|
+
def check_non_connection_error(do_raise=require_valid_table)
|
985
985
|
begin
|
986
986
|
db.transaction(:savepoint=>:only){yield}
|
987
987
|
rescue Sequel::DatabaseConnectionError
|
988
988
|
raise
|
989
989
|
rescue Sequel::Error
|
990
|
-
|
990
|
+
case do_raise
|
991
|
+
when nil
|
992
|
+
Sequel::Deprecation.deprecate("Setting a model class dataset to an invalid dataset", "Either use a valid dataset or set require_valid_table = false for the model class")
|
993
|
+
when false
|
994
|
+
# nothing
|
995
|
+
else
|
996
|
+
raise
|
997
|
+
end
|
991
998
|
end
|
992
999
|
end
|
993
1000
|
|
@@ -1097,7 +1104,7 @@ module Sequel
|
|
1097
1104
|
schema_hash = {}
|
1098
1105
|
ds_opts = dataset.opts
|
1099
1106
|
get_columns = proc{check_non_connection_error{columns} || []}
|
1100
|
-
schema_array = check_non_connection_error{db.schema(dataset, :reload=>reload)} if db.supports_schema_parsing?
|
1107
|
+
schema_array = check_non_connection_error(false){db.schema(dataset, :reload=>reload)} if db.supports_schema_parsing?
|
1101
1108
|
if schema_array
|
1102
1109
|
schema_array.each{|k,v| schema_hash[k] = v}
|
1103
1110
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The association_autoreloading plugin", "This plugin was integrated into the default model behavior in Sequel 4.0, and no longer has an effect")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# Empty plugin module for backwards compatibility
|
@@ -6,9 +6,9 @@ module Sequel
|
|
6
6
|
# for destroying, deleting, or nullifying associated model objects. The following
|
7
7
|
# association types support the following dependency actions:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# :many_to_many :: :nullify (removes all related entries in join table)
|
10
|
+
# :many_to_one :: :delete, :destroy
|
11
|
+
# :one_to_many, one_to_one :: :delete, :destroy, :nullify (sets foreign key to NULL for all associated objects)
|
12
12
|
#
|
13
13
|
# This plugin works directly with the association datasets and does not use any cached association values.
|
14
14
|
# The :delete action will delete all associated objects from the database in a single SQL call.
|
@@ -49,7 +49,7 @@ module Sequel
|
|
49
49
|
# Add attribute? methods for all of the boolean attributes for this model.
|
50
50
|
def create_boolean_readers
|
51
51
|
im = instance_methods.collect(&:to_s)
|
52
|
-
if cs = check_non_connection_error{columns}
|
52
|
+
if cs = check_non_connection_error(false){columns}
|
53
53
|
cs.each{|c| create_boolean_reader(c) if boolean_attribute?(c) && !im.include?("#{c}?")}
|
54
54
|
end
|
55
55
|
end
|
@@ -48,7 +48,7 @@ module Sequel
|
|
48
48
|
|
49
49
|
# Add subset methods for all of the boolean columns in this model.
|
50
50
|
def create_boolean_subsets
|
51
|
-
if cs = check_non_connection_error{columns}
|
51
|
+
if cs = check_non_connection_error(false){columns}
|
52
52
|
cs = cs.select{|c| db_schema[c][:type] == :boolean}.map{|c| boolean_subset_args(c)}
|
53
53
|
dataset_module do
|
54
54
|
cs.each{|c| where(*c)}
|
@@ -281,7 +281,7 @@ module Sequel
|
|
281
281
|
columns = db.from(table).columns
|
282
282
|
else
|
283
283
|
table = subclass.implicit_table_name
|
284
|
-
columns = check_non_connection_error{db.from(table).columns}
|
284
|
+
columns = check_non_connection_error(false){db.from(table).columns}
|
285
285
|
table = nil if !columns || columns.empty?
|
286
286
|
end
|
287
287
|
end
|
@@ -295,8 +295,9 @@ module Sequel
|
|
295
295
|
ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))})
|
296
296
|
end
|
297
297
|
cols = columns - [pk]
|
298
|
-
|
299
|
-
|
298
|
+
dup_cols = cols & ds.columns
|
299
|
+
unless dup_cols.empty?
|
300
|
+
Sequel::Deprecation.deprecate("Using class_table_inheritance with duplicate column names (#{n} => #{dup_cols}) in subclass tables (other than the primary key column)', 'Make sure all tables used have unique column names, or implement support for handling duplicate column names in the class_table_inheritance plugin")
|
300
301
|
end
|
301
302
|
sel_app = cols.map{|cc| Sequel.qualify(table, Sequel.identifier(cc))}
|
302
303
|
@sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app)
|
@@ -43,13 +43,13 @@ module Sequel
|
|
43
43
|
ds = super
|
44
44
|
if !ds.opts[:select] && (from = ds.opts[:from]) && from.length == 1 && !ds.opts[:join]
|
45
45
|
if db.supports_schema_parsing?
|
46
|
-
cols = check_non_connection_error{db.schema(ds)}
|
46
|
+
cols = check_non_connection_error(false){db.schema(ds)}
|
47
47
|
if cols
|
48
48
|
cols = cols.map{|c, _| c}
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
if cols ||= check_non_connection_error{ds.columns}
|
52
|
+
if cols ||= check_non_connection_error(false){ds.columns}
|
53
53
|
ds = ds.select(*cols.map{|c| Sequel.qualify(ds.first_source, Sequel.identifier(c))})
|
54
54
|
end
|
55
55
|
end
|
@@ -36,6 +36,8 @@ module Sequel
|
|
36
36
|
|
37
37
|
Plugins.after_set_dataset(self, :set_default_values)
|
38
38
|
|
39
|
+
Plugins.inherited_instance_variables(self, :@default_values=>:dup)
|
40
|
+
|
39
41
|
# Freeze default values when freezing model class
|
40
42
|
def freeze
|
41
43
|
@default_values.freeze
|
@@ -48,7 +50,7 @@ module Sequel
|
|
48
50
|
def set_default_values
|
49
51
|
h = {}
|
50
52
|
@db_schema.each{|k, v| h[k] = convert_default_value(v[:ruby_default]) unless v[:ruby_default].nil?} if @db_schema
|
51
|
-
@default_values = h
|
53
|
+
@default_values = h.merge!(@default_values || {})
|
52
54
|
end
|
53
55
|
|
54
56
|
# Handle the CURRENT_DATE and CURRENT_TIMESTAMP values specially by returning an appropriate Date or
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The many_to_one_pk_lookup plugin", "This plugin was integrated into the default model behavior in Sequel 4.0, and no longer has an effect")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# Empty plugin module for backwards compatibility
|
@@ -70,7 +70,7 @@ module Sequel
|
|
70
70
|
#
|
71
71
|
# Then you can do:
|
72
72
|
#
|
73
|
-
# artist.
|
73
|
+
# artist.update_fields(params[:artist], [:name, :albums_artists])
|
74
74
|
#
|
75
75
|
# To save changes to the artist, create the first album and associate it to the artist,
|
76
76
|
# and update the other existing associated album.
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The pg_typecast_on_load plugin", "This plugin is only useful on the deprecated do and switch adapters")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# The PgTypecastOnLoad plugin exists because when you connect to PostgreSQL
|
@@ -12,26 +12,6 @@ module Sequel
|
|
12
12
|
# level (where level 1 is children, level 2 is children and grandchildren
|
13
13
|
# etc.) in a single query.
|
14
14
|
#
|
15
|
-
# = Background
|
16
|
-
#
|
17
|
-
# There are two types of common models for storing tree structured data
|
18
|
-
# in an SQL database, the adjacency list model and the nested set model.
|
19
|
-
# Before recursive common table expressions (or similar capabilities such
|
20
|
-
# as CONNECT BY for Oracle), the nested set model was the only easy way
|
21
|
-
# to retrieve all ancestors and descendants in a single query. However,
|
22
|
-
# it has significant performance corner cases.
|
23
|
-
#
|
24
|
-
# On PostgreSQL 8.4, with a significant number of rows, the nested set
|
25
|
-
# model is almost 500 times slower than using a recursive common table
|
26
|
-
# expression with the adjacency list model to get all descendants, and
|
27
|
-
# almost 24,000 times slower to get all descendants to a given level.
|
28
|
-
#
|
29
|
-
# Considering that the nested set model requires more difficult management
|
30
|
-
# than the adjacency list model, it's almost always better to use the
|
31
|
-
# adjacency list model if your database supports common table expressions.
|
32
|
-
# See http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/
|
33
|
-
# for detailed analysis.
|
34
|
-
#
|
35
15
|
# = Usage
|
36
16
|
#
|
37
17
|
# The rcte_tree plugin adds four associations to the model: parent, children, ancestors, and
|
@@ -7,11 +7,11 @@ module Sequel
|
|
7
7
|
# when you call an accessor.
|
8
8
|
#
|
9
9
|
# This plugin works by keeping the serialized value in the values, and
|
10
|
-
# adding a
|
11
|
-
# will check the
|
12
|
-
# or deserialized the entry in
|
13
|
-
# set the
|
14
|
-
# that serializes all
|
10
|
+
# adding a deserialized_values hash. The reader method for serialized columns
|
11
|
+
# will check the deserialized_values for the value, return it if present,
|
12
|
+
# or deserialized the entry in values and return it. The writer method will
|
13
|
+
# set the deserialized_values entry. This plugin adds a before_save hook
|
14
|
+
# that serializes all deserialized_values to values.
|
15
15
|
#
|
16
16
|
# You can specify the serialization format as a pair of serializer/deserializer
|
17
17
|
# callable objects. You can also specify the serialization format as a single
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The validation_helpers plugin contains
|
6
|
-
#
|
5
|
+
# The validation_helpers plugin contains validate_* methods designed to be called inside Model#validate
|
6
|
+
# to perform validations:
|
7
7
|
#
|
8
8
|
# Sequel::Model.plugin :validation_helpers
|
9
9
|
# class Album < Sequel::Model
|
data/lib/sequel/version.rb
CHANGED
@@ -5,7 +5,7 @@ module Sequel
|
|
5
5
|
MAJOR = 4
|
6
6
|
# The minor version of Sequel. Bumped for every non-patch level
|
7
7
|
# release, generally around once a month.
|
8
|
-
MINOR =
|
8
|
+
MINOR = 47
|
9
9
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
10
10
|
# releases that fix regressions from previous versions.
|
11
11
|
TINY = 0
|
@@ -168,6 +168,8 @@ describe "PostgreSQL views" do
|
|
168
168
|
@db[:items_view].select_order_map(:number).must_equal [10, 20]
|
169
169
|
@db.refresh_view(:items_view)
|
170
170
|
@db[:items_view].select_order_map(:number).must_equal [10, 15, 20]
|
171
|
+
@db.views.wont_include :items_view
|
172
|
+
@db.views(@opts).must_include :items_view
|
171
173
|
end if DB.server_version >= 90300
|
172
174
|
|
173
175
|
it "should support refreshing materialized views concurrently" do
|
@@ -114,6 +114,7 @@ describe "Sequel::Plugins::ColumnSelect" do
|
|
114
114
|
def @db.supports_schema_parsing?() true end
|
115
115
|
def @db.schema_parse_table(t, *) [] end
|
116
116
|
@db.extend_datasets{def columns; raise Sequel::DatabaseError; end}
|
117
|
+
@Album.require_valid_table = false
|
117
118
|
@Album.plugin :column_select
|
118
119
|
@Album.dataset.sql.must_equal 'SELECT * FROM albums'
|
119
120
|
end
|
@@ -72,6 +72,7 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
72
72
|
|
73
73
|
it "should contain the default values in default_values" do
|
74
74
|
@pr.call(2).default_values.must_equal(:a=>2)
|
75
|
+
@c.default_values.clear
|
75
76
|
@pr.call(nil).default_values.must_equal({})
|
76
77
|
end
|
77
78
|
|
@@ -93,6 +94,19 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
93
94
|
@c.new.a.must_be_nil
|
94
95
|
end
|
95
96
|
|
97
|
+
it "should work in subclasses" do
|
98
|
+
@pr.call(2)
|
99
|
+
@c.default_values[:a] = proc{1}
|
100
|
+
c = Class.new(@c)
|
101
|
+
|
102
|
+
@c.new.a.must_equal 1
|
103
|
+
c.new.a.must_equal 1
|
104
|
+
|
105
|
+
c.default_values[:a] = proc{2}
|
106
|
+
@c.new.a.must_equal 1
|
107
|
+
c.new.a.must_equal 2
|
108
|
+
end
|
109
|
+
|
96
110
|
it "should work correctly on a model without a dataset" do
|
97
111
|
@pr.call(2)
|
98
112
|
c = Class.new(Sequel::Model(@db[:bar]))
|
@@ -7,28 +7,30 @@ describe Sequel::Model, "PgTypecastOnLoad plugin" do
|
|
7
7
|
[[:id, {}], [:b, {:type=>:boolean, :oid=>16}], [:y, {:type=>:integer, :oid=>20}]]
|
8
8
|
end
|
9
9
|
@c = Class.new(Sequel::Model(@db[:items]))
|
10
|
-
|
10
|
+
deprecated do
|
11
|
+
@c.plugin :pg_typecast_on_load, :b, :y
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
|
-
|
15
|
+
deprecated "should call the database conversion proc for all given columns" do
|
14
16
|
@c.first.values.must_equal(:id=>1, :b=>true, :y=>0)
|
15
17
|
end
|
16
18
|
|
17
|
-
|
19
|
+
deprecated "should call the database conversion proc with value when reloading the object, for all given columns" do
|
18
20
|
@c.first.refresh.values.must_equal(:id=>1, :b=>true, :y=>0)
|
19
21
|
end
|
20
22
|
|
21
|
-
|
23
|
+
deprecated "should not fail if schema oid does not have a related conversion proc" do
|
22
24
|
@c.db_schema[:b][:oid] = 0
|
23
25
|
@c.first.refresh.values.must_equal(:id=>1, :b=>"t", :y=>0)
|
24
26
|
end
|
25
27
|
|
26
|
-
|
28
|
+
deprecated "should call the database conversion proc with value when automatically reloading the object on creation via insert_select" do
|
27
29
|
@c.dataset = @c.dataset.with_extend{def insert_select(h) insert(h); first end}
|
28
30
|
@c.create.values.must_equal(:id=>1, :b=>true, :y=>0)
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
deprecated "should allowing setting columns separately via add_pg_typecast_on_load_columns" do
|
32
34
|
@c = Class.new(Sequel::Model(@db[:items]))
|
33
35
|
@c.plugin :pg_typecast_on_load
|
34
36
|
@c.first.values.must_equal(:id=>1, :b=>"t", :y=>"0")
|
@@ -38,7 +40,7 @@ describe Sequel::Model, "PgTypecastOnLoad plugin" do
|
|
38
40
|
@c.first.values.must_equal(:id=>1, :b=>true, :y=>0)
|
39
41
|
end
|
40
42
|
|
41
|
-
|
43
|
+
deprecated "should work with subclasses" do
|
42
44
|
@c = Class.new(Sequel::Model(@db[:items]))
|
43
45
|
@c.plugin :pg_typecast_on_load
|
44
46
|
@c.first.values.must_equal(:id=>1, :b=>"t", :y=>"0")
|
@@ -57,11 +59,11 @@ describe Sequel::Model, "PgTypecastOnLoad plugin" do
|
|
57
59
|
c1.first.values.must_equal(:id=>1, :b=>"t", :y=>0)
|
58
60
|
end
|
59
61
|
|
60
|
-
|
62
|
+
deprecated "should not mark the object as modified" do
|
61
63
|
@c.first.modified?.must_equal false
|
62
64
|
end
|
63
65
|
|
64
|
-
|
66
|
+
deprecated "should freeze pg_typecast_on_load_columns" do
|
65
67
|
@c.freeze
|
66
68
|
@c.pg_typecast_on_load_columns.frozen?.must_equal true
|
67
69
|
end
|
@@ -802,6 +802,22 @@ end
|
|
802
802
|
END_MIG
|
803
803
|
end
|
804
804
|
|
805
|
+
it "should convert oracle special types to ruby types" do
|
806
|
+
@d.meta_def(:database_type){:oracle}
|
807
|
+
types = ['number not null', 'date not null', 'varchar2(4 byte) not null']
|
808
|
+
@d.meta_def(:schema) do |t, *o|
|
809
|
+
i = 0
|
810
|
+
types.map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>false}]}
|
811
|
+
end
|
812
|
+
@d.dump_table_schema(:x).must_equal((<<END_MIG).chomp)
|
813
|
+
create_table(:x) do
|
814
|
+
BigDecimal :c1, :null=>false
|
815
|
+
Date :c2, :null=>false
|
816
|
+
String :c3, :null=>false
|
817
|
+
end
|
818
|
+
END_MIG
|
819
|
+
end
|
820
|
+
|
805
821
|
it "should force specify :null option for MySQL timestamp columns when using :same_db" do
|
806
822
|
@d.meta_def(:database_type){:mysql}
|
807
823
|
@d.meta_def(:schema){|*s| [[:c1, {:db_type=>'timestamp', :primary_key=>true, :allow_null=>true}]]}
|
@@ -8,6 +8,13 @@ with_server_specs = shared_description do
|
|
8
8
|
@db.sqls.must_equal ["SELECT * FROM t -- b"]
|
9
9
|
end
|
10
10
|
|
11
|
+
it "should set the default server to use in the block" do
|
12
|
+
@db.with_server(:a, :b){@db[:t].all}
|
13
|
+
@db.sqls.must_equal ["SELECT * FROM t -- b"]
|
14
|
+
@db.with_server(:a, :b){@db[:t].insert}
|
15
|
+
@db.sqls.must_equal ["INSERT INTO t DEFAULT VALUES -- a"]
|
16
|
+
end
|
17
|
+
|
11
18
|
it "should have no affect after the block" do
|
12
19
|
@db.with_server(:a){@db[:t].all}
|
13
20
|
@db.sqls.must_equal ["SELECT * FROM t -- a"]
|
@@ -49,7 +49,7 @@ describe "Sequel::Model basic support" do
|
|
49
49
|
Item.all.must_equal [Item.load(:id=>1, :name=>'J')]
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
deprecated "should not raise an error if the implied database table doesn't exist" do
|
53
53
|
class ::Item::Thing < Sequel::Model(@db)
|
54
54
|
set_dataset :items
|
55
55
|
end
|
@@ -57,6 +57,26 @@ describe "Sequel::Model basic support" do
|
|
57
57
|
Item::Thing.first.must_equal Item::Thing.load(:id=>1, :name=>'J')
|
58
58
|
end
|
59
59
|
|
60
|
+
it "should raise an error if the implied database table doesn't exist if require_valid_table is true" do
|
61
|
+
proc do
|
62
|
+
c = Sequel::Model(@db)
|
63
|
+
c.require_valid_table = true
|
64
|
+
class ::Item::Thing < c
|
65
|
+
set_dataset :items
|
66
|
+
end
|
67
|
+
end.must_raise Sequel::Error
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should not raise an error if the implied database table doesn't exist if require_valid_table is false" do
|
71
|
+
c = Sequel::Model(@db)
|
72
|
+
c.require_valid_table = false
|
73
|
+
class ::Item::Thing < c
|
74
|
+
set_dataset :items
|
75
|
+
end
|
76
|
+
Item.create(:name=>'J')
|
77
|
+
Item::Thing.first.must_equal Item::Thing.load(:id=>1, :name=>'J')
|
78
|
+
end
|
79
|
+
|
60
80
|
it "should create accessors for all table columns even if all dataset columns aren't selected" do
|
61
81
|
c = Class.new(Sequel::Model(@db[:items].select(:id)))
|
62
82
|
o = c.new
|
@@ -219,14 +239,43 @@ describe "Sequel::Model basic support" do
|
|
219
239
|
end
|
220
240
|
|
221
241
|
describe "Sequel::Model with no existing table" do
|
222
|
-
|
242
|
+
deprecated "should not raise an error when setting the dataset" do
|
223
243
|
db = DB
|
224
244
|
db.drop_table?(:items)
|
225
|
-
|
226
|
-
c
|
245
|
+
c = Class.new(Sequel::Model)
|
246
|
+
c.set_dataset(db[:items])
|
227
247
|
db.transaction do
|
228
248
|
c = Class.new(Sequel::Model(db[:items]))
|
229
249
|
db.get(Sequel.cast(1, Integer)).must_equal 1
|
230
250
|
end
|
231
251
|
end
|
252
|
+
|
253
|
+
it "should not raise an error when setting the dataset when require_valid_table is true" do
|
254
|
+
db = DB
|
255
|
+
db.drop_table?(:items)
|
256
|
+
c1 = Sequel::Model(db);
|
257
|
+
c = Class.new(Sequel::Model)
|
258
|
+
c.require_valid_table = true
|
259
|
+
proc{c.set_dataset(db[:items])}.must_raise Sequel::Error
|
260
|
+
db.transaction do
|
261
|
+
c = Class.new(Sequel::Model)
|
262
|
+
c.require_valid_table = true
|
263
|
+
proc{c.dataset = db[:items]}.must_raise Sequel::Error
|
264
|
+
db.get(Sequel.cast(1, Integer)).must_equal 1
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should not raise an error when setting the dataset when require_valid_table is false" do
|
269
|
+
db = DB
|
270
|
+
db.drop_table?(:items)
|
271
|
+
c = Class.new(Sequel::Model)
|
272
|
+
c.require_valid_table = false
|
273
|
+
c.set_dataset(db[:items])
|
274
|
+
db.transaction do
|
275
|
+
c = Class.new(Sequel::Model)
|
276
|
+
c.require_valid_table = false
|
277
|
+
c.dataset = db[:items]
|
278
|
+
db.get(Sequel.cast(1, Integer)).must_equal 1
|
279
|
+
end
|
280
|
+
end
|
232
281
|
end
|
@@ -586,6 +586,48 @@ describe Sequel::Model::Associations::AssociationReflection, "with default assoc
|
|
586
586
|
r[:foo].must_equal 3
|
587
587
|
r[:bar].must_equal 2
|
588
588
|
end
|
589
|
+
|
590
|
+
it "should have default_association_type_options take precedence over default_association_options" do
|
591
|
+
@c.default_association_options = {:foo=>2, :bar=>3}
|
592
|
+
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
593
|
+
@c.many_to_one :c, :class=>@c, :foo=>3
|
594
|
+
r = @c.association_reflection(:c)
|
595
|
+
r[:foo].must_equal 3
|
596
|
+
r[:bar].must_equal 2
|
597
|
+
end
|
598
|
+
|
599
|
+
it "should use default_association_type_options as defaults" do
|
600
|
+
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
601
|
+
@c.many_to_one :c, :class=>@c, :foo=>3
|
602
|
+
r = @c.association_reflection(:c)
|
603
|
+
r[:foo].must_equal 3
|
604
|
+
r[:bar].must_equal 2
|
605
|
+
|
606
|
+
@c.one_to_many :cs, :class=>@c, :foo=>3
|
607
|
+
r = @c.association_reflection(:cs)
|
608
|
+
r[:foo].must_equal 3
|
609
|
+
r[:bar].must_be_nil
|
610
|
+
end
|
611
|
+
|
612
|
+
it "should inherit default_association_type_options" do
|
613
|
+
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
614
|
+
c = Class.new(@c)
|
615
|
+
c.many_to_one :c, :class=>c, :foo=>3
|
616
|
+
r = c.association_reflection(:c)
|
617
|
+
r[:foo].must_equal 3
|
618
|
+
r[:bar].must_equal 2
|
619
|
+
|
620
|
+
@c.default_association_type_options[:many_to_one][:bar] = 4
|
621
|
+
c.many_to_one :d, :class=>c, :foo=>3
|
622
|
+
r = c.association_reflection(:d)
|
623
|
+
r[:foo].must_equal 3
|
624
|
+
r[:bar].must_equal 2
|
625
|
+
|
626
|
+
c.one_to_many :ds, :class=>c, :foo=>3
|
627
|
+
r = c.association_reflection(:ds)
|
628
|
+
r[:foo].must_equal 3
|
629
|
+
r[:bar].must_be_nil
|
630
|
+
end
|
589
631
|
end
|
590
632
|
|
591
633
|
describe "Sequel::Model.freeze" do
|
data/spec/model/model_spec.rb
CHANGED
@@ -1114,7 +1114,43 @@ describe "Model.db_schema" do
|
|
1114
1114
|
@c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
|
1115
1115
|
end
|
1116
1116
|
|
1117
|
-
|
1117
|
+
deprecated "should not raise error if setting dataset where getting schema and columns raises an error" do
|
1118
|
+
def @db.schema(table, opts={})
|
1119
|
+
raise Sequel::Error
|
1120
|
+
end
|
1121
|
+
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
1122
|
+
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
1123
|
+
end
|
1124
|
+
|
1125
|
+
it "should not raise error if setting dataset where getting schema and columns raises an error and require_valid_table is false" do
|
1126
|
+
@c.require_valid_table = false
|
1127
|
+
def @db.schema(table, opts={})
|
1128
|
+
raise Sequel::Error
|
1129
|
+
end
|
1130
|
+
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
1131
|
+
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
it "should raise error if setting dataset where getting schema and columns raises an error and require_valid_table is true" do
|
1135
|
+
@c.require_valid_table = true
|
1136
|
+
def @db.schema(table, opts={})
|
1137
|
+
raise Sequel::Error
|
1138
|
+
end
|
1139
|
+
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
1140
|
+
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
it "should use dataset columns if getting schema raises an error and require_valid_table is false" do
|
1144
|
+
@c.require_valid_table = false
|
1145
|
+
def @db.schema(table, opts={})
|
1146
|
+
raise Sequel::Error
|
1147
|
+
end
|
1148
|
+
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
1149
|
+
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
1150
|
+
end
|
1151
|
+
|
1152
|
+
it "should use dataset columns if getting schema raises an error and require_valid_table is true" do
|
1153
|
+
@c.require_valid_table = true
|
1118
1154
|
def @db.schema(table, opts={})
|
1119
1155
|
raise Sequel::Error
|
1120
1156
|
end
|
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: 4.
|
4
|
+
version: 4.47.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: 2017-
|
11
|
+
date: 2017-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -248,6 +248,7 @@ extra_rdoc_files:
|
|
248
248
|
- doc/release_notes/4.44.0.txt
|
249
249
|
- doc/release_notes/4.45.0.txt
|
250
250
|
- doc/release_notes/4.46.0.txt
|
251
|
+
- doc/release_notes/4.47.0.txt
|
251
252
|
files:
|
252
253
|
- CHANGELOG
|
253
254
|
- MIT-LICENSE
|
@@ -385,6 +386,7 @@ files:
|
|
385
386
|
- doc/release_notes/4.44.0.txt
|
386
387
|
- doc/release_notes/4.45.0.txt
|
387
388
|
- doc/release_notes/4.46.0.txt
|
389
|
+
- doc/release_notes/4.47.0.txt
|
388
390
|
- doc/release_notes/4.5.0.txt
|
389
391
|
- doc/release_notes/4.6.0.txt
|
390
392
|
- doc/release_notes/4.7.0.txt
|