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
@@ -19,7 +19,7 @@ module Sequel
|
|
19
19
|
#
|
20
20
|
# Then when you went to save an album that uses this plugin:
|
21
21
|
#
|
22
|
-
# Album.create(:
|
22
|
+
# Album.create(name: 'abc')
|
23
23
|
# # raises Sequel::ValidationFailed: name is shorter than 5 characters
|
24
24
|
#
|
25
25
|
# Usage:
|
@@ -39,7 +39,7 @@ module Sequel
|
|
39
39
|
|
40
40
|
# Automatically load the validation_helpers plugin to run the actual validations.
|
41
41
|
def self.apply(model, opts=OPTS)
|
42
|
-
model.
|
42
|
+
model.instance_exec do
|
43
43
|
plugin :validation_helpers
|
44
44
|
@constraint_validations_table = DEFAULT_CONSTRAINT_VALIDATIONS_TABLE
|
45
45
|
@constraint_validation_options = {}
|
@@ -56,7 +56,7 @@ module Sequel
|
|
56
56
|
# :presence) and values should be hashes of options specific
|
57
57
|
# to that validation type.
|
58
58
|
def self.configure(model, opts=OPTS)
|
59
|
-
model.
|
59
|
+
model.instance_exec do
|
60
60
|
if table = opts[:constraint_validations_table]
|
61
61
|
@constraint_validations_table = table
|
62
62
|
end
|
@@ -240,6 +240,7 @@ module Sequel
|
|
240
240
|
def validate
|
241
241
|
super
|
242
242
|
model.constraint_validations.each do |v|
|
243
|
+
# Allow calling private validation methods
|
243
244
|
send(*v)
|
244
245
|
end
|
245
246
|
end
|
@@ -1,42 +1,35 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
|
4
|
-
# :nocov:
|
5
|
-
require 'fastercsv'
|
6
|
-
# :nocov:
|
7
|
-
else
|
8
|
-
require 'csv'
|
9
|
-
end
|
3
|
+
require 'csv'
|
10
4
|
|
11
5
|
module Sequel
|
12
6
|
module Plugins
|
13
7
|
# csv_serializer handles serializing entire Sequel::Model objects to CSV,
|
14
8
|
# as well as support for deserializing CSV directly into Sequel::Model
|
15
|
-
# objects. It requires
|
16
|
-
# or the fastercsv gem when using ruby 1.8.
|
9
|
+
# objects. It requires the csv standard library.
|
17
10
|
#
|
18
11
|
# Basic Example:
|
19
12
|
#
|
20
13
|
# album = Album[1]
|
21
|
-
# album.to_csv(:
|
14
|
+
# album.to_csv(write_headers: true)
|
22
15
|
# # => "id,name,artist_id\n1,RF,2\n"
|
23
16
|
#
|
24
17
|
# You can provide options to control the CSV output:
|
25
18
|
#
|
26
|
-
# album.to_csv(:
|
27
|
-
# album.to_csv(:
|
19
|
+
# album.to_csv(only: :name)
|
20
|
+
# album.to_csv(except: [:id, :artist_id])
|
28
21
|
# # => "RF\n"
|
29
22
|
#
|
30
23
|
# +to_csv+ also exists as a class and dataset method, both of which return
|
31
24
|
# all objects in the dataset:
|
32
25
|
#
|
33
26
|
# Album.to_csv
|
34
|
-
# Album.where(:
|
27
|
+
# Album.where(artist_id: 1).to_csv
|
35
28
|
#
|
36
|
-
# If you have an existing array of model
|
29
|
+
# If you have an existing array of model instances you want to convert to
|
37
30
|
# CSV, you can call the class to_csv method with the :array option:
|
38
31
|
#
|
39
|
-
# Album.to_csv(:
|
32
|
+
# Album.to_csv(array: [Album[1], Album[2]])
|
40
33
|
#
|
41
34
|
# In addition to creating CSV, this plugin also enables Sequel::Model
|
42
35
|
# classes to create instances directly from CSV using the from_csv class
|
@@ -48,7 +41,7 @@ module Sequel
|
|
48
41
|
# The array_from_csv class method exists to parse arrays of model instances
|
49
42
|
# from CSV:
|
50
43
|
#
|
51
|
-
# csv = Album.where(:
|
44
|
+
# csv = Album.where(artist_id: 1).to_csv
|
52
45
|
# albums = Album.array_from_csv(csv)
|
53
46
|
#
|
54
47
|
# These do not necessarily round trip, since doing so would let users
|
@@ -56,7 +49,7 @@ module Sequel
|
|
56
49
|
# call set with the values in the hash. If you want to specify the allowed
|
57
50
|
# fields, you can use the :headers option.
|
58
51
|
#
|
59
|
-
# Album.from_csv(album.to_csv, :
|
52
|
+
# Album.from_csv(album.to_csv, headers: %w'id name')
|
60
53
|
#
|
61
54
|
# If you want to update an existing instance, you can use the from_csv
|
62
55
|
# instance method:
|
@@ -77,7 +70,7 @@ module Sequel
|
|
77
70
|
# Set up the column readers to do deserialization and the column writers
|
78
71
|
# to save the value in deserialized_values
|
79
72
|
def self.configure(model, opts = OPTS)
|
80
|
-
model.
|
73
|
+
model.instance_exec do
|
81
74
|
@csv_serializer_opts = (@csv_serializer_opts || OPTS).merge(opts)
|
82
75
|
end
|
83
76
|
end
|
@@ -155,7 +148,7 @@ module Sequel
|
|
155
148
|
opts = model.process_csv_serializer_opts(opts)
|
156
149
|
|
157
150
|
CSV.generate(opts) do |csv|
|
158
|
-
csv << opts[:headers].map{|k|
|
151
|
+
csv << opts[:headers].map{|k| public_send(k)}
|
159
152
|
end
|
160
153
|
end
|
161
154
|
end
|
@@ -174,7 +167,7 @@ module Sequel
|
|
174
167
|
|
175
168
|
CSV.generate(opts) do |csv|
|
176
169
|
items.each do |object|
|
177
|
-
csv << opts[:headers].map{|header| object.
|
170
|
+
csv << opts[:headers].map{|header| object.public_send(header) }
|
178
171
|
end
|
179
172
|
end
|
180
173
|
end
|
@@ -12,7 +12,7 @@ module Sequel
|
|
12
12
|
# plugin :dataset_associations
|
13
13
|
# one_to_many :albums
|
14
14
|
# end
|
15
|
-
# Artist.where(id
|
15
|
+
# Artist.where(id: 1..100).albums
|
16
16
|
# # SELECT * FROM albums
|
17
17
|
# # WHERE (albums.artist_id IN (
|
18
18
|
# # SELECT id FROM artists
|
@@ -27,7 +27,7 @@ module Sequel
|
|
27
27
|
# As the dataset methods return datasets, you can easily chain the
|
28
28
|
# methods to get associated datasets of associated datasets:
|
29
29
|
#
|
30
|
-
# Artist.where(id
|
30
|
+
# Artist.where(id: 1..100).albums.where{name < 'M'}.tags
|
31
31
|
# # SELECT tags.* FROM tags
|
32
32
|
# # WHERE (tags.id IN (
|
33
33
|
# # SELECT albums_tags.tag_id FROM albums
|
@@ -6,7 +6,7 @@ module Sequel
|
|
6
6
|
# for defining dataset methods:
|
7
7
|
#
|
8
8
|
# Album.def_dataset_method(:by_name) do |name|
|
9
|
-
# where(:name
|
9
|
+
# where(name: name)
|
10
10
|
# end
|
11
11
|
#
|
12
12
|
# Additionally, this adds support for Model.subset, which can also
|
@@ -41,8 +41,8 @@ module Sequel
|
|
41
41
|
#
|
42
42
|
# # Add new dataset method and class method that calls it
|
43
43
|
# Artist.def_dataset_method(:by_name){order(:name)}
|
44
|
-
# Artist.where(:name.like('A%')).by_name
|
45
|
-
# Artist.by_name.where(:name.like('A%'))
|
44
|
+
# Artist.where(Sequel[:name].like('A%')).by_name
|
45
|
+
# Artist.by_name.where(Sequel[:name].like('A%'))
|
46
46
|
#
|
47
47
|
# # Just add a class method that calls an existing dataset method
|
48
48
|
# Artist.def_dataset_method(:paginate)
|
@@ -63,7 +63,7 @@ module Sequel
|
|
63
63
|
# they can be chained.
|
64
64
|
# For example:
|
65
65
|
#
|
66
|
-
# Topic.subset(:joes, :username.like('%joe%'))
|
66
|
+
# Topic.subset(:joes, Sequel[:username].like('%joe%'))
|
67
67
|
# Topic.subset(:popular){num_posts > 100}
|
68
68
|
# Topic.subset(:recent){created_on > Date.today - 7}
|
69
69
|
#
|
@@ -75,7 +75,7 @@ module Sequel
|
|
75
75
|
# have more than 100 posts and were created less than
|
76
76
|
# 7 days ago.
|
77
77
|
#
|
78
|
-
# Both the args given and the block are passed to <tt>Dataset#
|
78
|
+
# Both the args given and the block are passed to <tt>Dataset#where</tt>.
|
79
79
|
#
|
80
80
|
# This method creates dataset methods that do not accept arguments. To create
|
81
81
|
# dataset methods that accept arguments, you should use define a
|
@@ -40,7 +40,7 @@ module Sequel
|
|
40
40
|
if opts.dataset_need_primary_key? && new?
|
41
41
|
o = make_add_associated_object(opts, o)
|
42
42
|
delay_validate_associated_object(opts, o)
|
43
|
-
|
43
|
+
public_send(opts[:name]) << o
|
44
44
|
after_create_hook{super(opts, o, *args)}
|
45
45
|
o
|
46
46
|
else
|
@@ -7,7 +7,7 @@ module Sequel
|
|
7
7
|
# that represents a model class method that returns a dataset:
|
8
8
|
#
|
9
9
|
# def Artist.by_name(name)
|
10
|
-
# where(:name
|
10
|
+
# where(name: name)
|
11
11
|
# end
|
12
12
|
#
|
13
13
|
# Artist.finder :by_name
|
@@ -18,7 +18,7 @@ module Sequel
|
|
18
18
|
#
|
19
19
|
# The alternative way to use this to pass your own block:
|
20
20
|
#
|
21
|
-
# Artist.finder(:
|
21
|
+
# Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
|
22
22
|
#
|
23
23
|
# Additionally, there is a Model.prepared_finder method. This works similarly
|
24
24
|
# to Model.finder, but uses a prepared statement. This limits the types of
|
@@ -50,7 +50,7 @@ module Sequel
|
|
50
50
|
# that represents a model class method that returns a dataset:
|
51
51
|
#
|
52
52
|
# def Artist.by_name(name)
|
53
|
-
# where(:name
|
53
|
+
# where(name: name)
|
54
54
|
# end
|
55
55
|
#
|
56
56
|
# Artist.finder :by_name
|
@@ -61,7 +61,7 @@ module Sequel
|
|
61
61
|
#
|
62
62
|
# The alternative way to use this to pass your own block:
|
63
63
|
#
|
64
|
-
# Artist.finder(:
|
64
|
+
# Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
|
65
65
|
#
|
66
66
|
# Note that if you pass your own block, you are responsible for manually setting
|
67
67
|
# limits if necessary (as shown above).
|
@@ -86,7 +86,7 @@ module Sequel
|
|
86
86
|
# This doesn't handle all possible cases. For example, if you have a method such as:
|
87
87
|
#
|
88
88
|
# def Artist.by_name(name)
|
89
|
-
# name ? where(:name
|
89
|
+
# name ? where(name: name) : exclude(name: nil)
|
90
90
|
# end
|
91
91
|
#
|
92
92
|
# Then calling a finder without an argument will not work as you expect.
|
@@ -128,7 +128,7 @@ module Sequel
|
|
128
128
|
ds = if block
|
129
129
|
model.instance_exec(*args, &block)
|
130
130
|
else
|
131
|
-
model.
|
131
|
+
model.public_send(meth, *args)
|
132
132
|
end
|
133
133
|
ds = ds.limit(1) if limit1
|
134
134
|
model_name = model.name
|
@@ -144,7 +144,7 @@ module Sequel
|
|
144
144
|
n = argn.call(model)
|
145
145
|
block ||= lambda do |pl, model2|
|
146
146
|
args = (0...n).map{pl.arg}
|
147
|
-
ds = model2.
|
147
|
+
ds = model2.public_send(meth, *args)
|
148
148
|
ds = ds.limit(1) if limit1
|
149
149
|
ds
|
150
150
|
end
|
@@ -154,7 +154,7 @@ module Sequel
|
|
154
154
|
end
|
155
155
|
|
156
156
|
@finder_loaders[meth_name] = loader_proc
|
157
|
-
mod = opts[:mod] ||
|
157
|
+
mod = opts[:mod] || singleton_class
|
158
158
|
if prepare
|
159
159
|
def_prepare_method(mod, meth_name)
|
160
160
|
else
|
@@ -190,14 +190,14 @@ module Sequel
|
|
190
190
|
finder(meth, opts, &block)
|
191
191
|
end
|
192
192
|
|
193
|
-
Plugins.inherited_instance_variables(self, :@finders=>:dup, :@
|
193
|
+
Plugins.inherited_instance_variables(self, :@finders=>:dup, :@finder_loaders=>:dup)
|
194
194
|
|
195
195
|
private
|
196
196
|
|
197
197
|
# Define a finder method in the given module with the given method name that
|
198
198
|
# load rows using the finder with the given name.
|
199
199
|
def def_finder_method(mod, meth, type)
|
200
|
-
mod.send(:define_method, meth){|*args, &block| finder_for(meth).
|
200
|
+
mod.send(:define_method, meth){|*args, &block| finder_for(meth).public_send(type, *args, &block)}
|
201
201
|
end
|
202
202
|
|
203
203
|
# Define a prepared_finder method in the given module that will call the associated prepared
|
@@ -234,6 +234,12 @@ module Sequel
|
|
234
234
|
s
|
235
235
|
end
|
236
236
|
end
|
237
|
+
|
238
|
+
# Clear any finders when reseting the instance dataset
|
239
|
+
def reset_instance_dataset
|
240
|
+
Sequel.synchronize{@finders.clear} if @finders && !@finders.frozen?
|
241
|
+
super
|
242
|
+
end
|
237
243
|
end
|
238
244
|
end
|
239
245
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
if RUBY_VERSION >= '1.9.0'
|
4
3
|
module Sequel
|
5
4
|
module Plugins
|
6
|
-
# The
|
5
|
+
# The force_encoding plugin allows you force specific encodings for all
|
7
6
|
# strings that are used by the model. When model instances are loaded
|
8
7
|
# from the database, all values in the hash that are strings are
|
9
8
|
# forced to the given encoding. Whenever you update a model column
|
@@ -77,8 +76,3 @@ module Sequel
|
|
77
76
|
end
|
78
77
|
end
|
79
78
|
end
|
80
|
-
else
|
81
|
-
# :nocov:
|
82
|
-
raise LoadError, 'ForceEncoding plugin only works on Ruby 1.9+'
|
83
|
-
# :nocov:
|
84
|
-
end
|
@@ -31,14 +31,6 @@ module Sequel
|
|
31
31
|
# # Allow the use of hook class methods in the Album class
|
32
32
|
# Album.plugin :hook_class_methods
|
33
33
|
module HookClassMethods
|
34
|
-
# SEQUEL5: Remove
|
35
|
-
DEPRECATION_REPLACEMENTS = {
|
36
|
-
:after_commit=>"Use after_save{db.after_commit{}} instead",
|
37
|
-
:after_destroy_commit=>"Use after_destroy{db.after_commit{}} instead",
|
38
|
-
:after_destroy_rollback=>"Use before_destroy{db.after_rollback{}} instead",
|
39
|
-
:after_rollback=>"Use before_save{db.after_rollback{}} instead"
|
40
|
-
}.freeze
|
41
|
-
|
42
34
|
# Set up the hooks instance variable in the model.
|
43
35
|
def self.apply(model)
|
44
36
|
hooks = model.instance_variable_set(:@hooks, {})
|
@@ -49,52 +41,11 @@ module Sequel
|
|
49
41
|
Model::HOOKS.each do |h|
|
50
42
|
class_eval(<<-END, __FILE__, __LINE__ + 1)
|
51
43
|
def #{h}(method = nil, &block)
|
52
|
-
#{"Sequel::Deprecation.deprecate('Sequel::Model.#{h} in the hook_class_methods plugin', #{DEPRECATION_REPLACEMENTS[h].inspect})" if DEPRECATION_REPLACEMENTS[h]}
|
53
44
|
add_hook(:#{h}, method, &block)
|
54
45
|
end
|
55
46
|
END
|
56
47
|
end
|
57
48
|
|
58
|
-
# This adds a new hook type. It will define both a class
|
59
|
-
# method that you can use to add hooks, as well as an instance method
|
60
|
-
# that you can use to call all hooks of that type. The class method
|
61
|
-
# can be called with a symbol or a block or both. If a block is given and
|
62
|
-
# and symbol is not, it adds the hook block to the hook type. If a block
|
63
|
-
# and symbol are both given, it replaces the hook block associated with
|
64
|
-
# that symbol for a given hook type, or adds it if there is no hook block
|
65
|
-
# with that symbol for that hook type. If no block is given, it assumes
|
66
|
-
# the symbol specifies an instance method to call and adds it to the hook
|
67
|
-
# type.
|
68
|
-
#
|
69
|
-
# If any before hook block returns false, the instance method will return false
|
70
|
-
# immediately without running the rest of the hooks of that type.
|
71
|
-
#
|
72
|
-
# It is recommended that you always provide a symbol to this method,
|
73
|
-
# for descriptive purposes. It's only necessary to do so when you
|
74
|
-
# are using a system that reloads code.
|
75
|
-
#
|
76
|
-
# Example of usage:
|
77
|
-
#
|
78
|
-
# class MyModel
|
79
|
-
# add_hook_type :before_move_to
|
80
|
-
# before_move_to(:check_move_allowed, &:allow_move?)
|
81
|
-
# def move_to(there)
|
82
|
-
# return if before_move_to == false
|
83
|
-
# # move MyModel object to there
|
84
|
-
# end
|
85
|
-
# end
|
86
|
-
#
|
87
|
-
# Do not call this method with untrusted input, as that can result in
|
88
|
-
# arbitrary code execution.
|
89
|
-
def add_hook_type(*hooks)
|
90
|
-
Sequel::Deprecation.deprecate("Sequel::Model.add_hook_type", "You should add your own hook types manually")
|
91
|
-
hooks.each do |hook|
|
92
|
-
@hooks[hook] = []
|
93
|
-
instance_eval("def #{hook}(method = nil, &block); add_hook(:#{hook}, method, &block) end", __FILE__, __LINE__)
|
94
|
-
class_eval("def #{hook}; model.hook_blocks(:#{hook}){|b| return false if instance_eval(&b) == false} end", __FILE__, __LINE__)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
49
|
# Freeze hooks when freezing model class.
|
99
50
|
def freeze
|
100
51
|
@hooks.freeze.each_value(&:freeze)
|
@@ -121,7 +72,8 @@ module Sequel
|
|
121
72
|
def add_hook(hook, tag, &block)
|
122
73
|
unless block
|
123
74
|
(raise Error, 'No hook method specified') unless tag
|
124
|
-
|
75
|
+
# Allow calling private hook methods
|
76
|
+
block = proc {send(tag)}
|
125
77
|
end
|
126
78
|
h = @hooks[hook]
|
127
79
|
if tag && (old = h.find{|x| x[0] == tag})
|
@@ -137,63 +89,9 @@ module Sequel
|
|
137
89
|
end
|
138
90
|
|
139
91
|
module InstanceMethods
|
140
|
-
|
141
|
-
[:before_create, :before_update, :before_validation].each do |h|
|
142
|
-
class_eval(<<-END, __FILE__, __LINE__+1)
|
143
|
-
def #{h}
|
144
|
-
model.hook_blocks(:#{h}) do |b|
|
145
|
-
if instance_eval(&b) == false
|
146
|
-
Sequel::Deprecation.deprecate("Having #{h} hook block return false to stop evaluation of further #{h} hook blocks", "Instead, call cancel_action inside #{h} hook block")
|
147
|
-
return false
|
148
|
-
end
|
149
|
-
end
|
150
|
-
super
|
151
|
-
end
|
152
|
-
END
|
153
|
-
end
|
154
|
-
[:after_create, :after_update, :after_validation].each{|h| class_eval("def #{h}; super; model.hook_blocks(:#{h}){|b| instance_eval(&b)}; end", __FILE__, __LINE__)}
|
155
|
-
|
156
|
-
def after_destroy
|
157
|
-
super
|
158
|
-
model.hook_blocks(:after_destroy){|b| instance_eval(&b)}
|
159
|
-
if model.has_hooks?(:after_destroy_commit)
|
160
|
-
db.after_commit{model.hook_blocks(:after_destroy_commit){|b| instance_eval(&b)}}
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def after_save
|
165
|
-
super
|
166
|
-
model.hook_blocks(:after_save){|b| instance_eval(&b)}
|
167
|
-
if model.has_hooks?(:after_commit)
|
168
|
-
db.after_commit{model.hook_blocks(:after_commit){|b| instance_eval(&b)}}
|
169
|
-
end
|
170
|
-
end
|
92
|
+
[:before_create, :before_update, :before_validation, :before_save, :before_destroy].each{|h| class_eval("def #{h}; model.hook_blocks(:#{h}){|b| instance_exec(&b)}; super end", __FILE__, __LINE__)}
|
171
93
|
|
172
|
-
def
|
173
|
-
model.hook_blocks(:before_destroy) do |b|
|
174
|
-
if instance_eval(&b) == false
|
175
|
-
Sequel::Deprecation.deprecate("Having before_destory hook block return false to stop evaluation of further before_destroy hook blocks", "Instead, call cancel_action inside before_destroy hook block")
|
176
|
-
return false
|
177
|
-
end
|
178
|
-
end
|
179
|
-
super
|
180
|
-
if model.has_hooks?(:after_destroy_rollback)
|
181
|
-
db.after_rollback{model.hook_blocks(:after_destroy_rollback){|b| instance_eval(&b)}}
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def before_save
|
186
|
-
model.hook_blocks(:before_save) do |b|
|
187
|
-
if instance_eval(&b) == false
|
188
|
-
Sequel::Deprecation.deprecate("Having before_save hook block return false to stop evaluation of further before_save hook blocks", "Instead, call cancel_action inside before_save hook block")
|
189
|
-
return false
|
190
|
-
end
|
191
|
-
end
|
192
|
-
super
|
193
|
-
if model.has_hooks?(:after_rollback)
|
194
|
-
db.after_rollback{model.hook_blocks(:after_rollback){|b| instance_eval(&b)}}
|
195
|
-
end
|
196
|
-
end
|
94
|
+
[:after_create, :after_update, :after_validation, :after_save, :after_destroy].each{|h| class_eval("def #{h}; super; model.hook_blocks(:#{h}){|b| instance_exec(&b)}; end", __FILE__, __LINE__)}
|
197
95
|
end
|
198
96
|
end
|
199
97
|
end
|