sequel 4.49.0 → 5.0.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 +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
3
|
module Sequel
|
4
|
-
# Proc that is
|
4
|
+
# Proc that is instance_execed to create the default inflections for both the
|
5
5
|
# model inflector and the inflector extension.
|
6
6
|
DEFAULT_INFLECTIONS_PROC = proc do
|
7
7
|
plural(/$/, 's')
|
data/lib/sequel/model/errors.rb
CHANGED
@@ -5,9 +5,6 @@ module Sequel
|
|
5
5
|
# Errors represents validation errors, a simple hash subclass
|
6
6
|
# with a few convenience methods.
|
7
7
|
class Errors < ::Hash
|
8
|
-
ATTRIBUTE_JOINER = ' and '.freeze
|
9
|
-
Sequel::Deprecation.deprecate_constant(self, :ATTRIBUTE_JOINER)
|
10
|
-
|
11
8
|
# Adds an error for the given attribute.
|
12
9
|
#
|
13
10
|
# errors.add(:name, 'is not valid') if name == 'invalid'
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
3
|
module Sequel
|
4
|
-
# Exception class raised when +raise_on_save_failure+ is set and
|
5
|
-
# or an around hook doesn't
|
4
|
+
# Exception class raised when +raise_on_save_failure+ is set and an action is canceled in a hook.
|
5
|
+
# or an around hook doesn't yield.
|
6
6
|
class HookFailed < Error
|
7
7
|
# The Sequel::Model instance related to this error.
|
8
8
|
attr_reader :model
|
@@ -13,10 +13,6 @@ module Sequel
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
# Alias for HookFailed, kept for backwards compatibility
|
17
|
-
BeforeHookFailed = HookFailed
|
18
|
-
Sequel::Deprecation.deprecate_constant(self, :BeforeHookFailed)
|
19
|
-
|
20
16
|
(
|
21
17
|
# Exception class raised when +require_modification+ is set and an UPDATE or DELETE statement to modify the dataset doesn't
|
22
18
|
# modify a single row.
|
@@ -25,31 +25,6 @@ module Sequel
|
|
25
25
|
# pluralization and singularization rules that is runs. This guarantees that your rules run before any of the rules that may
|
26
26
|
# already have been loaded.
|
27
27
|
module Inflections
|
28
|
-
CAMELIZE_CONVERT_REGEXP = /(^|_)(.)/.freeze
|
29
|
-
Sequel::Deprecation.deprecate_constant(self, :CAMELIZE_CONVERT_REGEXP)
|
30
|
-
CAMELIZE_MODULE_REGEXP = /\/(.?)/.freeze
|
31
|
-
Sequel::Deprecation.deprecate_constant(self, :CAMELIZE_MODULE_REGEXP)
|
32
|
-
DASH = '-'.freeze
|
33
|
-
Sequel::Deprecation.deprecate_constant(self, :DASH)
|
34
|
-
DEMODULIZE_CONVERT_REGEXP = /^.*::/.freeze
|
35
|
-
Sequel::Deprecation.deprecate_constant(self, :DEMODULIZE_CONVERT_REGEXP)
|
36
|
-
EMPTY_STRING= ''.freeze
|
37
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
|
38
|
-
SLASH = '/'.freeze
|
39
|
-
Sequel::Deprecation.deprecate_constant(self, :SLASH)
|
40
|
-
VALID_CONSTANT_NAME_REGEXP = /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/.freeze
|
41
|
-
Sequel::Deprecation.deprecate_constant(self, :VALID_CONSTANT_NAME_REGEXP)
|
42
|
-
UNDERSCORE = '_'.freeze
|
43
|
-
Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE)
|
44
|
-
UNDERSCORE_CONVERT_REGEXP1 = /([A-Z]+)([A-Z][a-z])/.freeze
|
45
|
-
Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE_CONVERT_REGEXP1)
|
46
|
-
UNDERSCORE_CONVERT_REGEXP2 = /([a-z\d])([A-Z])/.freeze
|
47
|
-
Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE_CONVERT_REGEXP2)
|
48
|
-
UNDERSCORE_CONVERT_REPLACE = '\1_\2'.freeze
|
49
|
-
Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE_CONVERT_REPLACE)
|
50
|
-
UNDERSCORE_MODULE_REGEXP = /::/.freeze
|
51
|
-
Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE_MODULE_REGEXP)
|
52
|
-
|
53
28
|
@plurals, @singulars, @uncountables = [], [], []
|
54
29
|
|
55
30
|
class << self
|
@@ -117,7 +92,7 @@ module Sequel
|
|
117
92
|
(@uncountables << words).flatten!
|
118
93
|
end
|
119
94
|
|
120
|
-
|
95
|
+
instance_exec(&DEFAULT_INFLECTIONS_PROC)
|
121
96
|
|
122
97
|
private
|
123
98
|
|
data/lib/sequel/model/plugins.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'active_model'
|
4
4
|
module Sequel
|
5
5
|
module Plugins
|
6
|
-
# The
|
6
|
+
# The active_model plugin makes Sequel::Model objects
|
7
7
|
# pass the ActiveModel::Lint tests, which should
|
8
8
|
# hopefully mean full ActiveModel compliance. This should
|
9
9
|
# allow the full support of Sequel::Model objects in Rails 3+.
|
@@ -18,9 +18,6 @@ module Sequel
|
|
18
18
|
# # Make the Album class active_model compliant
|
19
19
|
# Album.plugin :active_model
|
20
20
|
module ActiveModel
|
21
|
-
DEFAULT_TO_PARAM_JOINER = '-'.freeze
|
22
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_TO_PARAM_JOINER)
|
23
|
-
|
24
21
|
# ActiveModel compliant error class
|
25
22
|
class Errors < Sequel::Model::Errors
|
26
23
|
# Add autovivification so that #[] always returns an array.
|
@@ -82,7 +79,7 @@ module Sequel
|
|
82
79
|
end
|
83
80
|
end
|
84
81
|
|
85
|
-
# With the
|
82
|
+
# With the active_model plugin, Sequel model objects are already
|
86
83
|
# compliant, so this returns self.
|
87
84
|
def to_model
|
88
85
|
self
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The
|
5
|
+
# The association_dependencies plugin allows you do easily set up before and/or after destroy hooks
|
6
6
|
# for destroying, deleting, or nullifying associated model objects. The following
|
7
7
|
# association types support the following dependency actions:
|
8
8
|
#
|
@@ -18,21 +18,21 @@ module Sequel
|
|
18
18
|
# and dependency action values. You can provide the hash to the plugin call itself or
|
19
19
|
# to the add_association_dependencies method:
|
20
20
|
#
|
21
|
-
# Business.plugin :association_dependencies, :
|
21
|
+
# Business.plugin :association_dependencies, address: :delete
|
22
22
|
# # or:
|
23
23
|
# Artist.plugin :association_dependencies
|
24
|
-
# Artist.add_association_dependencies :
|
24
|
+
# Artist.add_association_dependencies albums: :destroy, reviews: :delete, tags: :nullify
|
25
25
|
module AssociationDependencies
|
26
26
|
# Mapping of association types to when the dependency calls should be made (either
|
27
27
|
# :before for in before_destroy or :after for in after_destroy)
|
28
|
-
ASSOCIATION_MAPPING = {:one_to_many=>:before, :many_to_one=>:after, :many_to_many=>:before, :one_to_one=>:before}
|
28
|
+
ASSOCIATION_MAPPING = {:one_to_many=>:before, :many_to_one=>:after, :many_to_many=>:before, :one_to_one=>:before}.freeze
|
29
29
|
|
30
30
|
# The valid dependence actions
|
31
|
-
DEPENDENCE_ACTIONS = [:delete, :destroy, :nullify]
|
31
|
+
DEPENDENCE_ACTIONS = [:delete, :destroy, :nullify].freeze
|
32
32
|
|
33
33
|
# Initialize the association_dependencies hash for this model.
|
34
34
|
def self.apply(model, hash=OPTS)
|
35
|
-
model.
|
35
|
+
model.instance_exec{@association_dependencies = {:before_delete=>[], :before_destroy=>[], :before_nullify=>[], :after_delete=>[], :after_destroy=>[]}}
|
36
36
|
end
|
37
37
|
|
38
38
|
# Call add_association_dependencies with any dependencies given in the plugin call.
|
@@ -50,7 +50,7 @@ module Sequel
|
|
50
50
|
attr_reader :association_dependencies
|
51
51
|
|
52
52
|
# Add association dependencies to this model. The hash should have association name
|
53
|
-
# symbol keys and dependency action symbol values (e.g. :
|
53
|
+
# symbol keys and dependency action symbol values (e.g. albums: :destroy).
|
54
54
|
def add_association_dependencies(hash)
|
55
55
|
hash.each do |association, action|
|
56
56
|
raise(Error, "Nonexistent association: #{association}") unless r = association_reflection(association)
|
@@ -60,15 +60,15 @@ module Sequel
|
|
60
60
|
association_dependencies[:"#{time}_#{action}"] << if action == :nullify
|
61
61
|
case type
|
62
62
|
when :one_to_many , :many_to_many
|
63
|
-
proc{
|
63
|
+
proc{public_send(r[:remove_all_method])}
|
64
64
|
when :one_to_one
|
65
|
-
proc{
|
65
|
+
proc{public_send(r[:setter_method], nil)}
|
66
66
|
else
|
67
67
|
raise(Error, "Can't nullify many_to_one associated objects: association: #{association}")
|
68
68
|
end
|
69
69
|
else
|
70
70
|
raise(Error, "Can only nullify many_to_many associations: association: #{association}") if type == :many_to_many
|
71
|
-
r
|
71
|
+
r[:dataset_method]
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -88,16 +88,16 @@ module Sequel
|
|
88
88
|
# many_to_one associations.
|
89
89
|
def after_destroy
|
90
90
|
super
|
91
|
-
model.association_dependencies[:after_delete].each{|m|
|
92
|
-
model.association_dependencies[:after_destroy].each{|m|
|
91
|
+
model.association_dependencies[:after_delete].each{|m| public_send(m).delete}
|
92
|
+
model.association_dependencies[:after_destroy].each{|m| public_send(m).destroy}
|
93
93
|
end
|
94
94
|
|
95
95
|
# Run the delete, destroy, and nullify association dependency actions for
|
96
96
|
# *_to_many associations.
|
97
97
|
def before_destroy
|
98
|
-
model.association_dependencies[:before_delete].each{|m|
|
99
|
-
model.association_dependencies[:before_destroy].each{|m|
|
100
|
-
model.association_dependencies[:before_nullify].each{|p|
|
98
|
+
model.association_dependencies[:before_delete].each{|m| public_send(m).delete}
|
99
|
+
model.association_dependencies[:before_destroy].each{|m| public_send(m).destroy}
|
100
|
+
model.association_dependencies[:before_nullify].each{|p| instance_exec(&p)}
|
101
101
|
super
|
102
102
|
end
|
103
103
|
end
|
@@ -12,6 +12,8 @@ module Sequel
|
|
12
12
|
# artist.album_pks # [1, 2, 3]
|
13
13
|
# artist.album_pks = [2, 4]
|
14
14
|
# artist.album_pks # [2, 4]
|
15
|
+
# artist.save
|
16
|
+
# # Persist changes
|
15
17
|
#
|
16
18
|
# Note that it uses the singular form of the association name. Also note
|
17
19
|
# that the setter both associates to new primary keys not in the assocation
|
@@ -22,18 +24,9 @@ module Sequel
|
|
22
24
|
# not call any callbacks. If you have any association callbacks,
|
23
25
|
# you probably should not use the setter methods.
|
24
26
|
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# uses the :delay_pks=>:always option, you can set the associated pks for existing
|
29
|
-
# objects, and the setting will not be persisted until after the object has
|
30
|
-
# been saved.
|
31
|
-
#
|
32
|
-
# SEQUEL5: Starting in Sequel 5, the :delay_pks association option will default
|
33
|
-
# to :delay_pks=>:always. If you would like to use the Sequel 4 behavior of
|
34
|
-
# having the setter make modifications immediately, explicitly use the
|
35
|
-
# :delay_pks=>false option. Additionally, Sequel 5 will not support the current
|
36
|
-
# :delay_pks=>true behavior, treating it as :delay_pks=>:always.
|
27
|
+
# By default, changes to the association will not happen until the object
|
28
|
+
# is saved. However, using the delay_pks: false option, you can have the
|
29
|
+
# changes made immediately when the association_pks setter method is called.
|
37
30
|
#
|
38
31
|
# By default, if you pass a nil value to the setter, an exception will be raised.
|
39
32
|
# You can change this behavior by using the :association_pks_nil association option.
|
@@ -95,7 +88,7 @@ module Sequel
|
|
95
88
|
rpk = opts.associated_class.primary_key
|
96
89
|
opts.associated_dataset.
|
97
90
|
naked.where(cond).
|
98
|
-
select_map(Sequel.
|
91
|
+
select_map(Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
|
99
92
|
end
|
100
93
|
elsif clpk
|
101
94
|
lambda do
|
@@ -111,7 +104,7 @@ module Sequel
|
|
111
104
|
if !opts[:read_only] && !join_associated_table
|
112
105
|
opts[:pks_setter] = lambda do |pks|
|
113
106
|
if pks.empty?
|
114
|
-
|
107
|
+
public_send(opts[:remove_all_method])
|
115
108
|
else
|
116
109
|
checked_transaction do
|
117
110
|
if clpk
|
@@ -146,13 +139,13 @@ module Sequel
|
|
146
139
|
key = opts[:key]
|
147
140
|
|
148
141
|
opts[:pks_getter] = lambda do
|
149
|
-
|
142
|
+
public_send(opts[:dataset_method]).select_map(opts.associated_class.primary_key)
|
150
143
|
end
|
151
144
|
|
152
145
|
unless opts[:read_only]
|
153
146
|
opts[:pks_setter] = lambda do |pks|
|
154
147
|
if pks.empty?
|
155
|
-
|
148
|
+
public_send(opts[:remove_all_method])
|
156
149
|
else
|
157
150
|
primary_key = opts.associated_class.primary_key
|
158
151
|
pkh = {primary_key=>pks}
|
@@ -170,7 +163,7 @@ module Sequel
|
|
170
163
|
end
|
171
164
|
|
172
165
|
checked_transaction do
|
173
|
-
ds =
|
166
|
+
ds = public_send(opts.dataset_method)
|
174
167
|
ds.unfiltered.where(pkh).update(h)
|
175
168
|
ds.exclude(pkh).update(nh)
|
176
169
|
end
|
@@ -207,10 +200,10 @@ module Sequel
|
|
207
200
|
# If the receiver is a new object, return any saved
|
208
201
|
# pks, or an empty array if no pks have been saved.
|
209
202
|
def _association_pks_getter(opts)
|
210
|
-
delay = opts
|
203
|
+
delay = opts.fetch(:delay_pks, true)
|
211
204
|
if new? && delay
|
212
205
|
(@_association_pks ||= {})[opts[:name]] ||= []
|
213
|
-
elsif delay
|
206
|
+
elsif delay && @_association_pks && (objs = @_association_pks[opts[:name]])
|
214
207
|
objs
|
215
208
|
else
|
216
209
|
instance_exec(&opts[:pks_getter])
|
@@ -219,7 +212,7 @@ module Sequel
|
|
219
212
|
|
220
213
|
# Update which objects are associated to the receiver.
|
221
214
|
# If the receiver is a new object, save the pks
|
222
|
-
# so the update can happen after the
|
215
|
+
# so the update can happen after the receiver has been saved.
|
223
216
|
def _association_pks_setter(opts, pks)
|
224
217
|
if pks.nil?
|
225
218
|
case opts[:association_pks_nil]
|
@@ -234,17 +227,10 @@ module Sequel
|
|
234
227
|
|
235
228
|
pks = convert_pk_array(opts, pks)
|
236
229
|
|
237
|
-
|
238
|
-
Sequel::Deprecation.deprecate("association_pks will default to assuming the :delay_pks=>:always association option starting in Sequel 5. Explicitly set :delay_pks=>false option for the association if you want changes to take effect immediately instead of being delayed until the object is saved (association: #{opts.inspect})")
|
239
|
-
false
|
240
|
-
end
|
241
|
-
if (new? && delay) || (delay == :always)
|
230
|
+
if opts.fetch(:delay_pks, true)
|
242
231
|
modified!
|
243
232
|
(@_association_pks ||= {})[opts[:name]] = pks
|
244
233
|
else
|
245
|
-
if !new? && delay && delay != :always
|
246
|
-
Sequel::Deprecation.deprecate("association_pks with the :delay_pks=>true association option will also delay setting of associated values for existing objects in Sequel 5 (currently it just delays setting of associated values for new objects). Please change to using :delay_pks=>:always to avoid this message. Sequel 5 will not support the existing :delay_pks=>true behavior for only delaying for new objects and not for existing objects")
|
247
|
-
end
|
248
234
|
instance_exec(pks, &opts[:pks_setter])
|
249
235
|
end
|
250
236
|
end
|
@@ -37,7 +37,7 @@ module Sequel
|
|
37
37
|
# :arguments => [2],
|
38
38
|
# :block => {|x| 3},
|
39
39
|
# :instance => artist,
|
40
|
-
# :reflection =>
|
40
|
+
# :reflection => AssociationReflection instance,
|
41
41
|
# :proxy_argument => 1,
|
42
42
|
# :proxy_block => {|ds| ds}
|
43
43
|
# }
|
@@ -51,7 +51,7 @@ module Sequel
|
|
51
51
|
# Album.plugin :association_proxies
|
52
52
|
module AssociationProxies
|
53
53
|
def self.configure(model, &block)
|
54
|
-
model.
|
54
|
+
model.instance_exec do
|
55
55
|
@association_proxy_to_dataset = block if block
|
56
56
|
@association_proxy_to_dataset ||= AssociationProxy::DEFAULT_PROXY_TO_DATASET
|
57
57
|
end
|
@@ -80,11 +80,11 @@ module Sequel
|
|
80
80
|
# is an array method, otherwise call the method on the association's dataset.
|
81
81
|
def method_missing(meth, *args, &block)
|
82
82
|
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)
|
83
|
-
@instance.
|
83
|
+
@instance.public_send(@reflection[:dataset_method])
|
84
84
|
else
|
85
85
|
@instance.send(:load_associated_objects, @reflection, @proxy_argument, &@proxy_block)
|
86
86
|
end
|
87
|
-
v.
|
87
|
+
v.public_send(meth, *args, &block)
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
@@ -100,9 +100,8 @@ module Sequel
|
|
100
100
|
# directly.
|
101
101
|
def def_association_method(opts)
|
102
102
|
if opts.returns_array?
|
103
|
-
association_module_def(opts.association_method, opts) do
|
104
|
-
|
105
|
-
AssociationProxy.new(self, opts, dynamic_opts.length == 0 ? OPTS : dynamic_opts[0], &block)
|
103
|
+
association_module_def(opts.association_method, opts) do |dynamic_opts=OPTS, &block|
|
104
|
+
AssociationProxy.new(self, opts, dynamic_opts, &block)
|
106
105
|
end
|
107
106
|
else
|
108
107
|
super
|
@@ -33,7 +33,7 @@ module Sequel
|
|
33
33
|
# By default, the plugin uses a not_null validation for NOT NULL columns, but that
|
34
34
|
# can be changed to a presence validation using an option:
|
35
35
|
#
|
36
|
-
# Model.plugin :auto_validations, :
|
36
|
+
# Model.plugin :auto_validations, not_null: :presence
|
37
37
|
#
|
38
38
|
# This is useful if you want to enforce that NOT NULL string columns do not
|
39
39
|
# allow empty values.
|
@@ -60,7 +60,7 @@ module Sequel
|
|
60
60
|
UNIQUE_OPTIONS = NOT_NULL_OPTIONS
|
61
61
|
|
62
62
|
def self.apply(model, opts=OPTS)
|
63
|
-
model.
|
63
|
+
model.instance_exec do
|
64
64
|
plugin :validation_helpers
|
65
65
|
@auto_validate_presence = false
|
66
66
|
@auto_validate_not_null_columns = []
|
@@ -81,7 +81,7 @@ module Sequel
|
|
81
81
|
|
82
82
|
# Setup auto validations for the model if it has a dataset.
|
83
83
|
def self.configure(model, opts=OPTS)
|
84
|
-
model.
|
84
|
+
model.instance_exec do
|
85
85
|
setup_auto_validations if @dataset
|
86
86
|
if opts[:not_null] == :presence
|
87
87
|
@auto_validate_presence = true
|
@@ -149,7 +149,7 @@ module Sequel
|
|
149
149
|
when :types
|
150
150
|
@auto_validate_types = false
|
151
151
|
else
|
152
|
-
|
152
|
+
public_send("auto_validate_#{type}_columns").clear
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
@@ -2,50 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The before_after_save plugin reorders some internal
|
6
|
-
# Sequel operations so they happen before after_create,
|
7
|
-
# after_update, and after_save are called, instead of
|
8
|
-
# after. These operations are:
|
9
|
-
#
|
10
|
-
# * Resetting the explicit modified flag
|
11
|
-
# * Refreshing the model or clearing changed columns after creation
|
12
|
-
#
|
13
|
-
# This behavior will become the default in Sequel 5.
|
14
|
-
#
|
15
|
-
# Usage:
|
16
|
-
#
|
17
|
-
# # Make all model subclasses perform the operations before after_save
|
18
|
-
# Sequel::Model.plugin :before_after_save
|
19
|
-
#
|
20
|
-
# # Make the Album class perform the operations before after_save
|
21
|
-
# Album.plugin :before_after_save
|
22
5
|
module BeforeAfterSave
|
23
|
-
module InstanceMethods
|
24
|
-
# SEQUEL5: Make module empty as it will be the default behavior
|
25
|
-
private
|
26
|
-
|
27
|
-
# Refresh and reset modified flag right after INSERT query.
|
28
|
-
def _after_create(pk)
|
29
|
-
super
|
30
|
-
@modified = false
|
31
|
-
pk ? _save_refresh : changed_columns.clear
|
32
|
-
end
|
33
|
-
|
34
|
-
# Don't refresh or reset modified flag, as it was already done.
|
35
|
-
def _after_save(pk)
|
36
|
-
if @was_new
|
37
|
-
@was_new = nil
|
38
|
-
else
|
39
|
-
@columns_updated = nil
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Refresh and reset modified flag right after UPDATE query.
|
44
|
-
def _after_update
|
45
|
-
super
|
46
|
-
@modified = false
|
47
|
-
end
|
48
|
-
end
|
49
6
|
end
|
50
7
|
end
|
51
8
|
end
|
@@ -41,12 +41,12 @@ module Sequel
|
|
41
41
|
# want not to be used during mass assignment, they need to be listed here as well (without the =).
|
42
42
|
#
|
43
43
|
# It's generally a bad idea to rely on a blacklist approach for security. Using a whitelist
|
44
|
-
# approach such as
|
44
|
+
# approach such as the whitelist_security plugin or the set_fields methods
|
45
45
|
# is usually a better choice. So use of this method is generally a bad idea.
|
46
46
|
#
|
47
47
|
# Artist.set_restricted_columns(:records_sold)
|
48
|
-
# Artist.set(:
|
49
|
-
# Artist.set(:
|
48
|
+
# Artist.set(name: 'Bob', hometown: 'Sactown') # No Error
|
49
|
+
# Artist.set(name: 'Bob', records_sold: 30000) # Error
|
50
50
|
def set_restricted_columns(*cols)
|
51
51
|
clear_setter_methods_cache
|
52
52
|
@restricted_columns = cols
|
@@ -58,7 +58,8 @@ module Sequel
|
|
58
58
|
# restricted_columns.
|
59
59
|
def get_setter_methods
|
60
60
|
meths = super
|
61
|
-
if !(respond_to?(:allowed_columns) && allowed_columns) && restricted_columns
|
61
|
+
#if !(respond_to?(:allowed_columns) && allowed_columns) && restricted_columns
|
62
|
+
if (!defined?(::Sequel::Plugins::WhitelistSecurity) || !plugins.include?(::Sequel::Plugins::WhitelistSecurity) || !allowed_columns) && restricted_columns
|
62
63
|
meths -= restricted_columns.map{|x| "#{x}="}
|
63
64
|
end
|
64
65
|
meths
|
@@ -67,20 +68,20 @@ module Sequel
|
|
67
68
|
|
68
69
|
module InstanceMethods
|
69
70
|
# Set all values using the entries in the hash, except for the keys
|
70
|
-
# given in except. You should probably use +set_fields+
|
71
|
+
# given in except. You should probably use +set_fields+
|
71
72
|
# instead of this method, as blacklist approaches to security are a bad idea.
|
72
73
|
#
|
73
|
-
# artist.set_except({:
|
74
|
+
# artist.set_except({name: 'Jim'}, :hometown)
|
74
75
|
# artist.name # => 'Jim'
|
75
76
|
def set_except(hash, *except)
|
76
77
|
set_restricted(hash, ExceptionList.new(except.flatten))
|
77
78
|
end
|
78
79
|
|
79
80
|
# Update all values using the entries in the hash, except for the keys
|
80
|
-
# given in except. You should probably use +update_fields+
|
81
|
+
# given in except. You should probably use +update_fields+
|
81
82
|
# instead of this method, as blacklist approaches to security are a bad idea.
|
82
83
|
#
|
83
|
-
# artist.update_except({:
|
84
|
+
# artist.update_except({name: 'Jim'}, :hometown) # UPDATE artists SET name = 'Jim' WHERE (id = 1)
|
84
85
|
def update_except(hash, *except)
|
85
86
|
update_restricted(hash, ExceptionList.new(except.flatten))
|
86
87
|
end
|