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
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The
|
5
|
+
# The association_dependencies plugin allows you do easily set up before and/or after destroy hooks
|
6
6
|
# for destroying, deleting, or nullifying associated model objects. The following
|
7
7
|
# association types support the following dependency actions:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# :many_to_many :: :nullify (removes all related entries in join table)
|
10
|
+
# :many_to_one :: :delete, :destroy
|
11
|
+
# :one_to_many, one_to_one :: :delete, :destroy, :nullify (sets foreign key to NULL for all associated objects)
|
12
12
|
#
|
13
13
|
# This plugin works directly with the association datasets and does not use any cached association values.
|
14
14
|
# The :delete action will delete all associated objects from the database in a single SQL call.
|
@@ -18,21 +18,21 @@ module Sequel
|
|
18
18
|
# and dependency action values. You can provide the hash to the plugin call itself or
|
19
19
|
# to the add_association_dependencies method:
|
20
20
|
#
|
21
|
-
# Business.plugin :association_dependencies, :
|
21
|
+
# Business.plugin :association_dependencies, address: :delete
|
22
22
|
# # or:
|
23
23
|
# Artist.plugin :association_dependencies
|
24
|
-
# Artist.add_association_dependencies :
|
24
|
+
# Artist.add_association_dependencies albums: :destroy, reviews: :delete, tags: :nullify
|
25
25
|
module AssociationDependencies
|
26
26
|
# Mapping of association types to when the dependency calls should be made (either
|
27
27
|
# :before for in before_destroy or :after for in after_destroy)
|
28
|
-
ASSOCIATION_MAPPING = {:one_to_many=>:before, :many_to_one=>:after, :many_to_many=>:before, :one_to_one=>:before}
|
28
|
+
ASSOCIATION_MAPPING = {:one_to_many=>:before, :many_to_one=>:after, :many_to_many=>:before, :one_to_one=>:before}.freeze
|
29
29
|
|
30
30
|
# The valid dependence actions
|
31
|
-
DEPENDENCE_ACTIONS = [:delete, :destroy, :nullify]
|
31
|
+
DEPENDENCE_ACTIONS = [:delete, :destroy, :nullify].freeze
|
32
32
|
|
33
33
|
# Initialize the association_dependencies hash for this model.
|
34
34
|
def self.apply(model, hash=OPTS)
|
35
|
-
model.
|
35
|
+
model.instance_exec{@association_dependencies = {:before_delete=>[], :before_destroy=>[], :before_nullify=>[], :after_delete=>[], :after_destroy=>[]}}
|
36
36
|
end
|
37
37
|
|
38
38
|
# Call add_association_dependencies with any dependencies given in the plugin call.
|
@@ -50,7 +50,7 @@ module Sequel
|
|
50
50
|
attr_reader :association_dependencies
|
51
51
|
|
52
52
|
# Add association dependencies to this model. The hash should have association name
|
53
|
-
# symbol keys and dependency action symbol values (e.g. :
|
53
|
+
# symbol keys and dependency action symbol values (e.g. albums: :destroy).
|
54
54
|
def add_association_dependencies(hash)
|
55
55
|
hash.each do |association, action|
|
56
56
|
raise(Error, "Nonexistent association: #{association}") unless r = association_reflection(association)
|
@@ -60,19 +60,26 @@ module Sequel
|
|
60
60
|
association_dependencies[:"#{time}_#{action}"] << if action == :nullify
|
61
61
|
case type
|
62
62
|
when :one_to_many , :many_to_many
|
63
|
-
|
63
|
+
[r[:remove_all_method]]
|
64
64
|
when :one_to_one
|
65
|
-
|
65
|
+
[r[:setter_method], nil]
|
66
66
|
else
|
67
67
|
raise(Error, "Can't nullify many_to_one associated objects: association: #{association}")
|
68
68
|
end
|
69
69
|
else
|
70
70
|
raise(Error, "Can only nullify many_to_many associations: association: #{association}") if type == :many_to_many
|
71
|
-
r
|
71
|
+
r[:dataset_method]
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
# Freeze association dependencies when freezing model class.
|
77
|
+
def freeze
|
78
|
+
@association_dependencies.freeze.each_value(&:freeze)
|
79
|
+
|
80
|
+
super
|
81
|
+
end
|
82
|
+
|
76
83
|
Plugins.inherited_instance_variables(self, :@association_dependencies=>:hash_dup)
|
77
84
|
end
|
78
85
|
|
@@ -81,16 +88,16 @@ module Sequel
|
|
81
88
|
# many_to_one associations.
|
82
89
|
def after_destroy
|
83
90
|
super
|
84
|
-
model.association_dependencies[:after_delete].each{|m|
|
85
|
-
model.association_dependencies[:after_destroy].each{|m|
|
91
|
+
model.association_dependencies[:after_delete].each{|m| public_send(m).delete}
|
92
|
+
model.association_dependencies[:after_destroy].each{|m| public_send(m).destroy}
|
86
93
|
end
|
87
94
|
|
88
95
|
# Run the delete, destroy, and nullify association dependency actions for
|
89
96
|
# *_to_many associations.
|
90
97
|
def before_destroy
|
91
|
-
model.association_dependencies[:before_delete].each{|m|
|
92
|
-
model.association_dependencies[:before_destroy].each{|m|
|
93
|
-
model.association_dependencies[:before_nullify].each{|
|
98
|
+
model.association_dependencies[:before_delete].each{|m| public_send(m).delete}
|
99
|
+
model.association_dependencies[:before_destroy].each{|m| public_send(m).destroy}
|
100
|
+
model.association_dependencies[:before_nullify].each{|args| public_send(*args)}
|
94
101
|
super
|
95
102
|
end
|
96
103
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
# The association_lazy_eager_option plugin supports passing
|
6
|
+
# an +:eager+ option to an association method. If the related
|
7
|
+
# association is already cached, the cached version will be
|
8
|
+
# returned. If the association is not already cached, it will
|
9
|
+
# be loaded, and the value of the +:eager+ option will be used
|
10
|
+
# to perform an eager load of the given associations.
|
11
|
+
# the plural versions.
|
12
|
+
#
|
13
|
+
# With Sequel's default behavior, you can already perform an
|
14
|
+
# eager load when lazy loading using a block:
|
15
|
+
#
|
16
|
+
# obj.association{|ds| ds.eager(:nested_association)}
|
17
|
+
#
|
18
|
+
# However, this will ignore any cached version. In more
|
19
|
+
# complex software, the association may already be cached
|
20
|
+
# and have the nested association cached inside of it, and
|
21
|
+
# using this callback approach then requires 2 unnecessary
|
22
|
+
# queries. This plugin will not perform any queries if the
|
23
|
+
# association is already cached, preventing duplicate work.
|
24
|
+
# However, you should make sure that an already loaded
|
25
|
+
# association has the nested association already eagerly
|
26
|
+
# loaded.
|
27
|
+
#
|
28
|
+
# Usage:
|
29
|
+
#
|
30
|
+
# # Make all model subclasses support the :eager association
|
31
|
+
# # method option (called before loading subclasses)
|
32
|
+
# Sequel::Model.plugin :association_lazy_eager_option
|
33
|
+
#
|
34
|
+
# # Make the Album class support the :eager association
|
35
|
+
# # method option
|
36
|
+
# Album.plugin :association_lazy_eager_option
|
37
|
+
module AssociationLazyEagerOption
|
38
|
+
module InstanceMethods
|
39
|
+
private
|
40
|
+
|
41
|
+
# Return a dataset for the association after applying any dynamic callback.
|
42
|
+
def _associated_dataset(opts, dynamic_opts)
|
43
|
+
ds = super
|
44
|
+
|
45
|
+
if eager = dynamic_opts[:eager]
|
46
|
+
ds = ds.eager(eager)
|
47
|
+
end
|
48
|
+
|
49
|
+
ds
|
50
|
+
end
|
51
|
+
|
52
|
+
# A placeholder literalizer that can be used to load the association, or nil to not use one.
|
53
|
+
def _associated_object_loader(opts, dynamic_opts)
|
54
|
+
return if dynamic_opts[:eager]
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
# Whether to use a simple primary key lookup on the associated class when loading.
|
59
|
+
def load_with_primary_key_lookup?(opts, dynamic_opts)
|
60
|
+
return false if dynamic_opts[:eager]
|
61
|
+
super
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
# The association_multi_add_remove plugin allows adding, removing and setting
|
6
|
+
# multiple associated objects in a single method call.
|
7
|
+
# By default Sequel::Model defines singular <tt>add_*</tt> and <tt>remove_*</tt>
|
8
|
+
# methods that operate on a single associated object, this adds plural forms
|
9
|
+
# that operate on multiple associated objects. Example:
|
10
|
+
#
|
11
|
+
# artist.albums # => [album1]
|
12
|
+
# artist.add_albums([album2, album3])
|
13
|
+
# artist.albums # => [album1, album2, album3]
|
14
|
+
# artist.remove_albums([album3, album1])
|
15
|
+
# artist.albums # => [album2]
|
16
|
+
# artist.albums = [album2, album3]
|
17
|
+
# artist.albums # => [album2, album3]
|
18
|
+
#
|
19
|
+
# It can handle all situations that the normal singular methods handle, but there is
|
20
|
+
# no attempt to optimize behavior, so using these methods will not improve performance.
|
21
|
+
#
|
22
|
+
# The add/remove/set methods defined by this plugin use a transaction,
|
23
|
+
# so if one add/remove/set fails and raises an exception, all adds/removes/set
|
24
|
+
# will be rolled back. If you are using database sharding and want to save
|
25
|
+
# to a specific shard, call Model#set_server to set the server for this instance,
|
26
|
+
# as the transaction will be opened on that server.
|
27
|
+
#
|
28
|
+
# You can customize the method names used for adding/removing multiple associated
|
29
|
+
# objects using the :multi_add_method and :multi_remove_method association options.
|
30
|
+
#
|
31
|
+
# Usage:
|
32
|
+
#
|
33
|
+
# # Allow adding/removing/setting multiple associated objects in a single call
|
34
|
+
# # for all model subclass instances (called before loading subclasses):
|
35
|
+
# Sequel::Model.plugin :association_multi_add_remove
|
36
|
+
#
|
37
|
+
# # Allow adding/removing/setting multiple associated objects in a single call
|
38
|
+
# # for Album instances (called before defining associations in the class):
|
39
|
+
# Album.plugin :association_multi_add_remove
|
40
|
+
module AssociationMultiAddRemove
|
41
|
+
module ClassMethods
|
42
|
+
private
|
43
|
+
|
44
|
+
# Define the methods use to add/remove/set multiple associated objects
|
45
|
+
# in a single method call.
|
46
|
+
def def_association_instance_methods(opts)
|
47
|
+
super
|
48
|
+
|
49
|
+
if opts[:adder]
|
50
|
+
add_method = opts[:add_method]
|
51
|
+
multi_add_method = opts[:multi_add_method] || :"add_#{opts[:name]}"
|
52
|
+
multi_add_method = nil if add_method == multi_add_method
|
53
|
+
if multi_add_method
|
54
|
+
association_module_def(multi_add_method, opts) do |objs, *args|
|
55
|
+
db.transaction(:server=>@server){objs.map{|obj| send(add_method, obj, *args)}.compact}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
if opts[:remover]
|
61
|
+
remove_method = opts[:remove_method]
|
62
|
+
multi_remove_method = opts[:multi_remove_method] || :"remove_#{opts[:name]}"
|
63
|
+
multi_remove_method = nil if remove_method == multi_remove_method
|
64
|
+
if multi_remove_method
|
65
|
+
association_module_def(multi_remove_method, opts) do |objs, *args|
|
66
|
+
db.transaction(:server=>@server){objs.map{|obj| send(remove_method, obj, *args)}.compact}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if multi_add_method && multi_remove_method
|
72
|
+
association_module_def(:"#{opts[:name]}=", opts) do |objs, *args|
|
73
|
+
db.transaction(:server=>@server) do
|
74
|
+
existing_objs = send(opts.association_method)
|
75
|
+
send(multi_remove_method, (existing_objs - objs), *args)
|
76
|
+
send(multi_add_method, (objs - existing_objs), *args)
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -2,16 +2,22 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The association_pks plugin adds association_pks and
|
6
|
-
# instance methods to the model class for each
|
7
|
-
#
|
8
|
-
#
|
5
|
+
# The association_pks plugin adds association_pks, association_pks=, and
|
6
|
+
# association_pks_dataset instance methods to the model class for each
|
7
|
+
# one_to_many and many_to_many association added. These methods allow for
|
8
|
+
# easily returning the primary keys of the associated objects, and easily
|
9
|
+
# modifying which objects are associated:
|
9
10
|
#
|
10
11
|
# Artist.one_to_many :albums
|
11
12
|
# artist = Artist[1]
|
13
|
+
# artist.album_pks_dataset
|
14
|
+
# # SELECT id FROM albums WHERE (albums.artist_id = 1)
|
15
|
+
#
|
12
16
|
# artist.album_pks # [1, 2, 3]
|
13
17
|
# artist.album_pks = [2, 4]
|
14
18
|
# artist.album_pks # [2, 4]
|
19
|
+
# artist.save
|
20
|
+
# # Persist changes
|
15
21
|
#
|
16
22
|
# Note that it uses the singular form of the association name. Also note
|
17
23
|
# that the setter both associates to new primary keys not in the assocation
|
@@ -20,14 +26,18 @@ module Sequel
|
|
20
26
|
# This plugin makes modifications directly to the underlying tables,
|
21
27
|
# it does not create or return any model objects, and therefore does
|
22
28
|
# not call any callbacks. If you have any association callbacks,
|
23
|
-
# you probably should not use the setter methods.
|
29
|
+
# you probably should not use the setter methods this plugin adds.
|
30
|
+
#
|
31
|
+
# By default, changes to the association will not happen until the object
|
32
|
+
# is saved. However, using the delay_pks: false association option, you can have
|
33
|
+
# the changes made immediately when the association_pks setter method is called.
|
24
34
|
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
35
|
+
# By default, repeated calls to the association_pks getter method will not be
|
36
|
+
# cached, unless the setter method has been used and the delay_pks: false
|
37
|
+
# association option is not used. You can set caching of repeated calls to the
|
38
|
+
# association_pks getter method using the :cache_pks association option. You can
|
39
|
+
# pass the :refresh option when calling the getter method to ignore any existing
|
40
|
+
# cached values, similar to how the :refresh option works with associations.
|
31
41
|
#
|
32
42
|
# By default, if you pass a nil value to the setter, an exception will be raised.
|
33
43
|
# You can change this behavior by using the :association_pks_nil association option.
|
@@ -35,6 +45,17 @@ module Sequel
|
|
35
45
|
# If set to :remove, the setter will treat the nil as an empty array, removing
|
36
46
|
# the association all currently associated values.
|
37
47
|
#
|
48
|
+
# For many_to_many associations, association_pks assumes the related pks can be
|
49
|
+
# accessed directly from the join table. This works in most cases, but in cases
|
50
|
+
# where the :right_primary_key association option is used to specify a different
|
51
|
+
# primary key in the associated table, association_pks will return the value of
|
52
|
+
# the association primary keys (foreign key values to associated table in the join
|
53
|
+
# table), not the associated model primary keys. If you would like to use the
|
54
|
+
# associated model primary keys, you need to use the
|
55
|
+
# :association_pks_use_associated_table association option. If the
|
56
|
+
# :association_pks_use_associated_table association option is used, no setter
|
57
|
+
# method will be added.
|
58
|
+
#
|
38
59
|
# Usage:
|
39
60
|
#
|
40
61
|
# # Make all model subclass *_to_many associations have association_pks
|
@@ -50,8 +71,17 @@ module Sequel
|
|
50
71
|
|
51
72
|
# Define a association_pks method using the block for the association reflection
|
52
73
|
def def_association_pks_methods(opts)
|
53
|
-
association_module_def(
|
54
|
-
|
74
|
+
association_module_def(opts[:pks_dataset_method], &opts[:pks_dataset])
|
75
|
+
|
76
|
+
opts[:pks_getter_method] = :"#{singularize(opts[:name])}_pks_getter"
|
77
|
+
association_module_def(opts[:pks_getter_method], &opts[:pks_getter])
|
78
|
+
association_module_def(:"#{singularize(opts[:name])}_pks", opts){|dynamic_opts=OPTS| _association_pks_getter(opts, dynamic_opts)}
|
79
|
+
|
80
|
+
if opts[:pks_setter]
|
81
|
+
opts[:pks_setter_method] = :"#{singularize(opts[:name])}_pks_setter"
|
82
|
+
association_module_def(opts[:pks_setter_method], &opts[:pks_setter])
|
83
|
+
association_module_def(:"#{singularize(opts[:name])}_pks=", opts){|pks| _association_pks_setter(opts, pks)}
|
84
|
+
end
|
55
85
|
end
|
56
86
|
|
57
87
|
# Add a getter that checks the join table for matching records and
|
@@ -67,37 +97,63 @@ module Sequel
|
|
67
97
|
clpk = lpk.is_a?(Array)
|
68
98
|
crk = rk.is_a?(Array)
|
69
99
|
|
70
|
-
opts[:
|
100
|
+
dataset_method = opts[:pks_dataset_method] = :"#{singularize(opts[:name])}_pks_dataset"
|
101
|
+
|
102
|
+
opts[:pks_dataset] = if join_associated_table = opts[:association_pks_use_associated_table]
|
103
|
+
tname = opts[:join_table]
|
71
104
|
lambda do
|
72
|
-
|
73
|
-
|
74
|
-
|
105
|
+
cond = if clpk
|
106
|
+
lk.zip(lpk).map{|k, pk| [Sequel.qualify(tname, k), get_column_value(pk)]}
|
107
|
+
else
|
108
|
+
{Sequel.qualify(tname, lk) => get_column_value(lpk)}
|
109
|
+
end
|
110
|
+
rpk = opts.associated_class.primary_key
|
111
|
+
opts.associated_dataset.
|
112
|
+
naked.where(cond).
|
113
|
+
select(*Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
|
114
|
+
end
|
115
|
+
elsif clpk
|
116
|
+
lambda do
|
117
|
+
cond = lk.zip(lpk).map{|k, pk| [k, get_column_value(pk)]}
|
118
|
+
_join_table_dataset(opts).where(cond).select(*rk)
|
75
119
|
end
|
76
120
|
else
|
77
121
|
lambda do
|
78
|
-
_join_table_dataset(opts).
|
122
|
+
_join_table_dataset(opts).where(lk=>get_column_value(lpk)).select(*rk)
|
79
123
|
end
|
80
124
|
end
|
81
125
|
|
82
|
-
opts[:
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
126
|
+
opts[:pks_getter] = if join_associated_table = opts[:association_pks_use_associated_table]
|
127
|
+
lambda do
|
128
|
+
public_send(dataset_method).map(opts.associated_class.primary_key)
|
129
|
+
end
|
130
|
+
else
|
131
|
+
lambda do
|
132
|
+
public_send(dataset_method).map(rk)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
if !opts[:read_only] && !join_associated_table
|
137
|
+
opts[:pks_setter] = lambda do |pks|
|
138
|
+
if pks.empty?
|
139
|
+
public_send(opts[:remove_all_method])
|
140
|
+
else
|
141
|
+
checked_transaction do
|
142
|
+
if clpk
|
143
|
+
lpkv = lpk.map{|k| get_column_value(k)}
|
144
|
+
cond = lk.zip(lpkv)
|
145
|
+
else
|
146
|
+
lpkv = get_column_value(lpk)
|
147
|
+
cond = {lk=>lpkv}
|
148
|
+
end
|
149
|
+
ds = _join_table_dataset(opts).where(cond)
|
150
|
+
ds.exclude(rk=>pks).delete
|
151
|
+
pks -= ds.select_map(rk)
|
152
|
+
lpkv = Array(lpkv)
|
153
|
+
key_array = crk ? pks.map{|pk| lpkv + pk} : pks.map{|pk| lpkv + [pk]}
|
154
|
+
key_columns = Array(lk) + Array(rk)
|
155
|
+
ds.import(key_columns, key_array)
|
93
156
|
end
|
94
|
-
ds = _join_table_dataset(opts).filter(cond)
|
95
|
-
ds.exclude(rk=>pks).delete
|
96
|
-
pks -= ds.select_map(rk)
|
97
|
-
lpkv = Array(lpkv)
|
98
|
-
key_array = crk ? pks.map{|pk| lpkv + pk} : pks.map{|pk| lpkv + [pk]}
|
99
|
-
key_columns = Array(lk) + Array(rk)
|
100
|
-
ds.import(key_columns, key_array)
|
101
157
|
end
|
102
158
|
end
|
103
159
|
end
|
@@ -114,33 +170,41 @@ module Sequel
|
|
114
170
|
|
115
171
|
key = opts[:key]
|
116
172
|
|
173
|
+
dataset_method = opts[:pks_dataset_method] = :"#{singularize(opts[:name])}_pks_dataset"
|
174
|
+
|
175
|
+
opts[:pks_dataset] = lambda do
|
176
|
+
public_send(opts[:dataset_method]).select(*opts.associated_class.primary_key)
|
177
|
+
end
|
178
|
+
|
117
179
|
opts[:pks_getter] = lambda do
|
118
|
-
|
180
|
+
public_send(dataset_method).map(opts.associated_class.primary_key)
|
119
181
|
end
|
120
182
|
|
121
|
-
opts[:
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
primary_key = opts.associated_class.primary_key
|
126
|
-
pkh = {primary_key=>pks}
|
127
|
-
|
128
|
-
if key.is_a?(Array)
|
129
|
-
h = {}
|
130
|
-
nh = {}
|
131
|
-
key.zip(pk).each do|k, v|
|
132
|
-
h[k] = v
|
133
|
-
nh[k] = nil
|
134
|
-
end
|
183
|
+
unless opts[:read_only]
|
184
|
+
opts[:pks_setter] = lambda do |pks|
|
185
|
+
if pks.empty?
|
186
|
+
public_send(opts[:remove_all_method])
|
135
187
|
else
|
136
|
-
|
137
|
-
|
138
|
-
|
188
|
+
primary_key = opts.associated_class.primary_key
|
189
|
+
pkh = {primary_key=>pks}
|
190
|
+
|
191
|
+
if key.is_a?(Array)
|
192
|
+
h = {}
|
193
|
+
nh = {}
|
194
|
+
key.zip(pk).each do|k, v|
|
195
|
+
h[k] = v
|
196
|
+
nh[k] = nil
|
197
|
+
end
|
198
|
+
else
|
199
|
+
h = {key=>pk}
|
200
|
+
nh = {key=>nil}
|
201
|
+
end
|
139
202
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
203
|
+
checked_transaction do
|
204
|
+
ds = public_send(opts.dataset_method)
|
205
|
+
ds.unfiltered.where(pkh).update(h)
|
206
|
+
ds.exclude(pkh).update(nh)
|
207
|
+
end
|
144
208
|
end
|
145
209
|
end
|
146
210
|
end
|
@@ -155,7 +219,8 @@ module Sequel
|
|
155
219
|
def after_save
|
156
220
|
if assoc_pks = @_association_pks
|
157
221
|
assoc_pks.each do |name, pks|
|
158
|
-
|
222
|
+
# pks_setter_method is private
|
223
|
+
send(model.association_reflection(name)[:pks_setter_method], pks)
|
159
224
|
end
|
160
225
|
@_association_pks = nil
|
161
226
|
end
|
@@ -173,20 +238,31 @@ module Sequel
|
|
173
238
|
# Return the primary keys of the associated objects.
|
174
239
|
# If the receiver is a new object, return any saved
|
175
240
|
# pks, or an empty array if no pks have been saved.
|
176
|
-
def _association_pks_getter(opts)
|
177
|
-
|
178
|
-
|
241
|
+
def _association_pks_getter(opts, dynamic_opts=OPTS)
|
242
|
+
do_cache = opts[:cache_pks]
|
243
|
+
delay = opts.fetch(:delay_pks, true)
|
244
|
+
cache_or_delay = do_cache || delay
|
245
|
+
|
246
|
+
if dynamic_opts[:refresh] && @_association_pks
|
247
|
+
@_association_pks.delete(opts[:name])
|
248
|
+
end
|
249
|
+
|
250
|
+
if new? && cache_or_delay
|
179
251
|
(@_association_pks ||= {})[opts[:name]] ||= []
|
180
|
-
elsif
|
252
|
+
elsif cache_or_delay && @_association_pks && (objs = @_association_pks[opts[:name]])
|
181
253
|
objs
|
254
|
+
elsif do_cache
|
255
|
+
# pks_getter_method is private
|
256
|
+
(@_association_pks ||= {})[opts[:name]] = send(opts[:pks_getter_method])
|
182
257
|
else
|
183
|
-
|
258
|
+
# pks_getter_method is private
|
259
|
+
send(opts[:pks_getter_method])
|
184
260
|
end
|
185
261
|
end
|
186
262
|
|
187
263
|
# Update which objects are associated to the receiver.
|
188
264
|
# If the receiver is a new object, save the pks
|
189
|
-
# so the update can happen after the
|
265
|
+
# so the update can happen after the receiver has been saved.
|
190
266
|
def _association_pks_setter(opts, pks)
|
191
267
|
if pks.nil?
|
192
268
|
case opts[:association_pks_nil]
|
@@ -201,12 +277,12 @@ module Sequel
|
|
201
277
|
|
202
278
|
pks = convert_pk_array(opts, pks)
|
203
279
|
|
204
|
-
|
205
|
-
if (new? && delay) || (delay == :always)
|
280
|
+
if opts.fetch(:delay_pks, true)
|
206
281
|
modified!
|
207
282
|
(@_association_pks ||= {})[opts[:name]] = pks
|
208
283
|
else
|
209
|
-
|
284
|
+
# pks_setter_method is private
|
285
|
+
send(opts[:pks_setter_method], pks)
|
210
286
|
end
|
211
287
|
end
|
212
288
|
|
@@ -219,9 +295,10 @@ module Sequel
|
|
219
295
|
|
220
296
|
if primary_key.is_a?(Array)
|
221
297
|
if (cols = sch.values_at(*klass.primary_key)).all? && (convs = cols.map{|c| c[:type] == :integer}).all?
|
298
|
+
db = model.db
|
222
299
|
pks.map do |cpk|
|
223
|
-
cpk.
|
224
|
-
|
300
|
+
cpk.map do |pk|
|
301
|
+
db.typecast_value(:integer, pk)
|
225
302
|
end
|
226
303
|
end
|
227
304
|
else
|
@@ -37,7 +37,7 @@ module Sequel
|
|
37
37
|
# :arguments => [2],
|
38
38
|
# :block => {|x| 3},
|
39
39
|
# :instance => artist,
|
40
|
-
# :reflection =>
|
40
|
+
# :reflection => AssociationReflection instance,
|
41
41
|
# :proxy_argument => 1,
|
42
42
|
# :proxy_block => {|ds| ds}
|
43
43
|
# }
|
@@ -51,7 +51,7 @@ module Sequel
|
|
51
51
|
# Album.plugin :association_proxies
|
52
52
|
module AssociationProxies
|
53
53
|
def self.configure(model, &block)
|
54
|
-
model.
|
54
|
+
model.instance_exec do
|
55
55
|
@association_proxy_to_dataset = block if block
|
56
56
|
@association_proxy_to_dataset ||= AssociationProxy::DEFAULT_PROXY_TO_DATASET
|
57
57
|
end
|
@@ -61,11 +61,24 @@ module Sequel
|
|
61
61
|
# associated objects and call the method on the associated object array.
|
62
62
|
# Calling any other method will call that method on the association's dataset.
|
63
63
|
class AssociationProxy < BasicObject
|
64
|
-
array = []
|
64
|
+
array = [].freeze
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
if RUBY_VERSION < '2.6'
|
67
|
+
# :nocov:
|
68
|
+
|
69
|
+
# Default proc used to determine whether to send the method to the dataset.
|
70
|
+
# If the array would respond to it, sends it to the array instead of the dataset.
|
71
|
+
DEFAULT_PROXY_TO_DATASET = proc do |opts|
|
72
|
+
array_method = array.respond_to?(opts[:method])
|
73
|
+
if !array_method && opts[:method] == :filter
|
74
|
+
Sequel::Deprecation.deprecate "The behavior of the #filter method for association proxies will change in Ruby 2.6. Switch from using #filter to using #where to conserve current behavior."
|
75
|
+
end
|
76
|
+
!array_method
|
77
|
+
end
|
78
|
+
# :nocov:
|
79
|
+
else
|
80
|
+
DEFAULT_PROXY_TO_DATASET = proc{|opts| !array.respond_to?(opts[:method])}
|
81
|
+
end
|
69
82
|
|
70
83
|
# Set the association reflection to use, and whether the association should be
|
71
84
|
# reloaded if an array method is called.
|
@@ -80,12 +93,15 @@ module Sequel
|
|
80
93
|
# is an array method, otherwise call the method on the association's dataset.
|
81
94
|
def method_missing(meth, *args, &block)
|
82
95
|
v = if @instance.model.association_proxy_to_dataset.call(:method=>meth, :arguments=>args, :block=>block, :instance=>@instance, :reflection=>@reflection, :proxy_argument=>@proxy_argument, :proxy_block=>@proxy_block)
|
83
|
-
@instance.
|
96
|
+
@instance.public_send(@reflection[:dataset_method])
|
84
97
|
else
|
85
98
|
@instance.send(:load_associated_objects, @reflection, @proxy_argument, &@proxy_block)
|
86
99
|
end
|
87
|
-
v.
|
100
|
+
v.public_send(meth, *args, &block)
|
88
101
|
end
|
102
|
+
# :nocov:
|
103
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
104
|
+
# :nocov:
|
89
105
|
end
|
90
106
|
|
91
107
|
module ClassMethods
|
@@ -96,10 +112,18 @@ module Sequel
|
|
96
112
|
|
97
113
|
Plugins.inherited_instance_variables(self, :@association_proxy_to_dataset=>nil)
|
98
114
|
|
115
|
+
private
|
116
|
+
|
99
117
|
# Changes the association method to return a proxy instead of the associated objects
|
100
118
|
# directly.
|
101
119
|
def def_association_method(opts)
|
102
|
-
opts.returns_array?
|
120
|
+
if opts.returns_array?
|
121
|
+
association_module_def(opts.association_method, opts) do |dynamic_opts=OPTS, &block|
|
122
|
+
AssociationProxy.new(self, opts, dynamic_opts, &block)
|
123
|
+
end
|
124
|
+
else
|
125
|
+
super
|
126
|
+
end
|
103
127
|
end
|
104
128
|
end
|
105
129
|
end
|