sequel 4.49.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe "Database transactions" do
|
4
4
|
before(:all) do
|
@@ -192,7 +192,6 @@ describe "Database transactions" do
|
|
192
192
|
c = Class.new(Sequel::Model(@d))
|
193
193
|
c.set_primary_key :name
|
194
194
|
c.unrestrict_primary_key
|
195
|
-
c.use_after_commit_rollback = false
|
196
195
|
@db.transaction(:prepare=>'XYZ'){c.create(:name => '1'); c.create(:name => '2').destroy}
|
197
196
|
@db.commit_prepared_transaction('XYZ')
|
198
197
|
@d.select_order_map(:name).must_equal ['1']
|
@@ -315,57 +314,6 @@ describe "Database transactions" do
|
|
315
314
|
end
|
316
315
|
end
|
317
316
|
|
318
|
-
if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby') and RUBY_VERSION < '1.9'
|
319
|
-
describe "Database transactions and Thread#kill" do
|
320
|
-
before do
|
321
|
-
@db = DB
|
322
|
-
@db.create_table!(:items, :engine=>'InnoDB'){String :name; Integer :value}
|
323
|
-
@d = @db[:items]
|
324
|
-
end
|
325
|
-
after do
|
326
|
-
@db.drop_table?(:items)
|
327
|
-
end
|
328
|
-
|
329
|
-
it "should handle transactions inside threads" do
|
330
|
-
q = Queue.new
|
331
|
-
q1 = Queue.new
|
332
|
-
t = Thread.new do
|
333
|
-
@db.transaction do
|
334
|
-
@d.insert(:name => 'abc', :value => 1)
|
335
|
-
q1.push nil
|
336
|
-
q.pop
|
337
|
-
@d.insert(:name => 'def', :value => 2)
|
338
|
-
end
|
339
|
-
end
|
340
|
-
q1.pop
|
341
|
-
t.kill
|
342
|
-
@d.count.must_equal 0
|
343
|
-
end
|
344
|
-
|
345
|
-
if DB.supports_savepoints?
|
346
|
-
it "should handle transactions with savepoints inside threads" do
|
347
|
-
q = Queue.new
|
348
|
-
q1 = Queue.new
|
349
|
-
t = Thread.new do
|
350
|
-
@db.transaction do
|
351
|
-
@d.insert(:name => 'abc', :value => 1)
|
352
|
-
@db.transaction(:savepoint=>true) do
|
353
|
-
@d.insert(:name => 'def', :value => 2)
|
354
|
-
q1.push nil
|
355
|
-
q.pop
|
356
|
-
@d.insert(:name => 'ghi', :value => 3)
|
357
|
-
end
|
358
|
-
@d.insert(:name => 'jkl', :value => 4)
|
359
|
-
end
|
360
|
-
end
|
361
|
-
q1.pop
|
362
|
-
t.kill
|
363
|
-
@d.count.must_equal 0
|
364
|
-
end
|
365
|
-
end
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
317
|
describe "Database transaction retrying" do
|
370
318
|
before(:all) do
|
371
319
|
@db = DB
|
@@ -379,7 +327,7 @@ describe "Database transaction retrying" do
|
|
379
327
|
@db.drop_table?(:items)
|
380
328
|
end
|
381
329
|
|
382
|
-
|
330
|
+
it "should be supported using the :retry_on option" do
|
383
331
|
@d.insert('b')
|
384
332
|
@d.insert('c')
|
385
333
|
s = 'a'
|
@@ -390,7 +338,7 @@ describe "Database transaction retrying" do
|
|
390
338
|
@d.select_order_map(:a).must_equal %w'b c d'
|
391
339
|
end
|
392
340
|
|
393
|
-
|
341
|
+
it "should limit number of retries via the :num_retries option" do
|
394
342
|
@d.insert('b')
|
395
343
|
@d.insert('c')
|
396
344
|
s = 'a'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe "Supported types" do
|
4
4
|
def create_items_table_with_column(name, type, opts={})
|
@@ -37,13 +37,13 @@ describe "Supported types" do
|
|
37
37
|
ds.all.must_equal [{:number=>2**34}]
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
it "should support generic float type" do
|
41
41
|
ds = create_items_table_with_column(:number, Float)
|
42
42
|
ds.insert(:number => 2.1)
|
43
43
|
ds.all.must_equal [{:number=>2.1}]
|
44
44
|
end
|
45
45
|
|
46
|
-
cspecify "should support generic numeric type", [:odbc, :mssql]
|
46
|
+
cspecify "should support generic numeric type", [:odbc, :mssql] do
|
47
47
|
ds = create_items_table_with_column(:number, Numeric, :size=>[15, 10])
|
48
48
|
ds.insert(:number => BigDecimal.new('2.123456789'))
|
49
49
|
ds.all.must_equal [{:number=>BigDecimal.new('2.123456789')}]
|
@@ -67,7 +67,7 @@ describe "Supported types" do
|
|
67
67
|
ds.all.must_equal [{:name=>'Test User'*100}]
|
68
68
|
end
|
69
69
|
|
70
|
-
cspecify "should support generic date type", [:
|
70
|
+
cspecify "should support generic date type", [:jdbc, :sqlite], [:tinytds], [:jdbc, :mssql], :oracle do
|
71
71
|
ds = create_items_table_with_column(:dat, Date)
|
72
72
|
d = Date.today
|
73
73
|
ds.insert(:dat => d)
|
@@ -75,7 +75,7 @@ describe "Supported types" do
|
|
75
75
|
ds.first[:dat].to_s.must_equal d.to_s
|
76
76
|
end
|
77
77
|
|
78
|
-
cspecify "should support generic time type", [:
|
78
|
+
cspecify "should support generic time type", [:odbc], [:jdbc, :mssql], [:jdbc, :sqlite], [:mysql2], [:tinytds], :oracle, [:ado] do
|
79
79
|
ds = create_items_table_with_column(:tim, Time, :only_time=>true)
|
80
80
|
t = Sequel::SQLTime.now
|
81
81
|
ds.insert(:tim => t)
|
@@ -89,7 +89,7 @@ describe "Supported types" do
|
|
89
89
|
v2.must_be_kind_of(Sequel::SQLTime)
|
90
90
|
end
|
91
91
|
|
92
|
-
cspecify "should support generic datetime type", [:
|
92
|
+
cspecify "should support generic datetime type", [:jdbc, :sqlite] do
|
93
93
|
ds = create_items_table_with_column(:tim, DateTime)
|
94
94
|
t = DateTime.now
|
95
95
|
ds.insert(:tim => t)
|
@@ -100,14 +100,14 @@ describe "Supported types" do
|
|
100
100
|
ds.first[:tim].strftime('%Y%m%d%H%M%S').must_equal t.strftime('%Y%m%d%H%M%S')
|
101
101
|
end
|
102
102
|
|
103
|
-
cspecify "should support generic file type", [:
|
103
|
+
cspecify "should support generic file type", [:odbc, :mssql], [:mysql2], [:tinytds] do
|
104
104
|
ds = create_items_table_with_column(:name, File)
|
105
105
|
ds.insert(:name =>Sequel.blob("a\0"*300))
|
106
106
|
ds.all.must_equal [{:name=>Sequel.blob("a\0"*300)}]
|
107
107
|
ds.first[:name].must_be_kind_of(::Sequel::SQL::Blob)
|
108
108
|
end
|
109
109
|
|
110
|
-
cspecify "should support generic boolean type", [:
|
110
|
+
cspecify "should support generic boolean type", [:jdbc, :sqlite], [:jdbc, :db2], :oracle do
|
111
111
|
ds = create_items_table_with_column(:number, TrueClass)
|
112
112
|
ds.insert(:number => true)
|
113
113
|
ds.all.must_equal [{:number=>true}]
|
@@ -116,7 +116,7 @@ describe "Supported types" do
|
|
116
116
|
ds.all.must_equal [{:number=>true}]
|
117
117
|
end
|
118
118
|
|
119
|
-
cspecify "should support generic boolean type with defaults", [:
|
119
|
+
cspecify "should support generic boolean type with defaults", [:jdbc, :sqlite], [:jdbc, :db2], :oracle do
|
120
120
|
ds = create_items_table_with_column(:number, TrueClass, :default=>true)
|
121
121
|
ds.insert
|
122
122
|
ds.all.must_equal [{:number=>true}]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe Sequel::Model::Associations::AssociationReflection, "#associated_class" do
|
4
4
|
before do
|
@@ -15,14 +15,34 @@ describe Sequel::Model::Associations::AssociationReflection, "#associated_class"
|
|
15
15
|
@c.association_reflection(:c).associated_class.must_equal ParParent
|
16
16
|
end
|
17
17
|
|
18
|
+
it "should use the :class value if present" do
|
19
|
+
@c.many_to_one :c, :class=>@c
|
20
|
+
@c.one_to_many :cs, :class=>@c
|
21
|
+
c = @c.association_reflection(:c)
|
22
|
+
cs = @c.association_reflection(:cs)
|
23
|
+
|
24
|
+
c.association_method.must_equal :c
|
25
|
+
c.dataset_method.must_equal :c_dataset
|
26
|
+
c.setter_method.must_equal :c=
|
27
|
+
c._setter_method.must_equal :_c=
|
28
|
+
|
29
|
+
cs.association_method.must_equal :cs
|
30
|
+
cs.dataset_method.must_equal :cs_dataset
|
31
|
+
cs.add_method.must_equal :add_c
|
32
|
+
cs._add_method.must_equal :_add_c
|
33
|
+
cs.remove_method.must_equal :remove_c
|
34
|
+
cs._remove_method.must_equal :_remove_c
|
35
|
+
cs.remove_all_method.must_equal :remove_all_cs
|
36
|
+
cs._remove_all_method.must_equal :_remove_all_cs
|
37
|
+
end
|
38
|
+
|
18
39
|
it "should have inspect include association class and representation of association definition " do
|
19
40
|
ParParent.many_to_one :c
|
20
41
|
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c>"
|
21
42
|
ParParent.many_to_one :c, :class=>ParParent
|
22
43
|
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :class=>ParParent>"
|
23
44
|
ParParent.many_to_one :c, :class=>ParParent, :key=>:c_id
|
24
|
-
|
25
|
-
"#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :class=>ParParent, :key=>:c_id>"].must_include ParParent.association_reflection(:c).inspect
|
45
|
+
ParParent.association_reflection(:c).inspect.must_equal "#<Sequel::Model::Associations::ManyToOneAssociationReflection ParParent.many_to_one :c, :key=>:c_id, :class=>ParParent>"
|
26
46
|
|
27
47
|
@c.one_to_many :foos do |ds| ds end
|
28
48
|
@c.association_reflection(:foos).inspect.must_equal "#<Sequel::Model::Associations::OneToManyAssociationReflection #{@c.to_s}.one_to_many :foos, :block=>#{@c.association_reflection(:foos)[:block].inspect}>"
|
@@ -286,11 +306,6 @@ describe Sequel::Model::Associations::AssociationReflection do
|
|
286
306
|
def @c.name() "C" end
|
287
307
|
end
|
288
308
|
|
289
|
-
deprecated "#eager_loading_predicate_key should be an alias of predicate_key for backwards compatibility" do
|
290
|
-
@c.one_to_many :cs, :class=>@c
|
291
|
-
@c.dataset.literal(@c.association_reflection(:cs).eager_loading_predicate_key).must_equal 'foo.c_id'
|
292
|
-
end
|
293
|
-
|
294
309
|
it "one_to_many #qualified_primary_key should be a qualified version of the primary key" do
|
295
310
|
@c.one_to_many :cs, :class=>@c
|
296
311
|
@c.dataset.literal(@c.association_reflection(:cs).qualified_primary_key).must_equal 'foo.id'
|
@@ -516,7 +531,7 @@ describe Sequel::Model, " association reflection methods" do
|
|
516
531
|
c.associate :many_to_one, :parent2, :class => @c1
|
517
532
|
@c1.associations.must_equal [:parent]
|
518
533
|
c.associations.sort_by{|x| x.to_s}.must_equal [:parent, :parent2]
|
519
|
-
c.instance_methods.
|
534
|
+
c.instance_methods.must_include(:parent)
|
520
535
|
end
|
521
536
|
end
|
522
537
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe Sequel::Model, "associate" do
|
4
4
|
it "should use explicit class if given a class, symbol, or string" do
|
@@ -449,12 +449,6 @@ describe Sequel::Model, "many_to_one" do
|
|
449
449
|
d.associations[:parent] = 42
|
450
450
|
d.parent(:reload=>true).wont_equal 42
|
451
451
|
DB.sqls.must_equal ["SELECT * FROM nodes WHERE id = 234"]
|
452
|
-
deprecated do
|
453
|
-
d.parent(true).wont_equal 42
|
454
|
-
DB.sqls.must_equal ["SELECT * FROM nodes WHERE id = 234"]
|
455
|
-
d.parent(Object.new).wont_equal 42
|
456
|
-
DB.sqls.must_equal ["SELECT * FROM nodes WHERE id = 234"]
|
457
|
-
end
|
458
452
|
end
|
459
453
|
|
460
454
|
it "should use a callback if given one as the argument" do
|
@@ -571,31 +565,31 @@ describe Sequel::Model, "many_to_one" do
|
|
571
565
|
|
572
566
|
it "should not create the setter method if :read_only option is used" do
|
573
567
|
@c2.many_to_one :parent, :class => @c2, :read_only=>true
|
574
|
-
@c2.instance_methods.
|
575
|
-
@c2.instance_methods.
|
568
|
+
@c2.instance_methods.must_include(:parent)
|
569
|
+
@c2.instance_methods.wont_include(:parent=)
|
576
570
|
end
|
577
571
|
|
578
572
|
it "should not add associations methods directly to class" do
|
579
573
|
@c2.many_to_one :parent, :class => @c2
|
580
|
-
@c2.instance_methods.
|
581
|
-
@c2.instance_methods.
|
582
|
-
@c2.instance_methods(false).
|
583
|
-
@c2.instance_methods(false).
|
574
|
+
@c2.instance_methods.must_include(:parent)
|
575
|
+
@c2.instance_methods.must_include(:parent=)
|
576
|
+
@c2.instance_methods(false).wont_include(:parent)
|
577
|
+
@c2.instance_methods(false).wont_include(:parent=)
|
584
578
|
end
|
585
579
|
|
586
580
|
it "should add associations methods to the :methods_module option" do
|
587
581
|
m = Module.new
|
588
582
|
@c2.many_to_one :parent, :class => @c2, :methods_module=>m
|
589
|
-
m.instance_methods.
|
590
|
-
m.instance_methods.
|
591
|
-
@c2.instance_methods.
|
592
|
-
@c2.instance_methods.
|
583
|
+
m.instance_methods.must_include(:parent)
|
584
|
+
m.instance_methods.must_include(:parent=)
|
585
|
+
@c2.instance_methods.wont_include(:parent)
|
586
|
+
@c2.instance_methods.wont_include(:parent=)
|
593
587
|
end
|
594
588
|
|
595
589
|
it "should add associations methods directly to class if :methods_module is the class itself" do
|
596
590
|
@c2.many_to_one :parent, :class => @c2, :methods_module=>@c2
|
597
|
-
@c2.instance_methods(false).
|
598
|
-
@c2.instance_methods(false).
|
591
|
+
@c2.instance_methods(false).must_include(:parent)
|
592
|
+
@c2.instance_methods(false).must_include(:parent=)
|
599
593
|
end
|
600
594
|
|
601
595
|
it "should raise an error if trying to set a model object that doesn't have a valid primary key" do
|
@@ -607,7 +601,7 @@ describe Sequel::Model, "many_to_one" do
|
|
607
601
|
|
608
602
|
it "should make the change to the foreign_key value inside a _association= method" do
|
609
603
|
@c2.many_to_one :parent, :class => @c2
|
610
|
-
@c2.private_instance_methods.
|
604
|
+
@c2.private_instance_methods.must_include(:_parent=)
|
611
605
|
p = @c2.new
|
612
606
|
c = @c2.load(:id=>123)
|
613
607
|
def p._parent=(x)
|
@@ -679,21 +673,6 @@ describe Sequel::Model, "many_to_one" do
|
|
679
673
|
p.associations[:parent].must_equal :foo
|
680
674
|
end
|
681
675
|
|
682
|
-
deprecated "should raise error and not call internal add or remove method if before callback returns false, even if raise_on_save_failure is false" do
|
683
|
-
p = @c2.new
|
684
|
-
c = @c2.load(:id=>123)
|
685
|
-
p.raise_on_save_failure = false
|
686
|
-
@c2.many_to_one :parent, :class => @c2, :before_set=>:bs
|
687
|
-
def p.bs(x) false end
|
688
|
-
def p._parent=; raise; end
|
689
|
-
proc{p.parent = c}.must_raise(Sequel::HookFailed)
|
690
|
-
|
691
|
-
p.parent.must_be_nil
|
692
|
-
p.associations[:parent] = c
|
693
|
-
p.parent.must_equal c
|
694
|
-
proc{p.parent = nil}.must_raise(Sequel::HookFailed)
|
695
|
-
end
|
696
|
-
|
697
676
|
it "should raise error and not call internal add or remove method if before callback calls cancel_action, even if raise_on_save_failure is false" do
|
698
677
|
p = @c2.new
|
699
678
|
c = @c2.load(:id=>123)
|
@@ -751,9 +730,9 @@ describe Sequel::Model, "one_to_one" do
|
|
751
730
|
|
752
731
|
it "should not add a setter method if the :read_only option is true" do
|
753
732
|
@c2.one_to_one :attribute, :class => @c1, :read_only=>true
|
754
|
-
im = @c2.instance_methods
|
755
|
-
im.must_include(
|
756
|
-
im.wont_include(
|
733
|
+
im = @c2.instance_methods
|
734
|
+
im.must_include(:attribute)
|
735
|
+
im.wont_include(:attribute=)
|
757
736
|
end
|
758
737
|
|
759
738
|
it "should add a setter method" do
|
@@ -761,10 +740,9 @@ describe Sequel::Model, "one_to_one" do
|
|
761
740
|
attrib = @c1.new(:id=>3)
|
762
741
|
@c1.dataset = @c1.dataset.with_fetch(:id=>3)
|
763
742
|
@c2.new(:id => 1234).attribute = attrib
|
764
|
-
sqls =
|
765
|
-
|
766
|
-
|
767
|
-
sqls.must_equal ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)', "SELECT * FROM attributes WHERE id = 3"]
|
743
|
+
DB.sqls.must_equal ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)',
|
744
|
+
'INSERT INTO attributes (id, node_id) VALUES (3, 1234)',
|
745
|
+
"SELECT * FROM attributes WHERE id = 3"]
|
768
746
|
|
769
747
|
@c2.new(:id => 1234).attribute.must_equal attrib
|
770
748
|
attrib = @c1.load(:id=>3)
|
@@ -800,10 +778,9 @@ describe Sequel::Model, "one_to_one" do
|
|
800
778
|
attrib = @c1.new(:id=>3)
|
801
779
|
@c1.dataset = @c1.dataset.with_fetch(:id=>3)
|
802
780
|
@c2.new(:id => 1234, :xxx=>5).attribute = attrib
|
803
|
-
sqls =
|
804
|
-
|
805
|
-
|
806
|
-
sqls.must_equal ['UPDATE attributes SET node_id = NULL WHERE (node_id = 5)', "SELECT * FROM attributes WHERE id = 3"]
|
781
|
+
DB.sqls.must_equal ['UPDATE attributes SET node_id = NULL WHERE (node_id = 5)',
|
782
|
+
'INSERT INTO attributes (id, node_id) VALUES (3, 5)',
|
783
|
+
"SELECT * FROM attributes WHERE id = 3"]
|
807
784
|
|
808
785
|
@c2.new(:id => 321, :xxx=>5).attribute.must_equal attrib
|
809
786
|
attrib = @c1.load(:id=>3)
|
@@ -818,10 +795,8 @@ describe Sequel::Model, "one_to_one" do
|
|
818
795
|
attrib = @c1.load(:id=>3, :y=>6)
|
819
796
|
@c1.dataset = @c1.dataset.with_fetch(:id=>3, :y=>6)
|
820
797
|
@c2.load(:id => 1234, :x=>5).attribute = attrib
|
821
|
-
sqls =
|
822
|
-
|
823
|
-
sqls.first.must_match(/UPDATE attributes SET (node_id|y) = NULL, (node_id|y) = NULL WHERE \(\(node_id = 1234\) AND \(y = 5\) AND \(id != 3\)\)/)
|
824
|
-
sqls.length.must_equal 2
|
798
|
+
DB.sqls.must_equal ["UPDATE attributes SET node_id = NULL, y = NULL WHERE ((node_id = 1234) AND (y = 5) AND (id != 3))",
|
799
|
+
"UPDATE attributes SET y = 5, node_id = 1234 WHERE (id = 3)"]
|
825
800
|
end
|
826
801
|
|
827
802
|
it "should use implicit key if omitted" do
|
@@ -946,10 +921,9 @@ describe Sequel::Model, "one_to_one" do
|
|
946
921
|
@c2.dataset = @c2.dataset.with_fetch(:id => 4321, :blah => 3)
|
947
922
|
d.parent = e
|
948
923
|
e.values.must_equal(:id => 4321, :blah => 3)
|
949
|
-
sqls =
|
950
|
-
|
951
|
-
|
952
|
-
sqls.must_equal ["UPDATE nodes SET blah = NULL WHERE (blah = 3)", "SELECT * FROM nodes WHERE id = 4321"]
|
924
|
+
DB.sqls.must_equal ["UPDATE nodes SET blah = NULL WHERE (blah = 3)",
|
925
|
+
"INSERT INTO nodes (id, blah) VALUES (4321, 3)",
|
926
|
+
"SELECT * FROM nodes WHERE id = 4321"]
|
953
927
|
end
|
954
928
|
|
955
929
|
it "should persist changes to associated object when the setter is called" do
|
@@ -999,10 +973,6 @@ describe Sequel::Model, "one_to_one" do
|
|
999
973
|
d.associations[:parent] = [42]
|
1000
974
|
d.parent(:reload=>true).wont_equal 42
|
1001
975
|
DB.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
|
1002
|
-
deprecated do
|
1003
|
-
d.parent(true).wont_equal 42
|
1004
|
-
DB.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
|
1005
|
-
end
|
1006
976
|
end
|
1007
977
|
|
1008
978
|
it "should have the setter set the reciprocal many_to_one cached association" do
|
@@ -1054,10 +1024,10 @@ describe Sequel::Model, "one_to_one" do
|
|
1054
1024
|
|
1055
1025
|
it "should not add associations methods directly to class" do
|
1056
1026
|
@c2.one_to_one :parent, :class => @c2
|
1057
|
-
@c2.instance_methods.
|
1058
|
-
@c2.instance_methods.
|
1059
|
-
@c2.instance_methods(false).
|
1060
|
-
@c2.instance_methods(false).
|
1027
|
+
@c2.instance_methods.must_include(:parent)
|
1028
|
+
@c2.instance_methods.must_include(:parent=)
|
1029
|
+
@c2.instance_methods(false).wont_include(:parent)
|
1030
|
+
@c2.instance_methods(false).wont_include(:parent=)
|
1061
1031
|
end
|
1062
1032
|
|
1063
1033
|
it "should raise an error if the current model object that doesn't have a valid primary key" do
|
@@ -1069,7 +1039,7 @@ describe Sequel::Model, "one_to_one" do
|
|
1069
1039
|
|
1070
1040
|
it "should make the change to the foreign_key value inside a _association= method" do
|
1071
1041
|
@c2.one_to_one :parent, :class => @c2
|
1072
|
-
@c2.private_instance_methods.
|
1042
|
+
@c2.private_instance_methods.must_include(:_parent=)
|
1073
1043
|
c = @c2.new
|
1074
1044
|
p = @c2.load(:id=>123)
|
1075
1045
|
def p._parent=(x)
|
@@ -1126,21 +1096,6 @@ describe Sequel::Model, "one_to_one" do
|
|
1126
1096
|
parent.pk.must_equal 20
|
1127
1097
|
end
|
1128
1098
|
|
1129
|
-
deprecated "should raise error and not call internal add or remove method if before callback returns false, even if raise_on_save_failure is false" do
|
1130
|
-
p = @c2.load(:id=>321)
|
1131
|
-
c = @c2.load(:id=>123)
|
1132
|
-
p.raise_on_save_failure = false
|
1133
|
-
@c2.one_to_one :parent, :class => @c2, :before_set=>:bs
|
1134
|
-
def p.bs(x) false end
|
1135
|
-
def p._parent=; raise; end
|
1136
|
-
proc{p.parent = c}.must_raise(Sequel::HookFailed)
|
1137
|
-
|
1138
|
-
p.associations[:parent].must_be_nil
|
1139
|
-
p.associations[:parent] = c
|
1140
|
-
p.parent.must_equal c
|
1141
|
-
proc{p.parent = nil}.must_raise(Sequel::HookFailed)
|
1142
|
-
end
|
1143
|
-
|
1144
1099
|
it "should raise error and not call internal add or remove method if before callback calls cancel_action, even if raise_on_save_failure is false" do
|
1145
1100
|
p = @c2.load(:id=>321)
|
1146
1101
|
c = @c2.load(:id=>123)
|
@@ -1253,15 +1208,6 @@ describe Sequel::Model, "one_to_many" do
|
|
1253
1208
|
DB.sqls.must_equal ["SELECT * FROM attributes WHERE ((attributes.nodeid = 1234) AND (name > 'M'))"]
|
1254
1209
|
end
|
1255
1210
|
|
1256
|
-
deprecated "should use a callback if given one as the argument" do
|
1257
|
-
@c2.one_to_many :attributes, :class => @c1, :key => :nodeid
|
1258
|
-
|
1259
|
-
d = @c2.load(:id => 1234)
|
1260
|
-
d.associations[:attributes] = []
|
1261
|
-
d.attributes(proc{|ds| ds.filter{name > 'M'}}).wont_equal []
|
1262
|
-
DB.sqls.must_equal ["SELECT * FROM attributes WHERE ((attributes.nodeid = 1234) AND (name > 'M'))"]
|
1263
|
-
end
|
1264
|
-
|
1265
1211
|
it "should use explicit key if given" do
|
1266
1212
|
@c2.one_to_many :attributes, :class => @c1, :key => :nodeid
|
1267
1213
|
@c2.new(:id => 1234).attributes_dataset.sql.must_equal 'SELECT * FROM attributes WHERE (attributes.nodeid = 1234)'
|
@@ -1303,9 +1249,8 @@ describe Sequel::Model, "one_to_many" do
|
|
1303
1249
|
a = @c1.new(:id => 234)
|
1304
1250
|
@c1.dataset = @c1.dataset.with_fetch(:id=>234, :node_id=>1234)
|
1305
1251
|
a.must_equal n.add_attribute(a)
|
1306
|
-
sqls
|
1307
|
-
|
1308
|
-
sqls.must_equal ["SELECT * FROM attributes WHERE id = 234"]
|
1252
|
+
DB.sqls.must_equal ["INSERT INTO attributes (id, node_id) VALUES (234, 1234)",
|
1253
|
+
"SELECT * FROM attributes WHERE id = 234"]
|
1309
1254
|
a.values.must_equal(:node_id => 1234, :id => 234)
|
1310
1255
|
end
|
1311
1256
|
|
@@ -1335,9 +1280,8 @@ describe Sequel::Model, "one_to_many" do
|
|
1335
1280
|
DB.reset
|
1336
1281
|
@c1.dataset = @c1.dataset.with_fetch(:node_id => 1234, :id => 234)
|
1337
1282
|
n.add_attribute(:id => 234).must_equal @c1.load(:node_id => 1234, :id => 234)
|
1338
|
-
sqls
|
1339
|
-
|
1340
|
-
sqls.must_equal ["SELECT * FROM attributes WHERE id = 234"]
|
1283
|
+
DB.sqls.must_equal ["INSERT INTO attributes (id, node_id) VALUES (234, 1234)",
|
1284
|
+
"SELECT * FROM attributes WHERE id = 234"]
|
1341
1285
|
end
|
1342
1286
|
|
1343
1287
|
it "should accept a primary key for the add_ method" do
|
@@ -1403,9 +1347,7 @@ describe Sequel::Model, "one_to_many" do
|
|
1403
1347
|
n = @c2.load(:id => 1234, :x=>5)
|
1404
1348
|
a = @c1.load(:id => 2345)
|
1405
1349
|
n.add_attribute(a).must_equal a
|
1406
|
-
sqls =
|
1407
|
-
sqls.shift.must_match(/UPDATE attributes SET (node_id = 1234|y = 5), (node_id = 1234|y = 5) WHERE \(id = 2345\)/)
|
1408
|
-
sqls.must_equal []
|
1350
|
+
DB.sqls.must_equal ["UPDATE attributes SET node_id = 1234, y = 5 WHERE (id = 2345)"]
|
1409
1351
|
end
|
1410
1352
|
|
1411
1353
|
it "should have add_ method accept a composite key" do
|
@@ -1416,10 +1358,8 @@ describe Sequel::Model, "one_to_many" do
|
|
1416
1358
|
n = @c2.load(:id => 1234, :x=>5)
|
1417
1359
|
a = @c1.load(:id => 2345, :z => 8, :node_id => 1234, :y=>5)
|
1418
1360
|
n.add_attribute([2345, 8]).must_equal a
|
1419
|
-
sqls =
|
1420
|
-
|
1421
|
-
sqls.shift.must_match(/UPDATE attributes SET (node_id|y) = (1234|5), (node_id|y) = (1234|5) WHERE \(\((id|z) = (2345|8)\) AND \((id|z) = (2345|8)\)\)/)
|
1422
|
-
sqls.must_equal []
|
1361
|
+
DB.sqls.must_equal ["SELECT * FROM attributes WHERE ((id = 2345) AND (z = 8)) LIMIT 1",
|
1362
|
+
"UPDATE attributes SET node_id = 1234, y = 5 WHERE ((id = 2345) AND (z = 8))"]
|
1423
1363
|
end
|
1424
1364
|
|
1425
1365
|
it "should have remove_ method respect composite keys" do
|
@@ -1428,9 +1368,8 @@ describe Sequel::Model, "one_to_many" do
|
|
1428
1368
|
n = @c2.load(:id => 1234, :x=>5)
|
1429
1369
|
a = @c1.load(:id => 2345, :node_id=>1234, :y=>5)
|
1430
1370
|
n.remove_attribute(a).must_equal a
|
1431
|
-
sqls =
|
1432
|
-
|
1433
|
-
sqls.must_equal ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.y = 5) AND (id = 2345)) LIMIT 1"]
|
1371
|
+
DB.sqls.must_equal ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.y = 5) AND (id = 2345)) LIMIT 1",
|
1372
|
+
"UPDATE attributes SET node_id = NULL, y = NULL WHERE (id = 2345)"]
|
1434
1373
|
end
|
1435
1374
|
|
1436
1375
|
it "should accept a array of composite primary key values for the remove_ method and remove an existing record" do
|
@@ -1439,10 +1378,8 @@ describe Sequel::Model, "one_to_many" do
|
|
1439
1378
|
@c2.one_to_many :attributes, :class => @c1, :key=>:node_id, :primary_key=>:id
|
1440
1379
|
n = @c2.new(:id => 123)
|
1441
1380
|
n.remove_attribute([234, 5]).must_equal @c1.load(:node_id => nil, :y => 5, :id => 234)
|
1442
|
-
sqls =
|
1443
|
-
|
1444
|
-
sqls.first.must_match(/SELECT \* FROM attributes WHERE \(\(attributes.node_id = 123\) AND \(attributes\.(id|y) = (234|5)\) AND \(attributes\.(id|y) = (234|5)\)\) LIMIT 1/)
|
1445
|
-
sqls.last.must_match(/UPDATE attributes SET node_id = NULL WHERE \(\((id|y) = (234|5)\) AND \((id|y) = (234|5)\)\)/)
|
1381
|
+
DB.sqls.must_equal ["SELECT * FROM attributes WHERE ((attributes.node_id = 123) AND (attributes.id = 234) AND (attributes.y = 5)) LIMIT 1",
|
1382
|
+
"UPDATE attributes SET node_id = NULL WHERE ((id = 234) AND (y = 5))"]
|
1446
1383
|
end
|
1447
1384
|
|
1448
1385
|
it "should raise an error in add_ and remove_ if the passed object returns false to save (is not valid)" do
|
@@ -1584,10 +1521,6 @@ describe Sequel::Model, "one_to_many" do
|
|
1584
1521
|
n.associations[:attributes] = 42
|
1585
1522
|
n.attributes(:reload=>true).wont_equal 42
|
1586
1523
|
DB.sqls.must_equal ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
|
1587
|
-
deprecated do
|
1588
|
-
n.attributes(true).wont_equal 42
|
1589
|
-
DB.sqls.must_equal ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
|
1590
|
-
end
|
1591
1524
|
end
|
1592
1525
|
|
1593
1526
|
it "should add item to cache if it exists when calling add_" do
|
@@ -1635,28 +1568,28 @@ describe Sequel::Model, "one_to_many" do
|
|
1635
1568
|
|
1636
1569
|
it "should not create the add_, remove_, or remove_all_ methods if :read_only option is used" do
|
1637
1570
|
@c2.one_to_many :attributes, :class => @c1, :read_only=>true
|
1638
|
-
im = @c2.instance_methods
|
1639
|
-
im.must_include(
|
1640
|
-
im.must_include(
|
1641
|
-
im.wont_include(
|
1642
|
-
im.wont_include(
|
1643
|
-
im.wont_include(
|
1571
|
+
im = @c2.instance_methods
|
1572
|
+
im.must_include(:attributes)
|
1573
|
+
im.must_include(:attributes_dataset)
|
1574
|
+
im.wont_include(:add_attribute)
|
1575
|
+
im.wont_include(:remove_attribute)
|
1576
|
+
im.wont_include(:remove_all_attributes)
|
1644
1577
|
end
|
1645
1578
|
|
1646
1579
|
it "should not add associations methods directly to class" do
|
1647
1580
|
@c2.one_to_many :attributes, :class => @c1
|
1648
|
-
im = @c2.instance_methods
|
1649
|
-
im.must_include(
|
1650
|
-
im.must_include(
|
1651
|
-
im.must_include(
|
1652
|
-
im.must_include(
|
1653
|
-
im.must_include(
|
1654
|
-
im2 = @c2.instance_methods(false)
|
1655
|
-
im2.wont_include(
|
1656
|
-
im2.wont_include(
|
1657
|
-
im2.wont_include(
|
1658
|
-
im2.wont_include(
|
1659
|
-
im2.wont_include(
|
1581
|
+
im = @c2.instance_methods
|
1582
|
+
im.must_include(:attributes)
|
1583
|
+
im.must_include(:attributes_dataset)
|
1584
|
+
im.must_include(:add_attribute)
|
1585
|
+
im.must_include(:remove_attribute)
|
1586
|
+
im.must_include(:remove_all_attributes)
|
1587
|
+
im2 = @c2.instance_methods(false)
|
1588
|
+
im2.wont_include(:attributes)
|
1589
|
+
im2.wont_include(:attributes_dataset)
|
1590
|
+
im2.wont_include(:add_attribute)
|
1591
|
+
im2.wont_include(:remove_attribute)
|
1592
|
+
im2.wont_include(:remove_all_attributes)
|
1660
1593
|
end
|
1661
1594
|
|
1662
1595
|
it "should populate the reciprocal many_to_one cache when loading the one_to_many association" do
|
@@ -1705,9 +1638,7 @@ describe Sequel::Model, "one_to_many" do
|
|
1705
1638
|
it "should have the remove_all_ method respect composite keys" do
|
1706
1639
|
@c2.one_to_many :attributes, :class => @c1, :key=>[:node_id, :y], :primary_key=>[:id, :x]
|
1707
1640
|
@c2.new(:id => 1234, :x=>5).remove_all_attributes
|
1708
|
-
sqls =
|
1709
|
-
sqls.pop.must_match(/UPDATE attributes SET (node_id|y) = NULL, (node_id|y) = NULL WHERE \(\(node_id = 1234\) AND \(y = 5\)\)/)
|
1710
|
-
sqls.must_equal []
|
1641
|
+
DB.sqls.must_equal ["UPDATE attributes SET node_id = NULL, y = NULL WHERE ((node_id = 1234) AND (y = 5))"]
|
1711
1642
|
end
|
1712
1643
|
|
1713
1644
|
it "remove_all should set the cache to []" do
|
@@ -1750,7 +1681,7 @@ describe Sequel::Model, "one_to_many" do
|
|
1750
1681
|
|
1751
1682
|
it "should call an _add_ method internally to add attributes" do
|
1752
1683
|
@c2.one_to_many :attributes, :class => @c1
|
1753
|
-
@c2.private_instance_methods.
|
1684
|
+
@c2.private_instance_methods.must_include(:_add_attribute)
|
1754
1685
|
p = @c2.load(:id=>10)
|
1755
1686
|
c = @c1.load(:id=>123)
|
1756
1687
|
def p._add_attribute(x)
|
@@ -1786,7 +1717,7 @@ describe Sequel::Model, "one_to_many" do
|
|
1786
1717
|
|
1787
1718
|
it "should call a _remove_ method internally to remove attributes" do
|
1788
1719
|
@c2.one_to_many :attributes, :class => @c1
|
1789
|
-
@c2.private_instance_methods.
|
1720
|
+
@c2.private_instance_methods.must_include(:_remove_attribute)
|
1790
1721
|
p = @c2.load(:id=>10)
|
1791
1722
|
c = @c1.load(:id=>123)
|
1792
1723
|
def p._remove_attribute(x)
|
@@ -1834,7 +1765,7 @@ describe Sequel::Model, "one_to_many" do
|
|
1834
1765
|
|
1835
1766
|
it "should call a _remove_all_ method internally to remove attributes" do
|
1836
1767
|
@c2.one_to_many :attributes, :class => @c1
|
1837
|
-
@c2.private_instance_methods.
|
1768
|
+
@c2.private_instance_methods.must_include(:_remove_all_attributes)
|
1838
1769
|
p = @c2.load(:id=>10)
|
1839
1770
|
def p._remove_all_attributes
|
1840
1771
|
@x = :foo
|
@@ -1893,39 +1824,6 @@ describe Sequel::Model, "one_to_many" do
|
|
1893
1824
|
attributes.collect{|a| a.pk}.must_equal [20, 30]
|
1894
1825
|
end
|
1895
1826
|
|
1896
|
-
deprecated "should raise error and not call internal add or remove method if before callback returns false if raise_on_save_failure is true" do
|
1897
|
-
p = @c2.load(:id=>10)
|
1898
|
-
c = @c1.load(:id=>123)
|
1899
|
-
@c2.one_to_many :attributes, :class => @c1, :before_add=>:ba, :before_remove=>:br
|
1900
|
-
def p.ba(c) false end
|
1901
|
-
def p._add_attribute; raise; end
|
1902
|
-
def p._remove_attribute; raise; end
|
1903
|
-
p.associations[:attributes] = []
|
1904
|
-
proc{p.add_attribute(c)}.must_raise(Sequel::HookFailed)
|
1905
|
-
p.attributes.must_equal []
|
1906
|
-
p.associations[:attributes] = [c]
|
1907
|
-
def p.br(c) false end
|
1908
|
-
proc{p.remove_attribute(c)}.must_raise(Sequel::HookFailed)
|
1909
|
-
p.attributes.must_equal [c]
|
1910
|
-
end
|
1911
|
-
|
1912
|
-
deprecated "should return nil and not call internal add or remove method if before callback returns false if raise_on_save_failure is false" do
|
1913
|
-
p = @c2.load(:id=>10)
|
1914
|
-
c = @c1.load(:id=>123)
|
1915
|
-
p.raise_on_save_failure = false
|
1916
|
-
@c2.one_to_many :attributes, :class => @c1, :before_add=>:ba, :before_remove=>:br
|
1917
|
-
def p.ba(c) false end
|
1918
|
-
def p._add_attribute; raise; end
|
1919
|
-
def p._remove_attribute; raise; end
|
1920
|
-
p.associations[:attributes] = []
|
1921
|
-
p.add_attribute(c).must_be_nil
|
1922
|
-
p.attributes.must_equal []
|
1923
|
-
p.associations[:attributes] = [c]
|
1924
|
-
def p.br(c) false end
|
1925
|
-
p.remove_attribute(c).must_be_nil
|
1926
|
-
p.attributes.must_equal [c]
|
1927
|
-
end
|
1928
|
-
|
1929
1827
|
it "should raise error and not call internal add or remove method if before callback calls cancel_action if raise_on_save_failure is true" do
|
1930
1828
|
p = @c2.load(:id=>10)
|
1931
1829
|
c = @c1.load(:id=>123)
|
@@ -2066,11 +1964,6 @@ describe Sequel::Model, "many_to_many" do
|
|
2066
1964
|
@c2.new(:id => 1234).attributes_dataset.sql.must_equal 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)'
|
2067
1965
|
end
|
2068
1966
|
|
2069
|
-
deprecated "should respect :eager_loading_predicate_key when lazily loading" do
|
2070
|
-
@c2.many_to_many :attributes, :class => @c1, :eager_loading_predicate_key=>Sequel.subscript(Sequel[:attributes_nodes][:node_id], 0)
|
2071
|
-
@c2.new(:id => 1234).attributes_dataset.sql.must_equal 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id[0] = 1234)'
|
2072
|
-
end
|
2073
|
-
|
2074
1967
|
it "should respect :predicate_key when lazily loading" do
|
2075
1968
|
@c2.many_to_many :attributes, :class => @c1, :predicate_key=>Sequel.subscript(Sequel[:attributes_nodes][:node_id], 0)
|
2076
1969
|
@c2.new(:id => 1234).attributes_dataset.sql.must_equal 'SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id[0] = 1234)'
|
@@ -2206,12 +2099,9 @@ describe Sequel::Model, "many_to_many" do
|
|
2206
2099
|
a.must_equal n.add_attribute(a)
|
2207
2100
|
a.must_equal n.remove_attribute(a)
|
2208
2101
|
n.remove_all_attributes
|
2209
|
-
sqls
|
2210
|
-
|
2211
|
-
|
2212
|
-
["DELETE FROM attribute2node WHERE ((node_id = 1234) AND (attribute_id = 2345))",
|
2213
|
-
"DELETE FROM attribute2node WHERE ((attribute_id = 2345) AND (node_id = 1234))"].must_include(sqls.shift)
|
2214
|
-
sqls.must_equal ["DELETE FROM attribute2node WHERE (node_id = 1234)"]
|
2102
|
+
DB.sqls.must_equal ["INSERT INTO attribute2node (node_id, attribute_id) VALUES (1234, 2345)",
|
2103
|
+
"DELETE FROM attribute2node WHERE ((node_id = 1234) AND (attribute_id = 2345))",
|
2104
|
+
"DELETE FROM attribute2node WHERE (node_id = 1234)"]
|
2215
2105
|
end
|
2216
2106
|
|
2217
2107
|
with_symbol_splitting "should handle an aliased symbol join table" do
|
@@ -2222,12 +2112,9 @@ describe Sequel::Model, "many_to_many" do
|
|
2222
2112
|
a.must_equal n.add_attribute(a)
|
2223
2113
|
a.must_equal n.remove_attribute(a)
|
2224
2114
|
n.remove_all_attributes
|
2225
|
-
sqls
|
2226
|
-
|
2227
|
-
|
2228
|
-
["DELETE FROM attribute2node WHERE ((node_id = 1234) AND (attribute_id = 2345))",
|
2229
|
-
"DELETE FROM attribute2node WHERE ((attribute_id = 2345) AND (node_id = 1234))"].must_include(sqls.shift)
|
2230
|
-
sqls.must_equal ["DELETE FROM attribute2node WHERE (node_id = 1234)"]
|
2115
|
+
DB.sqls.must_equal ["INSERT INTO attribute2node (node_id, attribute_id) VALUES (1234, 2345)",
|
2116
|
+
"DELETE FROM attribute2node WHERE ((node_id = 1234) AND (attribute_id = 2345))",
|
2117
|
+
"DELETE FROM attribute2node WHERE (node_id = 1234)"]
|
2231
2118
|
end
|
2232
2119
|
|
2233
2120
|
it "should define an add_ method that works on existing records" do
|
@@ -2236,10 +2123,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2236
2123
|
n = @c2.load(:id => 1234)
|
2237
2124
|
a = @c1.load(:id => 2345)
|
2238
2125
|
n.add_attribute(a).must_equal a
|
2239
|
-
sqls
|
2240
|
-
['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)',
|
2241
|
-
'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (2345, 1234)'].must_include(sqls.shift)
|
2242
|
-
sqls.must_equal []
|
2126
|
+
DB.sqls.must_equal ["INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)"]
|
2243
2127
|
end
|
2244
2128
|
|
2245
2129
|
it "should define an add_ method that works with a primary key" do
|
@@ -2249,10 +2133,8 @@ describe Sequel::Model, "many_to_many" do
|
|
2249
2133
|
a = @c1.load(:id => 2345)
|
2250
2134
|
@c1.dataset = @c1.dataset.with_fetch(:id=>2345)
|
2251
2135
|
n.add_attribute(2345).must_equal a
|
2252
|
-
sqls =
|
2253
|
-
|
2254
|
-
'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (2345, 1234)'].must_include(sqls.pop)
|
2255
|
-
sqls.must_equal ["SELECT * FROM attributes WHERE id = 2345"]
|
2136
|
+
DB.sqls.must_equal ["SELECT * FROM attributes WHERE id = 2345",
|
2137
|
+
"INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)"]
|
2256
2138
|
end
|
2257
2139
|
|
2258
2140
|
it "should raise an error if the primary key passed to the add_ method does not match an existing record" do
|
@@ -2270,11 +2152,9 @@ describe Sequel::Model, "many_to_many" do
|
|
2270
2152
|
n = @c2.load(:id => 1234)
|
2271
2153
|
@c1.dataset = @c1.dataset.with_fetch(:id=>1)
|
2272
2154
|
n.add_attribute(:id => 1).must_equal @c1.load(:id => 1)
|
2273
|
-
sqls
|
2274
|
-
|
2275
|
-
|
2276
|
-
].must_include(sqls.pop)
|
2277
|
-
sqls.must_equal ['INSERT INTO attributes (id) VALUES (1)', "SELECT * FROM attributes WHERE id = 1"]
|
2155
|
+
DB.sqls.must_equal ['INSERT INTO attributes (id) VALUES (1)',
|
2156
|
+
"SELECT * FROM attributes WHERE id = 1",
|
2157
|
+
"INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 1)"]
|
2278
2158
|
end
|
2279
2159
|
|
2280
2160
|
it "should define a remove_ method that works on existing records" do
|
@@ -2311,11 +2191,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2311
2191
|
n = @c2.load(:id => 1234).set(:xxx=>5)
|
2312
2192
|
a = @c1.load(:id => 2345).set(:yyy=>8)
|
2313
2193
|
n.add_attribute(a).must_equal a
|
2314
|
-
sqls
|
2315
|
-
['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (5, 8)',
|
2316
|
-
'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (8, 5)'
|
2317
|
-
].must_include(sqls.pop)
|
2318
|
-
sqls.must_equal []
|
2194
|
+
DB.sqls.must_equal ["INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (5, 8)"]
|
2319
2195
|
end
|
2320
2196
|
|
2321
2197
|
it "should have add_ method not add the same object to the cached association array if the object is already in the array" do
|
@@ -2358,10 +2234,8 @@ describe Sequel::Model, "many_to_many" do
|
|
2358
2234
|
n = @c2.load(:id => 1234, :x=>5)
|
2359
2235
|
a = @c1.load(:id => 2345, :z=>8)
|
2360
2236
|
n.add_attribute([2345, 8]).must_equal a
|
2361
|
-
sqls =
|
2362
|
-
|
2363
|
-
sqls.pop.must_match(/INSERT INTO attributes_nodes \([lr][12], [lr][12], [lr][12], [lr][12]\) VALUES \((1234|5|2345|8), (1234|5|2345|8), (1234|5|2345|8), (1234|5|2345|8)\)/)
|
2364
|
-
sqls.must_equal []
|
2237
|
+
DB.sqls.must_equal ["SELECT * FROM attributes WHERE ((id = 2345) AND (z = 8)) LIMIT 1",
|
2238
|
+
"INSERT INTO attributes_nodes (l1, l2, r1, r2) VALUES (1234, 5, 2345, 8)"]
|
2365
2239
|
end
|
2366
2240
|
|
2367
2241
|
it "should have the remove_ method respect the :left_primary_key and :right_primary_key options" do
|
@@ -2387,10 +2261,8 @@ describe Sequel::Model, "many_to_many" do
|
|
2387
2261
|
@c2.many_to_many :attributes, :class => @c1
|
2388
2262
|
n = @c2.new(:id => 1234)
|
2389
2263
|
@c1.load(:id => 234, :y=>8).must_equal n.remove_attribute([234, 8])
|
2390
|
-
sqls =
|
2391
|
-
|
2392
|
-
"SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.y = 8) AND (attributes.id = 234)) LIMIT 1"].must_include(sqls.shift)
|
2393
|
-
sqls.must_equal ["DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
|
2264
|
+
DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.id = 234) AND (attributes.y = 8)) LIMIT 1",
|
2265
|
+
"DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
|
2394
2266
|
end
|
2395
2267
|
|
2396
2268
|
it "should raise an error if the model object doesn't have a valid primary key" do
|
@@ -2479,10 +2351,6 @@ describe Sequel::Model, "many_to_many" do
|
|
2479
2351
|
n.associations[:attributes] = 42
|
2480
2352
|
n.attributes(:reload=>true).wont_equal 42
|
2481
2353
|
DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)"]
|
2482
|
-
deprecated do
|
2483
|
-
n.attributes(true).wont_equal 42
|
2484
|
-
DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234)"]
|
2485
|
-
end
|
2486
2354
|
end
|
2487
2355
|
|
2488
2356
|
it "should add item to cache if it exists when calling add_" do
|
@@ -2531,28 +2399,28 @@ describe Sequel::Model, "many_to_many" do
|
|
2531
2399
|
|
2532
2400
|
it "should not create the add_, remove_, or remove_all_ methods if :read_only option is used" do
|
2533
2401
|
@c2.many_to_many :attributes, :class => @c1, :read_only=>true
|
2534
|
-
im = @c2.instance_methods
|
2535
|
-
im.must_include(
|
2536
|
-
im.must_include(
|
2537
|
-
im.wont_include(
|
2538
|
-
im.wont_include(
|
2539
|
-
im.wont_include(
|
2402
|
+
im = @c2.instance_methods
|
2403
|
+
im.must_include(:attributes)
|
2404
|
+
im.must_include(:attributes_dataset)
|
2405
|
+
im.wont_include(:add_attribute)
|
2406
|
+
im.wont_include(:remove_attribute)
|
2407
|
+
im.wont_include(:remove_all_attributes)
|
2540
2408
|
end
|
2541
2409
|
|
2542
2410
|
it "should not add associations methods directly to class" do
|
2543
2411
|
@c2.many_to_many :attributes, :class => @c1
|
2544
|
-
im = @c2.instance_methods
|
2545
|
-
im.must_include(
|
2546
|
-
im.must_include(
|
2547
|
-
im.must_include(
|
2548
|
-
im.must_include(
|
2549
|
-
im.must_include(
|
2550
|
-
im2 = @c2.instance_methods(false)
|
2551
|
-
im2.wont_include(
|
2552
|
-
im2.wont_include(
|
2553
|
-
im2.wont_include(
|
2554
|
-
im2.wont_include(
|
2555
|
-
im2.wont_include(
|
2412
|
+
im = @c2.instance_methods
|
2413
|
+
im.must_include(:attributes)
|
2414
|
+
im.must_include(:attributes_dataset)
|
2415
|
+
im.must_include(:add_attribute)
|
2416
|
+
im.must_include(:remove_attribute)
|
2417
|
+
im.must_include(:remove_all_attributes)
|
2418
|
+
im2 = @c2.instance_methods(false)
|
2419
|
+
im2.wont_include(:attributes)
|
2420
|
+
im2.wont_include(:attributes_dataset)
|
2421
|
+
im2.wont_include(:add_attribute)
|
2422
|
+
im2.wont_include(:remove_attribute)
|
2423
|
+
im2.wont_include(:remove_all_attributes)
|
2556
2424
|
end
|
2557
2425
|
|
2558
2426
|
it "should have an remove_all_ method that removes all associations" do
|
@@ -2625,7 +2493,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2625
2493
|
|
2626
2494
|
it "should call an _add_ method internally to add attributes" do
|
2627
2495
|
@c2.many_to_many :attributes, :class => @c1
|
2628
|
-
@c2.private_instance_methods.
|
2496
|
+
@c2.private_instance_methods.must_include(:_add_attribute)
|
2629
2497
|
p = @c2.load(:id=>10)
|
2630
2498
|
c = @c1.load(:id=>123)
|
2631
2499
|
def p._add_attribute(x)
|
@@ -2660,7 +2528,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2660
2528
|
|
2661
2529
|
it "should call a _remove_ method internally to remove attributes" do
|
2662
2530
|
@c2.many_to_many :attributes, :class => @c1
|
2663
|
-
@c2.private_instance_methods.
|
2531
|
+
@c2.private_instance_methods.must_include(:_remove_attribute)
|
2664
2532
|
p = @c2.load(:id=>10)
|
2665
2533
|
c = @c1.load(:id=>123)
|
2666
2534
|
def p._remove_attribute(x)
|
@@ -2705,7 +2573,7 @@ describe Sequel::Model, "many_to_many" do
|
|
2705
2573
|
|
2706
2574
|
it "should call a _remove_all_ method internally to remove attributes" do
|
2707
2575
|
@c2.many_to_many :attributes, :class => @c1
|
2708
|
-
@c2.private_instance_methods.
|
2576
|
+
@c2.private_instance_methods.must_include(:_remove_all_attributes)
|
2709
2577
|
p = @c2.load(:id=>10)
|
2710
2578
|
def p._remove_all_attributes
|
2711
2579
|
@x = :foo
|
@@ -2766,40 +2634,6 @@ describe Sequel::Model, "many_to_many" do
|
|
2766
2634
|
attributes.collect{|a| a.pk}.must_equal [20, 30]
|
2767
2635
|
end
|
2768
2636
|
|
2769
|
-
deprecated "should raise error and not call internal add or remove method if before callback returns false if raise_on_save_failure is true" do
|
2770
|
-
p = @c2.load(:id=>10)
|
2771
|
-
c = @c1.load(:id=>123)
|
2772
|
-
@c2.many_to_many :attributes, :class => @c1, :before_add=>:ba, :before_remove=>:br
|
2773
|
-
def p.ba(c) false end
|
2774
|
-
def p._add_attribute; raise; end
|
2775
|
-
def p._remove_attribute; raise; end
|
2776
|
-
p.associations[:attributes] = []
|
2777
|
-
p.raise_on_save_failure = true
|
2778
|
-
proc{p.add_attribute(c)}.must_raise(Sequel::HookFailed)
|
2779
|
-
p.attributes.must_equal []
|
2780
|
-
p.associations[:attributes] = [c]
|
2781
|
-
def p.br(c) false end
|
2782
|
-
proc{p.remove_attribute(c)}.must_raise(Sequel::HookFailed)
|
2783
|
-
p.attributes.must_equal [c]
|
2784
|
-
end
|
2785
|
-
|
2786
|
-
deprecated "should return nil and not call internal add or remove method if before callback returns false if raise_on_save_failure is false" do
|
2787
|
-
p = @c2.load(:id=>10)
|
2788
|
-
c = @c1.load(:id=>123)
|
2789
|
-
p.raise_on_save_failure = false
|
2790
|
-
@c2.many_to_many :attributes, :class => @c1, :before_add=>:ba, :before_remove=>:br
|
2791
|
-
def p.ba(c) false end
|
2792
|
-
def p._add_attribute; raise; end
|
2793
|
-
def p._remove_attribute; raise; end
|
2794
|
-
p.associations[:attributes] = []
|
2795
|
-
p.add_attribute(c).must_be_nil
|
2796
|
-
p.attributes.must_equal []
|
2797
|
-
p.associations[:attributes] = [c]
|
2798
|
-
def p.br(c) false end
|
2799
|
-
p.remove_attribute(c).must_be_nil
|
2800
|
-
p.attributes.must_equal [c]
|
2801
|
-
end
|
2802
|
-
|
2803
2637
|
it "should raise error and not call internal add or remove method if before callback calls cancel_action if raise_on_save_failure is true" do
|
2804
2638
|
p = @c2.load(:id=>10)
|
2805
2639
|
c = @c1.load(:id=>123)
|
@@ -3077,20 +2911,16 @@ describe Sequel::Model, "one_through_one" do
|
|
3077
2911
|
n.associations[:attribute] = 42
|
3078
2912
|
n.attribute(:reload=>true).wont_equal 42
|
3079
2913
|
DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1"]
|
3080
|
-
deprecated do
|
3081
|
-
n.attribute(true).wont_equal 42
|
3082
|
-
DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE (attributes_nodes.node_id = 1234) LIMIT 1"]
|
3083
|
-
end
|
3084
2914
|
end
|
3085
2915
|
|
3086
2916
|
it "should not add associations methods directly to class" do
|
3087
2917
|
@c2.one_through_one :attribute, :class => @c1
|
3088
|
-
im = @c2.instance_methods
|
3089
|
-
im.must_include(
|
3090
|
-
im.must_include(
|
3091
|
-
im2 = @c2.instance_methods(false)
|
3092
|
-
im2.wont_include(
|
3093
|
-
im2.wont_include(
|
2918
|
+
im = @c2.instance_methods
|
2919
|
+
im.must_include(:attribute)
|
2920
|
+
im.must_include(:attribute_dataset)
|
2921
|
+
im2 = @c2.instance_methods(false)
|
2922
|
+
im2.wont_include(:attribute)
|
2923
|
+
im2.wont_include(:attribute_dataset)
|
3094
2924
|
end
|
3095
2925
|
|
3096
2926
|
it "should support after_load association callback" do
|
@@ -3116,9 +2946,9 @@ describe Sequel::Model, "one_through_one" do
|
|
3116
2946
|
|
3117
2947
|
it "should not add a setter method if the :read_only option is true" do
|
3118
2948
|
@c2.one_through_one :attribute, :class => @c1, :read_only=>true
|
3119
|
-
im = @c2.instance_methods
|
3120
|
-
im.must_include(
|
3121
|
-
im.wont_include(
|
2949
|
+
im = @c2.instance_methods
|
2950
|
+
im.must_include(:attribute)
|
2951
|
+
im.wont_include(:attribute=)
|
3122
2952
|
end
|
3123
2953
|
|
3124
2954
|
it "should add a setter method" do
|
@@ -3130,10 +2960,8 @@ describe Sequel::Model, "one_through_one" do
|
|
3130
2960
|
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 1234) LIMIT 1"]
|
3131
2961
|
|
3132
2962
|
o.attribute = attrib
|
3133
|
-
sqls =
|
3134
|
-
|
3135
|
-
"INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 3)"].must_include(sqls.slice! 1)
|
3136
|
-
sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 1234) LIMIT 1"]
|
2963
|
+
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 1234) LIMIT 1",
|
2964
|
+
"INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (3, 1234)"]
|
3137
2965
|
|
3138
2966
|
DB.fetch = {:node_id=>1234, :attribute_id=>5}
|
3139
2967
|
o.attribute = nil
|
@@ -3168,10 +2996,8 @@ describe Sequel::Model, "one_through_one" do
|
|
3168
2996
|
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (a AND (node_id = 1234)) LIMIT 1"]
|
3169
2997
|
|
3170
2998
|
o.attribute = attrib
|
3171
|
-
sqls =
|
3172
|
-
|
3173
|
-
"INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 3)"].must_include(sqls.slice! 1)
|
3174
|
-
sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (a AND (node_id = 1234)) LIMIT 1"]
|
2999
|
+
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (a AND (node_id = 1234)) LIMIT 1",
|
3000
|
+
"INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (3, 1234)"]
|
3175
3001
|
|
3176
3002
|
DB.fetch = {:node_id=>1234, :attribute_id=>5}
|
3177
3003
|
o.attribute = nil
|
@@ -3192,10 +3018,8 @@ describe Sequel::Model, "one_through_one" do
|
|
3192
3018
|
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 5) LIMIT 1"]
|
3193
3019
|
|
3194
3020
|
o.attribute = attrib
|
3195
|
-
sqls =
|
3196
|
-
|
3197
|
-
"INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (5, 7)"].must_include(sqls.slice! 1)
|
3198
|
-
sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 5) LIMIT 1"]
|
3021
|
+
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE (node_id = 5) LIMIT 1",
|
3022
|
+
"INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (7, 5)"]
|
3199
3023
|
|
3200
3024
|
DB.fetch = {:node_id=>1234, :attribute_id=>9}
|
3201
3025
|
o.attribute = nil
|
@@ -3217,9 +3041,8 @@ describe Sequel::Model, "one_through_one" do
|
|
3217
3041
|
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5)) LIMIT 1"]
|
3218
3042
|
|
3219
3043
|
o.attribute = attrib
|
3220
|
-
sqls =
|
3221
|
-
|
3222
|
-
sqls.must_equal ["SELECT * FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5)) LIMIT 1"]
|
3044
|
+
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5)) LIMIT 1",
|
3045
|
+
"INSERT INTO attributes_nodes (attribute_id, z, node_id, y) VALUES (3, 7, 1234, 5)"]
|
3223
3046
|
|
3224
3047
|
DB.fetch = {:node_id=>1234, :attribute_id=>10, :y=>6, :z=>8}
|
3225
3048
|
o.attribute = nil
|
@@ -3227,10 +3050,8 @@ describe Sequel::Model, "one_through_one" do
|
|
3227
3050
|
"DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5) AND (attribute_id = 10) AND (z = 8))"]
|
3228
3051
|
|
3229
3052
|
o.attribute = attrib
|
3230
|
-
sqls =
|
3231
|
-
|
3232
|
-
"UPDATE attributes_nodes SET z = 7, attribute_id = 3 WHERE ((node_id = 1234) AND (y = 5) AND (attribute_id = 10) AND (z = 8))"].must_include(sqls.slice!(1))
|
3233
|
-
sqls.must_equal ["SELECT * FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5)) LIMIT 1"]
|
3053
|
+
DB.sqls.must_equal ["SELECT * FROM attributes_nodes WHERE ((node_id = 1234) AND (y = 5)) LIMIT 1",
|
3054
|
+
"UPDATE attributes_nodes SET attribute_id = 3, z = 7 WHERE ((node_id = 1234) AND (y = 5) AND (attribute_id = 10) AND (z = 8))"]
|
3234
3055
|
end
|
3235
3056
|
|
3236
3057
|
it "should raise an error if the current model object that doesn't have a valid primary key" do
|
@@ -3249,7 +3070,7 @@ describe Sequel::Model, "one_through_one" do
|
|
3249
3070
|
|
3250
3071
|
it "should make the change to the foreign_key value inside a _association= method" do
|
3251
3072
|
@c2.one_through_one :attribute, :class => @c1
|
3252
|
-
@c2.private_instance_methods.
|
3073
|
+
@c2.private_instance_methods.must_include(:_attribute=)
|
3253
3074
|
attrib = @c1.new(:id=>3)
|
3254
3075
|
o = @c2.new(:id => 1234)
|
3255
3076
|
def o._attribute=(x)
|