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
|
@@ -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,9 +71,11 @@ 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)
|
|
74
|
+
association_module_def(opts[:pks_dataset_method], &opts[:pks_dataset])
|
|
75
|
+
|
|
63
76
|
opts[:pks_getter_method] = :"#{singularize(opts[:name])}_pks_getter"
|
|
64
77
|
association_module_def(opts[:pks_getter_method], &opts[:pks_getter])
|
|
65
|
-
association_module_def(:"#{singularize(opts[:name])}_pks", opts){_association_pks_getter(opts)}
|
|
78
|
+
association_module_def(:"#{singularize(opts[:name])}_pks", opts){|dynamic_opts=OPTS| _association_pks_getter(opts, dynamic_opts)}
|
|
66
79
|
|
|
67
80
|
if opts[:pks_setter]
|
|
68
81
|
opts[:pks_setter_method] = :"#{singularize(opts[:name])}_pks_setter"
|
|
@@ -84,7 +97,9 @@ module Sequel
|
|
|
84
97
|
clpk = lpk.is_a?(Array)
|
|
85
98
|
crk = rk.is_a?(Array)
|
|
86
99
|
|
|
87
|
-
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]
|
|
88
103
|
tname = opts[:join_table]
|
|
89
104
|
lambda do
|
|
90
105
|
cond = if clpk
|
|
@@ -95,16 +110,26 @@ module Sequel
|
|
|
95
110
|
rpk = opts.associated_class.primary_key
|
|
96
111
|
opts.associated_dataset.
|
|
97
112
|
naked.where(cond).
|
|
98
|
-
|
|
113
|
+
select(*Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
|
|
99
114
|
end
|
|
100
115
|
elsif clpk
|
|
101
116
|
lambda do
|
|
102
117
|
cond = lk.zip(lpk).map{|k, pk| [k, get_column_value(pk)]}
|
|
103
|
-
_join_table_dataset(opts).where(cond).
|
|
118
|
+
_join_table_dataset(opts).where(cond).select(*rk)
|
|
119
|
+
end
|
|
120
|
+
else
|
|
121
|
+
lambda do
|
|
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)
|
|
104
129
|
end
|
|
105
130
|
else
|
|
106
131
|
lambda do
|
|
107
|
-
|
|
132
|
+
public_send(dataset_method).map(rk)
|
|
108
133
|
end
|
|
109
134
|
end
|
|
110
135
|
|
|
@@ -145,8 +170,14 @@ module Sequel
|
|
|
145
170
|
|
|
146
171
|
key = opts[:key]
|
|
147
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
|
+
|
|
148
179
|
opts[:pks_getter] = lambda do
|
|
149
|
-
public_send(
|
|
180
|
+
public_send(dataset_method).map(opts.associated_class.primary_key)
|
|
150
181
|
end
|
|
151
182
|
|
|
152
183
|
unless opts[:read_only]
|
|
@@ -207,12 +238,22 @@ module Sequel
|
|
|
207
238
|
# Return the primary keys of the associated objects.
|
|
208
239
|
# If the receiver is a new object, return any saved
|
|
209
240
|
# pks, or an empty array if no pks have been saved.
|
|
210
|
-
def _association_pks_getter(opts)
|
|
241
|
+
def _association_pks_getter(opts, dynamic_opts=OPTS)
|
|
242
|
+
do_cache = opts[:cache_pks]
|
|
211
243
|
delay = opts.fetch(:delay_pks, true)
|
|
212
|
-
|
|
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
|
|
213
251
|
(@_association_pks ||= {})[opts[:name]] ||= []
|
|
214
|
-
elsif
|
|
252
|
+
elsif cache_or_delay && @_association_pks && (objs = @_association_pks[opts[:name]])
|
|
215
253
|
objs
|
|
254
|
+
elsif do_cache
|
|
255
|
+
# pks_getter_method is private
|
|
256
|
+
(@_association_pks ||= {})[opts[:name]] = send(opts[:pks_getter_method])
|
|
216
257
|
else
|
|
217
258
|
# pks_getter_method is private
|
|
218
259
|
send(opts[:pks_getter_method])
|
|
@@ -254,9 +295,10 @@ module Sequel
|
|
|
254
295
|
|
|
255
296
|
if primary_key.is_a?(Array)
|
|
256
297
|
if (cols = sch.values_at(*klass.primary_key)).all? && (convs = cols.map{|c| c[:type] == :integer}).all?
|
|
298
|
+
db = model.db
|
|
257
299
|
pks.map do |cpk|
|
|
258
|
-
cpk.
|
|
259
|
-
|
|
300
|
+
cpk.map do |pk|
|
|
301
|
+
db.typecast_value(:integer, pk)
|
|
260
302
|
end
|
|
261
303
|
end
|
|
262
304
|
else
|
|
@@ -64,6 +64,8 @@ module Sequel
|
|
|
64
64
|
array = [].freeze
|
|
65
65
|
|
|
66
66
|
if RUBY_VERSION < '2.6'
|
|
67
|
+
# :nocov:
|
|
68
|
+
|
|
67
69
|
# Default proc used to determine whether to send the method to the dataset.
|
|
68
70
|
# If the array would respond to it, sends it to the array instead of the dataset.
|
|
69
71
|
DEFAULT_PROXY_TO_DATASET = proc do |opts|
|
|
@@ -73,10 +75,9 @@ module Sequel
|
|
|
73
75
|
end
|
|
74
76
|
!array_method
|
|
75
77
|
end
|
|
76
|
-
else
|
|
77
78
|
# :nocov:
|
|
79
|
+
else
|
|
78
80
|
DEFAULT_PROXY_TO_DATASET = proc{|opts| !array.respond_to?(opts[:method])}
|
|
79
|
-
# :nocov:
|
|
80
81
|
end
|
|
81
82
|
|
|
82
83
|
# Set the association reflection to use, and whether the association should be
|
|
@@ -98,6 +99,9 @@ module Sequel
|
|
|
98
99
|
end
|
|
99
100
|
v.public_send(meth, *args, &block)
|
|
100
101
|
end
|
|
102
|
+
# :nocov:
|
|
103
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
104
|
+
# :nocov:
|
|
101
105
|
end
|
|
102
106
|
|
|
103
107
|
module ClassMethods
|
|
@@ -108,6 +112,8 @@ module Sequel
|
|
|
108
112
|
|
|
109
113
|
Plugins.inherited_instance_variables(self, :@association_proxy_to_dataset=>nil)
|
|
110
114
|
|
|
115
|
+
private
|
|
116
|
+
|
|
111
117
|
# Changes the association method to return a proxy instead of the associated objects
|
|
112
118
|
# directly.
|
|
113
119
|
def def_association_method(opts)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
extension 'async_thread_pool'
|
|
5
|
+
|
|
6
|
+
module Plugins
|
|
7
|
+
# The async_thread_pool plugin makes it slightly easier to use the async_thread_pool
|
|
8
|
+
# Database extension with models. It makes Model.async return an async dataset for the
|
|
9
|
+
# model, and support async behavior for #destroy, #with_pk, and #with_pk! for model
|
|
10
|
+
# datasets:
|
|
11
|
+
#
|
|
12
|
+
# # Will load the artist with primary key 1 asynchronously
|
|
13
|
+
# artist = Artist.async.with_pk(1)
|
|
14
|
+
#
|
|
15
|
+
# You must load the async_thread_pool Database extension into the Database object the
|
|
16
|
+
# model class uses in order for async behavior to work.
|
|
17
|
+
#
|
|
18
|
+
# Usage:
|
|
19
|
+
#
|
|
20
|
+
# # Make all model subclass datasets support support async class methods and additional
|
|
21
|
+
# # async dataset methods
|
|
22
|
+
# Sequel::Model.plugin :async_thread_pool
|
|
23
|
+
#
|
|
24
|
+
# # Make the Album class support async class method and additional async dataset methods
|
|
25
|
+
# Album.plugin :async_thread_pool
|
|
26
|
+
module AsyncThreadPool
|
|
27
|
+
module ClassMethods
|
|
28
|
+
Plugins.def_dataset_methods(self, :async)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module DatasetMethods
|
|
32
|
+
[:destroy, :with_pk, :with_pk!].each do |meth|
|
|
33
|
+
::Sequel::Database::AsyncThreadPool::DatasetMethods.define_async_method(self, meth)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
@@ -14,7 +14,9 @@ module Sequel
|
|
|
14
14
|
# the plugin looks at the database schema for the model's table. To determine
|
|
15
15
|
# the unique validations, Sequel looks at the indexes on the table. In order
|
|
16
16
|
# for this plugin to be fully functional, the underlying database adapter needs
|
|
17
|
-
# to support both schema and index parsing.
|
|
17
|
+
# to support both schema and index parsing. Additionally, unique validations are
|
|
18
|
+
# only added for models that select from a simple table, they are not added for models
|
|
19
|
+
# that select from a subquery or joined dataset.
|
|
18
20
|
#
|
|
19
21
|
# This plugin uses the validation_helpers plugin underneath to implement the
|
|
20
22
|
# validations. It does not allow for any per-column validation message
|
|
@@ -51,6 +53,11 @@ module Sequel
|
|
|
51
53
|
# This works for unique_opts, max_length_opts, schema_types_opts,
|
|
52
54
|
# explicit_not_null_opts, and not_null_opts.
|
|
53
55
|
#
|
|
56
|
+
# If you only want auto_validations to add validations to columns that do not already
|
|
57
|
+
# have an error associated with them, you can use the skip_invalid option:
|
|
58
|
+
#
|
|
59
|
+
# Model.plugin :auto_validations, skip_invalid: true
|
|
60
|
+
#
|
|
54
61
|
# Usage:
|
|
55
62
|
#
|
|
56
63
|
# # Make all model subclass use auto validations (called before loading subclasses)
|
|
@@ -64,12 +71,14 @@ module Sequel
|
|
|
64
71
|
MAX_LENGTH_OPTIONS = {:from=>:values, :allow_nil=>true}.freeze
|
|
65
72
|
SCHEMA_TYPES_OPTIONS = NOT_NULL_OPTIONS
|
|
66
73
|
UNIQUE_OPTIONS = NOT_NULL_OPTIONS
|
|
74
|
+
NO_NULL_BYTE_OPTIONS = MAX_LENGTH_OPTIONS
|
|
67
75
|
EMPTY_ARRAY = [].freeze
|
|
68
76
|
|
|
69
77
|
def self.apply(model, opts=OPTS)
|
|
70
78
|
model.instance_exec do
|
|
71
79
|
plugin :validation_helpers
|
|
72
80
|
@auto_validate_presence = false
|
|
81
|
+
@auto_validate_no_null_byte_columns = []
|
|
73
82
|
@auto_validate_not_null_columns = []
|
|
74
83
|
@auto_validate_explicit_not_null_columns = []
|
|
75
84
|
@auto_validate_max_length_columns = []
|
|
@@ -77,6 +86,7 @@ module Sequel
|
|
|
77
86
|
@auto_validate_types = true
|
|
78
87
|
|
|
79
88
|
@auto_validate_options = {
|
|
89
|
+
:no_null_byte=>NO_NULL_BYTE_OPTIONS,
|
|
80
90
|
:not_null=>NOT_NULL_OPTIONS,
|
|
81
91
|
:explicit_not_null=>EXPLICIT_NOT_NULL_OPTIONS,
|
|
82
92
|
:max_length=>MAX_LENGTH_OPTIONS,
|
|
@@ -95,16 +105,26 @@ module Sequel
|
|
|
95
105
|
end
|
|
96
106
|
|
|
97
107
|
h = @auto_validate_options.dup
|
|
98
|
-
[:not_null, :explicit_not_null, :max_length, :schema_types, :unique].each do |type|
|
|
108
|
+
[:not_null, :explicit_not_null, :max_length, :no_null_byte, :schema_types, :unique].each do |type|
|
|
99
109
|
if type_opts = opts[:"#{type}_opts"]
|
|
100
110
|
h[type] = h[type].merge(type_opts).freeze
|
|
101
111
|
end
|
|
102
112
|
end
|
|
113
|
+
|
|
114
|
+
if opts[:skip_invalid]
|
|
115
|
+
[:not_null, :explicit_not_null, :no_null_byte, :max_length, :schema_types].each do |type|
|
|
116
|
+
h[type] = h[type].merge(:skip_invalid=>true).freeze
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
103
120
|
@auto_validate_options = h.freeze
|
|
104
121
|
end
|
|
105
122
|
end
|
|
106
123
|
|
|
107
124
|
module ClassMethods
|
|
125
|
+
# The columns with automatic no_null_byte validations
|
|
126
|
+
attr_reader :auto_validate_no_null_byte_columns
|
|
127
|
+
|
|
108
128
|
# The columns with automatic not_null validations
|
|
109
129
|
attr_reader :auto_validate_not_null_columns
|
|
110
130
|
|
|
@@ -121,7 +141,15 @@ module Sequel
|
|
|
121
141
|
# Inherited options
|
|
122
142
|
attr_reader :auto_validate_options
|
|
123
143
|
|
|
124
|
-
Plugins.inherited_instance_variables(self,
|
|
144
|
+
Plugins.inherited_instance_variables(self,
|
|
145
|
+
:@auto_validate_presence=>nil,
|
|
146
|
+
:@auto_validate_types=>nil,
|
|
147
|
+
:@auto_validate_no_null_byte_columns=>:dup,
|
|
148
|
+
:@auto_validate_not_null_columns=>:dup,
|
|
149
|
+
:@auto_validate_explicit_not_null_columns=>:dup,
|
|
150
|
+
:@auto_validate_max_length_columns=>:dup,
|
|
151
|
+
:@auto_validate_unique_columns=>:dup,
|
|
152
|
+
:@auto_validate_options => :dup)
|
|
125
153
|
Plugins.after_set_dataset(self, :setup_auto_validations)
|
|
126
154
|
|
|
127
155
|
# Whether to use a presence validation for not null columns
|
|
@@ -136,6 +164,7 @@ module Sequel
|
|
|
136
164
|
|
|
137
165
|
# Freeze auto_validation settings when freezing model class.
|
|
138
166
|
def freeze
|
|
167
|
+
@auto_validate_no_null_byte_columns.freeze
|
|
139
168
|
@auto_validate_not_null_columns.freeze
|
|
140
169
|
@auto_validate_explicit_not_null_columns.freeze
|
|
141
170
|
@auto_validate_max_length_columns.freeze
|
|
@@ -144,12 +173,13 @@ module Sequel
|
|
|
144
173
|
super
|
|
145
174
|
end
|
|
146
175
|
|
|
147
|
-
# Skip automatic validations for the given validation type
|
|
176
|
+
# Skip automatic validations for the given validation type
|
|
177
|
+
# (:not_null, :types, :unique, :max_length, :no_null_byte).
|
|
148
178
|
# If :all is given as the type, skip all auto validations.
|
|
149
179
|
def skip_auto_validations(type)
|
|
150
180
|
case type
|
|
151
181
|
when :all
|
|
152
|
-
[:not_null, :types, :unique, :max_length].each{|v| skip_auto_validations(v)}
|
|
182
|
+
[:not_null, :no_null_byte, :types, :unique, :max_length].each{|v| skip_auto_validations(v)}
|
|
153
183
|
when :not_null
|
|
154
184
|
auto_validate_not_null_columns.clear
|
|
155
185
|
auto_validate_explicit_not_null_columns.clear
|
|
@@ -169,6 +199,7 @@ module Sequel
|
|
|
169
199
|
explicit_not_null_cols += Array(primary_key)
|
|
170
200
|
@auto_validate_explicit_not_null_columns = explicit_not_null_cols.uniq
|
|
171
201
|
@auto_validate_max_length_columns = db_schema.select{|col, sch| sch[:type] == :string && sch[:max_length].is_a?(Integer)}.map{|col, sch| [col, sch[:max_length]]}
|
|
202
|
+
@auto_validate_no_null_byte_columns = db_schema.select{|_, sch| sch[:type] == :string}.map{|col, _| col}
|
|
172
203
|
table = dataset.first_source_table
|
|
173
204
|
@auto_validate_unique_columns = if db.supports_index_parsing? && [Symbol, SQL::QualifiedIdentifier, SQL::Identifier, String].any?{|c| table.is_a?(c)}
|
|
174
205
|
db.indexes(table).select{|name, idx| idx[:unique] == true}.map{|name, idx| idx[:columns].length == 1 ? idx[:columns].first : idx[:columns]}
|
|
@@ -195,6 +226,9 @@ module Sequel
|
|
|
195
226
|
return if skip.include?(:all)
|
|
196
227
|
opts = model.auto_validate_options
|
|
197
228
|
|
|
229
|
+
unless skip.include?(:no_null_byte) || (no_null_byte_columns = model.auto_validate_no_null_byte_columns).empty?
|
|
230
|
+
validates_no_null_byte(no_null_byte_columns, opts[:no_null_byte])
|
|
231
|
+
end
|
|
198
232
|
|
|
199
233
|
unless skip.include?(:not_null)
|
|
200
234
|
not_null_method = model.auto_validate_presence? ? :validates_presence : :validates_not_null
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The auto_validations_constraint_validations_presence_message plugin provides
|
|
6
|
+
# integration for the auto_validations and constraint_validations plugins in
|
|
7
|
+
# the following situation:
|
|
8
|
+
#
|
|
9
|
+
# * A column has a NOT NULL constraint in the database
|
|
10
|
+
# * A constraint validation for presence exists on the column, with a :message
|
|
11
|
+
# option to set a column-specific message, and with the :allow_nil option set
|
|
12
|
+
# to true because the CHECK constraint doesn't need to check for NULL values
|
|
13
|
+
# as the column itself is NOT NULL
|
|
14
|
+
#
|
|
15
|
+
# In this case, by default the validation error message on the column will
|
|
16
|
+
# use the more specific constraint validation error message if the column
|
|
17
|
+
# has a non-NULL empty value, but will use the default auto_validations
|
|
18
|
+
# message if the column has a NULL value. With this plugin, the column-specific
|
|
19
|
+
# constraint validation error message will be used in both cases.
|
|
20
|
+
#
|
|
21
|
+
# Usage:
|
|
22
|
+
#
|
|
23
|
+
# # Make all model subclasses use this auto_validations/constraint_validations
|
|
24
|
+
# # integration (called before loading subclasses)
|
|
25
|
+
# Sequel::Model.plugin :auto_validations_constraint_validations_presence_message
|
|
26
|
+
#
|
|
27
|
+
# # Make the Album class use this auto_validations/constraint_validations integration
|
|
28
|
+
# Album.plugin :auto_validations_constraint_validations_presence_message
|
|
29
|
+
module AutoValidationsConstraintValidationsPresenceMessage
|
|
30
|
+
def self.apply(model)
|
|
31
|
+
model.plugin :auto_validations
|
|
32
|
+
model.plugin :constraint_validations
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.configure(model, opts=OPTS)
|
|
36
|
+
model.send(:_adjust_auto_validations_constraint_validations_presence_message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
module ClassMethods
|
|
40
|
+
Plugins.after_set_dataset(self, :_adjust_auto_validations_constraint_validations_presence_message)
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def _adjust_auto_validations_constraint_validations_presence_message
|
|
45
|
+
if @dataset &&
|
|
46
|
+
!@auto_validate_options[:not_null][:message] &&
|
|
47
|
+
!@auto_validate_options[:explicit_not_null][:message]
|
|
48
|
+
|
|
49
|
+
@constraint_validations.each do |array|
|
|
50
|
+
meth, column, opts = array
|
|
51
|
+
|
|
52
|
+
if meth == :validates_presence &&
|
|
53
|
+
opts &&
|
|
54
|
+
opts[:message] &&
|
|
55
|
+
opts[:allow_nil] &&
|
|
56
|
+
(@auto_validate_not_null_columns.include?(column) || @auto_validate_explicit_not_null_columns.include?(column))
|
|
57
|
+
|
|
58
|
+
@auto_validate_not_null_columns.delete(column)
|
|
59
|
+
@auto_validate_explicit_not_null_columns.delete(column)
|
|
60
|
+
array[2] = array[2].merge(:allow_nil=>false)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -58,8 +58,7 @@ module Sequel
|
|
|
58
58
|
# restricted_columns.
|
|
59
59
|
def get_setter_methods
|
|
60
60
|
meths = super
|
|
61
|
-
|
|
62
|
-
if (!defined?(::Sequel::Plugins::WhitelistSecurity) || !plugins.include?(::Sequel::Plugins::WhitelistSecurity) || !allowed_columns) && restricted_columns
|
|
61
|
+
if (!defined?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !is_a?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !allowed_columns) && restricted_columns
|
|
63
62
|
meths -= restricted_columns.map{|x| "#{x}="}
|
|
64
63
|
end
|
|
65
64
|
meths
|
|
@@ -31,7 +31,10 @@ module Sequel
|
|
|
31
31
|
# Create boolean subset methods for each boolean column.
|
|
32
32
|
def self.configure(model, &block)
|
|
33
33
|
model.instance_exec do
|
|
34
|
-
|
|
34
|
+
if block
|
|
35
|
+
define_singleton_method(:boolean_subset_args, &block)
|
|
36
|
+
singleton_class.send(:private, :boolean_subset_args)
|
|
37
|
+
end
|
|
35
38
|
create_boolean_subsets if @dataset
|
|
36
39
|
end
|
|
37
40
|
end
|
|
@@ -26,6 +26,9 @@ module Sequel
|
|
|
26
26
|
# * Model.with_pk!
|
|
27
27
|
# * Model.[] # when argument is not hash or nil
|
|
28
28
|
# * many_to_one association method # without dynamic callback, when primary key matches
|
|
29
|
+
#
|
|
30
|
+
# You should not use this plugin if you are using sharding and there are different
|
|
31
|
+
# rows for the same primary key on different shards.
|
|
29
32
|
#
|
|
30
33
|
# Usage:
|
|
31
34
|
#
|
|
@@ -108,6 +108,16 @@ module Sequel
|
|
|
108
108
|
# a = Executive.where{{employees[:id]=>1}}.first # works
|
|
109
109
|
# a = Executive.where{{executives[:id]=>1}}.first # doesn't work
|
|
110
110
|
#
|
|
111
|
+
# Note that because subclass datasets select from a subquery, you cannot update,
|
|
112
|
+
# delete, or insert into them directly. To delete related rows, you need to go
|
|
113
|
+
# through the related tables and remove the related rows. Code that does this would
|
|
114
|
+
# be similar to:
|
|
115
|
+
#
|
|
116
|
+
# pks = Executive.where{num_staff < 10}.select_map(:id)
|
|
117
|
+
# Executive.cti_tables.reverse_each do |table|
|
|
118
|
+
# DB.from(table).where(:id=>pks).delete
|
|
119
|
+
# end
|
|
120
|
+
#
|
|
111
121
|
# = Usage
|
|
112
122
|
#
|
|
113
123
|
# # Use the default of storing the class name in the sti_key
|
|
@@ -268,6 +278,27 @@ module Sequel
|
|
|
268
278
|
|
|
269
279
|
Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil, :@cti_alias=>nil, :@cti_ignore_subclass_columns=>nil, :@cti_qualify_tables=>nil)
|
|
270
280
|
|
|
281
|
+
# The table name for the current model class's main table.
|
|
282
|
+
def table_name
|
|
283
|
+
if cti_tables && cti_tables.length > 1
|
|
284
|
+
@cti_alias
|
|
285
|
+
else
|
|
286
|
+
super
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# The name of the most recently joined table.
|
|
291
|
+
def cti_table_name
|
|
292
|
+
cti_tables.last
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# The model class for the given key value.
|
|
296
|
+
def sti_class_from_key(key)
|
|
297
|
+
sti_class(sti_model_map[key])
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
private
|
|
301
|
+
|
|
271
302
|
def inherited(subclass)
|
|
272
303
|
ds = sti_dataset
|
|
273
304
|
|
|
@@ -279,7 +310,7 @@ module Sequel
|
|
|
279
310
|
# Set table if this is a class table inheritance
|
|
280
311
|
table = nil
|
|
281
312
|
columns = nil
|
|
282
|
-
if
|
|
313
|
+
if n = subclass.name
|
|
283
314
|
if table = cti_table_map[n.to_sym]
|
|
284
315
|
columns = db.schema(table).map(&:first)
|
|
285
316
|
else
|
|
@@ -330,27 +361,6 @@ module Sequel
|
|
|
330
361
|
end
|
|
331
362
|
end
|
|
332
363
|
|
|
333
|
-
# The table name for the current model class's main table.
|
|
334
|
-
def table_name
|
|
335
|
-
if cti_tables && cti_tables.length > 1
|
|
336
|
-
@cti_alias
|
|
337
|
-
else
|
|
338
|
-
super
|
|
339
|
-
end
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
# The name of the most recently joined table.
|
|
343
|
-
def cti_table_name
|
|
344
|
-
cti_tables ? cti_tables.last : dataset.first_source_alias
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
# The model class for the given key value.
|
|
348
|
-
def sti_class_from_key(key)
|
|
349
|
-
sti_class(sti_model_map[key])
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
private
|
|
353
|
-
|
|
354
364
|
# If using a subquery for class table inheritance, also use a subquery
|
|
355
365
|
# when setting subclass dataset.
|
|
356
366
|
def sti_subclass_dataset(key)
|
|
@@ -373,11 +383,6 @@ module Sequel
|
|
|
373
383
|
self
|
|
374
384
|
end
|
|
375
385
|
|
|
376
|
-
# Don't allow use of prepared statements.
|
|
377
|
-
def use_prepared_statements_for?(type)
|
|
378
|
-
false
|
|
379
|
-
end
|
|
380
|
-
|
|
381
386
|
# Set the sti_key column based on the sti_key_map.
|
|
382
387
|
def before_validation
|
|
383
388
|
if new? && (set = self[model.sti_key])
|
|
@@ -412,7 +417,7 @@ module Sequel
|
|
|
412
417
|
@values[primary_key] ||= nid
|
|
413
418
|
end
|
|
414
419
|
end
|
|
415
|
-
|
|
420
|
+
@values[primary_key]
|
|
416
421
|
end
|
|
417
422
|
|
|
418
423
|
# Update rows in all backing tables, using the columns in each table.
|