sequel 5.20.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -519
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -63
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
data/lib/sequel/model/base.rb
CHANGED
|
@@ -460,47 +460,6 @@ module Sequel
|
|
|
460
460
|
super
|
|
461
461
|
end
|
|
462
462
|
|
|
463
|
-
# If possible, set the dataset for the model subclass as soon as it
|
|
464
|
-
# is created. Also, make sure the inherited class instance variables
|
|
465
|
-
# are copied into the subclass.
|
|
466
|
-
#
|
|
467
|
-
# Sequel queries the database to get schema information as soon as
|
|
468
|
-
# a model class is created:
|
|
469
|
-
#
|
|
470
|
-
# class Artist < Sequel::Model # Causes schema query
|
|
471
|
-
# end
|
|
472
|
-
def inherited(subclass)
|
|
473
|
-
super
|
|
474
|
-
ivs = subclass.instance_variables
|
|
475
|
-
inherited_instance_variables.each do |iv, dup|
|
|
476
|
-
next if ivs.include?(iv)
|
|
477
|
-
if (sup_class_value = instance_variable_get(iv)) && dup
|
|
478
|
-
sup_class_value = case dup
|
|
479
|
-
when :dup
|
|
480
|
-
sup_class_value.dup
|
|
481
|
-
when :hash_dup
|
|
482
|
-
h = {}
|
|
483
|
-
sup_class_value.each{|k,v| h[k] = v.dup}
|
|
484
|
-
h
|
|
485
|
-
when Proc
|
|
486
|
-
dup.call(sup_class_value)
|
|
487
|
-
else
|
|
488
|
-
raise Error, "bad inherited instance variable type: #{dup.inspect}"
|
|
489
|
-
end
|
|
490
|
-
end
|
|
491
|
-
subclass.instance_variable_set(iv, sup_class_value)
|
|
492
|
-
end
|
|
493
|
-
|
|
494
|
-
unless ivs.include?(:@dataset)
|
|
495
|
-
if @dataset && self != Model
|
|
496
|
-
subclass.set_dataset(@dataset.clone, :inherited=>true)
|
|
497
|
-
elsif (n = subclass.name) && !n.to_s.empty?
|
|
498
|
-
db
|
|
499
|
-
subclass.set_dataset(subclass.implicit_table_name)
|
|
500
|
-
end
|
|
501
|
-
end
|
|
502
|
-
end
|
|
503
|
-
|
|
504
463
|
# Returns the implicit table name for the model class, which is the demodulized,
|
|
505
464
|
# underscored, pluralized name of the class.
|
|
506
465
|
#
|
|
@@ -515,12 +474,6 @@ module Sequel
|
|
|
515
474
|
call(values)
|
|
516
475
|
end
|
|
517
476
|
|
|
518
|
-
# Clear the setter_methods cache when a setter method is added.
|
|
519
|
-
def method_added(meth)
|
|
520
|
-
clear_setter_methods_cache if meth.to_s.end_with?('=')
|
|
521
|
-
super
|
|
522
|
-
end
|
|
523
|
-
|
|
524
477
|
# Mark the model as not having a primary key. Not having a primary key
|
|
525
478
|
# can cause issues, among which is that you won't be able to update records.
|
|
526
479
|
#
|
|
@@ -538,6 +491,11 @@ module Sequel
|
|
|
538
491
|
# the module using a the camelized plugin name under Sequel::Plugins.
|
|
539
492
|
def plugin(plugin, *args, &block)
|
|
540
493
|
m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
|
|
494
|
+
|
|
495
|
+
if !m.respond_to?(:apply) && !m.respond_to?(:configure) && (!args.empty? || block)
|
|
496
|
+
Deprecation.deprecate("Plugin #{plugin} accepts no arguments or block, and passing arguments/block to it", "Remove arguments and block when loading the plugin")
|
|
497
|
+
end
|
|
498
|
+
|
|
541
499
|
unless @plugins.include?(m)
|
|
542
500
|
@plugins << m
|
|
543
501
|
m.apply(self, *args, &block) if m.respond_to?(:apply)
|
|
@@ -547,8 +505,12 @@ module Sequel
|
|
|
547
505
|
dataset_extend(m::DatasetMethods, :create_class_methods=>false)
|
|
548
506
|
end
|
|
549
507
|
end
|
|
508
|
+
|
|
550
509
|
m.configure(self, *args, &block) if m.respond_to?(:configure)
|
|
551
510
|
end
|
|
511
|
+
# :nocov:
|
|
512
|
+
ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
|
|
513
|
+
# :nocov:
|
|
552
514
|
|
|
553
515
|
# Returns primary key attribute hash. If using a composite primary key
|
|
554
516
|
# value such be an array with values for each primary key in the correct
|
|
@@ -640,7 +602,7 @@ module Sequel
|
|
|
640
602
|
@columns = superclass.instance_variable_get(:@columns)
|
|
641
603
|
@db_schema = superclass.instance_variable_get(:@db_schema)
|
|
642
604
|
else
|
|
643
|
-
@dataset = @dataset.with_extend(*@dataset_method_modules.reverse)
|
|
605
|
+
@dataset = @dataset.with_extend(*@dataset_method_modules.reverse)
|
|
644
606
|
@db_schema = get_db_schema
|
|
645
607
|
end
|
|
646
608
|
|
|
@@ -679,8 +641,7 @@ module Sequel
|
|
|
679
641
|
|
|
680
642
|
# Cache of setter methods to allow by default, in order to speed up mass assignment.
|
|
681
643
|
def setter_methods
|
|
682
|
-
|
|
683
|
-
@setter_methods = get_setter_methods
|
|
644
|
+
@setter_methods || (@setter_methods = get_setter_methods)
|
|
684
645
|
end
|
|
685
646
|
|
|
686
647
|
# Returns name of primary table for the dataset. If the table for the dataset
|
|
@@ -768,8 +729,14 @@ module Sequel
|
|
|
768
729
|
im = instance_methods
|
|
769
730
|
overridable_methods_module.module_eval do
|
|
770
731
|
meth = :"#{column}="
|
|
771
|
-
|
|
772
|
-
|
|
732
|
+
unless im.include?(column)
|
|
733
|
+
define_method(column){self[column]}
|
|
734
|
+
alias_method(column, column)
|
|
735
|
+
end
|
|
736
|
+
unless im.include?(meth)
|
|
737
|
+
define_method(meth){|v| self[column] = v}
|
|
738
|
+
alias_method(meth, meth)
|
|
739
|
+
end
|
|
773
740
|
end
|
|
774
741
|
end
|
|
775
742
|
|
|
@@ -782,8 +749,14 @@ module Sequel
|
|
|
782
749
|
im = instance_methods
|
|
783
750
|
columns.each do |column|
|
|
784
751
|
meth = :"#{column}="
|
|
785
|
-
|
|
786
|
-
|
|
752
|
+
unless im.include?(column)
|
|
753
|
+
overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__)
|
|
754
|
+
overridable_methods_module.send(:alias_method, column, column)
|
|
755
|
+
end
|
|
756
|
+
unless im.include?(meth)
|
|
757
|
+
overridable_methods_module.module_eval("def #{meth}(v); self[:#{column}] = v end", __FILE__, __LINE__)
|
|
758
|
+
overridable_methods_module.send(:alias_method, meth, meth)
|
|
759
|
+
end
|
|
787
760
|
end
|
|
788
761
|
end
|
|
789
762
|
|
|
@@ -798,6 +771,10 @@ module Sequel
|
|
|
798
771
|
else
|
|
799
772
|
define_singleton_method(meth){|*args, &block| dataset.public_send(meth, *args, &block)}
|
|
800
773
|
end
|
|
774
|
+
singleton_class.send(:alias_method, meth, meth)
|
|
775
|
+
# :nocov:
|
|
776
|
+
singleton_class.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
|
777
|
+
# :nocov:
|
|
801
778
|
end
|
|
802
779
|
|
|
803
780
|
# Get the schema from the database, fall back on checking the columns
|
|
@@ -854,6 +831,46 @@ module Sequel
|
|
|
854
831
|
meths
|
|
855
832
|
end
|
|
856
833
|
|
|
834
|
+
# If possible, set the dataset for the model subclass as soon as it
|
|
835
|
+
# is created. Also, make sure the inherited class instance variables
|
|
836
|
+
# are copied into the subclass.
|
|
837
|
+
#
|
|
838
|
+
# Sequel queries the database to get schema information as soon as
|
|
839
|
+
# a model class is created:
|
|
840
|
+
#
|
|
841
|
+
# class Artist < Sequel::Model # Causes schema query
|
|
842
|
+
# end
|
|
843
|
+
def inherited(subclass)
|
|
844
|
+
super
|
|
845
|
+
ivs = subclass.instance_variables
|
|
846
|
+
inherited_instance_variables.each do |iv, dup|
|
|
847
|
+
if (sup_class_value = instance_variable_get(iv)) && dup
|
|
848
|
+
sup_class_value = case dup
|
|
849
|
+
when :dup
|
|
850
|
+
sup_class_value.dup
|
|
851
|
+
when :hash_dup
|
|
852
|
+
h = {}
|
|
853
|
+
sup_class_value.each{|k,v| h[k] = v.dup}
|
|
854
|
+
h
|
|
855
|
+
when Proc
|
|
856
|
+
dup.call(sup_class_value)
|
|
857
|
+
else
|
|
858
|
+
raise Error, "bad inherited instance variable type: #{dup.inspect}"
|
|
859
|
+
end
|
|
860
|
+
end
|
|
861
|
+
subclass.instance_variable_set(iv, sup_class_value)
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
unless ivs.include?(:@dataset)
|
|
865
|
+
if @dataset && self != Model
|
|
866
|
+
subclass.set_dataset(@dataset.clone, :inherited=>true)
|
|
867
|
+
elsif (n = subclass.name) && !n.to_s.empty?
|
|
868
|
+
db
|
|
869
|
+
subclass.set_dataset(subclass.implicit_table_name)
|
|
870
|
+
end
|
|
871
|
+
end
|
|
872
|
+
end
|
|
873
|
+
|
|
857
874
|
# A hash of instance variables to automatically set up in subclasses.
|
|
858
875
|
# Keys are instance variable symbols, values should be:
|
|
859
876
|
# nil :: Assign directly from superclass to subclass (frozen objects)
|
|
@@ -908,6 +925,12 @@ module Sequel
|
|
|
908
925
|
opts[:class_name] ||= '::' + ((name || '').split("::")[0..-2] + [camelize(default)]).join('::')
|
|
909
926
|
end
|
|
910
927
|
|
|
928
|
+
# Clear the setter_methods cache when a setter method is added.
|
|
929
|
+
def method_added(meth)
|
|
930
|
+
clear_setter_methods_cache if meth.to_s.end_with?('=')
|
|
931
|
+
super
|
|
932
|
+
end
|
|
933
|
+
|
|
911
934
|
# Module that the class includes that holds methods the class adds for column accessors and
|
|
912
935
|
# associations so that the methods can be overridden with +super+.
|
|
913
936
|
def overridable_methods_module
|
|
@@ -1069,8 +1092,8 @@ module Sequel
|
|
|
1069
1092
|
@new = true
|
|
1070
1093
|
@modified = true
|
|
1071
1094
|
initialize_set(values)
|
|
1072
|
-
|
|
1073
|
-
yield self if
|
|
1095
|
+
_clear_changed_columns(:initialize)
|
|
1096
|
+
yield self if defined?(yield)
|
|
1074
1097
|
end
|
|
1075
1098
|
|
|
1076
1099
|
# Returns value of the column's attribute.
|
|
@@ -1116,7 +1139,7 @@ module Sequel
|
|
|
1116
1139
|
when nil
|
|
1117
1140
|
return false
|
|
1118
1141
|
when Array
|
|
1119
|
-
return false if
|
|
1142
|
+
return false if pkv.any?(&:nil?)
|
|
1120
1143
|
end
|
|
1121
1144
|
|
|
1122
1145
|
(obj.class == model) && (obj.pk == pkv)
|
|
@@ -1237,12 +1260,12 @@ module Sequel
|
|
|
1237
1260
|
# Once an object is frozen, you cannot modify it's values, changed_columns,
|
|
1238
1261
|
# errors, or dataset.
|
|
1239
1262
|
def freeze
|
|
1240
|
-
values.freeze
|
|
1241
|
-
_changed_columns.freeze
|
|
1242
1263
|
unless errors.frozen?
|
|
1243
1264
|
validate
|
|
1244
1265
|
errors.freeze
|
|
1245
1266
|
end
|
|
1267
|
+
values.freeze
|
|
1268
|
+
_changed_columns.freeze
|
|
1246
1269
|
this if !new? && model.primary_key
|
|
1247
1270
|
super
|
|
1248
1271
|
end
|
|
@@ -1626,6 +1649,13 @@ module Sequel
|
|
|
1626
1649
|
def _changed_columns
|
|
1627
1650
|
@changed_columns ||= []
|
|
1628
1651
|
end
|
|
1652
|
+
|
|
1653
|
+
# Clear the changed columns. Reason is the reason for clearing
|
|
1654
|
+
# the columns, and should be one of: :initialize, :refresh, :create
|
|
1655
|
+
# or :update.
|
|
1656
|
+
def _clear_changed_columns(_reason)
|
|
1657
|
+
_changed_columns.clear
|
|
1658
|
+
end
|
|
1629
1659
|
|
|
1630
1660
|
# Do the deletion of the object's dataset, and check that the row
|
|
1631
1661
|
# was actually deleted.
|
|
@@ -1711,12 +1741,13 @@ module Sequel
|
|
|
1711
1741
|
|
|
1712
1742
|
# The values hash to use when inserting a new record.
|
|
1713
1743
|
alias _insert_values values
|
|
1744
|
+
private :_insert_values
|
|
1714
1745
|
|
|
1715
1746
|
# Refresh using a particular dataset, used inside save to make sure the same server
|
|
1716
1747
|
# is used for reading newly inserted values from the database
|
|
1717
1748
|
def _refresh(dataset)
|
|
1718
1749
|
_refresh_set_values(_refresh_get(dataset) || raise(NoExistingObject, "Record not found"))
|
|
1719
|
-
|
|
1750
|
+
_clear_changed_columns(:refresh)
|
|
1720
1751
|
end
|
|
1721
1752
|
|
|
1722
1753
|
# Get the row of column data from the database.
|
|
@@ -1754,7 +1785,7 @@ module Sequel
|
|
|
1754
1785
|
@this = nil
|
|
1755
1786
|
@new = false
|
|
1756
1787
|
@modified = false
|
|
1757
|
-
pk ? _save_refresh :
|
|
1788
|
+
pk ? _save_refresh : _clear_changed_columns(:create)
|
|
1758
1789
|
after_create
|
|
1759
1790
|
true
|
|
1760
1791
|
end
|
|
@@ -1765,14 +1796,12 @@ module Sequel
|
|
|
1765
1796
|
before_update
|
|
1766
1797
|
columns = opts[:columns]
|
|
1767
1798
|
if columns.nil?
|
|
1768
|
-
if opts[:changed]
|
|
1769
|
-
|
|
1770
|
-
columns_updated = @values.reject{|k,v| !cc.include?(k)}
|
|
1771
|
-
cc.clear
|
|
1799
|
+
columns_updated = if opts[:changed]
|
|
1800
|
+
_save_update_changed_colums_hash
|
|
1772
1801
|
else
|
|
1773
|
-
|
|
1774
|
-
_changed_columns.clear
|
|
1802
|
+
_save_update_all_columns_hash
|
|
1775
1803
|
end
|
|
1804
|
+
_clear_changed_columns(:update)
|
|
1776
1805
|
else # update only the specified columns
|
|
1777
1806
|
columns = Array(columns)
|
|
1778
1807
|
columns_updated = @values.reject{|k, v| !columns.include?(k)}
|
|
@@ -1798,7 +1827,7 @@ module Sequel
|
|
|
1798
1827
|
# can be overridden to avoid the refresh.
|
|
1799
1828
|
def _save_refresh
|
|
1800
1829
|
_save_set_values(_refresh_get(this.server?(:default)) || raise(NoExistingObject, "Record not found"))
|
|
1801
|
-
|
|
1830
|
+
_clear_changed_columns(:create)
|
|
1802
1831
|
end
|
|
1803
1832
|
|
|
1804
1833
|
# Set values to the provided hash. Called after a create,
|
|
@@ -1820,6 +1849,14 @@ module Sequel
|
|
|
1820
1849
|
v
|
|
1821
1850
|
end
|
|
1822
1851
|
|
|
1852
|
+
# Return a hash of values used when saving changed columns of an
|
|
1853
|
+
# existing object. Defaults to all of the objects current values
|
|
1854
|
+
# that are recorded as modified.
|
|
1855
|
+
def _save_update_changed_colums_hash
|
|
1856
|
+
cc = changed_columns
|
|
1857
|
+
@values.reject{|k,v| !cc.include?(k)}
|
|
1858
|
+
end
|
|
1859
|
+
|
|
1823
1860
|
# Validate the object if validating on save. Skips validation
|
|
1824
1861
|
# completely (including validation hooks) if
|
|
1825
1862
|
# skip_validation_on_save! has been called on the object,
|
|
@@ -2218,7 +2255,9 @@ module Sequel
|
|
|
2218
2255
|
plugin self
|
|
2219
2256
|
|
|
2220
2257
|
singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
|
|
2258
|
+
# :nocov:
|
|
2221
2259
|
if RUBY_VERSION >= '1.9.3'
|
|
2260
|
+
# :nocov:
|
|
2222
2261
|
singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
|
|
2223
2262
|
end
|
|
2224
2263
|
end
|
data/lib/sequel/model/errors.rb
CHANGED
|
@@ -38,7 +38,7 @@ module Sequel
|
|
|
38
38
|
def full_messages
|
|
39
39
|
inject([]) do |m, kv|
|
|
40
40
|
att, errors = *kv
|
|
41
|
-
errors.each {|e| m << (e.is_a?(LiteralString) ? e :
|
|
41
|
+
errors.each {|e| m << (e.is_a?(LiteralString) ? e : full_message(att, e))}
|
|
42
42
|
m
|
|
43
43
|
end
|
|
44
44
|
end
|
|
@@ -53,6 +53,15 @@ module Sequel
|
|
|
53
53
|
v
|
|
54
54
|
end
|
|
55
55
|
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
# Create full error message to use for the given attribute (or array of attributes)
|
|
60
|
+
# and error message. This can be overridden for easier internalization.
|
|
61
|
+
def full_message(att, error_msg)
|
|
62
|
+
att = att.join(' and ') if att.is_a?(Array)
|
|
63
|
+
"#{att} #{error_msg}"
|
|
64
|
+
end
|
|
56
65
|
end
|
|
57
66
|
end
|
|
58
67
|
end
|
data/lib/sequel/model/plugins.rb
CHANGED
|
@@ -31,6 +31,9 @@ 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
|
+
# :nocov:
|
|
35
|
+
mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
|
36
|
+
# :nocov:
|
|
34
37
|
end
|
|
35
38
|
end
|
|
36
39
|
|
|
@@ -40,6 +43,7 @@ module Sequel
|
|
|
40
43
|
mod.send(:define_method, :inherited_instance_variables) do ||
|
|
41
44
|
super().merge!(hash)
|
|
42
45
|
end
|
|
46
|
+
mod.send(:private, :inherited_instance_variables)
|
|
43
47
|
end
|
|
44
48
|
|
|
45
49
|
# Add method to +mod+ that overrides set_dataset to call the method afterward.
|
|
@@ -118,6 +122,7 @@ module Sequel
|
|
|
118
122
|
|
|
119
123
|
model.send(:define_method, meth, &block)
|
|
120
124
|
model.send(:private, meth)
|
|
125
|
+
model.send(:alias_method, meth, meth)
|
|
121
126
|
call_meth
|
|
122
127
|
end
|
|
123
128
|
|
|
@@ -139,6 +144,8 @@ module Sequel
|
|
|
139
144
|
keyword = :required
|
|
140
145
|
when :key, :keyrest
|
|
141
146
|
keyword ||= true
|
|
147
|
+
else
|
|
148
|
+
raise Error, "invalid arg_type passed to _define_sequel_method_arg_numbers: #{arg_type}"
|
|
142
149
|
end
|
|
143
150
|
end
|
|
144
151
|
arity = callable.arity
|
|
@@ -148,9 +155,8 @@ module Sequel
|
|
|
148
155
|
required_args = arity
|
|
149
156
|
arity -= 1 if keyword == :required
|
|
150
157
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
end
|
|
158
|
+
# callable currently is always a non-lambda Proc
|
|
159
|
+
optional_args -= arity
|
|
154
160
|
|
|
155
161
|
[required_args, optional_args, rest, keyword]
|
|
156
162
|
end
|
data/lib/sequel/model.rb
CHANGED
|
@@ -69,7 +69,9 @@ module Sequel
|
|
|
69
69
|
require_relative "model/base"
|
|
70
70
|
require_relative "model/exceptions"
|
|
71
71
|
require_relative "model/errors"
|
|
72
|
+
# :nocov:
|
|
72
73
|
if !defined?(::SEQUEL_NO_ASSOCIATIONS) && !ENV.has_key?('SEQUEL_NO_ASSOCIATIONS')
|
|
74
|
+
# :nocov:
|
|
73
75
|
require_relative 'model/associations'
|
|
74
76
|
plugin Model::Associations
|
|
75
77
|
end
|
|
@@ -77,7 +79,7 @@ module Sequel
|
|
|
77
79
|
def_Model(::Sequel)
|
|
78
80
|
|
|
79
81
|
# The setter methods (methods ending with =) that are never allowed
|
|
80
|
-
# to be called automatically via +set+/+update+/+new+/etc
|
|
82
|
+
# to be called automatically via +set+/+update+/+new+/etc.
|
|
81
83
|
RESTRICTED_SETTER_METHODS = instance_methods.map(&:to_s).select{|l| l.end_with?('=')}.freeze
|
|
82
84
|
end
|
|
83
85
|
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
|