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,226 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Touch plugin" do
|
|
4
|
-
before do
|
|
5
|
-
@c = Class.new(Sequel::Model)
|
|
6
|
-
p = proc{def touch_instance_value; touch_association_value; end}
|
|
7
|
-
@Artist = Class.new(@c, &p).set_dataset(:artists)
|
|
8
|
-
@Album = Class.new(@c, &p).set_dataset(:albums)
|
|
9
|
-
|
|
10
|
-
@Artist.columns :id, :updated_at, :modified_on
|
|
11
|
-
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
12
|
-
|
|
13
|
-
@Album.columns :id, :updated_at, :modified_on, :artist_id, :original_album_id
|
|
14
|
-
@Album.one_to_many :followup_albums, :class=>@Album, :key=>:original_album_id
|
|
15
|
-
@Album.many_to_one :artist, :class=>@Artist
|
|
16
|
-
|
|
17
|
-
@a = @Artist.load(:id=>1)
|
|
18
|
-
DB.reset
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "should default to using Time.now when setting the column values for model instances" do
|
|
22
|
-
c = Class.new(Sequel::Model).set_dataset(:a)
|
|
23
|
-
c.plugin :touch
|
|
24
|
-
c.columns :id, :updated_at
|
|
25
|
-
c.load(:id=>1).touch
|
|
26
|
-
DB.sqls.first.must_match(/UPDATE a SET updated_at = '[-0-9 :.]+' WHERE \(id = 1\)/)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "should work with current_datetime_timestamp extension" do
|
|
30
|
-
c = Class.new(Sequel::Model).set_dataset(:a)
|
|
31
|
-
c.dataset = c.dataset.extension(:current_datetime_timestamp)
|
|
32
|
-
c.plugin :touch
|
|
33
|
-
c.columns :id, :updated_at
|
|
34
|
-
c.load(:id=>1).touch
|
|
35
|
-
DB.sqls.must_equal ["UPDATE a SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should allow #touch instance method for updating the updated_at column" do
|
|
39
|
-
@Artist.plugin :touch
|
|
40
|
-
@a.touch
|
|
41
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should have #touch take an argument for the column to touch" do
|
|
45
|
-
@Artist.plugin :touch
|
|
46
|
-
@a.touch(:modified_on)
|
|
47
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should be able to specify the default column to touch in the plugin call using the :column option" do
|
|
51
|
-
@Artist.plugin :touch, :column=>:modified_on
|
|
52
|
-
@a.touch
|
|
53
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "should be able to specify the default column to touch using the touch_column model accessor" do
|
|
57
|
-
@Artist.plugin :touch
|
|
58
|
-
@Artist.touch_column = :modified_on
|
|
59
|
-
@a.touch
|
|
60
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should be able to specify the associations to touch in the plugin call using the :associations option" do
|
|
64
|
-
@Artist.plugin :touch, :associations=>:albums
|
|
65
|
-
@a.touch
|
|
66
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
67
|
-
"UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "should clear associations after touching them :associations option" do
|
|
71
|
-
@Artist.plugin :touch, :associations=>:albums
|
|
72
|
-
@a.associations[:albums] = [@Album.call(:id=>1)]
|
|
73
|
-
@a.touch
|
|
74
|
-
@a.associations[:albums].must_be_nil
|
|
75
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
76
|
-
"UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should be able to give an array to the :associations option specifying multiple associations" do
|
|
80
|
-
@Album.plugin :touch, :associations=>[:artist, :followup_albums]
|
|
81
|
-
@Album.load(:id=>4, :artist_id=>1).touch
|
|
82
|
-
sqls = DB.sqls
|
|
83
|
-
sqls.shift.must_equal "UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 4)"
|
|
84
|
-
sqls.sort.must_equal ["UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.original_album_id = 4)",
|
|
85
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 1)"]
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should be able to give a hash to the :associations option specifying the column to use for each association" do
|
|
89
|
-
@Artist.plugin :touch, :associations=>{:albums=>:modified_on}
|
|
90
|
-
@a.touch
|
|
91
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
92
|
-
"UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it "should default to using the touch_column as the default touch column for associations" do
|
|
96
|
-
@Artist.plugin :touch, :column=>:modified_on, :associations=>:albums
|
|
97
|
-
@a.touch
|
|
98
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
99
|
-
"UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it "should allow the mixed use of symbols and hashes inside an array for the :associations option" do
|
|
103
|
-
@Album.plugin :touch, :associations=>[:artist, {:followup_albums=>:modified_on}]
|
|
104
|
-
@Album.load(:id=>4, :artist_id=>1).touch
|
|
105
|
-
sqls = DB.sqls
|
|
106
|
-
sqls.shift.must_equal "UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 4)"
|
|
107
|
-
sqls.sort.must_equal ["UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.original_album_id = 4)",
|
|
108
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 1)"]
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "should be able to specify the associations to touch via a touch_associations_method" do
|
|
112
|
-
@Album.plugin :touch
|
|
113
|
-
@Album.touch_associations(:artist, {:followup_albums=>:modified_on})
|
|
114
|
-
@Album.load(:id=>4, :artist_id=>1).touch
|
|
115
|
-
sqls = DB.sqls
|
|
116
|
-
sqls.shift.must_equal "UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 4)"
|
|
117
|
-
sqls.sort.must_equal ["UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.original_album_id = 4)",
|
|
118
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 1)"]
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "should touch associated objects when destroying an object" do
|
|
122
|
-
@Album.plugin :touch
|
|
123
|
-
@Album.touch_associations(:artist, {:followup_albums=>:modified_on})
|
|
124
|
-
@Album.load(:id=>4, :artist_id=>1).destroy
|
|
125
|
-
sqls = DB.sqls
|
|
126
|
-
sqls.shift.must_equal "DELETE FROM albums WHERE id = 4"
|
|
127
|
-
sqls.sort.must_equal ["UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.original_album_id = 4)",
|
|
128
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 1)"]
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should be able to touch many_to_one associations" do
|
|
132
|
-
@Album.plugin :touch, :associations=>:artist
|
|
133
|
-
@Album.load(:id=>3, :artist_id=>4).touch
|
|
134
|
-
DB.sqls.must_equal ["UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 3)",
|
|
135
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 4)"]
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it "should be able to touch many_to_one associations" do
|
|
139
|
-
@Album.plugin :touch, :associations=>:artist
|
|
140
|
-
@Album.plugin :skip_create_refresh
|
|
141
|
-
@Album.create(:artist_id=>4)
|
|
142
|
-
DB.sqls.must_equal ["INSERT INTO albums (artist_id) VALUES (4)",
|
|
143
|
-
"UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (artists.id = 4)"]
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
it "should be able to touch one_to_one associations" do
|
|
147
|
-
@Artist.one_to_one :album, :class=>@Album, :key=>:artist_id
|
|
148
|
-
@Artist.plugin :touch, :associations=>:album
|
|
149
|
-
@a.touch
|
|
150
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
151
|
-
"UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
it "should be able to touch many_to_many associations" do
|
|
155
|
-
@Artist.many_to_many :albums, :class=>@Album, :left_key=>:artist_id, :join_table=>:aa
|
|
156
|
-
@Artist.plugin :touch, :associations=>:albums
|
|
157
|
-
@a.touch
|
|
158
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
159
|
-
"SELECT albums.* FROM albums INNER JOIN aa ON (aa.album_id = albums.id) WHERE (aa.artist_id = 1)",
|
|
160
|
-
"UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "should be able to touch many_through_many associations" do
|
|
164
|
-
@Artist.plugin :many_through_many
|
|
165
|
-
@Artist.many_through_many :albums, [[:aa, :artist_id, :album_id]], :class=>@Album
|
|
166
|
-
@Artist.plugin :touch, :associations=>:albums
|
|
167
|
-
@a.touch
|
|
168
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
169
|
-
"SELECT albums.* FROM albums INNER JOIN aa ON (aa.album_id = albums.id) WHERE (aa.artist_id = 1)",
|
|
170
|
-
"UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should handle touching many_to_one associations with no associated object" do
|
|
174
|
-
@Album.plugin :touch, :associations=>:artist
|
|
175
|
-
@Album.load(:id=>3, :artist_id=>nil).touch
|
|
176
|
-
DB.sqls.must_equal ["UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (id = 3)"]
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
it "should not update a column that doesn't exist" do
|
|
180
|
-
@Album.plugin :touch, :column=>:x
|
|
181
|
-
a = @Album.load(:id=>1)
|
|
182
|
-
a.touch
|
|
183
|
-
DB.sqls.must_equal []
|
|
184
|
-
a.artist_id = 1
|
|
185
|
-
a.touch
|
|
186
|
-
DB.sqls.must_equal ['UPDATE albums SET artist_id = 1 WHERE (id = 1)']
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
it "should raise an error if given a column argument in touch that doesn't exist" do
|
|
190
|
-
@Artist.plugin :touch
|
|
191
|
-
proc{@a.touch(:x)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "should raise an Error when a nonexistent association is given" do
|
|
195
|
-
@Artist.plugin :touch
|
|
196
|
-
proc{@Artist.plugin :touch, :associations=>:blah}.must_raise(Sequel::Error)
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it "should work correctly in subclasses" do
|
|
200
|
-
@Artist.plugin :touch
|
|
201
|
-
c1 = Class.new(@Artist)
|
|
202
|
-
c1.load(:id=>4).touch
|
|
203
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 4)"]
|
|
204
|
-
|
|
205
|
-
c1.touch_column = :modified_on
|
|
206
|
-
c1.touch_associations :albums
|
|
207
|
-
c1.load(:id=>1).touch
|
|
208
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 1)",
|
|
209
|
-
"UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
|
|
210
|
-
|
|
211
|
-
@a.touch
|
|
212
|
-
DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)"]
|
|
213
|
-
|
|
214
|
-
@Artist.plugin :touch, :column=>:modified_on, :associations=>:albums
|
|
215
|
-
c2 = Class.new(@Artist)
|
|
216
|
-
c2.load(:id=>4).touch
|
|
217
|
-
DB.sqls.must_equal ["UPDATE artists SET modified_on = CURRENT_TIMESTAMP WHERE (id = 4)",
|
|
218
|
-
"UPDATE albums SET modified_on = CURRENT_TIMESTAMP WHERE (albums.artist_id = 4)"]
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
it "should freeze touched associations when freezing model class" do
|
|
222
|
-
@Artist.plugin :touch, :associations=>:albums
|
|
223
|
-
@Artist.freeze
|
|
224
|
-
@Artist.touched_associations.frozen?.must_equal true
|
|
225
|
-
end
|
|
226
|
-
end
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Sequel::Model, "tree plugin" do
|
|
4
|
-
def klass(opts={})
|
|
5
|
-
@db = DB
|
|
6
|
-
c = Class.new(Sequel::Model(@db[:nodes]))
|
|
7
|
-
c.class_eval do
|
|
8
|
-
def self.name; 'Node'; end
|
|
9
|
-
columns :id, :name, :parent_id, :i, :pi
|
|
10
|
-
plugin :tree, opts
|
|
11
|
-
end
|
|
12
|
-
c
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
before do
|
|
16
|
-
@c = klass
|
|
17
|
-
@ds = @c.dataset
|
|
18
|
-
@o = @c.load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
19
|
-
@db.reset
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should define the correct associations" do
|
|
23
|
-
@c.associations.sort_by{|x| x.to_s}.must_equal [:children, :parent]
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should define the correct reciprocals" do
|
|
27
|
-
@c.associations.sort_by{|x| x.to_s}.map{|x| @c.association_reflection(x).reciprocal}.must_equal [:parent, :children]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should define the correct associations when giving options" do
|
|
31
|
-
klass(:children=>{:name=>:cs}, :parent=>{:name=>:p}).associations.sort_by{|x| x.to_s}.must_equal [:cs, :p]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should use the correct SQL for lazy associations" do
|
|
35
|
-
@o.parent_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.id = 1) LIMIT 1'
|
|
36
|
-
@o.children_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.parent_id = 2)'
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should use the correct SQL for lazy associations when giving options" do
|
|
40
|
-
o = klass(:primary_key=>:i, :key=>:pi, :order=>:name, :children=>{:name=>:cs}, :parent=>{:name=>:p}).load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
41
|
-
o.p_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.i = 4) ORDER BY name LIMIT 1'
|
|
42
|
-
o.cs_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.pi = 3) ORDER BY name'
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should have parent_column give the symbol of the parent column" do
|
|
46
|
-
@c.parent_column.must_equal :parent_id
|
|
47
|
-
klass(:key=>:p_id).parent_column.must_equal :p_id
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should have tree_order give the order of the association" do
|
|
51
|
-
@c.tree_order.must_be_nil
|
|
52
|
-
klass(:order=>:name).tree_order.must_equal :name
|
|
53
|
-
klass(:order=>[:parent_id, :name]).tree_order.must_equal [:parent_id, :name]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "should work correctly in subclasses" do
|
|
57
|
-
o = Class.new(klass(:primary_key=>:i, :key=>:pi, :order=>:name, :children=>{:name=>:cs}, :parent=>{:name=>:p})).load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
58
|
-
o.p_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.i = 4) ORDER BY name LIMIT 1'
|
|
59
|
-
o.cs_dataset.sql.must_equal 'SELECT * FROM nodes WHERE (nodes.pi = 3) ORDER BY name'
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should have roots return an array of the tree's roots" do
|
|
63
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
64
|
-
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :name=>'r')]
|
|
65
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (parent_id IS NULL)"]
|
|
66
|
-
@c.exclude(id: 2).roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :name=>'r')]
|
|
67
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((id != 2) AND (parent_id IS NULL))"]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "should have roots_dataset be a dataset representing the tree's roots" do
|
|
71
|
-
@c.roots_dataset.sql.must_equal "SELECT * FROM nodes WHERE (parent_id IS NULL)"
|
|
72
|
-
@c.exclude(id: 2).roots_dataset.sql.must_equal "SELECT * FROM nodes WHERE ((id != 2) AND (parent_id IS NULL))"
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "should have ancestors return the ancestors of the current node" do
|
|
76
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
|
77
|
-
@o.ancestors.must_equal [@c.load(:id=>1, :parent_id=>5, :name=>'r'), @c.load(:id=>5, :parent_id=>nil, :name=>'r2')]
|
|
78
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
79
|
-
"SELECT * FROM nodes WHERE id = 5"]
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it "should have descendants return the descendants of the current node" do
|
|
83
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :parent_id=>2, :name=>'r'}, {:id=>4, :parent_id=>2, :name=>'r2'}], [{:id=>5, :parent_id=>4, :name=>'r3'}], []])
|
|
84
|
-
@o.descendants.must_equal [@c.load(:id=>3, :parent_id=>2, :name=>'r'), @c.load(:id=>4, :parent_id=>2, :name=>'r2'), @c.load(:id=>5, :parent_id=>4, :name=>'r3')]
|
|
85
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.parent_id = 2)",
|
|
86
|
-
"SELECT * FROM nodes WHERE (nodes.parent_id = 3)",
|
|
87
|
-
"SELECT * FROM nodes WHERE (nodes.parent_id = 5)",
|
|
88
|
-
"SELECT * FROM nodes WHERE (nodes.parent_id = 4)"]
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "should have root return the root of the current node" do
|
|
92
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
|
93
|
-
@o.root.must_equal @c.load(:id=>5, :parent_id=>nil, :name=>'r2')
|
|
94
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
95
|
-
"SELECT * FROM nodes WHERE id = 5"]
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "should have root? return true for a root node and false for a child node" do
|
|
99
|
-
@c.load(:parent_id => nil).root?.must_equal true
|
|
100
|
-
@c.load(:parent_id => 1).root?.must_equal false
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
it "should have root? return false for an new node" do
|
|
104
|
-
@c.new.root?.must_equal false
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "should have self_and_siblings return the children of the current node's parent" do
|
|
108
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
|
109
|
-
@o.self_and_siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2'), @o]
|
|
110
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
111
|
-
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
it "should have self_and_siblings return the roots if the current object is a root" do
|
|
115
|
-
h = {:id=>2, :parent_id=>nil, :name=>'AA'}
|
|
116
|
-
@c.dataset = @c.dataset.with_fetch(h)
|
|
117
|
-
@c.load(h).self_and_siblings.must_equal [@c.load(h)]
|
|
118
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (parent_id IS NULL)"]
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "should have siblings return the children of the current node's parent, except for the current node" do
|
|
122
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
|
123
|
-
@o.siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2')]
|
|
124
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
125
|
-
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should have methods work correctly with custom association names" do
|
|
129
|
-
o = klass(:primary_key=>:i, :key=>:pi, :order=>:name, :children=>{:name=>:cs}, :parent=>{:name=>:p}).load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
130
|
-
|
|
131
|
-
o.model.parent_association_name.must_equal :p
|
|
132
|
-
o.model.children_association_name.must_equal :cs
|
|
133
|
-
o.model.dataset = o.model.dataset.with_fetch(lambda do |sql|
|
|
134
|
-
case sql
|
|
135
|
-
when "SELECT * FROM nodes WHERE (nodes.i = 4) ORDER BY name LIMIT 1"
|
|
136
|
-
{:id=>7, :parent_id=>8, :name=>'r2', :i=>4, :pi=>5}
|
|
137
|
-
when "SELECT * FROM nodes WHERE (nodes.i = 5) ORDER BY name LIMIT 1"
|
|
138
|
-
{:id=>10, :parent_id=>11, :name=>'r3', :i=>5, :pi=>nil}
|
|
139
|
-
when 'SELECT * FROM nodes WHERE (nodes.pi = 3) ORDER BY name'
|
|
140
|
-
{:id=>12, :parent_id=>13, :name=>'r4', :i=>7, :pi=>3}
|
|
141
|
-
when 'SELECT * FROM nodes WHERE (nodes.pi = 7) ORDER BY name'
|
|
142
|
-
{:id=>14, :parent_id=>15, :name=>'r5', :i=>8, :pi=>7}
|
|
143
|
-
when 'SELECT * FROM nodes WHERE (nodes.pi = 8) ORDER BY name'
|
|
144
|
-
[]
|
|
145
|
-
when 'SELECT * FROM nodes WHERE (nodes.pi = 4) ORDER BY name'
|
|
146
|
-
[{:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4}, {:id=>20, :parent_id=>21, :name=>'r6', :i=>9, :pi=>4}]
|
|
147
|
-
else
|
|
148
|
-
raise sql
|
|
149
|
-
end
|
|
150
|
-
end)
|
|
151
|
-
o.db.sqls.must_equal []
|
|
152
|
-
|
|
153
|
-
o.ancestors.must_equal [o.model.load(:id=>7, :parent_id=>8, :name=>'r2', :i=>4, :pi=>5),
|
|
154
|
-
o.model.load(:id=>10, :parent_id=>11, :name=>'r3', :i=>5, :pi=>nil)]
|
|
155
|
-
o.db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.i = 4) ORDER BY name LIMIT 1",
|
|
156
|
-
"SELECT * FROM nodes WHERE (nodes.i = 5) ORDER BY name LIMIT 1"]
|
|
157
|
-
|
|
158
|
-
o.descendants.must_equal [o.model.load(:id=>12, :parent_id=>13, :name=>'r4', :i=>7, :pi=>3),
|
|
159
|
-
o.model.load(:id=>14, :parent_id=>15, :name=>'r5', :i=>8, :pi=>7)]
|
|
160
|
-
o.db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.pi = 3) ORDER BY name",
|
|
161
|
-
"SELECT * FROM nodes WHERE (nodes.pi = 7) ORDER BY name",
|
|
162
|
-
"SELECT * FROM nodes WHERE (nodes.pi = 8) ORDER BY name"]
|
|
163
|
-
|
|
164
|
-
o.siblings.must_equal [o.model.load(:id=>20, :parent_id=>21, :name=>'r6', :i=>9, :pi=>4)]
|
|
165
|
-
o.db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.pi = 4) ORDER BY name"]
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
describe ":single_root option" do
|
|
169
|
-
before do
|
|
170
|
-
@c = klass(:single_root => true)
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should have root class method return the root" do
|
|
174
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
175
|
-
@c.root.must_equal @c.load(:id=>1, :parent_id=>nil, :name=>'r')
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "prevents creating a second root" do
|
|
179
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
180
|
-
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "errors when promoting an existing record to a second root" do
|
|
184
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
185
|
-
n = @c.load(:id => 2, :parent_id => 1)
|
|
186
|
-
lambda { n.update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
it "allows updating existing root" do
|
|
190
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
191
|
-
@c.root.update(:name => 'fdsa')
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
describe Sequel::Model, "tree plugin with composite keys" do
|
|
197
|
-
def klass(opts={})
|
|
198
|
-
@db = DB
|
|
199
|
-
c = Class.new(Sequel::Model(@db[:nodes]))
|
|
200
|
-
c.class_eval do
|
|
201
|
-
def self.name; 'Node'; end
|
|
202
|
-
columns :id, :id2, :name, :parent_id, :parent_id2, :i, :pi
|
|
203
|
-
set_primary_key [:id, :id2]
|
|
204
|
-
plugin :tree, opts.merge(:key=>[:parent_id, :parent_id2])
|
|
205
|
-
def self.set_dataset(ds)
|
|
206
|
-
super
|
|
207
|
-
set_primary_key [:id, :id2]
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
c
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
before do
|
|
214
|
-
@c = klass
|
|
215
|
-
@ds = @c.dataset
|
|
216
|
-
@o = @c.load(:id=>2, :id2=>5, :parent_id=>1, :parent_id2=>6, :name=>'AA', :i=>3, :pi=>4)
|
|
217
|
-
@db.reset
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
it "should use the correct SQL for lazy associations" do
|
|
222
|
-
@o.parent_dataset.sql.must_equal 'SELECT * FROM nodes WHERE ((nodes.id = 1) AND (nodes.id2 = 6)) LIMIT 1'
|
|
223
|
-
@o.children_dataset.sql.must_equal 'SELECT * FROM nodes WHERE ((nodes.parent_id = 2) AND (nodes.parent_id2 = 5))'
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
it "should have parent_column give an array of symbols of the parent column" do
|
|
227
|
-
@c.parent_column.must_equal [:parent_id, :parent_id2]
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
it "should have roots return an array of the tree's roots" do
|
|
231
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
232
|
-
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r')]
|
|
233
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((parent_id IS NULL) OR (parent_id2 IS NULL))"]
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
it "should have roots_dataset be a dataset representing the tree's roots" do
|
|
237
|
-
@c.roots_dataset.sql.must_equal "SELECT * FROM nodes WHERE ((parent_id IS NULL) OR (parent_id2 IS NULL))"
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
it "should have ancestors return the ancestors of the current node" do
|
|
241
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
|
242
|
-
@o.ancestors.must_equal [@c.load(:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'), @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')]
|
|
243
|
-
sqls = @db.sqls
|
|
244
|
-
sqls.length.must_equal 2
|
|
245
|
-
["SELECT * FROM nodes WHERE ((id = 1) AND (id2 = 6)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 6) AND (id = 1)) LIMIT 1"].must_include(sqls[0])
|
|
246
|
-
["SELECT * FROM nodes WHERE ((id = 5) AND (id2 = 7)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 7) AND (id = 5)) LIMIT 1"].must_include(sqls[1])
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
it "should have descendants return the descendants of the current node" do
|
|
250
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'}, {:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'}], [{:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3'}], []])
|
|
251
|
-
@o.descendants.must_equal [@c.load(:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'), @c.load(:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'), @c.load(:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3')]
|
|
252
|
-
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((nodes.parent_id = 2) AND (nodes.parent_id2 = 5))",
|
|
253
|
-
"SELECT * FROM nodes WHERE ((nodes.parent_id = 3) AND (nodes.parent_id2 = 7))",
|
|
254
|
-
"SELECT * FROM nodes WHERE ((nodes.parent_id = 5) AND (nodes.parent_id2 = 9))",
|
|
255
|
-
"SELECT * FROM nodes WHERE ((nodes.parent_id = 4) AND (nodes.parent_id2 = 8))"]
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
it "should have root return the root of the current node" do
|
|
259
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
|
260
|
-
@o.root.must_equal @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')
|
|
261
|
-
sqls = @db.sqls
|
|
262
|
-
sqls.length.must_equal 2
|
|
263
|
-
["SELECT * FROM nodes WHERE ((id = 1) AND (id2 = 6)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 6) AND (id = 1)) LIMIT 1"].must_include(sqls[0])
|
|
264
|
-
["SELECT * FROM nodes WHERE ((id = 5) AND (id2 = 7)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 7) AND (id = 5)) LIMIT 1"].must_include(sqls[1])
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
it "should have root? return true for a root node and false for a child node" do
|
|
268
|
-
@c.load(:parent_id => nil, :parent_id2=>nil).root?.must_equal true
|
|
269
|
-
@c.load(:parent_id => 1, :parent_id2=>nil).root?.must_equal true
|
|
270
|
-
@c.load(:parent_id => nil, :parent_id2=>2).root?.must_equal true
|
|
271
|
-
@c.load(:parent_id => 1, :parent_id2=>2).root?.must_equal false
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
it "should have root? return false for an new node" do
|
|
275
|
-
@c.new.root?.must_equal false
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
it "should have self_and_siblings return the children of the current node's parent" do
|
|
279
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
|
280
|
-
@o.self_and_siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'), @o]
|
|
281
|
-
sqls = @db.sqls
|
|
282
|
-
sqls.length.must_equal 2
|
|
283
|
-
["SELECT * FROM nodes WHERE ((id = 1) AND (id2 = 6)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 6) AND (id = 1)) LIMIT 1"].must_include(sqls[0])
|
|
284
|
-
sqls[1].must_equal "SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.parent_id2 = 6))"
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
it "should have siblings return the children of the current node's parent, except for the current node" do
|
|
288
|
-
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
|
289
|
-
@o.siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2')]
|
|
290
|
-
sqls = @db.sqls
|
|
291
|
-
sqls.length.must_equal 2
|
|
292
|
-
["SELECT * FROM nodes WHERE ((id = 1) AND (id2 = 6)) LIMIT 1", "SELECT * FROM nodes WHERE ((id2 = 6) AND (id = 1)) LIMIT 1"].must_include(sqls[0])
|
|
293
|
-
sqls[1].must_equal "SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.parent_id2 = 6))"
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
describe ":single_root option" do
|
|
297
|
-
before do
|
|
298
|
-
@c = klass(:single_root => true)
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
it "prevents creating a second root" do
|
|
302
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
303
|
-
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
304
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
|
305
|
-
lambda { @c.create(:parent_id2=>1) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
306
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
|
307
|
-
lambda { @c.create(:parent_id=>2) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
it "errors when promoting an existing record to a second root" do
|
|
311
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
312
|
-
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil, :parent_id2=>nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
313
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
|
314
|
-
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
315
|
-
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
|
316
|
-
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id2 => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it "allows updating existing root" do
|
|
320
|
-
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r')
|
|
321
|
-
@c.root.update(:name => 'fdsa')
|
|
322
|
-
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r')
|
|
323
|
-
@c.root.update(:name => 'fdsa')
|
|
324
|
-
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r')
|
|
325
|
-
@c.root.update(:name => 'fdsa')
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
it "freezes tree_order if it is an array" do
|
|
329
|
-
@c.tree_order = [:id]
|
|
330
|
-
@c.freeze
|
|
331
|
-
@c.tree_order.frozen?.must_equal true
|
|
332
|
-
end
|
|
333
|
-
end
|
|
334
|
-
end
|