sequel 4.36.0 → 5.61.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 +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- 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.3.0.txt +121 -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.4.0.txt +80 -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/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- 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 +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- 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.4.0.txt +0 -92
- 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/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- 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 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- 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/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- 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 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- 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 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- 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/spec_config.rb +0 -10
@@ -1,697 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
|
-
|
3
|
-
describe "NestedAttributes plugin" do
|
4
|
-
def check_sqls(should, is)
|
5
|
-
if should.is_a?(Array)
|
6
|
-
should.must_include(is)
|
7
|
-
else
|
8
|
-
is.must_equal should
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def check_sql_array(*shoulds)
|
13
|
-
sqls = @db.sqls
|
14
|
-
sqls.length.must_equal shoulds.length
|
15
|
-
shoulds.zip(sqls){|s, i| check_sqls(s, i)}
|
16
|
-
end
|
17
|
-
|
18
|
-
before do
|
19
|
-
@db = Sequel.mock(:autoid=>1, :numrows=>1)
|
20
|
-
@c = Class.new(Sequel::Model(@db))
|
21
|
-
@c.plugin :nested_attributes
|
22
|
-
@Artist = Class.new(@c).set_dataset(:artists)
|
23
|
-
@Album = Class.new(@c).set_dataset(:albums)
|
24
|
-
@Tag = Class.new(@c).set_dataset(:tags)
|
25
|
-
@Concert = Class.new(@c).set_dataset(:concerts)
|
26
|
-
@Artist.plugin :skip_create_refresh
|
27
|
-
@Album.plugin :skip_create_refresh
|
28
|
-
@Tag.plugin :skip_create_refresh
|
29
|
-
@Concert.plugin :skip_create_refresh
|
30
|
-
@Artist.columns :id, :name
|
31
|
-
@Album.columns :id, :name, :artist_id
|
32
|
-
@Tag.columns :id, :name
|
33
|
-
@Concert.columns :tour, :date, :artist_id, :playlist
|
34
|
-
@Concert.set_primary_key([:tour, :date])
|
35
|
-
@Concert.unrestrict_primary_key
|
36
|
-
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
37
|
-
@Artist.one_to_many :concerts, :class=>@Concert, :key=>:artist_id
|
38
|
-
@Artist.one_to_one :first_album, :class=>@Album, :key=>:artist_id
|
39
|
-
@Artist.one_to_one :first_concert, :class=>@Concert, :key=>:artist_id
|
40
|
-
@Concert.one_to_many :albums, :class=>@Album, :key=>:artist_id, :primary_key=>:artist_id
|
41
|
-
@Album.many_to_one :artist, :class=>@Artist, :reciprocal=>:albums
|
42
|
-
@Album.many_to_many :tags, :class=>@Tag, :left_key=>:album_id, :right_key=>:tag_id, :join_table=>:at
|
43
|
-
@Tag.many_to_many :albums, :class=>@Album, :left_key=>:tag_id, :right_key=>:album_id, :join_table=>:at
|
44
|
-
@Artist.nested_attributes :albums, :first_album, :destroy=>true, :remove=>true
|
45
|
-
@Artist.nested_attributes :concerts, :destroy=>true, :remove=>true
|
46
|
-
@Album.nested_attributes :artist, :tags, :destroy=>true, :remove=>true
|
47
|
-
@Artist.nested_attributes :first_concert
|
48
|
-
@Concert.nested_attributes :albums
|
49
|
-
@db.sqls
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should support creating new many_to_one objects" do
|
53
|
-
a = @Album.new({:name=>'Al', :artist_attributes=>{:name=>'Ar'}})
|
54
|
-
@db.sqls.must_equal []
|
55
|
-
a.save
|
56
|
-
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
57
|
-
["INSERT INTO albums (name, artist_id) VALUES ('Al', 1)", "INSERT INTO albums (artist_id, name) VALUES (1, 'Al')"])
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should support creating new one_to_one objects" do
|
61
|
-
a = @Artist.new(:name=>'Ar')
|
62
|
-
a.id = 1
|
63
|
-
a.first_album_attributes = {:name=>'Al'}
|
64
|
-
@db.sqls.must_equal []
|
65
|
-
a.save
|
66
|
-
check_sql_array(["INSERT INTO artists (name, id) VALUES ('Ar', 1)", "INSERT INTO artists (id, name) VALUES (1, 'Ar')"],
|
67
|
-
"UPDATE albums SET artist_id = NULL WHERE (artist_id = 1)",
|
68
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should support creating new one_to_many objects" do
|
72
|
-
a = @Artist.new({:name=>'Ar', :albums_attributes=>[{:name=>'Al'}]})
|
73
|
-
@db.sqls.must_equal []
|
74
|
-
a.save
|
75
|
-
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
76
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should support creating new one_to_many and one_to_one objects with presence validations on the foreign key" do
|
80
|
-
@Album.class_eval do
|
81
|
-
plugin :validation_helpers
|
82
|
-
def validate
|
83
|
-
validates_integer :artist_id
|
84
|
-
super
|
85
|
-
end
|
86
|
-
end
|
87
|
-
a = @Artist.new({:name=>'Ar', :albums_attributes=>[{:name=>'Al'}]})
|
88
|
-
@db.sqls.must_equal []
|
89
|
-
a.save
|
90
|
-
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
91
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
92
|
-
|
93
|
-
a = @Artist.new(:name=>'Ar')
|
94
|
-
a.id = 1
|
95
|
-
a.first_album_attributes = {:name=>'Al'}
|
96
|
-
@db.sqls.must_equal []
|
97
|
-
a.save
|
98
|
-
check_sql_array(["INSERT INTO artists (name, id) VALUES ('Ar', 1)", "INSERT INTO artists (id, name) VALUES (1, 'Ar')"],
|
99
|
-
"UPDATE albums SET artist_id = NULL WHERE (artist_id = 1)",
|
100
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should support creating new one_to_many and one_to_one objects with composite keys with presence validations on the foreign key" do
|
104
|
-
insert = nil
|
105
|
-
@Album.class_eval do
|
106
|
-
plugin :validation_helpers
|
107
|
-
def validate
|
108
|
-
validates_integer :artist_id
|
109
|
-
super
|
110
|
-
end
|
111
|
-
end
|
112
|
-
@Concert.class_eval do
|
113
|
-
define_method :_insert do
|
114
|
-
insert = values.dup
|
115
|
-
end
|
116
|
-
def before_create # Have to define the CPK somehow.
|
117
|
-
self.tour = 'To'
|
118
|
-
self.date = '2004-04-05'
|
119
|
-
super
|
120
|
-
end
|
121
|
-
def after_create
|
122
|
-
super
|
123
|
-
self.artist_id = 3
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
c = @Concert.new(:playlist=>'Pl')
|
128
|
-
@db.sqls.must_equal []
|
129
|
-
c.albums_attributes = [{:name=>'Al'}]
|
130
|
-
c.save
|
131
|
-
insert.must_equal(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
132
|
-
check_sql_array(["INSERT INTO albums (name, artist_id) VALUES ('Al', 3)", "INSERT INTO albums (artist_id, name) VALUES (3, 'Al')"])
|
133
|
-
|
134
|
-
@Concert.class_eval do
|
135
|
-
plugin :validation_helpers
|
136
|
-
def validate
|
137
|
-
validates_integer :artist_id
|
138
|
-
super
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
a = @Artist.new(:name=>'Ar')
|
143
|
-
a.id = 1
|
144
|
-
a.first_concert_attributes = {:playlist=>'Pl'}
|
145
|
-
@db.sqls.must_equal []
|
146
|
-
a.save
|
147
|
-
check_sql_array(["INSERT INTO artists (name, id) VALUES ('Ar', 1)", "INSERT INTO artists (id, name) VALUES (1, 'Ar')"],
|
148
|
-
"UPDATE concerts SET artist_id = NULL WHERE (artist_id = 1)")
|
149
|
-
insert.must_equal(:tour=>'To', :date=>'2004-04-05', :artist_id=>1, :playlist=>'Pl')
|
150
|
-
end
|
151
|
-
|
152
|
-
it "should should not remove existing values from object when validating" do
|
153
|
-
@Artist.one_to_one :first_album, :class=>@Album, :key=>:id
|
154
|
-
@Artist.nested_attributes :first_album
|
155
|
-
@db.fetch = {:id=>1}
|
156
|
-
a = @Artist.load(:id=>1)
|
157
|
-
a.set(:first_album_attributes=>{:id=>1, :name=>'Ar'})
|
158
|
-
a.first_album.values.must_equal(:id=>1, :name=>'Ar')
|
159
|
-
@db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.id = 1) LIMIT 1"]
|
160
|
-
a.save_changes
|
161
|
-
check_sql_array("UPDATE albums SET name = 'Ar' WHERE (id = 1)")
|
162
|
-
end
|
163
|
-
|
164
|
-
it "should support creating new many_to_many objects" do
|
165
|
-
a = @Album.new({:name=>'Al', :tags_attributes=>[{:name=>'T'}]})
|
166
|
-
@db.sqls.must_equal []
|
167
|
-
a.save
|
168
|
-
check_sql_array("INSERT INTO albums (name) VALUES ('Al')",
|
169
|
-
"INSERT INTO tags (name) VALUES ('T')",
|
170
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 2)", "INSERT INTO at (tag_id, album_id) VALUES (2, 1)"])
|
171
|
-
end
|
172
|
-
|
173
|
-
it "should add new objects to the cached association array as soon as the *_attributes= method is called" do
|
174
|
-
a = @Artist.new({:name=>'Ar', :first_album_attributes=>{:name=>'B'}, :albums_attributes=>[{:name=>'Al', :tags_attributes=>[{:name=>'T'}]}]})
|
175
|
-
a.albums.must_equal [@Album.new(:name=>'Al')]
|
176
|
-
a.albums.first.artist.must_equal a
|
177
|
-
a.albums.first.tags.must_equal [@Tag.new(:name=>'T')]
|
178
|
-
a.first_album.must_equal @Album.new(:name=>'B')
|
179
|
-
a.first_album.artist.must_equal a
|
180
|
-
end
|
181
|
-
|
182
|
-
it "should support creating new objects with composite primary keys" do
|
183
|
-
insert = nil
|
184
|
-
@Concert.class_eval do
|
185
|
-
define_method :_insert do
|
186
|
-
insert = values.dup
|
187
|
-
end
|
188
|
-
def before_create # Have to define the CPK somehow.
|
189
|
-
self.tour = 'To'
|
190
|
-
self.date = '2004-04-05'
|
191
|
-
super
|
192
|
-
end
|
193
|
-
end
|
194
|
-
a = @Artist.new({:name=>'Ar', :concerts_attributes=>[{:playlist=>'Pl'}]})
|
195
|
-
@db.sqls.must_equal []
|
196
|
-
a.save
|
197
|
-
@db.sqls.must_equal ["INSERT INTO artists (name) VALUES ('Ar')"]
|
198
|
-
insert.must_equal(:tour=>'To', :date=>'2004-04-05', :artist_id=>1, :playlist=>'Pl')
|
199
|
-
end
|
200
|
-
|
201
|
-
it "should support creating new objects with specific primary keys if :unmatched_pk => :create is set" do
|
202
|
-
@Artist.nested_attributes :albums, :unmatched_pk=>:create
|
203
|
-
insert = nil
|
204
|
-
@Album.class_eval do
|
205
|
-
unrestrict_primary_key
|
206
|
-
define_method :_insert do
|
207
|
-
insert = values.dup
|
208
|
-
end
|
209
|
-
end
|
210
|
-
a = @Artist.new({:name=>'Ar', :albums_attributes=>[{:id=>7, :name=>'Al'}]})
|
211
|
-
@db.sqls.must_equal []
|
212
|
-
a.save
|
213
|
-
@db.sqls.must_equal ["INSERT INTO artists (name) VALUES ('Ar')"]
|
214
|
-
insert.must_equal(:artist_id=>1, :name=>'Al', :id=>7)
|
215
|
-
end
|
216
|
-
|
217
|
-
it "should support creating new objects with specific composite primary keys if :unmatched_pk => :create is set" do
|
218
|
-
insert = nil
|
219
|
-
@Artist.nested_attributes :concerts, :unmatched_pk=>:create
|
220
|
-
@Concert.class_eval do
|
221
|
-
define_method :_insert do
|
222
|
-
insert = values.dup
|
223
|
-
end
|
224
|
-
end
|
225
|
-
a = @Artist.new({:name=>'Ar', :concerts_attributes=>[{:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl'}]})
|
226
|
-
@db.sqls.must_equal []
|
227
|
-
a.save
|
228
|
-
@db.sqls.must_equal ["INSERT INTO artists (name) VALUES ('Ar')"]
|
229
|
-
insert.must_equal(:tour=>'To', :date=>'2004-04-05', :artist_id=>1, :playlist=>'Pl')
|
230
|
-
end
|
231
|
-
|
232
|
-
it "should support updating many_to_one objects" do
|
233
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
234
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
235
|
-
al.associations[:artist] = ar
|
236
|
-
al.set(:artist_attributes=>{:id=>'20', :name=>'Ar2'})
|
237
|
-
@db.sqls.must_equal []
|
238
|
-
al.save
|
239
|
-
@db.sqls.must_equal ["UPDATE albums SET name = 'Al' WHERE (id = 10)", "UPDATE artists SET name = 'Ar2' WHERE (id = 20)"]
|
240
|
-
end
|
241
|
-
|
242
|
-
it "should support updating one_to_one objects" do
|
243
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
244
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
245
|
-
ar.associations[:first_album] = al
|
246
|
-
ar.set(:first_album_attributes=>{:id=>10, :name=>'Al2'})
|
247
|
-
@db.sqls.must_equal []
|
248
|
-
ar.save
|
249
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)", "UPDATE albums SET name = 'Al2' WHERE (id = 10)"]
|
250
|
-
end
|
251
|
-
|
252
|
-
it "should support updating one_to_many objects" do
|
253
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
254
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
255
|
-
ar.associations[:albums] = [al]
|
256
|
-
ar.set(:albums_attributes=>[{:id=>10, :name=>'Al2'}])
|
257
|
-
@db.sqls.must_equal []
|
258
|
-
ar.save
|
259
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)", "UPDATE albums SET name = 'Al2' WHERE (id = 10)"]
|
260
|
-
end
|
261
|
-
|
262
|
-
it "should support updating one_to_many objects with _delete/_remove flags set to false" do
|
263
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
264
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
265
|
-
ar.associations[:albums] = [al]
|
266
|
-
ar.set(:albums_attributes=>[{:id=>10, :name=>'Al2', :_delete => 'f', :_remove => '0'}])
|
267
|
-
@db.sqls.must_equal []
|
268
|
-
ar.save
|
269
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)", "UPDATE albums SET name = 'Al2' WHERE (id = 10)"]
|
270
|
-
end
|
271
|
-
|
272
|
-
it "should support updating many_to_many objects" do
|
273
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
274
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
275
|
-
a.associations[:tags] = [t]
|
276
|
-
a.set(:tags_attributes=>[{:id=>20, :name=>'T2'}])
|
277
|
-
@db.sqls.must_equal []
|
278
|
-
a.save
|
279
|
-
@db.sqls.must_equal ["UPDATE albums SET name = 'Al' WHERE (id = 10)", "UPDATE tags SET name = 'T2' WHERE (id = 20)"]
|
280
|
-
end
|
281
|
-
|
282
|
-
it "should support updating many_to_many objects with _delete/_remove flags set to false" do
|
283
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
284
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
285
|
-
a.associations[:tags] = [t]
|
286
|
-
a.set(:tags_attributes=>[{:id=>20, :name=>'T2', '_delete' => false, '_remove' => 'F'}])
|
287
|
-
@db.sqls.must_equal []
|
288
|
-
a.save
|
289
|
-
@db.sqls.must_equal ["UPDATE albums SET name = 'Al' WHERE (id = 10)", "UPDATE tags SET name = 'T2' WHERE (id = 20)"]
|
290
|
-
end
|
291
|
-
|
292
|
-
it "should support updating objects with composite primary keys" do
|
293
|
-
ar = @Artist.load(:id=>10, :name=>'Ar')
|
294
|
-
co = @Concert.load(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
295
|
-
ar.associations[:concerts] = [co]
|
296
|
-
ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl2'}])
|
297
|
-
@db.sqls.must_equal []
|
298
|
-
ar.save
|
299
|
-
check_sql_array("UPDATE artists SET name = 'Ar' WHERE (id = 10)", ["UPDATE concerts SET playlist = 'Pl2' WHERE ((tour = 'To') AND (date = '2004-04-05'))", "UPDATE concerts SET playlist = 'Pl2' WHERE ((date = '2004-04-05') AND (tour = 'To'))"])
|
300
|
-
end
|
301
|
-
|
302
|
-
it "should support removing many_to_one objects" do
|
303
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
304
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
305
|
-
al.associations[:artist] = ar
|
306
|
-
al.set(:artist_attributes=>{:id=>'20', :_remove=>'1'})
|
307
|
-
@db.sqls.must_equal []
|
308
|
-
al.save
|
309
|
-
check_sql_array(["UPDATE albums SET artist_id = NULL, name = 'Al' WHERE (id = 10)", "UPDATE albums SET name = 'Al', artist_id = NULL WHERE (id = 10)"])
|
310
|
-
end
|
311
|
-
|
312
|
-
it "should support removing one_to_one objects" do
|
313
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
314
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
315
|
-
ar.associations[:first_album] = al
|
316
|
-
ar.set(:first_album_attributes=>{:id=>10, :_remove=>'t'})
|
317
|
-
@db.sqls.must_equal []
|
318
|
-
ar.save
|
319
|
-
@db.sqls.must_equal ["UPDATE albums SET artist_id = NULL WHERE (artist_id = 20)", "UPDATE artists SET name = 'Ar' WHERE (id = 20)"]
|
320
|
-
end
|
321
|
-
|
322
|
-
it "should support removing one_to_many objects" do
|
323
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
324
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
325
|
-
ar.associations[:albums] = [al]
|
326
|
-
ar.set(:albums_attributes=>[{:id=>10, :_remove=>'t'}])
|
327
|
-
ar.associations[:albums].must_equal []
|
328
|
-
@db.sqls.must_equal []
|
329
|
-
@Album.dataset._fetch = {:id=>1}
|
330
|
-
ar.save
|
331
|
-
check_sql_array("SELECT 1 AS one FROM albums WHERE ((albums.artist_id = 20) AND (id = 10)) LIMIT 1",
|
332
|
-
["UPDATE albums SET artist_id = NULL, name = 'Al' WHERE (id = 10)", "UPDATE albums SET name = 'Al', artist_id = NULL WHERE (id = 10)"],
|
333
|
-
"UPDATE artists SET name = 'Ar' WHERE (id = 20)")
|
334
|
-
end
|
335
|
-
|
336
|
-
it "should support removing many_to_many objects" do
|
337
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
338
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
339
|
-
a.associations[:tags] = [t]
|
340
|
-
a.set(:tags_attributes=>[{:id=>20, :_remove=>true}])
|
341
|
-
a.associations[:tags].must_equal []
|
342
|
-
@db.sqls.must_equal []
|
343
|
-
a.save
|
344
|
-
@db.sqls.must_equal ["DELETE FROM at WHERE ((album_id = 10) AND (tag_id = 20))", "UPDATE albums SET name = 'Al' WHERE (id = 10)"]
|
345
|
-
end
|
346
|
-
|
347
|
-
it "should support removing objects with composite primary keys" do
|
348
|
-
ar = @Artist.load(:id=>10, :name=>'Ar')
|
349
|
-
co = @Concert.load(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
350
|
-
ar.associations[:concerts] = [co]
|
351
|
-
ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-05', :_remove=>'t'}])
|
352
|
-
@db.sqls.must_equal []
|
353
|
-
@Concert.dataset._fetch = {:id=>1}
|
354
|
-
ar.save
|
355
|
-
check_sql_array(["SELECT 1 AS one FROM concerts WHERE ((concerts.artist_id = 10) AND (tour = 'To') AND (date = '2004-04-05')) LIMIT 1", "SELECT 1 AS one FROM concerts WHERE ((concerts.artist_id = 10) AND (date = '2004-04-05') AND (tour = 'To')) LIMIT 1"],
|
356
|
-
["UPDATE concerts SET artist_id = NULL, playlist = 'Pl' WHERE ((tour = 'To') AND (date = '2004-04-05'))", "UPDATE concerts SET playlist = 'Pl', artist_id = NULL WHERE ((tour = 'To') AND (date = '2004-04-05'))", "UPDATE concerts SET artist_id = NULL, playlist = 'Pl' WHERE ((date = '2004-04-05') AND (tour = 'To'))", "UPDATE concerts SET playlist = 'Pl', artist_id = NULL WHERE ((date = '2004-04-05') AND (tour = 'To'))"],
|
357
|
-
"UPDATE artists SET name = 'Ar' WHERE (id = 10)")
|
358
|
-
end
|
359
|
-
|
360
|
-
it "should support destroying many_to_one objects" do
|
361
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
362
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
363
|
-
al.associations[:artist] = ar
|
364
|
-
al.set(:artist_attributes=>{:id=>'20', :_delete=>'1'})
|
365
|
-
@db.sqls.must_equal []
|
366
|
-
al.save
|
367
|
-
check_sql_array(["UPDATE albums SET artist_id = NULL, name = 'Al' WHERE (id = 10)", "UPDATE albums SET name = 'Al', artist_id = NULL WHERE (id = 10)"],
|
368
|
-
"DELETE FROM artists WHERE (id = 20)")
|
369
|
-
end
|
370
|
-
|
371
|
-
it "should support destroying one_to_one objects" do
|
372
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
373
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
374
|
-
ar.associations[:first_album] = al
|
375
|
-
ar.set(:first_album_attributes=>{:id=>10, :_delete=>'t'})
|
376
|
-
@db.sqls.must_equal []
|
377
|
-
ar.save
|
378
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)", "DELETE FROM albums WHERE (id = 10)"]
|
379
|
-
end
|
380
|
-
|
381
|
-
it "should support destroying one_to_many objects" do
|
382
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
383
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
384
|
-
ar.associations[:albums] = [al]
|
385
|
-
ar.set(:albums_attributes=>[{:id=>10, :_delete=>'t'}])
|
386
|
-
@db.sqls.must_equal []
|
387
|
-
ar.save
|
388
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)", "DELETE FROM albums WHERE (id = 10)"]
|
389
|
-
end
|
390
|
-
|
391
|
-
it "should support destroying many_to_many objects" do
|
392
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
393
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
394
|
-
a.associations[:tags] = [t]
|
395
|
-
a.set(:tags_attributes=>[{:id=>20, :_delete=>true}])
|
396
|
-
@db.sqls.must_equal []
|
397
|
-
a.save
|
398
|
-
@db.sqls.must_equal ["DELETE FROM at WHERE ((album_id = 10) AND (tag_id = 20))", "UPDATE albums SET name = 'Al' WHERE (id = 10)", "DELETE FROM tags WHERE (id = 20)"]
|
399
|
-
end
|
400
|
-
|
401
|
-
it "should support destroying objects with composite primary keys" do
|
402
|
-
ar = @Artist.load(:id=>10, :name=>'Ar')
|
403
|
-
co = @Concert.load(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
404
|
-
ar.associations[:concerts] = [co]
|
405
|
-
ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-05', :_delete=>'t'}])
|
406
|
-
@db.sqls.must_equal []
|
407
|
-
ar.save
|
408
|
-
check_sql_array("UPDATE artists SET name = 'Ar' WHERE (id = 10)", ["DELETE FROM concerts WHERE ((tour = 'To') AND (date = '2004-04-05'))", "DELETE FROM concerts WHERE ((date = '2004-04-05') AND (tour = 'To'))"])
|
409
|
-
end
|
410
|
-
|
411
|
-
it "should support both string and symbol keys in nested attribute hashes" do
|
412
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
413
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
414
|
-
a.associations[:tags] = [t]
|
415
|
-
a.set('tags_attributes'=>[{'id'=>20, '_delete'=>true}])
|
416
|
-
@db.sqls.must_equal []
|
417
|
-
a.save
|
418
|
-
@db.sqls.must_equal ["DELETE FROM at WHERE ((album_id = 10) AND (tag_id = 20))", "UPDATE albums SET name = 'Al' WHERE (id = 10)", "DELETE FROM tags WHERE (id = 20)"]
|
419
|
-
end
|
420
|
-
|
421
|
-
it "should support using a hash instead of an array for to_many nested attributes" do
|
422
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
423
|
-
t = @Tag.load(:id=>20, :name=>'T')
|
424
|
-
a.associations[:tags] = [t]
|
425
|
-
a.set('tags_attributes'=>{'1'=>{'id'=>20, '_delete'=>true}})
|
426
|
-
@db.sqls.must_equal []
|
427
|
-
a.save
|
428
|
-
@db.sqls.must_equal ["DELETE FROM at WHERE ((album_id = 10) AND (tag_id = 20))", "UPDATE albums SET name = 'Al' WHERE (id = 10)", "DELETE FROM tags WHERE (id = 20)"]
|
429
|
-
end
|
430
|
-
|
431
|
-
it "should only allow destroying associated objects if :destroy option is used in the nested_attributes call" do
|
432
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
433
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
434
|
-
a.associations[:artist] = ar
|
435
|
-
@Album.nested_attributes :artist
|
436
|
-
proc{a.set(:artist_attributes=>{:id=>'20', :_delete=>'1'})}.must_raise(Sequel::MassAssignmentRestriction)
|
437
|
-
@Album.nested_attributes :artist, :destroy=>true
|
438
|
-
a.set(:artist_attributes=>{:id=>'20', :_delete=>'1'})
|
439
|
-
end
|
440
|
-
|
441
|
-
it "should only allow removing associated objects if :remove option is used in the nested_attributes call" do
|
442
|
-
a = @Album.load(:id=>10, :name=>'Al')
|
443
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
444
|
-
a.associations[:artist] = ar
|
445
|
-
@Album.nested_attributes :artist
|
446
|
-
proc{a.set(:artist_attributes=>{:id=>'20', :_remove=>'1'})}.must_raise(Sequel::MassAssignmentRestriction)
|
447
|
-
@Album.nested_attributes :artist, :remove=>true
|
448
|
-
a.set(:artist_attributes=>{:id=>'20', :_remove=>'1'})
|
449
|
-
end
|
450
|
-
|
451
|
-
it "should raise an Error if a primary key is given in a nested attribute hash, but no matching associated object exists" do
|
452
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
453
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
454
|
-
ar.associations[:albums] = [al]
|
455
|
-
proc{ar.set(:albums_attributes=>[{:id=>30, :_delete=>'t'}])}.must_raise(Sequel::Error)
|
456
|
-
ar.set(:albums_attributes=>[{:id=>10, :_delete=>'t'}])
|
457
|
-
end
|
458
|
-
|
459
|
-
it "should not raise an Error if an unmatched primary key is given, if the :strict=>false option is used" do
|
460
|
-
@Artist.nested_attributes :albums, :strict=>false
|
461
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
462
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
463
|
-
ar.associations[:albums] = [al]
|
464
|
-
ar.set(:albums_attributes=>[{:id=>30, :_delete=>'t'}])
|
465
|
-
@db.sqls.must_equal []
|
466
|
-
ar.save
|
467
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)"]
|
468
|
-
end
|
469
|
-
|
470
|
-
it "should not raise an Error if an unmatched primary key is given, if the :unmatched_pk=>:ignore option is used" do
|
471
|
-
@Artist.nested_attributes :albums, :unmatched_pk=>:ignore
|
472
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
473
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
474
|
-
ar.associations[:albums] = [al]
|
475
|
-
ar.set(:albums_attributes=>[{:id=>30, :_delete=>'t'}])
|
476
|
-
@db.sqls.must_equal []
|
477
|
-
ar.save
|
478
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 20)"]
|
479
|
-
end
|
480
|
-
|
481
|
-
it "should raise an Error if a composite primary key is given in a nested attribute hash, but no matching associated object exists" do
|
482
|
-
ar = @Artist.load(:id=>10, :name=>'Ar')
|
483
|
-
co = @Concert.load(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
484
|
-
ar.associations[:concerts] = [co]
|
485
|
-
proc{ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-04', :_delete=>'t'}])}.must_raise(Sequel::Error)
|
486
|
-
ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-05', :_delete=>'t'}])
|
487
|
-
end
|
488
|
-
|
489
|
-
it "should not raise an Error if an unmatched composite primary key is given, if the :strict=>false option is used" do
|
490
|
-
@Artist.nested_attributes :concerts, :strict=>false
|
491
|
-
ar = @Artist.load(:id=>10, :name=>'Ar')
|
492
|
-
co = @Concert.load(:tour=>'To', :date=>'2004-04-05', :playlist=>'Pl')
|
493
|
-
ar.associations[:concerts] = [co]
|
494
|
-
ar.set(:concerts_attributes=>[{:tour=>'To', :date=>'2004-04-06', :_delete=>'t'}])
|
495
|
-
@db.sqls.must_equal []
|
496
|
-
ar.save
|
497
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar' WHERE (id = 10)"]
|
498
|
-
end
|
499
|
-
|
500
|
-
it "should not save if nested attribute is not valid and should include nested attribute validation errors in the main object's validation errors" do
|
501
|
-
@Artist.class_eval do
|
502
|
-
def validate
|
503
|
-
super
|
504
|
-
errors.add(:name, 'cannot be Ar') if name == 'Ar'
|
505
|
-
end
|
506
|
-
end
|
507
|
-
a = @Album.new(:name=>'Al', :artist_attributes=>{:name=>'Ar'})
|
508
|
-
@db.sqls.must_equal []
|
509
|
-
proc{a.save}.must_raise(Sequel::ValidationFailed)
|
510
|
-
a.errors.full_messages.must_equal ['artist name cannot be Ar']
|
511
|
-
@db.sqls.must_equal []
|
512
|
-
# Should preserve attributes
|
513
|
-
a.artist.name.must_equal 'Ar'
|
514
|
-
end
|
515
|
-
|
516
|
-
it "should not attempt to validate nested attributes if the :validate=>false association option is used" do
|
517
|
-
@Album.many_to_one :artist, :class=>@Artist, :validate=>false, :reciprocal=>nil
|
518
|
-
@Album.nested_attributes :artist, :tags, :destroy=>true, :remove=>true
|
519
|
-
@Artist.class_eval do
|
520
|
-
def validate
|
521
|
-
super
|
522
|
-
errors.add(:name, 'cannot be Ar') if name == 'Ar'
|
523
|
-
end
|
524
|
-
end
|
525
|
-
a = @Album.new(:name=>'Al', :artist_attributes=>{:name=>'Ar'})
|
526
|
-
@db.sqls.must_equal []
|
527
|
-
a.save
|
528
|
-
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
529
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
530
|
-
end
|
531
|
-
|
532
|
-
it "should not attempt to validate nested attributes if the :validate=>false option is passed to save" do
|
533
|
-
@Artist.class_eval do
|
534
|
-
def validate
|
535
|
-
super
|
536
|
-
errors.add(:name, 'cannot be Ar') if name == 'Ar'
|
537
|
-
end
|
538
|
-
end
|
539
|
-
a = @Album.new(:name=>'Al', :artist_attributes=>{:name=>'Ar'})
|
540
|
-
@db.sqls.must_equal []
|
541
|
-
a.save(:validate=>false)
|
542
|
-
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
543
|
-
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
544
|
-
end
|
545
|
-
|
546
|
-
it "should not accept nested attributes unless explicitly specified" do
|
547
|
-
@Artist.many_to_many :tags, :class=>@Tag, :left_key=>:album_id, :right_key=>:tag_id, :join_table=>:at
|
548
|
-
proc{@Artist.create({:name=>'Ar', :tags_attributes=>[{:name=>'T'}]})}.must_raise(Sequel::MassAssignmentRestriction)
|
549
|
-
@db.sqls.must_equal []
|
550
|
-
end
|
551
|
-
|
552
|
-
it "should save when save_changes or update is called if nested attribute associated objects changed but there are no changes to the main object" do
|
553
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
554
|
-
ar = @Artist.load(:id=>20, :name=>'Ar')
|
555
|
-
al.associations[:artist] = ar
|
556
|
-
@db.sqls.must_equal []
|
557
|
-
al.update(:artist_attributes=>{:id=>'20', :name=>'Ar2'})
|
558
|
-
@db.sqls.must_equal ["UPDATE artists SET name = 'Ar2' WHERE (id = 20)"]
|
559
|
-
end
|
560
|
-
|
561
|
-
it "should have a :limit option limiting the amount of entries" do
|
562
|
-
@Album.nested_attributes :tags, :limit=>2
|
563
|
-
arr = [{:name=>'T'}]
|
564
|
-
proc{@Album.new({:name=>'Al', :tags_attributes=>arr*3})}.must_raise(Sequel::Error)
|
565
|
-
a = @Album.new({:name=>'Al', :tags_attributes=>arr*2})
|
566
|
-
@db.sqls.must_equal []
|
567
|
-
a.save
|
568
|
-
check_sql_array("INSERT INTO albums (name) VALUES ('Al')",
|
569
|
-
"INSERT INTO tags (name) VALUES ('T')",
|
570
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 2)", "INSERT INTO at (tag_id, album_id) VALUES (2, 1)"],
|
571
|
-
"INSERT INTO tags (name) VALUES ('T')",
|
572
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 4)", "INSERT INTO at (tag_id, album_id) VALUES (4, 1)"])
|
573
|
-
end
|
574
|
-
|
575
|
-
it "should accept a block that each hash gets passed to determine if it should be processed" do
|
576
|
-
@Album.nested_attributes(:tags){|h| h[:name].empty?}
|
577
|
-
a = @Album.new({:name=>'Al', :tags_attributes=>[{:name=>'T'}, {:name=>''}, {:name=>'T2'}]})
|
578
|
-
@db.sqls.must_equal []
|
579
|
-
a.save
|
580
|
-
check_sql_array("INSERT INTO albums (name) VALUES ('Al')",
|
581
|
-
"INSERT INTO tags (name) VALUES ('T')",
|
582
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 2)", "INSERT INTO at (tag_id, album_id) VALUES (2, 1)"],
|
583
|
-
"INSERT INTO tags (name) VALUES ('T2')",
|
584
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 4)", "INSERT INTO at (tag_id, album_id) VALUES (4, 1)"])
|
585
|
-
end
|
586
|
-
|
587
|
-
it "should accept a :transform block that returns a changed attributes hash" do
|
588
|
-
@Album.nested_attributes :tags, :transform=>proc{|parent, hash| hash[:name] << parent.name; hash }
|
589
|
-
a = @Album.new(:name => 'Al')
|
590
|
-
a.set(:tags_attributes=>[{:name=>'T'.dup}, {:name=>'T2'.dup}])
|
591
|
-
@db.sqls.must_equal []
|
592
|
-
a.save
|
593
|
-
check_sql_array("INSERT INTO albums (name) VALUES ('Al')",
|
594
|
-
"INSERT INTO tags (name) VALUES ('TAl')",
|
595
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 2)", "INSERT INTO at (tag_id, album_id) VALUES (2, 1)"],
|
596
|
-
"INSERT INTO tags (name) VALUES ('T2Al')",
|
597
|
-
["INSERT INTO at (album_id, tag_id) VALUES (1, 4)", "INSERT INTO at (tag_id, album_id) VALUES (4, 1)"])
|
598
|
-
end
|
599
|
-
|
600
|
-
it "should return objects created/modified in the internal methods" do
|
601
|
-
@Album.nested_attributes :tags, :remove=>true, :strict=>false
|
602
|
-
objs = []
|
603
|
-
@Album.class_eval do
|
604
|
-
define_method(:nested_attributes_create){|*a| objs << [super(*a), :create]}
|
605
|
-
define_method(:nested_attributes_remove){|*a| objs << [super(*a), :remove]}
|
606
|
-
define_method(:nested_attributes_update){|*a| objs << [super(*a), :update]}
|
607
|
-
end
|
608
|
-
a = @Album.new(:name=>'Al')
|
609
|
-
a.associations[:tags] = [@Tag.load(:id=>6, :name=>'A'), @Tag.load(:id=>7, :name=>'A2')]
|
610
|
-
a.tags_attributes = [{:id=>6, :name=>'T'}, {:id=>7, :name=>'T2', :_remove=>true}, {:name=>'T3'}, {:id=>8, :name=>'T4'}, {:id=>9, :name=>'T5', :_remove=>true}]
|
611
|
-
objs.must_equal [[@Tag.load(:id=>6, :name=>'T'), :update], [@Tag.load(:id=>7, :name=>'A2'), :remove], [@Tag.new(:name=>'T3'), :create]]
|
612
|
-
end
|
613
|
-
|
614
|
-
it "should raise an error if updating modifies the associated objects keys" do
|
615
|
-
@Artist.columns :id, :name, :artist_id
|
616
|
-
@Album.columns :id, :name, :artist_id
|
617
|
-
@Tag.columns :id, :name, :tag_id
|
618
|
-
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :primary_key=>:artist_id
|
619
|
-
@Album.many_to_one :artist, :class=>@Artist, :primary_key=>:artist_id
|
620
|
-
@Album.many_to_many :tags, :class=>@Tag, :left_key=>:album_id, :right_key=>:tag_id, :join_table=>:at, :right_primary_key=>:tag_id
|
621
|
-
@Artist.nested_attributes :albums, :destroy=>true, :remove=>true
|
622
|
-
@Album.nested_attributes :artist, :tags, :destroy=>true, :remove=>true
|
623
|
-
|
624
|
-
al = @Album.load(:id=>10, :name=>'Al', :artist_id=>25)
|
625
|
-
ar = @Artist.load(:id=>20, :name=>'Ar', :artist_id=>25)
|
626
|
-
t = @Tag.load(:id=>30, :name=>'T', :tag_id=>15)
|
627
|
-
al.associations[:artist] = ar
|
628
|
-
al.associations[:tags] = [t]
|
629
|
-
ar.associations[:albums] = [al]
|
630
|
-
proc{ar.set(:albums_attributes=>[{:id=>10, :name=>'Al2', :artist_id=>'3'}])}.must_raise(Sequel::Error)
|
631
|
-
proc{al.set(:artist_attributes=>{:id=>20, :name=>'Ar2', :artist_id=>'3'})}.must_raise(Sequel::Error)
|
632
|
-
proc{al.set(:tags_attributes=>[{:id=>30, :name=>'T2', :tag_id=>'3'}])}.must_raise(Sequel::Error)
|
633
|
-
end
|
634
|
-
|
635
|
-
it "should accept a :fields option and only allow modification of those fields" do
|
636
|
-
@Tag.columns :id, :name, :number
|
637
|
-
@Album.nested_attributes :tags, :destroy=>true, :remove=>true, :fields=>[:name]
|
638
|
-
|
639
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
640
|
-
t = @Tag.load(:id=>30, :name=>'T', :number=>10)
|
641
|
-
al.associations[:tags] = [t]
|
642
|
-
al.set(:tags_attributes=>[{:id=>30, :name=>'T2'}, {:name=>'T3'}])
|
643
|
-
@db.sqls.must_equal []
|
644
|
-
al.save
|
645
|
-
check_sql_array("UPDATE albums SET name = 'Al' WHERE (id = 10)",
|
646
|
-
"UPDATE tags SET name = 'T2' WHERE (id = 30)",
|
647
|
-
"INSERT INTO tags (name) VALUES ('T3')",
|
648
|
-
["INSERT INTO at (album_id, tag_id) VALUES (10, 1)", "INSERT INTO at (tag_id, album_id) VALUES (1, 10)"])
|
649
|
-
proc{al.set(:tags_attributes=>[{:id=>30, :name=>'T2', :number=>3}])}.must_raise(Sequel::MassAssignmentRestriction)
|
650
|
-
proc{al.set(:tags_attributes=>[{:name=>'T2', :number=>3}])}.must_raise(Sequel::MassAssignmentRestriction)
|
651
|
-
end
|
652
|
-
|
653
|
-
it "should accept a proc for the :fields option that accepts the associated object and returns an array of fields" do
|
654
|
-
@Tag.columns :id, :name, :number
|
655
|
-
@Album.nested_attributes :tags, :destroy=>true, :remove=>true, :fields=>proc{|object| object.is_a?(@Tag) ? [:name] : []}
|
656
|
-
|
657
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
658
|
-
t = @Tag.load(:id=>30, :name=>'T', :number=>10)
|
659
|
-
al.associations[:tags] = [t]
|
660
|
-
al.set(:tags_attributes=>[{:id=>30, :name=>'T2'}, {:name=>'T3'}])
|
661
|
-
@db.sqls.must_equal []
|
662
|
-
al.save
|
663
|
-
check_sql_array("UPDATE albums SET name = 'Al' WHERE (id = 10)",
|
664
|
-
"UPDATE tags SET name = 'T2' WHERE (id = 30)",
|
665
|
-
"INSERT INTO tags (name) VALUES ('T3')",
|
666
|
-
["INSERT INTO at (album_id, tag_id) VALUES (10, 1)", "INSERT INTO at (tag_id, album_id) VALUES (1, 10)"])
|
667
|
-
proc{al.set(:tags_attributes=>[{:id=>30, :name=>'T2', :number=>3}])}.must_raise(Sequel::MassAssignmentRestriction)
|
668
|
-
proc{al.set(:tags_attributes=>[{:name=>'T2', :number=>3}])}.must_raise(Sequel::MassAssignmentRestriction)
|
669
|
-
end
|
670
|
-
|
671
|
-
it "should allow per-call options via the set_nested_attributes method" do
|
672
|
-
@Tag.columns :id, :name, :number
|
673
|
-
@Album.nested_attributes :tags
|
674
|
-
|
675
|
-
al = @Album.load(:id=>10, :name=>'Al')
|
676
|
-
t = @Tag.load(:id=>30, :name=>'T', :number=>10)
|
677
|
-
al.associations[:tags] = [t]
|
678
|
-
al.set_nested_attributes(:tags, [{:id=>30, :name=>'T2'}, {:name=>'T3'}], :fields=>[:name])
|
679
|
-
@db.sqls.must_equal []
|
680
|
-
al.save
|
681
|
-
check_sql_array("UPDATE albums SET name = 'Al' WHERE (id = 10)",
|
682
|
-
"UPDATE tags SET name = 'T2' WHERE (id = 30)",
|
683
|
-
"INSERT INTO tags (name) VALUES ('T3')",
|
684
|
-
["INSERT INTO at (album_id, tag_id) VALUES (10, 1)", "INSERT INTO at (tag_id, album_id) VALUES (1, 10)"])
|
685
|
-
proc{al.set_nested_attributes(:tags, [{:id=>30, :name=>'T2', :number=>3}], :fields=>[:name])}.must_raise(Sequel::MassAssignmentRestriction)
|
686
|
-
proc{al.set_nested_attributes(:tags, [{:name=>'T2', :number=>3}], :fields=>[:name])}.must_raise(Sequel::MassAssignmentRestriction)
|
687
|
-
end
|
688
|
-
|
689
|
-
it "should have set_nested_attributes method raise error if called with a bad association" do
|
690
|
-
proc{@Album.load(:id=>10, :name=>'Al').set_nested_attributes(:tags2, [{:id=>30, :name=>'T2', :number=>3}], :fields=>[:name])}.must_raise(Sequel::Error)
|
691
|
-
end
|
692
|
-
|
693
|
-
it "should have set_nested_attributes method raise error if called with an association that doesn't support nested attributes" do
|
694
|
-
@Tag.columns :id, :name, :number
|
695
|
-
proc{@Album.load(:id=>10, :name=>'Al').set_nested_attributes(:tags, [{:id=>30, :name=>'T2', :number=>3}], :fields=>[:name])}.must_raise(Sequel::Error)
|
696
|
-
end
|
697
|
-
end
|