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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* A column_encryption plugin has been added to support encrypting the
|
|
4
|
+
content of individual columns in a table.
|
|
5
|
+
|
|
6
|
+
Column values are encrypted with AES-256-GCM using a per-value
|
|
7
|
+
cipher key derived from a key provided in the configuration using
|
|
8
|
+
HMAC-SHA256.
|
|
9
|
+
|
|
10
|
+
If you would like to support encryption of columns in more than one
|
|
11
|
+
model, you should probably load the plugin into the parent class of
|
|
12
|
+
your models and specify the keys:
|
|
13
|
+
|
|
14
|
+
Sequel::Model.plugin :column_encryption do |enc|
|
|
15
|
+
enc.key 0, ENV["SEQUEL_COLUMN_ENCRYPTION_KEY"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
This specifies a single master encryption key. Unless you are
|
|
19
|
+
actively rotating keys, it is best to use a single master key.
|
|
20
|
+
|
|
21
|
+
In the above call, 0 is the id of the key, and
|
|
22
|
+
ENV["SEQUEL_COLUMN_ENCRYPTION_KEY"] is the content of the key, which
|
|
23
|
+
must be a string with exactly 32 bytes. As indicated, this key
|
|
24
|
+
should not be hardcoded or otherwise committed to the source control
|
|
25
|
+
repository.
|
|
26
|
+
|
|
27
|
+
For models that need encrypted columns, you load the plugin again,
|
|
28
|
+
but specify the columns to encrypt:
|
|
29
|
+
|
|
30
|
+
ConfidentialModel.plugin :column_encryption do |enc|
|
|
31
|
+
enc.column :encrypted_column_name
|
|
32
|
+
enc.column :searchable_column_name, searchable: true
|
|
33
|
+
enc.column :ci_searchable_column_name, searchable: :case_insensitive
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
With this, all three specified columns (encrypted_column_name,
|
|
37
|
+
searchable_column_name, and ci_searchable_column_name) will be
|
|
38
|
+
marked as encrypted columns. When you run the following code:
|
|
39
|
+
|
|
40
|
+
ConfidentialModel.create(
|
|
41
|
+
encrypted_column_name: 'These',
|
|
42
|
+
searchable_column_name: 'will be',
|
|
43
|
+
ci_searchable_column_name: 'Encrypted'
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
It will save encrypted versions to the database.
|
|
47
|
+
encrypted_column_name will not be searchable, searchable_column_name
|
|
48
|
+
will be searchable with an exact match, and
|
|
49
|
+
ci_searchable_column_name will be searchable with a case insensitive
|
|
50
|
+
match.
|
|
51
|
+
|
|
52
|
+
To search searchable encrypted columns, use with_encrypted_value.
|
|
53
|
+
This example code will return the model instance created in the code
|
|
54
|
+
example in the previous section:
|
|
55
|
+
|
|
56
|
+
ConfidentialModel.
|
|
57
|
+
with_encrypted_value(:searchable_column_name, "will be")
|
|
58
|
+
with_encrypted_value(:ci_searchable_column_name, "encrypted").
|
|
59
|
+
first
|
|
60
|
+
|
|
61
|
+
To rotate encryption keys, add a new key above the existing key,
|
|
62
|
+
with a new key ID:
|
|
63
|
+
|
|
64
|
+
Sequel::Model.plugin :column_encryption do |enc|
|
|
65
|
+
enc.key 1, ENV["SEQUEL_COLUMN_ENCRYPTION_KEY"]
|
|
66
|
+
enc.key 0, ENV["SEQUEL_OLD_COLUMN_ENCRYPTION_KEY"]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
Newly encrypted data will then use the new key. Records encrypted
|
|
70
|
+
with the older key will still be decrypted correctly.
|
|
71
|
+
|
|
72
|
+
To force reencryption for existing records that are using the older
|
|
73
|
+
key, you can use the needing_reencryption dataset method and the
|
|
74
|
+
reencrypt instance method. For a small number of records, you can
|
|
75
|
+
probably do:
|
|
76
|
+
|
|
77
|
+
ConfidentialModel.needing_reencryption.all(&:reencrypt)
|
|
78
|
+
|
|
79
|
+
With more than a small number of records, you'll want to do this in
|
|
80
|
+
batches. It's possible you could use an approach such as:
|
|
81
|
+
|
|
82
|
+
ds = ConfidentialModel.needing_reencryption.limit(100)
|
|
83
|
+
true until ds.all(&:reencrypt).empty?
|
|
84
|
+
|
|
85
|
+
After all values have been reencrypted for all models, and no models
|
|
86
|
+
use the older encryption key, you can remove it from the
|
|
87
|
+
configuration:
|
|
88
|
+
|
|
89
|
+
Sequel::Model.plugin :column_encryption do |enc|
|
|
90
|
+
enc.key 1, ENV["SEQUEL_COLUMN_ENCRYPTION_KEY"]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
The column_encryption plugin supports encrypting serialized data,
|
|
94
|
+
as well as enforcing uniquenss of searchable encrypted columns
|
|
95
|
+
(in the absence of key rotation). By design, it does not support
|
|
96
|
+
compression, mixing encrypted and unencrypted data in the same
|
|
97
|
+
column, or support arbitrary encryption ciphers. See the plugin
|
|
98
|
+
documentation for more details.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* A concurrent_eager_loading plugin has been added. This plugin
|
|
4
|
+
builds on top of the async_thread_pool Database extension and
|
|
5
|
+
allows eager loading multiple associations concurrently in
|
|
6
|
+
separate threads. With this plugin, you can mark datasets for
|
|
7
|
+
concurrent eager loading using eager_load_concurrently:
|
|
8
|
+
|
|
9
|
+
Album.eager_load_concurrently.eager(:artist, :genre, :tracks).all
|
|
10
|
+
|
|
11
|
+
Datasets that are marked for concurrent eager loading will use
|
|
12
|
+
concurrent eager loading if they are eager loading more than one
|
|
13
|
+
association. If you would like to make concurrent eager loading
|
|
14
|
+
the default, you can load the plugin with the :always option.
|
|
15
|
+
|
|
16
|
+
All of the association types that ship with Sequel now support
|
|
17
|
+
concurrent eager loading when using this plugin. For custom eager
|
|
18
|
+
loaders using the :eager_loader association option, please see the
|
|
19
|
+
documentation for the plugin for how to enable custom eager loading
|
|
20
|
+
for them.
|
|
21
|
+
|
|
22
|
+
= Other Improvements
|
|
23
|
+
|
|
24
|
+
* The date_arithmetic extension now handles ActiveSupport::Duration
|
|
25
|
+
values with weeks, as well as :weeks as a key in a hash value. Weeks
|
|
26
|
+
are converted into 7 days internally.
|
|
27
|
+
|
|
28
|
+
* The shared SQLite adapter now emulates the dropping of non-composite
|
|
29
|
+
unique constraints. Non-composite unique constraints are now
|
|
30
|
+
treated similarly to composite unique constraints, in that dropping
|
|
31
|
+
any unique constraints on a table will drop all unique constraints
|
|
32
|
+
on that table.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* A auto_validations_constraint_validations_presence_message plugin
|
|
4
|
+
has been added that provides integration for the auto_validations
|
|
5
|
+
and constraint_validations plugin in the following conditions:
|
|
6
|
+
|
|
7
|
+
* The column has a NOT NULL constraint
|
|
8
|
+
* The column has a presence constraint validation with both
|
|
9
|
+
the :message and :allow_nil options used.
|
|
10
|
+
|
|
11
|
+
In this case, when saving a nil value in the column, the plugin
|
|
12
|
+
will make it so the more specific message from the presence
|
|
13
|
+
constraint validation is used, instead of the generic message
|
|
14
|
+
from auto_validations.
|
|
15
|
+
|
|
16
|
+
= Other Improvements
|
|
17
|
+
|
|
18
|
+
* On SQLite 3.35.0+, Sequel now uses ALTER TABLE DROP COLUMN for
|
|
19
|
+
dropping columns, instead of emulating the dropped column by
|
|
20
|
+
recreating the table.
|
|
21
|
+
|
|
22
|
+
* The Dataset#with :materialized option is now supported on SQLite
|
|
23
|
+
3.35.0+ for specifying whether common table expressions should be
|
|
24
|
+
materialized.
|
|
25
|
+
|
|
26
|
+
* The odbc adapter now correct handles boolean columns with NULL
|
|
27
|
+
values. Previously, such values were returned as false instead
|
|
28
|
+
of nil.
|
|
29
|
+
|
|
30
|
+
= Backwards Compatibility
|
|
31
|
+
|
|
32
|
+
* The change to use ALTER TABLE DROP COLUMN on SQLite 3.35.0+ can
|
|
33
|
+
cause backwards compatibility issues if SQLite 3.35.0+ does
|
|
34
|
+
not allow dropping the column.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* An unused_associations plugin has been added, which allows you to
|
|
4
|
+
determine which associations and association methods are not used.
|
|
5
|
+
You can use this to avoid defining the unused associations and
|
|
6
|
+
association methods, which can save memory.
|
|
7
|
+
|
|
8
|
+
This plugin is supported on Ruby 2.5+, and uses method coverage to
|
|
9
|
+
determine if the plugin's methods are called. Because Sequel::Model
|
|
10
|
+
adds association methods to an anonymous module included in the
|
|
11
|
+
class, directly using the method coverage data to determine which
|
|
12
|
+
associations are used is challenging.
|
|
13
|
+
|
|
14
|
+
This plugin is mostly designed for reporting. You can have a
|
|
15
|
+
test suite that runs with method coverage enabled, and use the
|
|
16
|
+
coverage information to get data on unused associations:
|
|
17
|
+
|
|
18
|
+
# Calls Coverage.result
|
|
19
|
+
cov_data = Sequel::Model.update_associations_coverage
|
|
20
|
+
unused_associations_data = Sequel::Model.update_unused_associations_data(coverage_data: cov_data)
|
|
21
|
+
Sequel::Model.unused_associations(unused_associations_data: unused_associations_data)
|
|
22
|
+
# => [["Class1", "assoc1"], ...]
|
|
23
|
+
|
|
24
|
+
unused_associations returns an array of two element arrays, where
|
|
25
|
+
the first element is the class name and the second element is the
|
|
26
|
+
association name. The returned values will be associations where
|
|
27
|
+
all of the association methods are not used.
|
|
28
|
+
|
|
29
|
+
In addition to determining which associations are not used, you can
|
|
30
|
+
also use this to determine if you are defining association methods
|
|
31
|
+
that are not used:
|
|
32
|
+
|
|
33
|
+
Sequel::Model.unused_association_options(unused_associations_data: unused_associations_data)
|
|
34
|
+
# => [["Class2", "assoc2", {:read_only=>true}], ...]
|
|
35
|
+
|
|
36
|
+
unused_association_options is similar to unused_associations, but
|
|
37
|
+
returns an array of three element arrays, where the third element
|
|
38
|
+
is a hash of association options that should be used to avoid
|
|
39
|
+
defining the unused association methods. It's common in Sequel to
|
|
40
|
+
define associations and only use them for reading data and not for
|
|
41
|
+
modifications, and you can use this to easily see which associations
|
|
42
|
+
are only used for reading data.
|
|
43
|
+
|
|
44
|
+
As the determination of whether associations are used is based on
|
|
45
|
+
method coverage, this will report as unused any associations that are
|
|
46
|
+
used but where the association methods are not called. These cases
|
|
47
|
+
are rare, but can happen if you have libraries that use the
|
|
48
|
+
association reflection metadata without calling the association
|
|
49
|
+
methods, or use the association only in combination with another
|
|
50
|
+
plugin such as dataset_associations. You can set the :is_used
|
|
51
|
+
association option to explicitly mark an association as used, and
|
|
52
|
+
have this plugin avoid reporting it as unused.
|
|
53
|
+
|
|
54
|
+
In addition to just reporting on unused associations, you can also
|
|
55
|
+
directly use the unused associations metadata to automatically avoid
|
|
56
|
+
defining unused associations or unused associations methods. You
|
|
57
|
+
can set a :file option when loading the plugin:
|
|
58
|
+
|
|
59
|
+
Sequel::Model.plugin :unused_associations, file: 'unused_associations.json'
|
|
60
|
+
|
|
61
|
+
Then run the method coverage testing. This will save the unused
|
|
62
|
+
associations metadata to the file. Then you can use this metadata
|
|
63
|
+
automatically by also setting the :modify_associations option:
|
|
64
|
+
|
|
65
|
+
Sequel::Model.plugin :unused_associations, file: 'unused_associations.json',
|
|
66
|
+
modify_associations: true
|
|
67
|
+
|
|
68
|
+
With the :modify_associations option, unused associations are
|
|
69
|
+
skipped instead of being defined, and the options returned by
|
|
70
|
+
unused_association_options are automatically used. Note that using
|
|
71
|
+
the :modify_associations option is risky unless you have complete
|
|
72
|
+
coverage and do not have cases where the associations are used
|
|
73
|
+
without calling methods.
|
|
74
|
+
|
|
75
|
+
It is common to have multiple test suites where you need to combine
|
|
76
|
+
coverage. The plugin supports this by using a :coverage_file option:
|
|
77
|
+
|
|
78
|
+
Sequel::Model.plugin :unused_associations, coverage_file: 'unused_associations_coverage.json'
|
|
79
|
+
|
|
80
|
+
In this case, you would run update_associations_coverage after each
|
|
81
|
+
test suite, and update_unused_associations_data only after all test
|
|
82
|
+
suites have been run.
|
|
83
|
+
|
|
84
|
+
* Passing nil as the value of the :setter, :adder, :remover, or
|
|
85
|
+
:clearer association options will cause the related method to not be
|
|
86
|
+
defined, instead of using the default value. This allows you to
|
|
87
|
+
only define the methods you will actually be using.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* Sequel now supports using separate queries for each table for both
|
|
4
|
+
lazy and eager loading of the following associations:
|
|
5
|
+
|
|
6
|
+
* many_to_many
|
|
7
|
+
* one_through_one
|
|
8
|
+
* many_through_many # many_through_many plugin
|
|
9
|
+
* one_through_many # many_through_many plugin
|
|
10
|
+
|
|
11
|
+
For many_to_many/one_through_one, you specify the :join_table_db
|
|
12
|
+
association option, which should be a Sequel::Database instance
|
|
13
|
+
containing the join table. It is possible for the current table,
|
|
14
|
+
join table, and associated table all to be in separate databases:
|
|
15
|
+
|
|
16
|
+
JOIN_TABLE_DB = Sequel.connect('...')
|
|
17
|
+
Album.many_to_many :artists, join_table_db: JOIN_TABLE_DB
|
|
18
|
+
|
|
19
|
+
For many_through_many/one_through_many, you can use the :db option
|
|
20
|
+
in each join table specification. All join tables can be in
|
|
21
|
+
separate databases:
|
|
22
|
+
|
|
23
|
+
JTDB1 = Sequel.connect('...')
|
|
24
|
+
JTDB2 = Sequel.connect('...')
|
|
25
|
+
# Tracks on all albums this artist appears on
|
|
26
|
+
Artist.many_through_many :album_tracks, [
|
|
27
|
+
{table: :albums_artists, left: :artist_id, right: :album_id, db: JTDB1},
|
|
28
|
+
{table: :artists, left: :id, right: :id, db: JTDB2}
|
|
29
|
+
],
|
|
30
|
+
class: :Track, right_primary_key: :album_id
|
|
31
|
+
|
|
32
|
+
* The :allow_eager_graph association option has been added. Setting
|
|
33
|
+
this option to false will disallow eager loading via #eager_graph.
|
|
34
|
+
This is useful if you can eager load the association via #eager,
|
|
35
|
+
but not with #eager_graph.
|
|
36
|
+
|
|
37
|
+
* The :allow_filtering_by association option has been added. Setting
|
|
38
|
+
this option to false will disallow the use of filtering by
|
|
39
|
+
associations for the association.
|
|
40
|
+
|
|
41
|
+
* Dataset#returning is now supported on SQLite 3.35.0+. To work around
|
|
42
|
+
bugs in the SQLite implementation, identifiers used in the RETURNING
|
|
43
|
+
clause are automatically aliased. Additionally, prepared statements
|
|
44
|
+
that use the RETURNING clause on SQLite seem to have issues, so the
|
|
45
|
+
prepared_statements plugin does not automatically use prepared
|
|
46
|
+
statements on SQLite for queries that use the RETURNING clause.
|
|
47
|
+
|
|
48
|
+
* Database#rename_tables has been added on MySQL to support renaming
|
|
49
|
+
multiple tables in the same query.
|
|
50
|
+
|
|
51
|
+
= Other Improvements
|
|
52
|
+
|
|
53
|
+
* The unused_associations plugin now tracks access to the association
|
|
54
|
+
reflection for associations, so it will no longer show an
|
|
55
|
+
association as completely unused if something is accessing the
|
|
56
|
+
association reflection for it. This eliminates most of the false
|
|
57
|
+
positives, where the plugin would show an association as unused
|
|
58
|
+
even though something was using it without calling the association
|
|
59
|
+
methods.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* A Sequel::Database#like_without_collate accessor has been added on
|
|
4
|
+
Microsoft SQL Server, which avoids using the COLLATE clause for
|
|
5
|
+
LIKE expressions. This can speed up query performance significantly.
|
|
6
|
+
|
|
7
|
+
* A private Sequel::Model::Errors#full_message method has been added
|
|
8
|
+
to make it easier to support internationalization for Sequel::Model
|
|
9
|
+
error messages.
|
|
10
|
+
|
|
11
|
+
= Other Improvements
|
|
12
|
+
|
|
13
|
+
* The association reflection tracking in the unused_associations
|
|
14
|
+
plugin now works correctly when combining coverage runs.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* Model#validates_no_null_byte has been added to the
|
|
4
|
+
validation_helpers. It checks that the value being validated does
|
|
5
|
+
not contain an ASCII NUL ('\0') byte. Some databases will return an
|
|
6
|
+
error if a string contains a NUL byte.
|
|
7
|
+
|
|
8
|
+
The auto_validations plugin will now automatically add no_null_byte
|
|
9
|
+
validations for all string columns in the model's table. This will
|
|
10
|
+
change exceptions raised by NUL bytes from database errors to
|
|
11
|
+
validation failures.
|
|
12
|
+
|
|
13
|
+
If you are using auto_validations and would like to have a table
|
|
14
|
+
accept NUL bytes in string columns, use the following code inside
|
|
15
|
+
the model:
|
|
16
|
+
|
|
17
|
+
skip_auto_validations(:no_null_byte)
|
|
18
|
+
|
|
19
|
+
* JSONB subscripts are now supported on PostgreSQL 14+ when using the
|
|
20
|
+
pg_json_ops extension. You can use JSONB subscripts to more easily
|
|
21
|
+
update part of a JSONB column:
|
|
22
|
+
|
|
23
|
+
DB[:table].update(Sequel.pg_jsonb_op(:column)['key'] => 'value')
|
|
24
|
+
UPDATE "table" SET "column"['key'] = 'value'
|
|
25
|
+
|
|
26
|
+
* hstore subscripts are now supported on PostgreSQL 14+ when using the
|
|
27
|
+
pg_hstore_ops extension. You can use hstore subscripts to more
|
|
28
|
+
easily update part of an hstore column:
|
|
29
|
+
|
|
30
|
+
DB[:table].update(Sequel.hstore_op(:column)['key'] => 'value')
|
|
31
|
+
UPDATE "table" SET "column"['key'] = 'value'
|
|
32
|
+
|
|
33
|
+
* Sequel now supports table aliases for JOIN USING columns on
|
|
34
|
+
PostgreSQL 14+. These allow you to reference the USING columns in
|
|
35
|
+
the query using a qualified identifier. To use this support, pass an
|
|
36
|
+
SQL::AliasedExpression as the expression to join on:
|
|
37
|
+
|
|
38
|
+
DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
|
|
39
|
+
# SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"
|
|
40
|
+
|
|
41
|
+
* Database#create_trigger on PostgreSQL now supports a :replace option
|
|
42
|
+
for CREATE OR REPLACE TRIGGER (supported in PostgreSQL 14+).
|
|
43
|
+
|
|
44
|
+
* SQL::Expression#sequel_ast_transform has been added to support
|
|
45
|
+
AST transforms of custom expression classes.
|
|
46
|
+
|
|
47
|
+
= Other Improvements
|
|
48
|
+
|
|
49
|
+
* Sequel now supports calling PostgreSQL procedures without arguments
|
|
50
|
+
when using Database#call_procedure. Previously, attempts to call
|
|
51
|
+
procuredures without arguments would call the procedure with a
|
|
52
|
+
single NULL argument.
|
|
53
|
+
|
|
54
|
+
* Sequel now uses defined?(yield) instead of block_given? internally
|
|
55
|
+
for better performance on CRuby. defined?(yield) is faster as it is
|
|
56
|
+
built into the VM, while block_given? is a regular method and has
|
|
57
|
+
the overhead of calling a regular method. Note that defined?(yield)
|
|
58
|
+
is not implemented correctly on JRuby before 9.0.0.0, so this
|
|
59
|
+
release of Sequel drops support for JRuby versions before 9.0.0.0.
|
data/doc/sharding.rdoc
CHANGED
|
@@ -140,6 +140,8 @@ the shard to use. This is fairly easy using a Sequel::Model:
|
|
|
140
140
|
|
|
141
141
|
Rainbow.plaintext_for_hash("e580726d31f6e1ad216ffd87279e536d1f74e606")
|
|
142
142
|
|
|
143
|
+
=== :servers_hash Option
|
|
144
|
+
|
|
143
145
|
The connection pool can be further controlled to change how it handles attempts
|
|
144
146
|
to access shards that haven't been configured. The default is
|
|
145
147
|
to assume the :default shard. However, you can specify a
|
data/doc/sql.rdoc
CHANGED
|
@@ -428,6 +428,18 @@ As you can see, these literalize with ANDs by default. You can use the <tt>Sequ
|
|
|
428
428
|
|
|
429
429
|
Sequel.or(column1: 1, column2: 2) # (("column1" = 1) OR ("column2" = 2))
|
|
430
430
|
|
|
431
|
+
As you can see in the above examples, <tt>Sequel.|</tt> and <tt>Sequel.or</tt> work differently.
|
|
432
|
+
<tt>Sequel.|</tt> is for combining an arbitrary number of expressions using OR. If you pass a single
|
|
433
|
+
argument, <tt>Sequel.|</tt> will just convert it to a Sequel expression, similar to <tt>Sequel.expr</tt>.
|
|
434
|
+
<tt>Sequel.or</tt> is for taking a single hash or array of two element arrays and combining the
|
|
435
|
+
elements of that single argument using OR instead of AND:
|
|
436
|
+
|
|
437
|
+
Sequel.|(column1: 1, column2: 2) # (("column1" = 1) AND ("column2" = 2))
|
|
438
|
+
Sequel.or(column1: 1, column2: 2) # (("column1" = 1) OR ("column2" = 2))
|
|
439
|
+
|
|
440
|
+
Sequel.|({column1: 1}, {column2: 2}) # (("column1" = 1) OR ("column2" = 2))
|
|
441
|
+
Sequel.or({column1: 1}, {column2: 2}) # ArgumentError
|
|
442
|
+
|
|
431
443
|
You've already seen the <tt>Sequel.negate</tt> method, which will use ANDs if multiple entries are used:
|
|
432
444
|
|
|
433
445
|
Sequel.negate(column1: 1, column2: 2) # (("column1" != 1) AND ("column2" != 2))
|
|
@@ -544,7 +556,7 @@ On some databases, you can specify null ordering:
|
|
|
544
556
|
|
|
545
557
|
=== All Columns (.*)
|
|
546
558
|
|
|
547
|
-
To select all columns in a table, Sequel supports the * method on identifiers and qualified without an argument:
|
|
559
|
+
To select all columns in a table, Sequel supports the * method on identifiers and qualified identifiers without an argument:
|
|
548
560
|
|
|
549
561
|
Sequel[:table].* # "table".*
|
|
550
562
|
Sequel[:schema][:table].* # "schema"."table".*
|
data/doc/testing.rdoc
CHANGED
|
@@ -8,17 +8,20 @@ These run each test in its own transaction, the recommended way to test.
|
|
|
8
8
|
|
|
9
9
|
=== minitest/spec
|
|
10
10
|
|
|
11
|
-
==== with minitest-hooks
|
|
12
|
-
|
|
11
|
+
==== with minitest-hooks
|
|
13
12
|
require 'minitest/hooks/default'
|
|
13
|
+
|
|
14
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
15
|
+
|
|
14
16
|
class Minitest::HooksSpec
|
|
15
17
|
def around
|
|
16
18
|
DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
|
|
17
19
|
end
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
==== without minitest-hooks
|
|
21
|
-
|
|
22
|
+
==== without minitest-hooks
|
|
23
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
24
|
+
|
|
22
25
|
class Minitest::Spec
|
|
23
26
|
def run(*args, &block)
|
|
24
27
|
DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
|
|
@@ -26,7 +29,8 @@ These run each test in its own transaction, the recommended way to test.
|
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
=== minitest/test
|
|
29
|
-
|
|
32
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
33
|
+
|
|
30
34
|
# Use this class as the base class for your tests
|
|
31
35
|
class SequelTestCase < Minitest::Test
|
|
32
36
|
def run(*args, &block)
|
|
@@ -35,7 +39,8 @@ These run each test in its own transaction, the recommended way to test.
|
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
=== rspec >= 2.8
|
|
38
|
-
|
|
42
|
+
DB = Sequel.postgres # change the database if you are using sqlite etc.
|
|
43
|
+
|
|
39
44
|
RSpec.configure do |c|
|
|
40
45
|
c.around(:each) do |example|
|
|
41
46
|
DB.transaction(:rollback=>:always, :auto_savepoint=>true){example.run}
|
|
@@ -152,20 +157,28 @@ The SEQUEL_INTEGRATION_URL environment variable specifies the Database connectio
|
|
|
152
157
|
|
|
153
158
|
=== Other
|
|
154
159
|
|
|
160
|
+
SEQUEL_ASYNC_THREAD_POOL :: Use the async_thread_pool extension when running the specs
|
|
161
|
+
SEQUEL_ASYNC_THREAD_POOL_PREEMPT :: Use the async_thread_pool extension when running the specs, with the :preempt_async_thread option
|
|
155
162
|
SEQUEL_COLUMNS_INTROSPECTION :: Use the columns_introspection extension when running the specs
|
|
156
163
|
SEQUEL_CONNECTION_VALIDATOR :: Use the connection validator extension when running the specs
|
|
157
164
|
SEQUEL_DUPLICATE_COLUMNS_HANDLER :: Use the duplicate columns handler extension with value given when running the specs
|
|
165
|
+
SEQUEL_CONCURRENT_EAGER_LOADING :: Use the async_thread_pool extension and concurrent_eager_loading plugin when running the specs
|
|
158
166
|
SEQUEL_ERROR_SQL :: Use the error_sql extension when running the specs
|
|
159
167
|
SEQUEL_INDEX_CACHING :: Use the index_caching extension when running the specs
|
|
168
|
+
SEQUEL_FIBER_CONCURRENCY :: Use the fiber_concurrency extension when running the adapter and integration specs
|
|
160
169
|
SEQUEL_FREEZE_DATABASE :: Freeze the database before running the integration specs
|
|
161
170
|
SEQUEL_IDENTIFIER_MANGLING :: Use the identifier_mangling extension when running the specs
|
|
162
171
|
SEQUEL_INTEGER64 :: Use the integer64 extension when running the adapter or integration specs
|
|
163
172
|
SEQUEL_MODEL_PREPARED_STATEMENTS :: Use the prepared_statements plugin when running the specs
|
|
164
173
|
SEQUEL_MODEL_THROW_FAILURES :: Use the throw_failures plugin when running the specs
|
|
165
174
|
SEQUEL_NO_CACHE_ASSOCIATIONS :: Don't cache association metadata when running the specs
|
|
166
|
-
SEQUEL_NO_CHECK_SQLS :: Don't check for specific SQL syntax when running the specs
|
|
167
175
|
SEQUEL_CHECK_PENDING :: Try running all specs (note, can cause lockups for some adapters), and raise errors for skipped specs that don't fail
|
|
168
176
|
SEQUEL_NO_PENDING :: Don't skip any specs, try running all specs (note, can cause lockups for some adapters)
|
|
169
177
|
SEQUEL_PG_TIMESTAMPTZ :: Use the pg_timestamptz extension when running the postgres specs
|
|
178
|
+
SEQUEL_QUERY_PER_ASSOCIATION_DB_0_URL :: Run query-per-association integration tests with multiple databases (all 4 must be set to run)
|
|
179
|
+
SEQUEL_QUERY_PER_ASSOCIATION_DB_1_URL :: Run query-per-association integration tests with multiple databases (all 4 must be set to run)
|
|
180
|
+
SEQUEL_QUERY_PER_ASSOCIATION_DB_2_URL :: Run query-per-association integration tests with multiple databases (all 4 must be set to run)
|
|
181
|
+
SEQUEL_QUERY_PER_ASSOCIATION_DB_3_URL :: Run query-per-association integration tests with multiple databases (all 4 must be set to run)
|
|
170
182
|
SEQUEL_SPLIT_SYMBOLS :: Turn on symbol splitting when running the adapter and integration specs
|
|
171
183
|
SEQUEL_SYNCHRONIZE_SQL :: Use the synchronize_sql extension when running the specs
|
|
184
|
+
SEQUEL_TZINFO_VERSION :: Force the given tzinfo version when running the specs (e.g. '>=2')
|
data/doc/transactions.rdoc
CHANGED
|
@@ -143,14 +143,6 @@ If you want the current savepoint to be rolled back when the savepoint block exi
|
|
|
143
143
|
end # RELEASE SAVEPOINT
|
|
144
144
|
end # COMMIT
|
|
145
145
|
|
|
146
|
-
If you want the current savepoint to be rolled back when the savepoint block exits (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>true)</tt>
|
|
147
|
-
|
|
148
|
-
DB.transaction do # BEGIN
|
|
149
|
-
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
150
|
-
DB.rollback_on_exit(:savepoint=>true)
|
|
151
|
-
end # ROLLBACK TO SAVEPOINT
|
|
152
|
-
end # COMMIT
|
|
153
|
-
|
|
154
146
|
If you want the current savepoint and potentially enclosing savepoints to be rolled back when the savepoint blocks exit (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>integer)</tt>
|
|
155
147
|
|
|
156
148
|
DB.transaction do # BEGIN
|
data/doc/validations.rdoc
CHANGED
|
@@ -232,7 +232,7 @@ These methods check that the specified attributes can be valid integers or valid
|
|
|
232
232
|
|
|
233
233
|
=== +validates_operator+
|
|
234
234
|
|
|
235
|
-
+validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
|
|
235
|
+
+validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc.) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
|
|
236
236
|
|
|
237
237
|
class Album < Sequel::Model
|
|
238
238
|
def validate
|
data/doc/virtual_rows.rdoc
CHANGED