sequel 4.26.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/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/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/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# Sequel by default does not use proxies for associations. The association
|
|
@@ -35,7 +37,7 @@ module Sequel
|
|
|
35
37
|
# :arguments => [2],
|
|
36
38
|
# :block => {|x| 3},
|
|
37
39
|
# :instance => artist,
|
|
38
|
-
# :reflection =>
|
|
40
|
+
# :reflection => AssociationReflection instance,
|
|
39
41
|
# :proxy_argument => 1,
|
|
40
42
|
# :proxy_block => {|ds| ds}
|
|
41
43
|
# }
|
|
@@ -49,7 +51,7 @@ module Sequel
|
|
|
49
51
|
# Album.plugin :association_proxies
|
|
50
52
|
module AssociationProxies
|
|
51
53
|
def self.configure(model, &block)
|
|
52
|
-
model.
|
|
54
|
+
model.instance_exec do
|
|
53
55
|
@association_proxy_to_dataset = block if block
|
|
54
56
|
@association_proxy_to_dataset ||= AssociationProxy::DEFAULT_PROXY_TO_DATASET
|
|
55
57
|
end
|
|
@@ -59,11 +61,24 @@ module Sequel
|
|
|
59
61
|
# associated objects and call the method on the associated object array.
|
|
60
62
|
# Calling any other method will call that method on the association's dataset.
|
|
61
63
|
class AssociationProxy < BasicObject
|
|
62
|
-
array = []
|
|
64
|
+
array = [].freeze
|
|
65
|
+
|
|
66
|
+
if RUBY_VERSION < '2.6'
|
|
67
|
+
# :nocov:
|
|
63
68
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
69
|
+
# Default proc used to determine whether to send the method to the dataset.
|
|
70
|
+
# If the array would respond to it, sends it to the array instead of the dataset.
|
|
71
|
+
DEFAULT_PROXY_TO_DATASET = proc do |opts|
|
|
72
|
+
array_method = array.respond_to?(opts[:method])
|
|
73
|
+
if !array_method && opts[:method] == :filter
|
|
74
|
+
Sequel::Deprecation.deprecate "The behavior of the #filter method for association proxies will change in Ruby 2.6. Switch from using #filter to using #where to conserve current behavior."
|
|
75
|
+
end
|
|
76
|
+
!array_method
|
|
77
|
+
end
|
|
78
|
+
# :nocov:
|
|
79
|
+
else
|
|
80
|
+
DEFAULT_PROXY_TO_DATASET = proc{|opts| !array.respond_to?(opts[:method])}
|
|
81
|
+
end
|
|
67
82
|
|
|
68
83
|
# Set the association reflection to use, and whether the association should be
|
|
69
84
|
# reloaded if an array method is called.
|
|
@@ -78,12 +93,13 @@ module Sequel
|
|
|
78
93
|
# is an array method, otherwise call the method on the association's dataset.
|
|
79
94
|
def method_missing(meth, *args, &block)
|
|
80
95
|
v = if @instance.model.association_proxy_to_dataset.call(:method=>meth, :arguments=>args, :block=>block, :instance=>@instance, :reflection=>@reflection, :proxy_argument=>@proxy_argument, :proxy_block=>@proxy_block)
|
|
81
|
-
@instance.
|
|
96
|
+
@instance.public_send(@reflection[:dataset_method])
|
|
82
97
|
else
|
|
83
98
|
@instance.send(:load_associated_objects, @reflection, @proxy_argument, &@proxy_block)
|
|
84
99
|
end
|
|
85
|
-
v.
|
|
100
|
+
v.public_send(meth, *args, &block)
|
|
86
101
|
end
|
|
102
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
87
103
|
end
|
|
88
104
|
|
|
89
105
|
module ClassMethods
|
|
@@ -94,10 +110,18 @@ module Sequel
|
|
|
94
110
|
|
|
95
111
|
Plugins.inherited_instance_variables(self, :@association_proxy_to_dataset=>nil)
|
|
96
112
|
|
|
113
|
+
private
|
|
114
|
+
|
|
97
115
|
# Changes the association method to return a proxy instead of the associated objects
|
|
98
116
|
# directly.
|
|
99
117
|
def def_association_method(opts)
|
|
100
|
-
opts.returns_array?
|
|
118
|
+
if opts.returns_array?
|
|
119
|
+
association_module_def(opts.association_method, opts) do |dynamic_opts=OPTS, &block|
|
|
120
|
+
AssociationProxy.new(self, opts, dynamic_opts, &block)
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
super
|
|
124
|
+
end
|
|
101
125
|
end
|
|
102
126
|
end
|
|
103
127
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The auto_validations plugin automatically sets up the following types of validations
|
|
@@ -28,10 +30,16 @@ module Sequel
|
|
|
28
30
|
#
|
|
29
31
|
# Model.skip_auto_validations(:all)
|
|
30
32
|
#
|
|
33
|
+
# It is possible to skip auto validations on a per-model-instance basis via:
|
|
34
|
+
#
|
|
35
|
+
# instance.skip_auto_validations(:unique, :not_null) do
|
|
36
|
+
# puts instance.valid?
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
31
39
|
# By default, the plugin uses a not_null validation for NOT NULL columns, but that
|
|
32
40
|
# can be changed to a presence validation using an option:
|
|
33
41
|
#
|
|
34
|
-
# Model.plugin :auto_validations, :
|
|
42
|
+
# Model.plugin :auto_validations, not_null: :presence
|
|
35
43
|
#
|
|
36
44
|
# This is useful if you want to enforce that NOT NULL string columns do not
|
|
37
45
|
# allow empty values.
|
|
@@ -56,9 +64,10 @@ module Sequel
|
|
|
56
64
|
MAX_LENGTH_OPTIONS = {:from=>:values, :allow_nil=>true}.freeze
|
|
57
65
|
SCHEMA_TYPES_OPTIONS = NOT_NULL_OPTIONS
|
|
58
66
|
UNIQUE_OPTIONS = NOT_NULL_OPTIONS
|
|
67
|
+
EMPTY_ARRAY = [].freeze
|
|
59
68
|
|
|
60
69
|
def self.apply(model, opts=OPTS)
|
|
61
|
-
model.
|
|
70
|
+
model.instance_exec do
|
|
62
71
|
plugin :validation_helpers
|
|
63
72
|
@auto_validate_presence = false
|
|
64
73
|
@auto_validate_not_null_columns = []
|
|
@@ -79,7 +88,7 @@ module Sequel
|
|
|
79
88
|
|
|
80
89
|
# Setup auto validations for the model if it has a dataset.
|
|
81
90
|
def self.configure(model, opts=OPTS)
|
|
82
|
-
model.
|
|
91
|
+
model.instance_exec do
|
|
83
92
|
setup_auto_validations if @dataset
|
|
84
93
|
if opts[:not_null] == :presence
|
|
85
94
|
@auto_validate_presence = true
|
|
@@ -125,15 +134,29 @@ module Sequel
|
|
|
125
134
|
@auto_validate_types
|
|
126
135
|
end
|
|
127
136
|
|
|
137
|
+
# Freeze auto_validation settings when freezing model class.
|
|
138
|
+
def freeze
|
|
139
|
+
@auto_validate_not_null_columns.freeze
|
|
140
|
+
@auto_validate_explicit_not_null_columns.freeze
|
|
141
|
+
@auto_validate_max_length_columns.freeze
|
|
142
|
+
@auto_validate_unique_columns.freeze
|
|
143
|
+
|
|
144
|
+
super
|
|
145
|
+
end
|
|
146
|
+
|
|
128
147
|
# Skip automatic validations for the given validation type (:not_null, :types, :unique).
|
|
129
148
|
# If :all is given as the type, skip all auto validations.
|
|
130
149
|
def skip_auto_validations(type)
|
|
131
|
-
|
|
150
|
+
case type
|
|
151
|
+
when :all
|
|
132
152
|
[:not_null, :types, :unique, :max_length].each{|v| skip_auto_validations(v)}
|
|
133
|
-
|
|
153
|
+
when :not_null
|
|
154
|
+
auto_validate_not_null_columns.clear
|
|
155
|
+
auto_validate_explicit_not_null_columns.clear
|
|
156
|
+
when :types
|
|
134
157
|
@auto_validate_types = false
|
|
135
158
|
else
|
|
136
|
-
|
|
159
|
+
public_send("auto_validate_#{type}_columns").clear
|
|
137
160
|
end
|
|
138
161
|
end
|
|
139
162
|
|
|
@@ -156,38 +179,50 @@ module Sequel
|
|
|
156
179
|
end
|
|
157
180
|
|
|
158
181
|
module InstanceMethods
|
|
182
|
+
# Skip the given types of auto validations on this instance inside the block.
|
|
183
|
+
def skip_auto_validations(*types)
|
|
184
|
+
types << :all if types.empty?
|
|
185
|
+
@_skip_auto_validations = types
|
|
186
|
+
yield
|
|
187
|
+
ensure
|
|
188
|
+
@_skip_auto_validations = nil
|
|
189
|
+
end
|
|
190
|
+
|
|
159
191
|
# Validate the model's auto validations columns
|
|
160
192
|
def validate
|
|
161
193
|
super
|
|
194
|
+
skip = @_skip_auto_validations || EMPTY_ARRAY
|
|
195
|
+
return if skip.include?(:all)
|
|
162
196
|
opts = model.auto_validate_options
|
|
163
197
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
198
|
+
|
|
199
|
+
unless skip.include?(:not_null)
|
|
200
|
+
not_null_method = model.auto_validate_presence? ? :validates_presence : :validates_not_null
|
|
201
|
+
unless (not_null_columns = model.auto_validate_not_null_columns).empty?
|
|
202
|
+
public_send(not_null_method, not_null_columns, opts[:not_null])
|
|
169
203
|
end
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if model.auto_validate_presence?
|
|
173
|
-
validates_presence(not_null_columns, opts[:explicit_not_null])
|
|
174
|
-
else
|
|
175
|
-
validates_not_null(not_null_columns, opts[:explicit_not_null])
|
|
204
|
+
unless (not_null_columns = model.auto_validate_explicit_not_null_columns).empty?
|
|
205
|
+
public_send(not_null_method, not_null_columns, opts[:explicit_not_null])
|
|
176
206
|
end
|
|
177
207
|
end
|
|
178
|
-
|
|
208
|
+
|
|
209
|
+
unless skip.include?(:max_length) || (max_length_columns = model.auto_validate_max_length_columns).empty?
|
|
179
210
|
max_length_columns.each do |col, len|
|
|
180
211
|
validates_max_length(len, col, opts[:max_length])
|
|
181
212
|
end
|
|
182
213
|
end
|
|
183
214
|
|
|
184
|
-
|
|
215
|
+
unless skip.include?(:types) || !model.auto_validate_types?
|
|
216
|
+
validates_schema_types(keys, opts[:schema_types])
|
|
217
|
+
end
|
|
185
218
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
219
|
+
unless skip.include?(:unique)
|
|
220
|
+
unique_opts = Hash[opts[:unique]]
|
|
221
|
+
if model.respond_to?(:sti_dataset)
|
|
222
|
+
unique_opts[:dataset] = model.sti_dataset
|
|
223
|
+
end
|
|
224
|
+
model.auto_validate_unique_columns.each{|cols| validates_unique(cols, unique_opts)}
|
|
189
225
|
end
|
|
190
|
-
model.auto_validate_unique_columns.each{|cols| validates_unique(cols, unique_opts)}
|
|
191
226
|
end
|
|
192
227
|
end
|
|
193
228
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# The blacklist_security plugin contains blacklist-based support for
|
|
@@ -13,12 +15,25 @@ module Sequel
|
|
|
13
15
|
# # Make the Album class support the blacklist security features.
|
|
14
16
|
# Album.plugin :blacklist_security
|
|
15
17
|
module BlacklistSecurity
|
|
18
|
+
# Special array subclass used for marking methods to be removed.
|
|
19
|
+
class ExceptionList < Array
|
|
20
|
+
end
|
|
21
|
+
|
|
16
22
|
module ClassMethods
|
|
17
23
|
# Which columns are specifically restricted in a call to set/update/new/etc.
|
|
18
24
|
# (default: not set). Some columns are restricted regardless of
|
|
19
25
|
# this setting, such as the primary key column and columns in Model::RESTRICTED_SETTER_METHODS.
|
|
20
26
|
attr_reader :restricted_columns
|
|
21
27
|
|
|
28
|
+
Plugins.inherited_instance_variables(self, :@restricted_columns=>:dup)
|
|
29
|
+
|
|
30
|
+
# Freeze restricted columns when freezing model class.
|
|
31
|
+
def freeze
|
|
32
|
+
@restricted_columns.freeze
|
|
33
|
+
|
|
34
|
+
super
|
|
35
|
+
end
|
|
36
|
+
|
|
22
37
|
# Set the columns to restrict when using mass assignment (e.g. +set+). Using this means that
|
|
23
38
|
# attempts to call setter methods for the columns listed here will cause an
|
|
24
39
|
# exception or be silently skipped (based on the +strict_param_setting+ setting).
|
|
@@ -26,12 +41,12 @@ module Sequel
|
|
|
26
41
|
# want not to be used during mass assignment, they need to be listed here as well (without the =).
|
|
27
42
|
#
|
|
28
43
|
# It's generally a bad idea to rely on a blacklist approach for security. Using a whitelist
|
|
29
|
-
# approach such as
|
|
44
|
+
# approach such as the whitelist_security plugin or the set_fields methods
|
|
30
45
|
# is usually a better choice. So use of this method is generally a bad idea.
|
|
31
46
|
#
|
|
32
47
|
# Artist.set_restricted_columns(:records_sold)
|
|
33
|
-
# Artist.set(:
|
|
34
|
-
# Artist.set(:
|
|
48
|
+
# Artist.set(name: 'Bob', hometown: 'Sactown') # No Error
|
|
49
|
+
# Artist.set(name: 'Bob', records_sold: 30000) # Error
|
|
35
50
|
def set_restricted_columns(*cols)
|
|
36
51
|
clear_setter_methods_cache
|
|
37
52
|
@restricted_columns = cols
|
|
@@ -43,7 +58,7 @@ module Sequel
|
|
|
43
58
|
# restricted_columns.
|
|
44
59
|
def get_setter_methods
|
|
45
60
|
meths = super
|
|
46
|
-
if !allowed_columns && restricted_columns
|
|
61
|
+
if (!defined?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !is_a?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !allowed_columns) && restricted_columns
|
|
47
62
|
meths -= restricted_columns.map{|x| "#{x}="}
|
|
48
63
|
end
|
|
49
64
|
meths
|
|
@@ -51,25 +66,21 @@ module Sequel
|
|
|
51
66
|
end
|
|
52
67
|
|
|
53
68
|
module InstanceMethods
|
|
54
|
-
# Special array subclass used for marking methods to be removed.
|
|
55
|
-
class ExceptionList < Array
|
|
56
|
-
end
|
|
57
|
-
|
|
58
69
|
# Set all values using the entries in the hash, except for the keys
|
|
59
|
-
# given in except. You should probably use +set_fields+
|
|
70
|
+
# given in except. You should probably use +set_fields+
|
|
60
71
|
# instead of this method, as blacklist approaches to security are a bad idea.
|
|
61
72
|
#
|
|
62
|
-
# artist.set_except({:
|
|
73
|
+
# artist.set_except({name: 'Jim'}, :hometown)
|
|
63
74
|
# artist.name # => 'Jim'
|
|
64
75
|
def set_except(hash, *except)
|
|
65
76
|
set_restricted(hash, ExceptionList.new(except.flatten))
|
|
66
77
|
end
|
|
67
78
|
|
|
68
79
|
# Update all values using the entries in the hash, except for the keys
|
|
69
|
-
# given in except. You should probably use +update_fields+
|
|
80
|
+
# given in except. You should probably use +update_fields+
|
|
70
81
|
# instead of this method, as blacklist approaches to security are a bad idea.
|
|
71
82
|
#
|
|
72
|
-
# artist.update_except({:
|
|
83
|
+
# artist.update_except({name: 'Jim'}, :hometown) # UPDATE artists SET name = 'Jim' WHERE (id = 1)
|
|
73
84
|
def update_except(hash, *except)
|
|
74
85
|
update_restricted(hash, ExceptionList.new(except.flatten))
|
|
75
86
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
|
-
# The
|
|
5
|
+
# The boolean_readers plugin allows for the creation of attribute? methods
|
|
4
6
|
# for boolean columns, which provides a nicer API. By default, the accessors
|
|
5
7
|
# are created for all columns of type :boolean. However, you can provide a
|
|
6
8
|
# block to the plugin to change the criteria used to determine if a
|
|
@@ -26,8 +28,8 @@ module Sequel
|
|
|
26
28
|
# Add the boolean_attribute? class method to the model, and create
|
|
27
29
|
# attribute? boolean reader methods for the class's columns if the class has a dataset.
|
|
28
30
|
def self.configure(model, &block)
|
|
29
|
-
model.
|
|
30
|
-
(
|
|
31
|
+
model.instance_exec do
|
|
32
|
+
define_singleton_method(:boolean_attribute?, &(block || DEFAULT_BOOLEAN_ATTRIBUTE_PROC))
|
|
31
33
|
send(:create_boolean_readers) if @dataset
|
|
32
34
|
end
|
|
33
35
|
end
|
|
@@ -46,9 +48,10 @@ module Sequel
|
|
|
46
48
|
|
|
47
49
|
# Add attribute? methods for all of the boolean attributes for this model.
|
|
48
50
|
def create_boolean_readers
|
|
49
|
-
im = instance_methods.
|
|
50
|
-
cs = columns
|
|
51
|
-
|
|
51
|
+
im = instance_methods.map(&:to_s)
|
|
52
|
+
if cs = check_non_connection_error(false){columns}
|
|
53
|
+
cs.each{|c| create_boolean_reader(c) if boolean_attribute?(c) && !im.include?("#{c}?")}
|
|
54
|
+
end
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The boolean_subsets plugin allows for the automatic creation of subsets for
|
|
6
|
+
# for boolean columns, which can DRY up model classes that define such subsets
|
|
7
|
+
# manually. By default, subsets are created for all columns of type :boolean,
|
|
8
|
+
# with the subset name being the same as column name, and the conditions being
|
|
9
|
+
# <tt>column IS TRUE</tt> (assuming the database supports that syntax).
|
|
10
|
+
#
|
|
11
|
+
# You can provide a block to the plugin, which will be called with column name
|
|
12
|
+
# symbol, and should return an array of arguments to pass to +dataset_module.where+.
|
|
13
|
+
# Using this, you can change the method name and arguments for each column.
|
|
14
|
+
# This block is executed in the context of the model class.
|
|
15
|
+
#
|
|
16
|
+
# Usage:
|
|
17
|
+
#
|
|
18
|
+
# # Add boolean subset methods for all columns of type :boolean
|
|
19
|
+
# # in all model subclasses (called before loading subclasses)
|
|
20
|
+
# Sequel::Model.plugin :boolean_subsets
|
|
21
|
+
#
|
|
22
|
+
# # Add subsets for all boolean columns in the Album class
|
|
23
|
+
# Album.plugin(:boolean_subsets)
|
|
24
|
+
#
|
|
25
|
+
# # Remove is_ from the front of the column name when creating the subset
|
|
26
|
+
# # method name, and use (column = 'Y') as the filter conditions
|
|
27
|
+
# Sequel::Model.plugin :boolean_subsets do |column|
|
|
28
|
+
# [column.to_s.sub(/\Ais_/, ''), {column=>'Y'}]
|
|
29
|
+
# end
|
|
30
|
+
module BooleanSubsets
|
|
31
|
+
# Create boolean subset methods for each boolean column.
|
|
32
|
+
def self.configure(model, &block)
|
|
33
|
+
model.instance_exec do
|
|
34
|
+
if block
|
|
35
|
+
define_singleton_method(:boolean_subset_args, &block)
|
|
36
|
+
singleton_class.send(:private, :boolean_subset_args)
|
|
37
|
+
end
|
|
38
|
+
create_boolean_subsets if @dataset
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module ClassMethods
|
|
43
|
+
Plugins.after_set_dataset(self, :create_boolean_subsets)
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# The arguments to use when automatically defining a boolean subset for the given column.
|
|
48
|
+
def boolean_subset_args(c)
|
|
49
|
+
[c, {c=>true}]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Add subset methods for all of the boolean columns in this model.
|
|
53
|
+
def create_boolean_subsets
|
|
54
|
+
if cs = check_non_connection_error(false){columns}
|
|
55
|
+
cs = cs.select{|c| db_schema[c][:type] == :boolean}.map{|c| boolean_subset_args(c)}
|
|
56
|
+
dataset_module do
|
|
57
|
+
cs.each{|c| where(*c)}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# Sequel's built-in caching plugin supports caching to any object that
|
|
@@ -17,8 +19,16 @@ module Sequel
|
|
|
17
19
|
# raise an exception for a missing record, so if you use memcached, you will
|
|
18
20
|
# want to use this option.
|
|
19
21
|
#
|
|
20
|
-
# Note that only
|
|
21
|
-
#
|
|
22
|
+
# Note that only lookups by primary key are cached using this plugin. The following
|
|
23
|
+
# methods use a lookup by primary key:
|
|
24
|
+
#
|
|
25
|
+
# * Model.with_pk
|
|
26
|
+
# * Model.with_pk!
|
|
27
|
+
# * Model.[] # when argument is not hash or nil
|
|
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.
|
|
22
32
|
#
|
|
23
33
|
# Usage:
|
|
24
34
|
#
|
|
@@ -27,15 +37,15 @@ module Sequel
|
|
|
27
37
|
# Sequel::Model.plugin :caching, CACHE
|
|
28
38
|
#
|
|
29
39
|
# # Make the Album class use the cache with a 30 minute time-to-live
|
|
30
|
-
# Album.plugin :caching, CACHE, :
|
|
40
|
+
# Album.plugin :caching, CACHE, ttl: 1800
|
|
31
41
|
#
|
|
32
42
|
# # Make the Artist class use a cache with the memcached protocol
|
|
33
|
-
# Artist.plugin :caching, MEMCACHED_CACHE, :
|
|
43
|
+
# Artist.plugin :caching, MEMCACHED_CACHE, ignore_exceptions: true
|
|
34
44
|
module Caching
|
|
35
45
|
# Set the cache_store and cache_ttl attributes for the given model.
|
|
36
46
|
# If the :ttl option is not given, 3600 seconds is the default.
|
|
37
47
|
def self.configure(model, store, opts=OPTS)
|
|
38
|
-
model.
|
|
48
|
+
model.instance_exec do
|
|
39
49
|
@cache_store = store
|
|
40
50
|
@cache_ttl = opts[:ttl] || 3600
|
|
41
51
|
@cache_ignore_exceptions = opts[:ignore_exceptions]
|
|
@@ -66,7 +76,7 @@ module Sequel
|
|
|
66
76
|
|
|
67
77
|
# Returns the prefix used to namespace this class in the cache.
|
|
68
78
|
def cache_key_prefix
|
|
69
|
-
|
|
79
|
+
to_s
|
|
70
80
|
end
|
|
71
81
|
|
|
72
82
|
# Return a key string for the given primary key.
|
|
@@ -84,26 +94,27 @@ module Sequel
|
|
|
84
94
|
|
|
85
95
|
private
|
|
86
96
|
|
|
87
|
-
#
|
|
88
|
-
def
|
|
97
|
+
# Access the cache using the given method and key, rescuing exceptions if necessary.
|
|
98
|
+
def cache_op(meth, ck)
|
|
89
99
|
if @cache_ignore_exceptions
|
|
90
|
-
@cache_store.
|
|
100
|
+
@cache_store.public_send(meth, ck) rescue nil
|
|
91
101
|
else
|
|
92
|
-
@cache_store.
|
|
102
|
+
@cache_store.public_send(meth, ck)
|
|
93
103
|
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Delete the entry with the matching key from the cache
|
|
107
|
+
def cache_delete(ck)
|
|
108
|
+
cache_op(:delete, ck)
|
|
94
109
|
nil
|
|
95
110
|
end
|
|
96
111
|
|
|
97
112
|
# Returned the cached object, or nil if the object was not
|
|
98
113
|
# in the cached
|
|
99
114
|
def cache_get(ck)
|
|
100
|
-
|
|
101
|
-
@cache_store.get(ck) rescue nil
|
|
102
|
-
else
|
|
103
|
-
@cache_store.get(ck)
|
|
104
|
-
end
|
|
115
|
+
cache_op(:get, ck)
|
|
105
116
|
end
|
|
106
|
-
|
|
117
|
+
|
|
107
118
|
# Set the object in the cache_store with the given key for cache_ttl seconds.
|
|
108
119
|
def cache_set(ck, obj)
|
|
109
120
|
@cache_store.set(ck, obj, @cache_ttl)
|