sequel 5.20.0 → 5.49.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 +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -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/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- 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 +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- 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 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- 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 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- 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 -1826
- 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/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- 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 -189
- 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/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/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_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 -336
- 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 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- 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 -172
- 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 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- 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 -519
- 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 -381
- 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 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- 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 -63
- 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_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 -1981
- 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 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- 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 -4
- data/spec/spec_config.rb +0 -12
|
@@ -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
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Sequel::Model, "TypecastOnLoad plugin" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:fetch=>{:id=>1, :b=>"1", :y=>"0"}, :columns=>[:id, :b, :y], :numrows=>1)
|
|
6
|
-
def @db.supports_schema_parsing?() true end
|
|
7
|
-
def @db.schema(*args)
|
|
8
|
-
[[:id, {}], [:y, {:type=>:boolean, :db_type=>'tinyint(1)'}], [:b, {:type=>:integer, :db_type=>'integer'}]]
|
|
9
|
-
end
|
|
10
|
-
@c = Class.new(Sequel::Model(@db[:items])) do
|
|
11
|
-
attr_accessor :bset
|
|
12
|
-
def b=(x)
|
|
13
|
-
self.bset = true
|
|
14
|
-
super
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "should call setter method with value when loading the object, for all given columns" do
|
|
20
|
-
@c.plugin :typecast_on_load, :b
|
|
21
|
-
o = @c.load(:id=>1, :b=>"1", :y=>"0")
|
|
22
|
-
o.values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
23
|
-
o.bset.must_equal true
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should call setter method with value when reloading the object, for all given columns" do
|
|
27
|
-
@c.plugin :typecast_on_load, :b
|
|
28
|
-
o = @c.load(:id=>1, :b=>"1", :y=>"0")
|
|
29
|
-
o.refresh
|
|
30
|
-
o.values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
31
|
-
o.bset.must_equal true
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should call setter method with value when automatically reloading the object on creation" do
|
|
35
|
-
@c.plugin :typecast_on_load, :b
|
|
36
|
-
o = @c.new(:b=>"1", :y=>"0")
|
|
37
|
-
o.save.values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
38
|
-
o.bset.must_equal true
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "should call setter method with value when automatically reloading the object on creation via insert_select" do
|
|
42
|
-
@c.plugin :typecast_on_load, :b
|
|
43
|
-
@c.dataset = @c.dataset.with_extend{def insert_select(h) insert(h); first end}
|
|
44
|
-
o = @c.new(:b=>"1", :y=>"0")
|
|
45
|
-
o.save.values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
46
|
-
o.bset.must_equal true
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "should allowing setting columns separately via add_typecast_on_load_columns" do
|
|
50
|
-
@c.plugin :typecast_on_load
|
|
51
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
|
|
52
|
-
@c.add_typecast_on_load_columns :b
|
|
53
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
54
|
-
@c.add_typecast_on_load_columns :y
|
|
55
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>false)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should work with subclasses" do
|
|
59
|
-
@c.plugin :typecast_on_load
|
|
60
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
|
|
61
|
-
|
|
62
|
-
c1 = Class.new(@c)
|
|
63
|
-
@c.add_typecast_on_load_columns :b
|
|
64
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
65
|
-
c1.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
|
|
66
|
-
|
|
67
|
-
c2 = Class.new(@c)
|
|
68
|
-
@c.add_typecast_on_load_columns :y
|
|
69
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>false)
|
|
70
|
-
c2.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
|
|
71
|
-
|
|
72
|
-
c1.add_typecast_on_load_columns :y
|
|
73
|
-
c1.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>false)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "should not mark the object as modified" do
|
|
77
|
-
@c.plugin :typecast_on_load, :b
|
|
78
|
-
@c.load(:id=>1, :b=>"1", :y=>"0").modified?.must_equal false
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should freeze typecast_on_load columns when freezing model class" do
|
|
82
|
-
@c.plugin :typecast_on_load, :b
|
|
83
|
-
@c.freeze
|
|
84
|
-
@c.typecast_on_load_columns.frozen?.must_equal true
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::UnlimitedUpdate" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:host=>'mysql', :numrows=>1)
|
|
6
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
-
@c = Class.new(Sequel::Model(@db[:test]))
|
|
8
|
-
@c.columns :id, :name
|
|
9
|
-
@o = @c.load(:id=>1, :name=>'a')
|
|
10
|
-
@db.sqls
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should remove limit from update dataset" do
|
|
14
|
-
@o.save
|
|
15
|
-
@db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1) LIMIT 1"]
|
|
16
|
-
|
|
17
|
-
@c.plugin :unlimited_update
|
|
18
|
-
@o.save
|
|
19
|
-
@db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1)"]
|
|
20
|
-
end
|
|
21
|
-
end
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::UpdateOrCreate" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:autoid=>proc{1}, :numrows=>1)
|
|
6
|
-
@c = Class.new(Sequel::Model(@db[:test]))
|
|
7
|
-
@c.plugin :update_or_create
|
|
8
|
-
@c.columns :id, :a, :b
|
|
9
|
-
@db.sqls
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it ".update_or_create should update an existing record if one exists" do
|
|
13
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
14
|
-
@c.update_or_create(:a=>2){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>2, :b=>4)
|
|
15
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1", "UPDATE test SET b = 4 WHERE (id = 1)"]
|
|
16
|
-
|
|
17
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
18
|
-
@c.update_or_create({:a=>2}, :b=>4).must_equal @c.load(:id=>1, :a=>2, :b=>4)
|
|
19
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1", "UPDATE test SET b = 4 WHERE (id = 1)"]
|
|
20
|
-
|
|
21
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
22
|
-
@c.update_or_create({:a=>2}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
|
|
23
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1",
|
|
24
|
-
'UPDATE test SET a = 3, b = 4 WHERE (id = 1)']
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it ".update_or_create should create a record if an existing record does not exist" do
|
|
28
|
-
@db.fetch = [[], [{:id=>1, :a=>1, :b=>4}]]
|
|
29
|
-
@c.update_or_create(:a=>1){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>1, :b=>4)
|
|
30
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1",
|
|
31
|
-
"INSERT INTO test (a, b) VALUES (1, 4)",
|
|
32
|
-
"SELECT * FROM test WHERE (id = 1) LIMIT 1"]
|
|
33
|
-
|
|
34
|
-
@db.fetch = [[], [{:id=>1, :a=>1, :b=>4}]]
|
|
35
|
-
@c.update_or_create({:a=>1}, :b=>4).must_equal @c.load(:id=>1, :a=>1, :b=>4)
|
|
36
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1",
|
|
37
|
-
"INSERT INTO test (a, b) VALUES (1, 4)",
|
|
38
|
-
"SELECT * FROM test WHERE (id = 1) LIMIT 1"]
|
|
39
|
-
|
|
40
|
-
@db.fetch = [[], [{:id=>1, :a=>3, :b=>4}]]
|
|
41
|
-
@c.update_or_create({:a=>1}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
|
|
42
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1",
|
|
43
|
-
"INSERT INTO test (a, b) VALUES (3, 4)",
|
|
44
|
-
"SELECT * FROM test WHERE (id = 1) LIMIT 1"]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it ".update_or_create should return an existing record even if no changes necessary" do
|
|
48
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
49
|
-
@c.update_or_create(:a=>2){|t| t.b = 3}.must_equal @c.load(:id=>1, :a=>2, :b=>3)
|
|
50
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it ".find_or_new should return an existing record" do
|
|
54
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
55
|
-
@c.find_or_new(:a=>2){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>2, :b=>4)
|
|
56
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
|
|
57
|
-
|
|
58
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
59
|
-
@c.find_or_new({:a=>2}, :b=>4).must_equal @c.load(:id=>1, :a=>2, :b=>4)
|
|
60
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
|
|
61
|
-
|
|
62
|
-
@db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
|
|
63
|
-
@c.find_or_new({:a=>2}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
|
|
64
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it ".find_or_new should return a new record if no record exists" do
|
|
68
|
-
o = @c.find_or_new(:a=>1){|t| t.b = 4}
|
|
69
|
-
o.must_equal @c.load(:a=>1, :b=>4)
|
|
70
|
-
o.new?.must_equal true
|
|
71
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
|
|
72
|
-
|
|
73
|
-
o = @c.find_or_new({:a=>1}, :b=>4)
|
|
74
|
-
o.must_equal @c.load(:a=>1, :b=>4)
|
|
75
|
-
o.new?.must_equal true
|
|
76
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
|
|
77
|
-
|
|
78
|
-
o = @c.find_or_new({:a=>1}, :a=>3){|t| t.b = 4}
|
|
79
|
-
o.must_equal @c.load(:a=>3, :b=>4)
|
|
80
|
-
o.new?.must_equal true
|
|
81
|
-
@db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
|
|
82
|
-
end
|
|
83
|
-
end
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::UpdatePrimaryKey" do
|
|
4
|
-
before do
|
|
5
|
-
@c = Class.new(Sequel::Model(:a))
|
|
6
|
-
@c.plugin :update_primary_key
|
|
7
|
-
@c.columns :a, :b
|
|
8
|
-
def @c.set_dataset(*)
|
|
9
|
-
super
|
|
10
|
-
set_primary_key :a
|
|
11
|
-
end
|
|
12
|
-
@c.set_primary_key :a
|
|
13
|
-
@c.unrestrict_primary_key
|
|
14
|
-
@ds = @c.dataset
|
|
15
|
-
DB.reset
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should handle regular updates" do
|
|
19
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>1, :b=>4}], [{:a=>1, :b=>4}], [{:a=>1, :b=>5}], [{:a=>1, :b=>5}], [{:a=>1, :b=>6}], [{:a=>1, :b=>6}]])
|
|
20
|
-
@c.first.update(:b=>4)
|
|
21
|
-
@c.all.must_equal [@c.load(:a=>1, :b=>4)]
|
|
22
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 4 WHERE (a = 1)", "SELECT * FROM a"]
|
|
23
|
-
@c.first.set(:b=>5).save
|
|
24
|
-
@c.all.must_equal [@c.load(:a=>1, :b=>5)]
|
|
25
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 5 WHERE (a = 1)", "SELECT * FROM a"]
|
|
26
|
-
@c.first.set(:b=>6).save(:columns=>:b)
|
|
27
|
-
@c.all.must_equal [@c.load(:a=>1, :b=>6)]
|
|
28
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 6 WHERE (a = 1)", "SELECT * FROM a"]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "should handle updating the primary key field with another field" do
|
|
32
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]])
|
|
33
|
-
@c.first.update(:a=>2, :b=>4)
|
|
34
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>4)]
|
|
35
|
-
sqls = DB.sqls
|
|
36
|
-
["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
|
|
37
|
-
sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "should handle updating just the primary key field when saving changes" do
|
|
41
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>3}], [{:a=>2, :b=>3}], [{:a=>3, :b=>3}]])
|
|
42
|
-
@c.first.update(:a=>2)
|
|
43
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>3)]
|
|
44
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "SELECT * FROM a"]
|
|
45
|
-
@c.first.set(:a=>3).save(:columns=>:a)
|
|
46
|
-
@c.all.must_equal [@c.load(:a=>3, :b=>3)]
|
|
47
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 3 WHERE (a = 2)", "SELECT * FROM a"]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should handle saving after modifying the primary key field with another field" do
|
|
51
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]])
|
|
52
|
-
@c.first.set(:a=>2, :b=>4).save
|
|
53
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>4)]
|
|
54
|
-
sqls = DB.sqls
|
|
55
|
-
["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
|
|
56
|
-
sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "should handle saving after modifying just the primary key field" do
|
|
60
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>3}]])
|
|
61
|
-
@c.first.set(:a=>2).save
|
|
62
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>3)]
|
|
63
|
-
sqls = DB.sqls
|
|
64
|
-
["UPDATE a SET a = 2, b = 3 WHERE (a = 1)", "UPDATE a SET b = 3, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
|
|
65
|
-
sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "should handle saving after updating the primary key" do
|
|
69
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>5}]])
|
|
70
|
-
@c.first.update(:a=>2).update(:b=>4).set(:b=>5).save
|
|
71
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>5)]
|
|
72
|
-
DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "UPDATE a SET b = 4 WHERE (a = 2)", "UPDATE a SET b = 5 WHERE (a = 2)", "SELECT * FROM a"]
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "should work correctly when using the prepared_statements plugin" do
|
|
76
|
-
@c.plugin :prepared_statements
|
|
77
|
-
@c.dataset = @c.dataset.with_fetch([[{:a=>1, :b=>3}], [{:a=>2, :b=>4}], [{:a=>3}]])
|
|
78
|
-
o = @c.first
|
|
79
|
-
o.update(:a=>2, :b=>4)
|
|
80
|
-
@c.all.must_equal [@c.load(:a=>2, :b=>4)]
|
|
81
|
-
sqls = DB.sqls
|
|
82
|
-
["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
|
|
83
|
-
sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
|
|
84
|
-
|
|
85
|
-
@c.create(:a=>3)
|
|
86
|
-
DB.sqls.must_equal ["INSERT INTO a (a) VALUES (3)", "SELECT * FROM a WHERE a = 3"]
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should clear the associations cache of non-many_to_one associations when changing the primary key" do
|
|
90
|
-
@c.one_to_many :cs, :class=>@c
|
|
91
|
-
@c.many_to_one :c, :class=>@c
|
|
92
|
-
o = @c.new(:a=>1)
|
|
93
|
-
o.associations[:cs] = @c.new
|
|
94
|
-
o.associations[:c] = o2 = @c.new
|
|
95
|
-
o.a = 2
|
|
96
|
-
o.associations.must_equal(:c=>o2)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "should handle frozen instances" do
|
|
100
|
-
o = @c.new
|
|
101
|
-
o.a = 1
|
|
102
|
-
o.freeze
|
|
103
|
-
o.pk_hash.must_equal(:a=>1)
|
|
104
|
-
end
|
|
105
|
-
end
|