sequel 5.8.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- 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.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.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.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- 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 +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/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 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- 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/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
data/lib/sequel/model/plugins.rb
CHANGED
|
@@ -31,6 +31,7 @@ module Sequel
|
|
|
31
31
|
def self.def_dataset_methods(mod, meths)
|
|
32
32
|
Array(meths).each do |meth|
|
|
33
33
|
mod.class_eval("def #{meth}(*args, &block); dataset.#{meth}(*args, &block) end", __FILE__, __LINE__)
|
|
34
|
+
mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
|
34
35
|
end
|
|
35
36
|
end
|
|
36
37
|
|
|
@@ -40,6 +41,7 @@ module Sequel
|
|
|
40
41
|
mod.send(:define_method, :inherited_instance_variables) do ||
|
|
41
42
|
super().merge!(hash)
|
|
42
43
|
end
|
|
44
|
+
mod.send(:private, :inherited_instance_variables)
|
|
43
45
|
end
|
|
44
46
|
|
|
45
47
|
# Add method to +mod+ that overrides set_dataset to call the method afterward.
|
|
@@ -51,5 +53,108 @@ module Sequel
|
|
|
51
53
|
r
|
|
52
54
|
end
|
|
53
55
|
end
|
|
56
|
+
|
|
57
|
+
method_num = 0
|
|
58
|
+
method_num_mutex = Mutex.new
|
|
59
|
+
# Return a unique method name symbol for the given suffix.
|
|
60
|
+
SEQUEL_METHOD_NAME = lambda do |suffix|
|
|
61
|
+
:"_sequel_#{suffix}_#{method_num_mutex.synchronize{method_num += 1}}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Define a private instance method using the block with the provided name and
|
|
65
|
+
# expected arity. If the name is given as a Symbol, it is used directly.
|
|
66
|
+
# If the name is given as a String, a unique name will be generated using
|
|
67
|
+
# that string. The expected_arity should be either 0 (no arguments) or
|
|
68
|
+
# 1 (single argument).
|
|
69
|
+
#
|
|
70
|
+
# If a block with an arity that does not match the expected arity is used,
|
|
71
|
+
# a deprecation warning will be issued. The method defined should still
|
|
72
|
+
# work, though it will be slower than a method with the expected arity.
|
|
73
|
+
#
|
|
74
|
+
# Sequel only checks arity for regular blocks, not lambdas. Lambdas were
|
|
75
|
+
# already strict in regards to arity, so there is no need to try to fix
|
|
76
|
+
# arity to keep backwards compatibility for lambdas.
|
|
77
|
+
#
|
|
78
|
+
# Blocks with required keyword arguments are not supported by this method.
|
|
79
|
+
def self.def_sequel_method(model, meth, expected_arity, &block)
|
|
80
|
+
if meth.is_a?(String)
|
|
81
|
+
meth = SEQUEL_METHOD_NAME.call(meth)
|
|
82
|
+
end
|
|
83
|
+
call_meth = meth
|
|
84
|
+
|
|
85
|
+
unless block.lambda?
|
|
86
|
+
required_args, optional_args, rest, keyword = _define_sequel_method_arg_numbers(block)
|
|
87
|
+
|
|
88
|
+
if keyword == :required
|
|
89
|
+
raise Error, "cannot use block with required keyword arguments when calling define_sequel_method with expected arity #{expected_arity}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
case expected_arity
|
|
93
|
+
when 0
|
|
94
|
+
unless required_args == 0
|
|
95
|
+
# SEQUEL6: remove
|
|
96
|
+
Sequel::Deprecation.deprecate("Arity mismatch in block passed to define_sequel_method. Expected Arity 0, but arguments required for #{block.inspect}. Support for this will be removed in Sequel 6.")
|
|
97
|
+
b = block
|
|
98
|
+
block = lambda{instance_exec(&b)} # Fallback
|
|
99
|
+
end
|
|
100
|
+
when 1
|
|
101
|
+
if required_args == 0 && optional_args == 0 && !rest
|
|
102
|
+
# SEQUEL6: remove
|
|
103
|
+
Sequel::Deprecation.deprecate("Arity mismatch in block passed to define_sequel_method. Expected Arity 1, but no arguments accepted for #{block.inspect}. Support for this will be removed in Sequel 6.")
|
|
104
|
+
temp_method = SEQUEL_METHOD_NAME.call("temp")
|
|
105
|
+
model.class_eval("def #{temp_method}(_) #{meth =~ /\A\w+\z/ ? "#{meth}_arity" : "send(:\"#{meth}_arity\")"} end", __FILE__, __LINE__)
|
|
106
|
+
model.send(:alias_method, meth, temp_method)
|
|
107
|
+
model.send(:undef_method, temp_method)
|
|
108
|
+
model.send(:private, meth)
|
|
109
|
+
meth = :"#{meth}_arity"
|
|
110
|
+
elsif required_args > 1
|
|
111
|
+
# SEQUEL6: remove
|
|
112
|
+
Sequel::Deprecation.deprecate("Arity mismatch in block passed to define_sequel_method. Expected Arity 1, but more arguments required for #{block.inspect}. Support for this will be removed in Sequel 6.")
|
|
113
|
+
b = block
|
|
114
|
+
block = lambda{|r| instance_exec(r, &b)} # Fallback
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
raise Error, "unexpected arity passed to define_sequel_method: #{expected_arity.inspect}"
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
model.send(:define_method, meth, &block)
|
|
122
|
+
model.send(:private, meth)
|
|
123
|
+
call_meth
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Return the number of required argument, optional arguments,
|
|
127
|
+
# whether the callable accepts any additional arguments,
|
|
128
|
+
# and whether the callable accepts keyword arguments (true, false
|
|
129
|
+
# or :required).
|
|
130
|
+
def self._define_sequel_method_arg_numbers(callable)
|
|
131
|
+
optional_args = 0
|
|
132
|
+
rest = false
|
|
133
|
+
keyword = false
|
|
134
|
+
callable.parameters.map(&:first).each do |arg_type, _|
|
|
135
|
+
case arg_type
|
|
136
|
+
when :opt
|
|
137
|
+
optional_args += 1
|
|
138
|
+
when :rest
|
|
139
|
+
rest = true
|
|
140
|
+
when :keyreq
|
|
141
|
+
keyword = :required
|
|
142
|
+
when :key, :keyrest
|
|
143
|
+
keyword ||= true
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
arity = callable.arity
|
|
147
|
+
if arity < 0
|
|
148
|
+
arity = arity.abs - 1
|
|
149
|
+
end
|
|
150
|
+
required_args = arity
|
|
151
|
+
arity -= 1 if keyword == :required
|
|
152
|
+
|
|
153
|
+
# callable currently is always a non-lambda Proc
|
|
154
|
+
optional_args -= arity
|
|
155
|
+
|
|
156
|
+
[required_args, optional_args, rest, keyword]
|
|
157
|
+
end
|
|
158
|
+
private_class_method :_define_sequel_method_arg_numbers
|
|
54
159
|
end
|
|
55
160
|
end
|
|
@@ -60,9 +60,9 @@ 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
|
|
@@ -97,7 +97,7 @@ module Sequel
|
|
|
97
97
|
def before_destroy
|
|
98
98
|
model.association_dependencies[:before_delete].each{|m| public_send(m).delete}
|
|
99
99
|
model.association_dependencies[:before_destroy].each{|m| public_send(m).destroy}
|
|
100
|
-
model.association_dependencies[:before_nullify].each{|
|
|
100
|
+
model.association_dependencies[:before_nullify].each{|args| public_send(*args)}
|
|
101
101
|
super
|
|
102
102
|
end
|
|
103
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,13 +2,17 @@
|
|
|
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]
|
|
@@ -22,11 +26,18 @@ module Sequel
|
|
|
22
26
|
# This plugin makes modifications directly to the underlying tables,
|
|
23
27
|
# it does not create or return any model objects, and therefore does
|
|
24
28
|
# not call any callbacks. If you have any association callbacks,
|
|
25
|
-
# you probably should not use the setter methods.
|
|
29
|
+
# you probably should not use the setter methods this plugin adds.
|
|
26
30
|
#
|
|
27
31
|
# By default, changes to the association will not happen until the object
|
|
28
|
-
# is saved. However, using the delay_pks: false option, you can have
|
|
29
|
-
# changes made immediately when the association_pks setter method is called.
|
|
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.
|
|
34
|
+
#
|
|
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.
|
|
30
41
|
#
|
|
31
42
|
# By default, if you pass a nil value to the setter, an exception will be raised.
|
|
32
43
|
# You can change this behavior by using the :association_pks_nil association option.
|
|
@@ -60,8 +71,17 @@ module Sequel
|
|
|
60
71
|
|
|
61
72
|
# Define a association_pks method using the block for the association reflection
|
|
62
73
|
def def_association_pks_methods(opts)
|
|
63
|
-
association_module_def(
|
|
64
|
-
|
|
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
|
|
65
85
|
end
|
|
66
86
|
|
|
67
87
|
# Add a getter that checks the join table for matching records and
|
|
@@ -77,7 +97,9 @@ module Sequel
|
|
|
77
97
|
clpk = lpk.is_a?(Array)
|
|
78
98
|
crk = rk.is_a?(Array)
|
|
79
99
|
|
|
80
|
-
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]
|
|
81
103
|
tname = opts[:join_table]
|
|
82
104
|
lambda do
|
|
83
105
|
cond = if clpk
|
|
@@ -88,16 +110,26 @@ module Sequel
|
|
|
88
110
|
rpk = opts.associated_class.primary_key
|
|
89
111
|
opts.associated_dataset.
|
|
90
112
|
naked.where(cond).
|
|
91
|
-
|
|
113
|
+
select(*Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
|
|
92
114
|
end
|
|
93
115
|
elsif clpk
|
|
94
116
|
lambda do
|
|
95
117
|
cond = lk.zip(lpk).map{|k, pk| [k, get_column_value(pk)]}
|
|
96
|
-
_join_table_dataset(opts).where(cond).
|
|
118
|
+
_join_table_dataset(opts).where(cond).select(*rk)
|
|
97
119
|
end
|
|
98
120
|
else
|
|
99
121
|
lambda do
|
|
100
|
-
_join_table_dataset(opts).where(lk=>get_column_value(lpk)).
|
|
122
|
+
_join_table_dataset(opts).where(lk=>get_column_value(lpk)).select(*rk)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
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)
|
|
101
133
|
end
|
|
102
134
|
end
|
|
103
135
|
|
|
@@ -138,8 +170,14 @@ module Sequel
|
|
|
138
170
|
|
|
139
171
|
key = opts[:key]
|
|
140
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
|
+
|
|
141
179
|
opts[:pks_getter] = lambda do
|
|
142
|
-
public_send(
|
|
180
|
+
public_send(dataset_method).map(opts.associated_class.primary_key)
|
|
143
181
|
end
|
|
144
182
|
|
|
145
183
|
unless opts[:read_only]
|
|
@@ -181,7 +219,8 @@ module Sequel
|
|
|
181
219
|
def after_save
|
|
182
220
|
if assoc_pks = @_association_pks
|
|
183
221
|
assoc_pks.each do |name, pks|
|
|
184
|
-
|
|
222
|
+
# pks_setter_method is private
|
|
223
|
+
send(model.association_reflection(name)[:pks_setter_method], pks)
|
|
185
224
|
end
|
|
186
225
|
@_association_pks = nil
|
|
187
226
|
end
|
|
@@ -199,14 +238,25 @@ module Sequel
|
|
|
199
238
|
# Return the primary keys of the associated objects.
|
|
200
239
|
# If the receiver is a new object, return any saved
|
|
201
240
|
# pks, or an empty array if no pks have been saved.
|
|
202
|
-
def _association_pks_getter(opts)
|
|
241
|
+
def _association_pks_getter(opts, dynamic_opts=OPTS)
|
|
242
|
+
do_cache = opts[:cache_pks]
|
|
203
243
|
delay = opts.fetch(:delay_pks, true)
|
|
204
|
-
|
|
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
|
|
205
251
|
(@_association_pks ||= {})[opts[:name]] ||= []
|
|
206
|
-
elsif
|
|
252
|
+
elsif cache_or_delay && @_association_pks && (objs = @_association_pks[opts[:name]])
|
|
207
253
|
objs
|
|
254
|
+
elsif do_cache
|
|
255
|
+
# pks_getter_method is private
|
|
256
|
+
(@_association_pks ||= {})[opts[:name]] = send(opts[:pks_getter_method])
|
|
208
257
|
else
|
|
209
|
-
|
|
258
|
+
# pks_getter_method is private
|
|
259
|
+
send(opts[:pks_getter_method])
|
|
210
260
|
end
|
|
211
261
|
end
|
|
212
262
|
|
|
@@ -231,7 +281,8 @@ module Sequel
|
|
|
231
281
|
modified!
|
|
232
282
|
(@_association_pks ||= {})[opts[:name]] = pks
|
|
233
283
|
else
|
|
234
|
-
|
|
284
|
+
# pks_setter_method is private
|
|
285
|
+
send(opts[:pks_setter_method], pks)
|
|
235
286
|
end
|
|
236
287
|
end
|
|
237
288
|
|
|
@@ -244,9 +295,10 @@ module Sequel
|
|
|
244
295
|
|
|
245
296
|
if primary_key.is_a?(Array)
|
|
246
297
|
if (cols = sch.values_at(*klass.primary_key)).all? && (convs = cols.map{|c| c[:type] == :integer}).all?
|
|
298
|
+
db = model.db
|
|
247
299
|
pks.map do |cpk|
|
|
248
|
-
cpk.
|
|
249
|
-
|
|
300
|
+
cpk.map do |pk|
|
|
301
|
+
db.typecast_value(:integer, pk)
|
|
250
302
|
end
|
|
251
303
|
end
|
|
252
304
|
else
|