sequel 3.21.0 → 3.41.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.
- data/CHANGELOG +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +576 -0
- data/doc/opening_databases.rdoc +121 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +539 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +334 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +137 -16
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +77 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +168 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +227 -33
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +324 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +200 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +340 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +65 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +53 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
2
2
|
|
|
3
3
|
describe "Eagerly loading a tree structure" do
|
|
4
|
-
before do
|
|
4
|
+
before(:all) do
|
|
5
5
|
INTEGRATION_DB.instance_variable_set(:@schemas, {})
|
|
6
6
|
INTEGRATION_DB.create_table!(:nodes) do
|
|
7
7
|
primary_key :id
|
|
@@ -12,7 +12,7 @@ describe "Eagerly loading a tree structure" do
|
|
|
12
12
|
one_to_many :children, :key=>:parent_id
|
|
13
13
|
|
|
14
14
|
# Only useful when eager loading
|
|
15
|
-
many_to_one :ancestors, :eager_loader=>(proc do |eo|
|
|
15
|
+
many_to_one :ancestors, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
|
|
16
16
|
# Handle cases where the root node has the same parent_id as primary_key
|
|
17
17
|
# and also when it is NULL
|
|
18
18
|
non_root_nodes = eo[:rows].reject do |n|
|
|
@@ -36,7 +36,7 @@ describe "Eagerly loading a tree structure" do
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end)
|
|
39
|
-
many_to_one :descendants, :eager_loader=>(proc do |eo|
|
|
39
|
+
many_to_one :descendants, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
|
|
40
40
|
id_map = {}
|
|
41
41
|
eo[:rows].each do |n|
|
|
42
42
|
# Initialize an empty array of child associations for each parent node
|
|
@@ -66,9 +66,8 @@ describe "Eagerly loading a tree structure" do
|
|
|
66
66
|
Node.insert(:parent_id=>4)
|
|
67
67
|
Node.insert(:parent_id=>5)
|
|
68
68
|
Node.insert(:parent_id=>6)
|
|
69
|
-
clear_sqls
|
|
70
69
|
end
|
|
71
|
-
after do
|
|
70
|
+
after(:all) do
|
|
72
71
|
INTEGRATION_DB.drop_table :nodes
|
|
73
72
|
Object.send(:remove_const, :Node)
|
|
74
73
|
end
|
|
@@ -145,7 +144,6 @@ describe "Association Extensions" do
|
|
|
145
144
|
many_to_one :author
|
|
146
145
|
end
|
|
147
146
|
@author = Author.create
|
|
148
|
-
clear_sqls
|
|
149
147
|
end
|
|
150
148
|
after do
|
|
151
149
|
INTEGRATION_DB.drop_table :authorships, :authors
|
|
@@ -172,7 +170,7 @@ describe "Association Extensions" do
|
|
|
172
170
|
end
|
|
173
171
|
|
|
174
172
|
describe "has_many :through has_many and has_one :through belongs_to" do
|
|
175
|
-
before do
|
|
173
|
+
before(:all) do
|
|
176
174
|
INTEGRATION_DB.instance_variable_set(:@schemas, {})
|
|
177
175
|
INTEGRATION_DB.create_table!(:firms) do
|
|
178
176
|
primary_key :id
|
|
@@ -187,7 +185,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
|
|
|
187
185
|
end
|
|
188
186
|
end), \
|
|
189
187
|
:eager_loader=>(proc do |eo|
|
|
190
|
-
id_map = eo[:
|
|
188
|
+
id_map = eo[:id_map]
|
|
191
189
|
eo[:rows].each{|firm| firm.associations[:invoices] = []}
|
|
192
190
|
Invoice.eager_graph(:client).filter(:client__firm_id=>id_map.keys).all do |inv|
|
|
193
191
|
id_map[inv.client.firm_id].each do |firm|
|
|
@@ -251,9 +249,8 @@ describe "has_many :through has_many and has_one :through belongs_to" do
|
|
|
251
249
|
@invoice3 = Invoice.create(:client => @client2)
|
|
252
250
|
@invoice4 = Invoice.create(:client => @client3)
|
|
253
251
|
@invoice5 = Invoice.create(:client => @client3)
|
|
254
|
-
clear_sqls
|
|
255
252
|
end
|
|
256
|
-
after do
|
|
253
|
+
after(:all) do
|
|
257
254
|
INTEGRATION_DB.drop_table :invoices, :clients, :firms
|
|
258
255
|
Object.send(:remove_const, :Firm)
|
|
259
256
|
Object.send(:remove_const, :Client)
|
|
@@ -324,7 +321,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
|
|
|
324
321
|
end
|
|
325
322
|
|
|
326
323
|
describe "Polymorphic Associations" do
|
|
327
|
-
before do
|
|
324
|
+
before(:all) do
|
|
328
325
|
INTEGRATION_DB.instance_variable_set(:@schemas, {})
|
|
329
326
|
INTEGRATION_DB.create_table!(:assets) do
|
|
330
327
|
primary_key :id
|
|
@@ -336,7 +333,7 @@ describe "Polymorphic Associations" do
|
|
|
336
333
|
many_to_one :attachable, :reciprocal=>:assets, \
|
|
337
334
|
:dataset=>(proc do
|
|
338
335
|
klass = m.call(attachable_type)
|
|
339
|
-
klass.
|
|
336
|
+
klass.where(klass.primary_key=>attachable_id)
|
|
340
337
|
end), \
|
|
341
338
|
:eager_loader=>(proc do |eo|
|
|
342
339
|
id_map = {}
|
|
@@ -346,7 +343,7 @@ describe "Polymorphic Associations" do
|
|
|
346
343
|
end
|
|
347
344
|
id_map.each do |klass_name, id_map|
|
|
348
345
|
klass = m.call(klass_name)
|
|
349
|
-
klass.
|
|
346
|
+
klass.where(klass.primary_key=>id_map.keys).all do |attach|
|
|
350
347
|
id_map[attach.pk].each do |asset|
|
|
351
348
|
asset.associations[:attachable] = attach
|
|
352
349
|
end
|
|
@@ -366,25 +363,18 @@ describe "Polymorphic Associations" do
|
|
|
366
363
|
primary_key :id
|
|
367
364
|
end
|
|
368
365
|
class ::Post < Sequel::Model
|
|
369
|
-
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable
|
|
370
|
-
ds.filter(:attachable_type=>'Post')
|
|
371
|
-
end
|
|
366
|
+
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Post'}
|
|
372
367
|
|
|
373
368
|
private
|
|
374
369
|
|
|
375
370
|
def _add_asset(asset)
|
|
376
|
-
asset.attachable_id
|
|
377
|
-
asset.attachable_type = 'Post'
|
|
378
|
-
asset.save
|
|
371
|
+
asset.update(:attachable_id=>pk, :attachable_type=>'Post')
|
|
379
372
|
end
|
|
380
373
|
def _remove_asset(asset)
|
|
381
|
-
asset.attachable_id
|
|
382
|
-
asset.attachable_type = nil
|
|
383
|
-
asset.save
|
|
374
|
+
asset.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
384
375
|
end
|
|
385
376
|
def _remove_all_assets
|
|
386
|
-
|
|
387
|
-
.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
377
|
+
assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
388
378
|
end
|
|
389
379
|
end
|
|
390
380
|
|
|
@@ -392,27 +382,23 @@ describe "Polymorphic Associations" do
|
|
|
392
382
|
primary_key :id
|
|
393
383
|
end
|
|
394
384
|
class ::Note < Sequel::Model
|
|
395
|
-
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable
|
|
396
|
-
|
|
397
|
-
end
|
|
398
|
-
|
|
385
|
+
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Note'}
|
|
386
|
+
|
|
399
387
|
private
|
|
400
388
|
|
|
401
389
|
def _add_asset(asset)
|
|
402
|
-
asset.attachable_id
|
|
403
|
-
asset.attachable_type = 'Note'
|
|
404
|
-
asset.save
|
|
390
|
+
asset.update(:attachable_id=>pk, :attachable_type=>'Note')
|
|
405
391
|
end
|
|
406
392
|
def _remove_asset(asset)
|
|
407
|
-
asset.attachable_id
|
|
408
|
-
asset.attachable_type = nil
|
|
409
|
-
asset.save
|
|
393
|
+
asset.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
410
394
|
end
|
|
411
395
|
def _remove_all_assets
|
|
412
|
-
|
|
413
|
-
.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
396
|
+
assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
|
|
414
397
|
end
|
|
415
398
|
end
|
|
399
|
+
end
|
|
400
|
+
before do
|
|
401
|
+
[:assets, :posts, :notes].each{|t| INTEGRATION_DB[t].delete}
|
|
416
402
|
@post = Post.create
|
|
417
403
|
Note.create
|
|
418
404
|
@note = Note.create
|
|
@@ -420,9 +406,8 @@ describe "Polymorphic Associations" do
|
|
|
420
406
|
@asset2 = Asset.create(:attachable=>@note)
|
|
421
407
|
@asset1.associations.clear
|
|
422
408
|
@asset2.associations.clear
|
|
423
|
-
clear_sqls
|
|
424
409
|
end
|
|
425
|
-
after do
|
|
410
|
+
after(:all) do
|
|
426
411
|
INTEGRATION_DB.drop_table :assets, :posts, :notes
|
|
427
412
|
Object.send(:remove_const, :Asset)
|
|
428
413
|
Object.send(:remove_const, :Post)
|
|
@@ -483,7 +468,7 @@ describe "Polymorphic Associations" do
|
|
|
483
468
|
end
|
|
484
469
|
|
|
485
470
|
describe "many_to_one/one_to_many not referencing primary key" do
|
|
486
|
-
before do
|
|
471
|
+
before(:all) do
|
|
487
472
|
INTEGRATION_DB.instance_variable_set(:@schemas, {})
|
|
488
473
|
INTEGRATION_DB.create_table!(:clients) do
|
|
489
474
|
primary_key :id
|
|
@@ -527,7 +512,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
|
527
512
|
many_to_one :client, :key=>:client_name, \
|
|
528
513
|
:dataset=>proc{Client.filter(:name=>client_name)}, \
|
|
529
514
|
:eager_loader=>(proc do |eo|
|
|
530
|
-
id_map = eo[:
|
|
515
|
+
id_map = eo[:id_map]
|
|
531
516
|
eo[:rows].each{|inv| inv.associations[:client] = nil}
|
|
532
517
|
Client.filter(:name=>id_map.keys).all do |client|
|
|
533
518
|
id_map[client.name].each{|inv| inv.associations[:client] = client}
|
|
@@ -540,14 +525,16 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
|
540
525
|
self.client_name = (client.name if client)
|
|
541
526
|
end
|
|
542
527
|
end
|
|
543
|
-
|
|
528
|
+
end
|
|
529
|
+
before do
|
|
530
|
+
Client.delete
|
|
531
|
+
Invoice.delete
|
|
544
532
|
@client1 = Client.create(:name=>'X')
|
|
545
533
|
@client2 = Client.create(:name=>'Y')
|
|
546
534
|
@invoice1 = Invoice.create(:client_name=>'X')
|
|
547
535
|
@invoice2 = Invoice.create(:client_name=>'X')
|
|
548
|
-
clear_sqls
|
|
549
536
|
end
|
|
550
|
-
after do
|
|
537
|
+
after(:all) do
|
|
551
538
|
INTEGRATION_DB.drop_table :invoices, :clients
|
|
552
539
|
Object.send(:remove_const, :Client)
|
|
553
540
|
Object.send(:remove_const, :Invoice)
|
|
@@ -618,7 +605,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
|
618
605
|
end
|
|
619
606
|
|
|
620
607
|
describe "statistics associations" do
|
|
621
|
-
before do
|
|
608
|
+
before(:all) do
|
|
622
609
|
INTEGRATION_DB.create_table!(:projects) do
|
|
623
610
|
primary_key :id
|
|
624
611
|
String :name
|
|
@@ -628,11 +615,11 @@ describe "statistics associations" do
|
|
|
628
615
|
:dataset=>proc{Ticket.filter(:project_id=>id).select{sum(hours).as(hours)}},
|
|
629
616
|
:eager_loader=>(proc do |eo|
|
|
630
617
|
eo[:rows].each{|p| p.associations[:ticket_hours] = nil}
|
|
631
|
-
Ticket.filter(:project_id=>eo[:
|
|
632
|
-
|
|
633
|
-
|
|
618
|
+
Ticket.filter(:project_id=>eo[:id_map].keys).
|
|
619
|
+
select_group(:project_id).
|
|
620
|
+
select_append{sum(hours).as(hours)}.
|
|
634
621
|
all do |t|
|
|
635
|
-
p = eo[:
|
|
622
|
+
p = eo[:id_map][t.values.delete(:project_id)].first
|
|
636
623
|
p.associations[:ticket_hours] = t
|
|
637
624
|
end
|
|
638
625
|
end)
|
|
@@ -658,9 +645,8 @@ describe "statistics associations" do
|
|
|
658
645
|
@ticket2 = Ticket.create(:project=>@project1, :hours=>10)
|
|
659
646
|
@ticket3 = Ticket.create(:project=>@project2, :hours=>2)
|
|
660
647
|
@ticket4 = Ticket.create(:project=>@project2, :hours=>20)
|
|
661
|
-
clear_sqls
|
|
662
648
|
end
|
|
663
|
-
after do
|
|
649
|
+
after(:all) do
|
|
664
650
|
INTEGRATION_DB.drop_table :tickets, :projects
|
|
665
651
|
Object.send(:remove_const, :Project)
|
|
666
652
|
Object.send(:remove_const, :Ticket)
|
|
@@ -679,7 +665,7 @@ describe "statistics associations" do
|
|
|
679
665
|
end
|
|
680
666
|
|
|
681
667
|
describe "one to one associations" do
|
|
682
|
-
before do
|
|
668
|
+
before(:all) do
|
|
683
669
|
INTEGRATION_DB.create_table!(:books) do
|
|
684
670
|
primary_key :id
|
|
685
671
|
end
|
|
@@ -703,10 +689,8 @@ describe "one to one associations" do
|
|
|
703
689
|
@page2 = Page.create(:book=>@book1, :page_number=>2)
|
|
704
690
|
@page3 = Page.create(:book=>@book2, :page_number=>1)
|
|
705
691
|
@page4 = Page.create(:book=>@book2, :page_number=>2)
|
|
706
|
-
clear_sqls
|
|
707
692
|
end
|
|
708
|
-
|
|
709
|
-
after do
|
|
693
|
+
after(:all) do
|
|
710
694
|
INTEGRATION_DB.drop_table :pages, :books
|
|
711
695
|
Object.send(:remove_const, :Book)
|
|
712
696
|
Object.send(:remove_const, :Page)
|
|
@@ -7,7 +7,7 @@ describe Sequel::Migrator do
|
|
|
7
7
|
@m = Sequel::Migrator
|
|
8
8
|
end
|
|
9
9
|
after do
|
|
10
|
-
|
|
10
|
+
@db.drop_table?(:schema_info, :schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333, :sm11111, :sm22222)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
specify "should be able to migrate up and down all the way successfully" do
|
|
@@ -187,8 +187,7 @@ describe Sequel::Migrator do
|
|
|
187
187
|
|
|
188
188
|
specify "should handle reversible migrations" do
|
|
189
189
|
@dir = 'spec/files/reversible_migrations'
|
|
190
|
-
@db.drop_table(:a)
|
|
191
|
-
@db.drop_table(:b) rescue nil
|
|
190
|
+
@db.drop_table?(:a, :b)
|
|
192
191
|
@m.apply(@db, @dir, 1)
|
|
193
192
|
[:schema_info, :a].each{|n| @db.table_exists?(n).should be_true}
|
|
194
193
|
[:schema_migrations, :b].each{|n| @db.table_exists?(n).should be_false}
|
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
|
3
3
|
describe "Sequel::Model basic support" do
|
|
4
4
|
before do
|
|
5
5
|
@db = INTEGRATION_DB
|
|
6
|
-
@db.create_table!(:items) do
|
|
6
|
+
@db.create_table!(:items, :engine=>:InnoDB) do
|
|
7
7
|
primary_key :id
|
|
8
8
|
String :name
|
|
9
9
|
end
|
|
@@ -11,7 +11,7 @@ describe "Sequel::Model basic support" do
|
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
after do
|
|
14
|
-
@db.drop_table(:items)
|
|
14
|
+
@db.drop_table?(:items)
|
|
15
15
|
Object.send(:remove_const, :Item)
|
|
16
16
|
end
|
|
17
17
|
|
|
@@ -38,6 +38,14 @@ describe "Sequel::Model basic support" do
|
|
|
38
38
|
Item::Thing.first.should == Item::Thing.load(:id=>1, :name=>'J')
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
specify "should create accessors for all table columns even if all dataset columns aren't selected" do
|
|
42
|
+
c = Class.new(Sequel::Model(@db[:items].select(:id)))
|
|
43
|
+
o = c.new
|
|
44
|
+
o.name = 'A'
|
|
45
|
+
o.save.should == c.load(:id=>1)
|
|
46
|
+
c.select_map(:name).should == ['A']
|
|
47
|
+
end
|
|
48
|
+
|
|
41
49
|
specify "should work correctly when a dataset restricts the colums it selects" do
|
|
42
50
|
class ::Item::Thing < Sequel::Model(@db[:items].select(:name))
|
|
43
51
|
end
|
|
@@ -52,6 +60,68 @@ describe "Sequel::Model basic support" do
|
|
|
52
60
|
Item.count.should == 0
|
|
53
61
|
end
|
|
54
62
|
|
|
63
|
+
specify "#save should return nil if raise_on_save_failure is false and save isn't successful" do
|
|
64
|
+
i = Item.new(:name=>'J')
|
|
65
|
+
i.use_transactions = true
|
|
66
|
+
def i.after_save
|
|
67
|
+
raise Sequel::Rollback
|
|
68
|
+
end
|
|
69
|
+
i.save.should be_nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
specify "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
|
|
73
|
+
i = Item.create(:name=>'J')
|
|
74
|
+
i.use_transactions = true
|
|
75
|
+
def i.hooks
|
|
76
|
+
@hooks
|
|
77
|
+
end
|
|
78
|
+
def i.rb=(x)
|
|
79
|
+
@hooks = []
|
|
80
|
+
@rb = x
|
|
81
|
+
end
|
|
82
|
+
def i.after_save
|
|
83
|
+
@hooks << :as
|
|
84
|
+
raise Sequel::Rollback if @rb
|
|
85
|
+
end
|
|
86
|
+
def i.after_destroy
|
|
87
|
+
@hooks << :ad
|
|
88
|
+
raise Sequel::Rollback if @rb
|
|
89
|
+
end
|
|
90
|
+
def i.after_commit
|
|
91
|
+
@hooks << :ac
|
|
92
|
+
end
|
|
93
|
+
def i.after_rollback
|
|
94
|
+
@hooks << :ar
|
|
95
|
+
end
|
|
96
|
+
def i.after_destroy_commit
|
|
97
|
+
@hooks << :adc
|
|
98
|
+
end
|
|
99
|
+
def i.after_destroy_rollback
|
|
100
|
+
@hooks << :adr
|
|
101
|
+
end
|
|
102
|
+
i.name = 'K'
|
|
103
|
+
i.rb = true
|
|
104
|
+
i.save.should be_nil
|
|
105
|
+
i.reload.name.should == 'J'
|
|
106
|
+
i.hooks.should == [:as, :ar]
|
|
107
|
+
|
|
108
|
+
i.rb = true
|
|
109
|
+
i.destroy.should be_nil
|
|
110
|
+
i.exists?.should be_true
|
|
111
|
+
i.hooks.should == [:ad, :adr]
|
|
112
|
+
|
|
113
|
+
i.name = 'K'
|
|
114
|
+
i.rb = false
|
|
115
|
+
i.save.should_not be_nil
|
|
116
|
+
i.reload.name.should == 'K'
|
|
117
|
+
i.hooks.should == [:as, :ac]
|
|
118
|
+
|
|
119
|
+
i.rb = false
|
|
120
|
+
i.destroy.should_not be_nil
|
|
121
|
+
i.exists?.should be_false
|
|
122
|
+
i.hooks.should == [:ad, :adc]
|
|
123
|
+
end
|
|
124
|
+
|
|
55
125
|
specify "#exists? should return whether the item is still in the database" do
|
|
56
126
|
i = Item.create(:name=>'J')
|
|
57
127
|
i.exists?.should == true
|
|
@@ -128,3 +198,12 @@ describe "Sequel::Model basic support" do
|
|
|
128
198
|
end
|
|
129
199
|
end
|
|
130
200
|
end
|
|
201
|
+
|
|
202
|
+
describe "Sequel::Model with no existing table" do
|
|
203
|
+
specify "should not raise an error when setting the dataset" do
|
|
204
|
+
db = INTEGRATION_DB
|
|
205
|
+
db.drop_table?(:items)
|
|
206
|
+
proc{class ::Item < Sequel::Model(db); end; Object.send(:remove_const, :Item)}.should_not raise_error
|
|
207
|
+
proc{c = Class.new(Sequel::Model); c.set_dataset(db[:items])}.should_not raise_error
|
|
208
|
+
end
|
|
209
|
+
end
|