sequel 5.29.0 → 5.34.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 +70 -1922
- data/README.rdoc +1 -1
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +3 -3
- data/doc/code_order.rdoc +12 -2
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/postgresql.rdoc +71 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/testing.rdoc +1 -1
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -5
- data/lib/sequel/adapters/shared/mysql.rb +9 -9
- data/lib/sequel/adapters/shared/oracle.rb +16 -16
- data/lib/sequel/adapters/shared/postgres.rb +169 -14
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +32 -5
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +318 -314
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/misc.rb +16 -10
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +0 -1
- data/lib/sequel/database/schema_methods.rb +15 -16
- data/lib/sequel/database/transactions.rb +12 -13
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/query.rb +4 -3
- data/lib/sequel/deprecated.rb +2 -0
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/pg_enum.rb +5 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_inet.rb +13 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_range.rb +2 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/schema_dumper.rb +10 -4
- data/lib/sequel/extensions/server_block.rb +3 -3
- data/lib/sequel/model.rb +2 -0
- data/lib/sequel/model/associations.rb +30 -18
- data/lib/sequel/model/base.rb +64 -55
- data/lib/sequel/model/plugins.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
- data/lib/sequel/plugins/association_pks.rb +57 -16
- data/lib/sequel/plugins/association_proxies.rb +2 -0
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
- data/lib/sequel/plugins/dirty.rb +13 -13
- data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
- data/lib/sequel/plugins/json_serializer.rb +3 -7
- data/lib/sequel/plugins/rcte_tree.rb +2 -2
- data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/timezones.rb +6 -4
- data/lib/sequel/version.rb +1 -1
- metadata +17 -368
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -828
- data/spec/adapters/mysql_spec.rb +0 -1060
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4476
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2915
- data/spec/core/dataset_spec.rb +0 -5544
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1498
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1844
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/any_not_empty_spec.rb +0 -23
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -222
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/exclude_or_null_spec.rb +0 -15
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_conflict_spec.rb +0 -103
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -346
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -218
- data/spec/extensions/nested_attributes_spec.rb +0 -815
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -356
- data/spec/extensions/pg_json_spec.rb +0 -451
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -600
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -387
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -135
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -197
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -70
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_cache_spec.rb +0 -35
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -2037
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2423
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -903
- data/spec/integration/spec_helper.rb +0 -71
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -5
- data/spec/spec_config.rb +0 -12
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Supported types" do
|
|
4
|
-
def create_items_table_with_column(name, type, opts={})
|
|
5
|
-
DB.create_table!(:items){column name, type, opts}
|
|
6
|
-
DB[:items]
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
after(:all) do
|
|
10
|
-
DB.drop_table?(:items)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should support casting correctly" do
|
|
14
|
-
ds = create_items_table_with_column(:number, Integer)
|
|
15
|
-
ds.insert(:number => 1)
|
|
16
|
-
ds.select(Sequel.cast(:number, String).as(:n)).map(:n).must_equal %w'1'
|
|
17
|
-
ds = create_items_table_with_column(:name, String)
|
|
18
|
-
ds.insert(:name=> '1')
|
|
19
|
-
ds.select(Sequel.cast(:name, Integer).as(:n)).map(:n).must_equal [1]
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should support NULL correctly" do
|
|
23
|
-
ds = create_items_table_with_column(:number, Integer)
|
|
24
|
-
ds.insert(:number => nil)
|
|
25
|
-
ds.all.must_equal [{:number=>nil}]
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "should support generic integer type" do
|
|
29
|
-
ds = create_items_table_with_column(:number, Integer)
|
|
30
|
-
ds.insert(:number => 2)
|
|
31
|
-
ds.all.must_equal [{:number=>2}]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should support generic bignum type" do
|
|
35
|
-
ds = create_items_table_with_column(:number, :Bignum)
|
|
36
|
-
ds.insert(:number => 2**34)
|
|
37
|
-
ds.all.must_equal [{:number=>2**34}]
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "should support generic float type" do
|
|
41
|
-
ds = create_items_table_with_column(:number, Float)
|
|
42
|
-
ds.insert(:number => 2.1)
|
|
43
|
-
ds.all.must_equal [{:number=>2.1}]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
cspecify "should support generic numeric type", [:odbc, :mssql] do
|
|
47
|
-
ds = create_items_table_with_column(:number, Numeric, :size=>[15, 10])
|
|
48
|
-
ds.insert(:number => BigDecimal('2.123456789'))
|
|
49
|
-
ds.all.must_equal [{:number=>BigDecimal('2.123456789')}]
|
|
50
|
-
ds = create_items_table_with_column(:number, BigDecimal, :size=>[15, 10])
|
|
51
|
-
ds.insert(:number => BigDecimal('2.123456789'))
|
|
52
|
-
ds.all.must_equal [{:number=>BigDecimal('2.123456789')}]
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "should support generic string type" do
|
|
56
|
-
ds = create_items_table_with_column(:name, String)
|
|
57
|
-
ds.insert(:name => 'Test User')
|
|
58
|
-
ds.all.must_equal [{:name=>'Test User'}]
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "should support generic text type" do
|
|
62
|
-
ds = create_items_table_with_column(:name, String, :text=>true)
|
|
63
|
-
ds.insert(:name => 'Test User'*100)
|
|
64
|
-
ds.all.must_equal [{:name=>'Test User'*100}]
|
|
65
|
-
|
|
66
|
-
ds.update(:name=>ds.get(:name))
|
|
67
|
-
ds.all.must_equal [{:name=>'Test User'*100}]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
cspecify "should support generic date type", [:jdbc, :sqlite], [:tinytds], [:jdbc, :mssql], :oracle do
|
|
71
|
-
ds = create_items_table_with_column(:dat, Date)
|
|
72
|
-
d = Date.today
|
|
73
|
-
ds.insert(:dat => d)
|
|
74
|
-
ds.first[:dat].must_be_kind_of(Date)
|
|
75
|
-
ds.first[:dat].to_s.must_equal d.to_s
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
cspecify "should support generic time type", [:odbc], [:jdbc, :mssql], [:jdbc, :sqlite], [:mysql2], [:tinytds], :oracle, [:ado] do
|
|
79
|
-
ds = create_items_table_with_column(:tim, Time, :only_time=>true)
|
|
80
|
-
t = Sequel::SQLTime.now
|
|
81
|
-
ds.insert(:tim => t)
|
|
82
|
-
v = ds.first[:tim]
|
|
83
|
-
ds.literal(v).must_equal ds.literal(t)
|
|
84
|
-
v.must_be_kind_of(Sequel::SQLTime)
|
|
85
|
-
ds.delete
|
|
86
|
-
ds.insert(:tim => v)
|
|
87
|
-
v2 = ds.first[:tim]
|
|
88
|
-
ds.literal(v2).must_equal ds.literal(t)
|
|
89
|
-
v2.must_be_kind_of(Sequel::SQLTime)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
cspecify "should support generic datetime type", [:jdbc, :sqlite] do
|
|
93
|
-
ds = create_items_table_with_column(:tim, DateTime)
|
|
94
|
-
t = DateTime.now
|
|
95
|
-
ds.insert(:tim => t)
|
|
96
|
-
ds.first[:tim].strftime('%Y%m%d%H%M%S').must_equal t.strftime('%Y%m%d%H%M%S')
|
|
97
|
-
ds = create_items_table_with_column(:tim, Time)
|
|
98
|
-
t = Time.now
|
|
99
|
-
ds.insert(:tim => t)
|
|
100
|
-
ds.first[:tim].strftime('%Y%m%d%H%M%S').must_equal t.strftime('%Y%m%d%H%M%S')
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
cspecify "should support generic file type", [:odbc, :mssql], [:mysql2], [:tinytds] do
|
|
104
|
-
ds = create_items_table_with_column(:name, File)
|
|
105
|
-
ds.insert(:name =>Sequel.blob("a\0"*300))
|
|
106
|
-
ds.all.must_equal [{:name=>Sequel.blob("a\0"*300)}]
|
|
107
|
-
ds.first[:name].must_be_kind_of(::Sequel::SQL::Blob)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
cspecify "should support generic boolean type", [:jdbc, :sqlite], [:jdbc, :db2], :oracle do
|
|
111
|
-
ds = create_items_table_with_column(:number, TrueClass)
|
|
112
|
-
ds.insert(:number => true)
|
|
113
|
-
ds.all.must_equal [{:number=>true}]
|
|
114
|
-
ds = create_items_table_with_column(:number, FalseClass)
|
|
115
|
-
ds.insert(:number => true)
|
|
116
|
-
ds.all.must_equal [{:number=>true}]
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
cspecify "should support generic boolean type with defaults", [:jdbc, :sqlite], [:jdbc, :db2], :oracle do
|
|
120
|
-
ds = create_items_table_with_column(:number, TrueClass, :default=>true)
|
|
121
|
-
ds.insert
|
|
122
|
-
ds.all.must_equal [{:number=>true}]
|
|
123
|
-
ds = create_items_table_with_column(:number, FalseClass, :default=>false)
|
|
124
|
-
ds.insert
|
|
125
|
-
ds.all.must_equal [{:number=>false}]
|
|
126
|
-
end
|
|
127
|
-
end
|
|
@@ -1,803 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Sequel::Model::Associations::AssociationReflection, "#associated_class" do
|
|
4
|
-
before do
|
|
5
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
6
|
-
class ::ParParent < Sequel::Model; end
|
|
7
|
-
end
|
|
8
|
-
after do
|
|
9
|
-
Object.send(:remove_const, :ParParent)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "should use the :class value if present" do
|
|
13
|
-
@c.many_to_one :c, :class=>ParParent
|
|
14
|
-
@c.association_reflection(:c).keys.must_include(:class)
|
|
15
|
-
@c.association_reflection(:c).associated_class.must_equal ParParent
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should use the :class value if present" do
|
|
19
|
-
@c.many_to_one :c, :class=>@c
|
|
20
|
-
@c.one_to_many :cs, :class=>@c
|
|
21
|
-
c = @c.association_reflection(:c)
|
|
22
|
-
cs = @c.association_reflection(:cs)
|
|
23
|
-
|
|
24
|
-
c.association_method.must_equal :c
|
|
25
|
-
c.dataset_method.must_equal :c_dataset
|
|
26
|
-
c.setter_method.must_equal :c=
|
|
27
|
-
c._setter_method.must_equal :_c=
|
|
28
|
-
|
|
29
|
-
cs.association_method.must_equal :cs
|
|
30
|
-
cs.dataset_method.must_equal :cs_dataset
|
|
31
|
-
cs.add_method.must_equal :add_c
|
|
32
|
-
cs._add_method.must_equal :_add_c
|
|
33
|
-
cs.remove_method.must_equal :remove_c
|
|
34
|
-
cs._remove_method.must_equal :_remove_c
|
|
35
|
-
cs.remove_all_method.must_equal :remove_all_cs
|
|
36
|
-
cs._remove_all_method.must_equal :_remove_all_cs
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should have inspect include association class and representation of association definition " do
|
|
40
|
-
ParParent.many_to_one :c
|
|
41
|
-
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c>"
|
|
42
|
-
ParParent.many_to_one :c, :class=>ParParent
|
|
43
|
-
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :class=>ParParent>"
|
|
44
|
-
ParParent.many_to_one :c, :class=>ParParent, :key=>:c_id
|
|
45
|
-
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :key=>:c_id, :class=>ParParent>"
|
|
46
|
-
|
|
47
|
-
@c.one_to_many :foos do |ds| ds end
|
|
48
|
-
@c.association_reflection(:foos).inspect.must_equal "#<Sequel::Model::Associations::OneToManyAssociationReflection #{@c.to_s}.one_to_many :foos, :block=>#{@c.association_reflection(:foos)[:block].inspect}>"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "should figure out the class if the :class value is not present" do
|
|
52
|
-
@c.many_to_one :c, :class=>'ParParent'
|
|
53
|
-
@c.association_reflection(:c).keys.wont_include(:class)
|
|
54
|
-
@c.association_reflection(:c).associated_class.must_equal ParParent
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should respect :class_namespace option for specifying the namespace" do
|
|
58
|
-
class ::ParParent
|
|
59
|
-
class ParParent < Sequel::Model; end
|
|
60
|
-
end
|
|
61
|
-
ParParent.many_to_one :par_parent, :class=>'ParParent'
|
|
62
|
-
ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent
|
|
63
|
-
ParParent.many_to_one :par_parent, :class=>'ParParent', :class_namespace=>'ParParent'
|
|
64
|
-
ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent::ParParent
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "should include association inspect output if an exception would be raised" do
|
|
68
|
-
r = @c.many_to_one(:c)
|
|
69
|
-
|
|
70
|
-
begin
|
|
71
|
-
r.associated_class
|
|
72
|
-
rescue NameError => e
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
e.message.must_include r.inspect
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
describe Sequel::Model::Associations::AssociationReflection, "#primary_key" do
|
|
80
|
-
before do
|
|
81
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
82
|
-
class ::ParParent < Sequel::Model; end
|
|
83
|
-
end
|
|
84
|
-
after do
|
|
85
|
-
Object.send(:remove_const, :ParParent)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should use the :primary_key value if present" do
|
|
89
|
-
@c.many_to_one :c, :class=>ParParent, :primary_key=>:blah__blah
|
|
90
|
-
@c.association_reflection(:c).keys.must_include(:primary_key)
|
|
91
|
-
@c.association_reflection(:c).primary_key.must_equal :blah__blah
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
it "should use the associated table's primary key if :primary_key is not present" do
|
|
95
|
-
@c.many_to_one :c, :class=>'ParParent'
|
|
96
|
-
@c.association_reflection(:c).keys.wont_include(:primary_key)
|
|
97
|
-
@c.association_reflection(:c).primary_key.must_equal :id
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
describe Sequel::Model::Associations::AssociationReflection, "#reciprocal_type" do
|
|
102
|
-
it "should include a specific type if only one matches" do
|
|
103
|
-
c = Class.new(Sequel::Model(:a))
|
|
104
|
-
c.one_to_many :cs, :class=>c, :key=>:c_id
|
|
105
|
-
c.many_to_one :c, :class=>c, :key=>:c_id
|
|
106
|
-
c.association_reflection(:c).send(:reciprocal_type).must_equal :one_to_many
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
|
|
111
|
-
before do
|
|
112
|
-
class ::ParParent < Sequel::Model; end
|
|
113
|
-
class ::ParParentTwo < Sequel::Model; end
|
|
114
|
-
class ::ParParentThree < Sequel::Model; end
|
|
115
|
-
end
|
|
116
|
-
after do
|
|
117
|
-
Object.send(:remove_const, :ParParent)
|
|
118
|
-
Object.send(:remove_const, :ParParentTwo)
|
|
119
|
-
Object.send(:remove_const, :ParParentThree)
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "should use the :reciprocal value if present" do
|
|
123
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
124
|
-
@d = Class.new(Sequel::Model(:foo))
|
|
125
|
-
@c.many_to_one :c, :class=>@d, :reciprocal=>:xx
|
|
126
|
-
@c.association_reflection(:c).keys.must_include(:reciprocal)
|
|
127
|
-
@c.association_reflection(:c).reciprocal.must_equal :xx
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
it "should not raise an error if some reciprocal associations have invalid associated classes" do
|
|
131
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
132
|
-
@c.one_to_many :sadfakloasdfioas
|
|
133
|
-
@c.many_to_one :c, :class=>@c
|
|
134
|
-
@c.association_reflection(:c).reciprocal
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "should require the associated class is the current class to be a reciprocal" do
|
|
138
|
-
ParParent.many_to_one :par_parent_two, :key=>:blah
|
|
139
|
-
ParParent.many_to_one :par_parent_three, :key=>:blah
|
|
140
|
-
ParParentTwo.one_to_many :par_parents, :key=>:blah
|
|
141
|
-
ParParentThree.one_to_many :par_parents, :key=>:blah
|
|
142
|
-
|
|
143
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
|
|
144
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
|
|
145
|
-
|
|
146
|
-
ParParent.many_to_many :par_parent_twos, :left_key=>:l, :right_key=>:r, :join_table=>:jt
|
|
147
|
-
ParParent.many_to_many :par_parent_threes, :left_key=>:l, :right_key=>:r, :join_table=>:jt
|
|
148
|
-
ParParentTwo.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
|
|
149
|
-
ParParentThree.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
|
|
150
|
-
|
|
151
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
|
|
152
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it "should handle composite keys" do
|
|
156
|
-
ParParent.many_to_one :par_parent_two, :key=>[:a, :b], :primary_key=>[:c, :b]
|
|
157
|
-
ParParent.many_to_one :par_parent_three, :key=>[:d, :e], :primary_key=>[:c, :b]
|
|
158
|
-
ParParentTwo.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:a, :b]
|
|
159
|
-
ParParentThree.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:d, :e]
|
|
160
|
-
|
|
161
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
|
|
162
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
|
|
163
|
-
|
|
164
|
-
ParParent.many_to_many :par_parent_twos, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
|
|
165
|
-
ParParent.many_to_many :par_parent_threes, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
|
|
166
|
-
ParParentTwo.many_to_many :par_parents, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
|
|
167
|
-
ParParentThree.many_to_many :par_parents, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
|
|
168
|
-
|
|
169
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
|
|
170
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should figure out the reciprocal if the :reciprocal value is not present" do
|
|
174
|
-
ParParent.many_to_one :par_parent_two
|
|
175
|
-
ParParentTwo.one_to_many :par_parents
|
|
176
|
-
ParParent.many_to_many :par_parent_threes
|
|
177
|
-
ParParentThree.many_to_many :par_parents
|
|
178
|
-
|
|
179
|
-
ParParent.association_reflection(:par_parent_two).keys.wont_include(:reciprocal)
|
|
180
|
-
ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
|
|
181
|
-
ParParentTwo.association_reflection(:par_parents).keys.wont_include(:reciprocal)
|
|
182
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
|
|
183
|
-
ParParent.association_reflection(:par_parent_threes).keys.wont_include(:reciprocal)
|
|
184
|
-
ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
|
|
185
|
-
ParParentThree.association_reflection(:par_parents).keys.wont_include(:reciprocal)
|
|
186
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
it "should handle ambiguous reciprocals where only one doesn't have conditions/blocks" do
|
|
190
|
-
ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
|
|
191
|
-
ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :conditions=>{:id=>:id}
|
|
192
|
-
ParParentTwo.one_to_many :par_parents
|
|
193
|
-
ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
|
|
194
|
-
ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes do |ds|
|
|
195
|
-
ds
|
|
196
|
-
end
|
|
197
|
-
ParParentThree.many_to_many :par_parents
|
|
198
|
-
|
|
199
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
|
|
200
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
it "should handle ambiguous reciprocals where only one has matching primary keys" do
|
|
204
|
-
ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
|
|
205
|
-
ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :primary_key=>:foo
|
|
206
|
-
ParParentTwo.one_to_many :par_parents, :class=>ParParent, :key=>:par_parent_two_id
|
|
207
|
-
ParParentTwo.one_to_many :par_parents2, :clone=>:par_parents, :primary_key=>:foo
|
|
208
|
-
ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
|
|
209
|
-
ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes, :right_primary_key=>:foo
|
|
210
|
-
ParParent.many_to_many :par_parent_threes3, :clone=>:par_parent_threes, :left_primary_key=>:foo
|
|
211
|
-
ParParentThree.many_to_many :par_parents
|
|
212
|
-
|
|
213
|
-
ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
|
|
214
|
-
ParParent.association_reflection(:par_parent_two2).reciprocal.must_equal :par_parents2
|
|
215
|
-
ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
|
|
216
|
-
ParParentTwo.association_reflection(:par_parents2).reciprocal.must_equal :par_parent_two2
|
|
217
|
-
ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
it "should handle reciprocals where current association has conditions/block" do
|
|
221
|
-
ParParent.many_to_one :par_parent_two, :conditions=>{:id=>:id}
|
|
222
|
-
ParParentTwo.one_to_many :par_parents
|
|
223
|
-
ParParent.many_to_many :par_parent_threes do |ds|
|
|
224
|
-
ds
|
|
225
|
-
end
|
|
226
|
-
ParParentThree.many_to_many :par_parents
|
|
227
|
-
|
|
228
|
-
ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
|
|
229
|
-
ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
describe Sequel::Model::Associations::AssociationReflection, "#select" do
|
|
234
|
-
before do
|
|
235
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
236
|
-
class ::ParParent < Sequel::Model; end
|
|
237
|
-
end
|
|
238
|
-
after do
|
|
239
|
-
Object.send(:remove_const, :ParParent)
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
it "should use the :select value if present" do
|
|
243
|
-
@c.many_to_one :c, :class=>ParParent, :select=>[:par_parents__id]
|
|
244
|
-
@c.association_reflection(:c).keys.must_include(:select)
|
|
245
|
-
@c.association_reflection(:c).select.must_equal [:par_parents__id]
|
|
246
|
-
end
|
|
247
|
-
it "should be the associated_table.* if :select is not present for a many_to_many associaiton" do
|
|
248
|
-
@c.many_to_many :cs, :class=>'ParParent'
|
|
249
|
-
@c.association_reflection(:cs).keys.wont_include(:select)
|
|
250
|
-
@c.association_reflection(:cs).select.must_equal Sequel::SQL::ColumnAll.new(:par_parents)
|
|
251
|
-
end
|
|
252
|
-
it "should be blank if :select is not present for a many_to_one and one_to_many associaiton" do
|
|
253
|
-
@c.one_to_many :cs, :class=>'ParParent'
|
|
254
|
-
@c.association_reflection(:cs).keys.wont_include(:select)
|
|
255
|
-
@c.association_reflection(:cs).select.must_be_nil
|
|
256
|
-
@c.many_to_one :c, :class=>'ParParent'
|
|
257
|
-
@c.association_reflection(:c).keys.wont_include(:select)
|
|
258
|
-
@c.association_reflection(:c).select.must_be_nil
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
describe Sequel::Model::Associations::AssociationReflection, "#can_have_associated_objects?" do
|
|
263
|
-
it "should be true for any given object (for backward compatibility)" do
|
|
264
|
-
Sequel::Model::Associations::AssociationReflection.new.can_have_associated_objects?(Object.new).must_equal true
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
describe Sequel::Model::Associations::AssociationReflection, "#associated_object_keys" do
|
|
269
|
-
before do
|
|
270
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
271
|
-
class ::ParParent < Sequel::Model; end
|
|
272
|
-
end
|
|
273
|
-
after do
|
|
274
|
-
Object.send(:remove_const, :ParParent)
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
it "should use the primary keys for a many_to_one association" do
|
|
278
|
-
@c.many_to_one :c, :class=>ParParent
|
|
279
|
-
@c.association_reflection(:c).associated_object_keys.must_equal [:id]
|
|
280
|
-
@c.many_to_one :c, :class=>ParParent, :primary_key=>:d_id
|
|
281
|
-
@c.association_reflection(:c).associated_object_keys.must_equal [:d_id]
|
|
282
|
-
@c.many_to_one :c, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
|
|
283
|
-
@c.association_reflection(:c).associated_object_keys.must_equal [:id1, :id2]
|
|
284
|
-
end
|
|
285
|
-
it "should use the keys for a one_to_many association" do
|
|
286
|
-
ParParent.one_to_many :cs, :class=>ParParent
|
|
287
|
-
ParParent.association_reflection(:cs).associated_object_keys.must_equal [:par_parent_id]
|
|
288
|
-
@c.one_to_many :cs, :class=>ParParent, :key=>:d_id
|
|
289
|
-
@c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
|
|
290
|
-
@c.one_to_many :cs, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
|
|
291
|
-
@c.association_reflection(:cs).associated_object_keys.must_equal [:c_id1, :c_id2]
|
|
292
|
-
end
|
|
293
|
-
it "should use the right primary keys for a many_to_many association" do
|
|
294
|
-
@c.many_to_many :cs, :class=>ParParent
|
|
295
|
-
@c.association_reflection(:cs).associated_object_keys.must_equal [:id]
|
|
296
|
-
@c.many_to_many :cs, :class=>ParParent, :right_primary_key=>:d_id
|
|
297
|
-
@c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
|
|
298
|
-
@c.many_to_many :cs, :class=>ParParent, :right_key=>[:c_id1, :c_id2], :right_primary_key=>[:id1, :id2]
|
|
299
|
-
@c.association_reflection(:cs).associated_object_keys.must_equal [:id1, :id2]
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
describe Sequel::Model::Associations::AssociationReflection do
|
|
304
|
-
before do
|
|
305
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
306
|
-
def @c.name() "C" end
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
it "one_to_many #qualified_primary_key should be a qualified version of the primary key" do
|
|
310
|
-
@c.one_to_many :cs, :class=>@c
|
|
311
|
-
@c.dataset.literal(@c.association_reflection(:cs).qualified_primary_key).must_equal 'foo.id'
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
it "many_to_many #associated_key_column should be the left key" do
|
|
315
|
-
@c.many_to_many :cs, :class=>@c
|
|
316
|
-
@c.association_reflection(:cs).associated_key_column.must_equal :c_id
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it "many_to_many #qualified_right_key should be a qualified version of the primary key" do
|
|
320
|
-
@c.many_to_many :cs, :class=>@c, :right_key=>:c2_id
|
|
321
|
-
@c.dataset.literal(@c.association_reflection(:cs).qualified_right_key).must_equal 'cs_cs.c2_id'
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
it "many_to_many #qualified_right_primary_key should be a qualified version of the primary key" do
|
|
325
|
-
@c.many_to_many :cs, :class=>@c
|
|
326
|
-
@c.dataset.literal(@c.association_reflection(:cs).qualified_right_primary_key).must_equal 'foo.id'
|
|
327
|
-
end
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
describe Sequel::Model::Associations::AssociationReflection, "#remove_before_destroy?" do
|
|
331
|
-
before do
|
|
332
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
it "should be true for many_to_one and many_to_many associations" do
|
|
336
|
-
@c.many_to_one :c, :class=>@c
|
|
337
|
-
@c.association_reflection(:c).remove_before_destroy?.must_equal true
|
|
338
|
-
@c.many_to_many :cs, :class=>@c
|
|
339
|
-
@c.association_reflection(:cs).remove_before_destroy?.must_equal true
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
it "should be false for one_to_one and one_to_many associations" do
|
|
343
|
-
@c.one_to_one :c, :class=>@c
|
|
344
|
-
@c.association_reflection(:c).remove_before_destroy?.must_equal false
|
|
345
|
-
@c.one_to_many :cs, :class=>@c
|
|
346
|
-
@c.association_reflection(:cs).remove_before_destroy?.must_equal false
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associations_limit_strategy" do
|
|
351
|
-
before do
|
|
352
|
-
@db = Sequel.mock
|
|
353
|
-
@c = Class.new(Sequel::Model(@db[:a]))
|
|
354
|
-
end
|
|
355
|
-
after do
|
|
356
|
-
Sequel::Model.default_eager_limit_strategy = true
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
it "should be nil by default for *_one associations" do
|
|
360
|
-
@c.many_to_one :c, :class=>@c
|
|
361
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
362
|
-
@c.one_to_one :c, :class=>@c
|
|
363
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
364
|
-
@c.one_through_one :c, :class=>@c
|
|
365
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
it "should be :correlated_subquery by default for one_to_many and one_to_one with :order associations" do
|
|
369
|
-
@c.one_to_one :c, :class=>@c, :order=>:a
|
|
370
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
|
|
371
|
-
@c.one_to_many :cs, :class=>@c, :limit=>1
|
|
372
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
it "should be :ruby by default for many_to_many and one_through_one with :order associations" do
|
|
376
|
-
@c.one_through_one :c, :class=>@c, :order=>:a
|
|
377
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
378
|
-
@c.many_to_many :cs, :class=>@c, :limit=>1
|
|
379
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
380
|
-
end
|
|
381
|
-
|
|
382
|
-
it "should be nil for many_to_one associations even if :eager_limit_strategy or :filter_limit_strategy is used" do
|
|
383
|
-
@c.many_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
|
384
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
385
|
-
@c.many_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
|
|
386
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
387
|
-
@c.many_to_one :c, :class=>@c, :filter_limit_strategy=>true
|
|
388
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
389
|
-
end
|
|
390
|
-
|
|
391
|
-
it "should be a symbol for other associations if given a symbol" do
|
|
392
|
-
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
|
|
393
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
|
|
394
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>:window_function, :limit=>1
|
|
395
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
|
|
399
|
-
@c.dataset = @c.dataset.with_extend{def supports_ordered_distinct_on?; true end}
|
|
400
|
-
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
|
401
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
it "should use :window_function for associations if picking and the association dataset supports window functions" do
|
|
405
|
-
@c.dataset = @c.dataset.with_extend{def supports_window_functions?; true end}
|
|
406
|
-
@c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
|
|
407
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
408
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
|
409
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
410
|
-
@c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
|
411
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
412
|
-
end
|
|
413
|
-
|
|
414
|
-
it "should use :ruby for one_to_many associations if the database doesn't support limits in subqueries" do
|
|
415
|
-
@c.dataset = @c.dataset.with_extend{def supports_limits_in_correlated_subqueries?; false end}
|
|
416
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
|
417
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
it "should use :ruby for one_to_many associations if offset doesn't work in correlated subqueries and an offset is used" do
|
|
421
|
-
@c.dataset = @c.dataset.with_extend{def supports_offsets_in_correlated_subqueries?; false end}
|
|
422
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
|
423
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
|
|
424
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>[1, 1]
|
|
425
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
it "should use :ruby for one_to_many associations if composite primary key is used and database does not support multiple columns in IN" do
|
|
429
|
-
@c.dataset = @c.dataset.with_extend{def supports_multiple_column_in?; false end}
|
|
430
|
-
@c.set_primary_key [:id, :id2]
|
|
431
|
-
@c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1, :key=>[:id, :id2]
|
|
432
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
433
|
-
end
|
|
434
|
-
|
|
435
|
-
it "should use :ruby for many_to_many associations if picking and the association dataset doesn't window functions" do
|
|
436
|
-
@c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
|
|
437
|
-
@c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
|
|
438
|
-
end
|
|
439
|
-
|
|
440
|
-
it "should respect Model.default_eager_limit_strategy to *_many associations" do
|
|
441
|
-
Sequel::Model.default_eager_limit_strategy = :window_function
|
|
442
|
-
Sequel::Model.default_eager_limit_strategy.must_equal :window_function
|
|
443
|
-
c = Class.new(Sequel::Model)
|
|
444
|
-
c.dataset = :a
|
|
445
|
-
c.default_eager_limit_strategy.must_equal :window_function
|
|
446
|
-
c.one_to_many :cs, :class=>c, :limit=>1
|
|
447
|
-
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
448
|
-
c.many_to_many :cs, :class=>c, :limit=>1
|
|
449
|
-
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
450
|
-
|
|
451
|
-
Sequel::Model.default_eager_limit_strategy = true
|
|
452
|
-
c = Class.new(Sequel::Model)
|
|
453
|
-
c.dataset = :a
|
|
454
|
-
c.one_to_many :cs, :class=>c, :limit=>1
|
|
455
|
-
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
|
|
456
|
-
c.dataset = c.dataset.with_extend{def supports_window_functions?; true end}
|
|
457
|
-
c.many_to_many :cs, :class=>c, :limit=>1
|
|
458
|
-
c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
|
|
459
|
-
end
|
|
460
|
-
|
|
461
|
-
it "should ignore Model.default_eager_limit_strategy for one_to_one associations" do
|
|
462
|
-
@c.default_eager_limit_strategy = :window_function
|
|
463
|
-
@c.one_to_one :c, :class=>@c
|
|
464
|
-
@c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
|
|
465
|
-
end
|
|
466
|
-
end
|
|
467
|
-
|
|
468
|
-
describe Sequel::Model::Associations::AssociationReflection, "#apply_eager_dataset_changes" do
|
|
469
|
-
it "should apply the eager block as well as the association options to the dataset" do
|
|
470
|
-
@c = Class.new(Sequel::Model(:foo))
|
|
471
|
-
@c.one_to_many :cs, :class=>@c, :select=>:a, :order=>:b do |ds| ds.where(:c) end
|
|
472
|
-
@c.association_reflection(:cs).apply_eager_dataset_changes(@c.dataset).sql.must_equal 'SELECT a FROM foo WHERE c ORDER BY b'
|
|
473
|
-
end
|
|
474
|
-
end
|
|
475
|
-
|
|
476
|
-
describe Sequel::Model, " association reflection methods" do
|
|
477
|
-
before do
|
|
478
|
-
@c1 = Class.new(Sequel::Model(:nodes)) do
|
|
479
|
-
def self.name; 'Node'; end
|
|
480
|
-
def self.to_s; 'Node'; end
|
|
481
|
-
end
|
|
482
|
-
DB.reset
|
|
483
|
-
end
|
|
484
|
-
|
|
485
|
-
it "#all_association_reflections should include all association reflection hashes" do
|
|
486
|
-
@c1.all_association_reflections.must_equal []
|
|
487
|
-
|
|
488
|
-
@c1.associate :many_to_one, :parent, :class => @c1
|
|
489
|
-
@c1.all_association_reflections.collect{|v| v[:name]}.must_equal [:parent]
|
|
490
|
-
@c1.all_association_reflections.collect{|v| v[:type]}.must_equal [:many_to_one]
|
|
491
|
-
@c1.all_association_reflections.collect{|v| v[:class]}.must_equal [@c1]
|
|
492
|
-
|
|
493
|
-
@c1.associate :one_to_many, :children, :class => @c1
|
|
494
|
-
@c1.all_association_reflections.sort_by{|x|x[:name].to_s}
|
|
495
|
-
@c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:name]}.must_equal [:children, :parent]
|
|
496
|
-
@c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:type]}.must_equal [:one_to_many, :many_to_one]
|
|
497
|
-
@c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:class]}.must_equal [@c1, @c1]
|
|
498
|
-
end
|
|
499
|
-
|
|
500
|
-
it "#association_reflection should return nil for nonexistent association" do
|
|
501
|
-
@c1.association_reflection(:blah).must_be_nil
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
it "#association_reflection should return association reflection hash if association exists" do
|
|
505
|
-
@c1.associate :many_to_one, :parent, :class => @c1
|
|
506
|
-
@c1.association_reflection(:parent).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
|
|
507
|
-
@c1.association_reflection(:parent)[:name].must_equal :parent
|
|
508
|
-
@c1.association_reflection(:parent)[:type].must_equal :many_to_one
|
|
509
|
-
@c1.association_reflection(:parent)[:class].must_equal @c1
|
|
510
|
-
|
|
511
|
-
@c1.associate :one_to_many, :children, :class => @c1
|
|
512
|
-
@c1.association_reflection(:children).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
|
|
513
|
-
@c1.association_reflection(:children)[:name].must_equal :children
|
|
514
|
-
@c1.association_reflection(:children)[:type].must_equal :one_to_many
|
|
515
|
-
@c1.association_reflection(:children)[:class].must_equal @c1
|
|
516
|
-
end
|
|
517
|
-
|
|
518
|
-
it "#associations should include all association names" do
|
|
519
|
-
@c1.associations.must_equal []
|
|
520
|
-
@c1.associate :many_to_one, :parent, :class => @c1
|
|
521
|
-
@c1.associations.must_equal [:parent]
|
|
522
|
-
@c1.associate :one_to_many, :children, :class => @c1
|
|
523
|
-
@c1.associations.sort_by{|x|x.to_s}.must_equal [:children, :parent]
|
|
524
|
-
end
|
|
525
|
-
|
|
526
|
-
it "association reflections should be copied upon subclasing" do
|
|
527
|
-
@c1.associate :many_to_one, :parent, :class => @c1
|
|
528
|
-
c = Class.new(@c1)
|
|
529
|
-
@c1.associations.must_equal [:parent]
|
|
530
|
-
c.associations.must_equal [:parent]
|
|
531
|
-
c.associate :many_to_one, :parent2, :class => @c1
|
|
532
|
-
@c1.associations.must_equal [:parent]
|
|
533
|
-
c.associations.sort_by{|x| x.to_s}.must_equal [:parent, :parent2]
|
|
534
|
-
c.instance_methods.must_include(:parent)
|
|
535
|
-
end
|
|
536
|
-
end
|
|
537
|
-
|
|
538
|
-
describe Sequel::Model::Associations::AssociationReflection, "with caching disabled" do
|
|
539
|
-
before do
|
|
540
|
-
@db = Sequel.mock
|
|
541
|
-
@c = Class.new(Sequel::Model)
|
|
542
|
-
@c.dataset = @db[:foo]
|
|
543
|
-
@c.cache_associations = false
|
|
544
|
-
end
|
|
545
|
-
|
|
546
|
-
it "should not cache metadata" do
|
|
547
|
-
begin
|
|
548
|
-
class ::ParParent < Sequel::Model; end
|
|
549
|
-
c = ParParent
|
|
550
|
-
@c.many_to_one :c, :class=>:ParParent
|
|
551
|
-
@c.association_reflection(:c).associated_class.must_equal c
|
|
552
|
-
Object.send(:remove_const, :ParParent)
|
|
553
|
-
class ::ParParent < Sequel::Model; end
|
|
554
|
-
c = ParParent
|
|
555
|
-
@c.association_reflection(:c).associated_class.must_equal c
|
|
556
|
-
ensure
|
|
557
|
-
Object.send(:remove_const, :ParParent)
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
|
|
561
|
-
it "should not used cached schema" do
|
|
562
|
-
def @db.supports_schema_parsing?; true end
|
|
563
|
-
def @db.schema(table, opts={})
|
|
564
|
-
[[opts[:reload] ? :reload : :id, {}]]
|
|
565
|
-
end
|
|
566
|
-
@c.dataset = @db[:items]
|
|
567
|
-
@c.columns.must_equal [:reload]
|
|
568
|
-
|
|
569
|
-
@c.cache_associations = true
|
|
570
|
-
@c.dataset = @db[:items]
|
|
571
|
-
@c.columns.must_equal [:id]
|
|
572
|
-
end
|
|
573
|
-
end
|
|
574
|
-
|
|
575
|
-
describe Sequel::Model::Associations::AssociationReflection, "with default association options" do
|
|
576
|
-
before do
|
|
577
|
-
@db = Sequel.mock
|
|
578
|
-
@c = Class.new(Sequel::Model)
|
|
579
|
-
@c.dataset = @db[:foo]
|
|
580
|
-
end
|
|
581
|
-
|
|
582
|
-
it "should use default_association_options as defaults" do
|
|
583
|
-
@c.default_association_options = {:foo=>1, :bar=>2}
|
|
584
|
-
@c.many_to_one :c, :class=>@c, :foo=>3
|
|
585
|
-
r = @c.association_reflection(:c)
|
|
586
|
-
r[:foo].must_equal 3
|
|
587
|
-
r[:bar].must_equal 2
|
|
588
|
-
end
|
|
589
|
-
|
|
590
|
-
it "should inherit default_association_options" do
|
|
591
|
-
@c.default_association_options = {:foo=>1, :bar=>2}
|
|
592
|
-
c = Class.new(@c)
|
|
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
|
-
|
|
598
|
-
@c.default_association_options[:bar] = 4
|
|
599
|
-
c.many_to_one :d, :class=>c, :foo=>3
|
|
600
|
-
r = c.association_reflection(:d)
|
|
601
|
-
r[:foo].must_equal 3
|
|
602
|
-
r[:bar].must_equal 2
|
|
603
|
-
end
|
|
604
|
-
|
|
605
|
-
it "should have default_association_type_options take precedence over default_association_options" do
|
|
606
|
-
@c.default_association_options = {:foo=>2, :bar=>3}
|
|
607
|
-
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
|
608
|
-
@c.many_to_one :c, :class=>@c, :foo=>3
|
|
609
|
-
r = @c.association_reflection(:c)
|
|
610
|
-
r[:foo].must_equal 3
|
|
611
|
-
r[:bar].must_equal 2
|
|
612
|
-
end
|
|
613
|
-
|
|
614
|
-
it "should use default_association_type_options as defaults" do
|
|
615
|
-
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
|
616
|
-
@c.many_to_one :c, :class=>@c, :foo=>3
|
|
617
|
-
r = @c.association_reflection(:c)
|
|
618
|
-
r[:foo].must_equal 3
|
|
619
|
-
r[:bar].must_equal 2
|
|
620
|
-
|
|
621
|
-
@c.one_to_many :cs, :class=>@c, :foo=>3
|
|
622
|
-
r = @c.association_reflection(:cs)
|
|
623
|
-
r[:foo].must_equal 3
|
|
624
|
-
r[:bar].must_be_nil
|
|
625
|
-
end
|
|
626
|
-
|
|
627
|
-
it "should inherit default_association_type_options" do
|
|
628
|
-
@c.default_association_type_options[:many_to_one] = {:foo=>1, :bar=>2}
|
|
629
|
-
c = Class.new(@c)
|
|
630
|
-
c.many_to_one :c, :class=>c, :foo=>3
|
|
631
|
-
r = c.association_reflection(:c)
|
|
632
|
-
r[:foo].must_equal 3
|
|
633
|
-
r[:bar].must_equal 2
|
|
634
|
-
|
|
635
|
-
@c.default_association_type_options[:many_to_one][:bar] = 4
|
|
636
|
-
c.many_to_one :d, :class=>c, :foo=>3
|
|
637
|
-
r = c.association_reflection(:d)
|
|
638
|
-
r[:foo].must_equal 3
|
|
639
|
-
r[:bar].must_equal 2
|
|
640
|
-
|
|
641
|
-
c.one_to_many :ds, :class=>c, :foo=>3
|
|
642
|
-
r = c.association_reflection(:ds)
|
|
643
|
-
r[:foo].must_equal 3
|
|
644
|
-
r[:bar].must_be_nil
|
|
645
|
-
end
|
|
646
|
-
end
|
|
647
|
-
|
|
648
|
-
describe "Sequel::Model.freeze" do
|
|
649
|
-
it "should freeze the model class and not allow any changes to associations" do
|
|
650
|
-
model = Class.new(Sequel::Model(:items))
|
|
651
|
-
model.many_to_one :foo, :class=>model, :key=>:id
|
|
652
|
-
model.default_association_options = {:read_only=>true}
|
|
653
|
-
model.freeze
|
|
654
|
-
|
|
655
|
-
model.association_reflections.frozen?.must_equal true
|
|
656
|
-
model.association_reflection(:foo).frozen?.must_equal true
|
|
657
|
-
model.autoreloading_associations.frozen?.must_equal true
|
|
658
|
-
model.autoreloading_associations[:id].frozen?.must_equal true
|
|
659
|
-
model.default_association_options.frozen?.must_equal true
|
|
660
|
-
end
|
|
661
|
-
|
|
662
|
-
it "should allow subclasses of frozen model classes to modify associations" do
|
|
663
|
-
model = Class.new(Sequel::Model(:items))
|
|
664
|
-
model.many_to_one :foo, :class=>model, :key=>:id
|
|
665
|
-
model.freeze
|
|
666
|
-
model = Class.new(model)
|
|
667
|
-
model.dataset = :items2
|
|
668
|
-
|
|
669
|
-
model.association_reflection(:foo).frozen?.must_equal true
|
|
670
|
-
model.autoreloading_associations.frozen?.must_equal false
|
|
671
|
-
model.autoreloading_associations[:id].frozen?.must_equal false
|
|
672
|
-
|
|
673
|
-
model.many_to_one :bar, :class=>model, :key=>:id
|
|
674
|
-
model.many_to_one :foo, :class=>model, :key=>:id
|
|
675
|
-
model.association_reflections.frozen?.must_equal false
|
|
676
|
-
model.association_reflection(:foo).frozen?.must_equal false
|
|
677
|
-
model.association_reflection(:bar).frozen?.must_equal false
|
|
678
|
-
|
|
679
|
-
model.default_association_options.frozen?.wont_equal true
|
|
680
|
-
model.default_association_options = {:read_only=>true}
|
|
681
|
-
model.default_association_options.frozen?.wont_equal true
|
|
682
|
-
end
|
|
683
|
-
end
|
|
684
|
-
|
|
685
|
-
describe "Sequel::Model.finalize_associations" do
|
|
686
|
-
before do
|
|
687
|
-
class ::MtmItem < Sequel::Model
|
|
688
|
-
set_primary_key :mtm_id
|
|
689
|
-
many_to_many :items
|
|
690
|
-
many_to_one :item
|
|
691
|
-
end
|
|
692
|
-
class ::OtoItem < Sequel::Model
|
|
693
|
-
set_primary_key :oto_id
|
|
694
|
-
end
|
|
695
|
-
class ::Item < Sequel::Model
|
|
696
|
-
many_to_one :item
|
|
697
|
-
one_to_many :items, :limit=>10
|
|
698
|
-
one_to_one :mtm_item
|
|
699
|
-
many_to_many :mtm_items
|
|
700
|
-
one_through_one :oto_item
|
|
701
|
-
end
|
|
702
|
-
[MtmItem, OtoItem, Item].each(&:finalize_associations)
|
|
703
|
-
end
|
|
704
|
-
after do
|
|
705
|
-
Object.send(:remove_const, :Item)
|
|
706
|
-
Object.send(:remove_const, :MtmItem)
|
|
707
|
-
Object.send(:remove_const, :OtoItem)
|
|
708
|
-
end
|
|
709
|
-
|
|
710
|
-
it "AssociationReflection should have default finalize_settings method" do
|
|
711
|
-
Sequel::Model::Associations::AssociationReflection.new.finalize_settings[:associated_class].must_equal :class
|
|
712
|
-
end
|
|
713
|
-
|
|
714
|
-
it "should finalize many_to_one associations" do
|
|
715
|
-
r = Item.association_reflection(:item)
|
|
716
|
-
r[:class].must_equal Item
|
|
717
|
-
r[:_dataset].sql.must_equal "SELECT * FROM items LIMIT 1"
|
|
718
|
-
r[:associated_eager_dataset].sql.must_equal "SELECT * FROM items"
|
|
719
|
-
r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items.id FROM items WHERE (items.id IS NOT NULL)"
|
|
720
|
-
r[:placeholder_loader].wont_be_nil
|
|
721
|
-
r[:predicate_key].must_equal Sequel.qualify(:items, :id)
|
|
722
|
-
r[:primary_key].must_equal :id
|
|
723
|
-
r[:primary_keys].must_equal [:id]
|
|
724
|
-
r[:primary_key_method].must_equal :id
|
|
725
|
-
r[:primary_key_methods].must_equal [:id]
|
|
726
|
-
r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
|
|
727
|
-
r.fetch(:reciprocal_type).must_equal :one_to_many
|
|
728
|
-
r.fetch(:reciprocal).must_equal :items
|
|
729
|
-
end
|
|
730
|
-
|
|
731
|
-
it "should finalize one_to_many associations" do
|
|
732
|
-
r = Item.association_reflection(:items)
|
|
733
|
-
r[:class].must_equal Item
|
|
734
|
-
r[:_dataset].sql.must_equal "SELECT * FROM items LIMIT 10"
|
|
735
|
-
r[:associated_eager_dataset].sql.must_equal "SELECT * FROM items"
|
|
736
|
-
r[:_eager_limit_strategy].must_equal :union
|
|
737
|
-
r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items.item_id FROM items WHERE ((items.item_id IS NOT NULL) AND (items.id IN (SELECT t1.id FROM items AS t1 WHERE (t1.item_id = items.item_id) LIMIT 10)))"
|
|
738
|
-
r[:placeholder_loader].wont_be_nil
|
|
739
|
-
r[:predicate_key].must_equal Sequel.qualify(:items, :item_id)
|
|
740
|
-
r[:predicate_keys].must_equal [Sequel.qualify(:items, :item_id)]
|
|
741
|
-
r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
|
|
742
|
-
r.fetch(:reciprocal).must_equal :item
|
|
743
|
-
end
|
|
744
|
-
|
|
745
|
-
it "should finalize one_to_one associations" do
|
|
746
|
-
r = Item.association_reflection(:mtm_item)
|
|
747
|
-
r[:class].must_equal MtmItem
|
|
748
|
-
r[:_dataset].sql.must_equal "SELECT * FROM mtm_items LIMIT 1"
|
|
749
|
-
r[:associated_eager_dataset].sql.must_equal "SELECT * FROM mtm_items"
|
|
750
|
-
r[:_eager_limit_strategy].must_be_nil
|
|
751
|
-
r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT mtm_items.item_id FROM mtm_items WHERE (mtm_items.item_id IS NOT NULL)"
|
|
752
|
-
r[:placeholder_loader].wont_be_nil
|
|
753
|
-
r[:predicate_key].must_equal Sequel.qualify(:mtm_items, :item_id)
|
|
754
|
-
r[:predicate_keys].must_equal [Sequel.qualify(:mtm_items, :item_id)]
|
|
755
|
-
r[:qualified_primary_key].must_equal Sequel.qualify(:items, :id)
|
|
756
|
-
r.fetch(:reciprocal).must_equal :item
|
|
757
|
-
end
|
|
758
|
-
|
|
759
|
-
it "should finalize many_to_many associations" do
|
|
760
|
-
r = Item.association_reflection(:mtm_items)
|
|
761
|
-
r[:class].must_equal MtmItem
|
|
762
|
-
r[:_dataset].sql.must_equal "SELECT mtm_items.* FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id)"
|
|
763
|
-
r[:associated_eager_dataset].sql.must_equal "SELECT mtm_items.* FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id)"
|
|
764
|
-
r[:_eager_limit_strategy].must_be_nil
|
|
765
|
-
r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items_mtm_items.item_id FROM mtm_items INNER JOIN items_mtm_items ON (items_mtm_items.mtm_item_id = mtm_items.mtm_id) WHERE (items_mtm_items.item_id IS NOT NULL)"
|
|
766
|
-
r[:placeholder_loader].wont_be_nil
|
|
767
|
-
r[:predicate_key].must_equal Sequel.qualify(:items_mtm_items, :item_id)
|
|
768
|
-
r[:predicate_keys].must_equal [Sequel.qualify(:items_mtm_items, :item_id)]
|
|
769
|
-
r.fetch(:reciprocal).must_equal :items
|
|
770
|
-
r[:associated_key_array].must_equal [Sequel.qualify(:items_mtm_items, :item_id).as(:x_foreign_key_x)]
|
|
771
|
-
r[:qualified_right_key].must_equal Sequel.qualify(:items_mtm_items, :mtm_item_id)
|
|
772
|
-
r[:join_table_source].must_equal :items_mtm_items
|
|
773
|
-
r[:join_table_alias].must_equal :items_mtm_items
|
|
774
|
-
r[:qualified_right_primary_key].must_equal Sequel.qualify(:mtm_items, :mtm_id)
|
|
775
|
-
r[:right_primary_key].must_equal :mtm_id
|
|
776
|
-
r[:right_primary_keys].must_equal [:mtm_id]
|
|
777
|
-
r[:right_primary_key_method].must_equal :mtm_id
|
|
778
|
-
r[:right_primary_key_methods].must_equal [:mtm_id]
|
|
779
|
-
r[:select].must_equal Sequel::SQL::ColumnAll.new(:mtm_items)
|
|
780
|
-
end
|
|
781
|
-
|
|
782
|
-
it "should finalize one_through_one associations" do
|
|
783
|
-
r = Item.association_reflection(:oto_item)
|
|
784
|
-
r[:class].must_equal OtoItem
|
|
785
|
-
r[:_dataset].sql.must_equal "SELECT oto_items.* FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id) LIMIT 1"
|
|
786
|
-
r[:associated_eager_dataset].sql.must_equal "SELECT oto_items.* FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id)"
|
|
787
|
-
r[:_eager_limit_strategy].must_be_nil
|
|
788
|
-
r[:filter_by_associations_conditions_dataset].sql.must_equal "SELECT items_oto_items.item_id FROM oto_items INNER JOIN items_oto_items ON (items_oto_items.oto_item_id = oto_items.oto_id) WHERE (items_oto_items.item_id IS NOT NULL)"
|
|
789
|
-
r[:placeholder_loader].wont_be_nil
|
|
790
|
-
r[:predicate_key].must_equal Sequel.qualify(:items_oto_items, :item_id)
|
|
791
|
-
r[:predicate_keys].must_equal [Sequel.qualify(:items_oto_items, :item_id)]
|
|
792
|
-
r[:associated_key_array].must_equal [Sequel.qualify(:items_oto_items, :item_id).as(:x_foreign_key_x)]
|
|
793
|
-
r[:qualified_right_key].must_equal Sequel.qualify(:items_oto_items, :oto_item_id)
|
|
794
|
-
r[:join_table_source].must_equal :items_oto_items
|
|
795
|
-
r[:join_table_alias].must_equal :items_oto_items
|
|
796
|
-
r[:qualified_right_primary_key].must_equal Sequel.qualify(:oto_items, :oto_id)
|
|
797
|
-
r[:right_primary_key].must_equal :oto_id
|
|
798
|
-
r[:right_primary_keys].must_equal [:oto_id]
|
|
799
|
-
r[:right_primary_key_method].must_equal :oto_id
|
|
800
|
-
r[:right_primary_key_methods].must_equal [:oto_id]
|
|
801
|
-
r[:select].must_equal Sequel::SQL::ColumnAll.new(:oto_items)
|
|
802
|
-
end
|
|
803
|
-
end
|