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
data/lib/sequel/plugins/touch.rb
CHANGED
@@ -22,17 +22,13 @@ module Sequel
|
|
22
22
|
# Sequel::Model.plugin :touch
|
23
23
|
#
|
24
24
|
# # Allow touching of Album instances, with a custom column
|
25
|
-
# Album.plugin :touch, :
|
25
|
+
# Album.plugin :touch, column: :updated_on
|
26
26
|
#
|
27
27
|
# # Allow touching of Artist instances, updating the albums and tags
|
28
28
|
# # associations when touching, touching the +updated_on+ column for
|
29
29
|
# # albums and the +updated_at+ column for tags
|
30
|
-
# Artist.plugin :touch, :
|
30
|
+
# Artist.plugin :touch, associations: [{albums: :updated_on}, :tags]
|
31
31
|
module Touch
|
32
|
-
# The default column to update when touching
|
33
|
-
TOUCH_COLUMN_DEFAULT = :updated_at
|
34
|
-
Sequel::Deprecation.deprecate_constant(self, :TOUCH_COLUMN_DEFAULT)
|
35
|
-
|
36
32
|
def self.apply(model, opts=OPTS)
|
37
33
|
model.instance_variable_set(:@touched_associations, {})
|
38
34
|
end
|
@@ -131,13 +127,13 @@ module Sequel
|
|
131
127
|
model.touched_associations.each do |assoc, column|
|
132
128
|
r = model.association_reflection(assoc)
|
133
129
|
next unless r.can_have_associated_objects?(self)
|
134
|
-
ds =
|
130
|
+
ds = public_send(r[:dataset_method])
|
135
131
|
|
136
132
|
if ds.send(:joined_dataset?)
|
137
133
|
# Can't update all values at once, so update each instance individually.
|
138
134
|
# Instead if doing a simple save, update via the instance's dataset,
|
139
135
|
# to avoid going into an infinite loop in some cases.
|
140
|
-
|
136
|
+
public_send(assoc).each{|x| x.this.update(column=>touch_association_value)}
|
141
137
|
else
|
142
138
|
# Update all values at once for performance reasons.
|
143
139
|
ds.update(column=>touch_association_value)
|
data/lib/sequel/plugins/tree.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The
|
5
|
+
# The tree plugin adds additional associations and methods that allow you to
|
6
6
|
# treat a Model as a tree.
|
7
7
|
#
|
8
8
|
# A column for holding the parent key is required and is :parent_id by default.
|
@@ -21,7 +21,7 @@ module Sequel
|
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# class Node < Sequel::Model
|
24
|
-
# plugin :tree, :
|
24
|
+
# plugin :tree, key: :parentid, order: :position
|
25
25
|
# end
|
26
26
|
module Tree
|
27
27
|
# Create parent and children associations. Any options
|
@@ -33,7 +33,7 @@ module Sequel
|
|
33
33
|
opts = opts.dup
|
34
34
|
opts[:class] = model
|
35
35
|
|
36
|
-
model.
|
36
|
+
model.instance_exec do
|
37
37
|
@parent_column = (opts[:key] ||= :parent_id)
|
38
38
|
@tree_order = opts[:order]
|
39
39
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The
|
5
|
+
# The typecast_on_load plugin exists because most of Sequel's database adapters don't
|
6
6
|
# have complete control over typecasting, and may return columns that aren't
|
7
7
|
# typecast correctly (with correct being defined as how the model object
|
8
8
|
# would typecast the same column values).
|
@@ -23,7 +23,7 @@ module Sequel
|
|
23
23
|
module TypecastOnLoad
|
24
24
|
# Call add_typecast_on_load_columns on the passed column arguments.
|
25
25
|
def self.configure(model, *columns)
|
26
|
-
model.
|
26
|
+
model.instance_exec do
|
27
27
|
@typecast_on_load_columns ||= []
|
28
28
|
add_typecast_on_load_columns(*columns)
|
29
29
|
end
|
@@ -4,13 +4,7 @@ module Sequel
|
|
4
4
|
module Plugins
|
5
5
|
# The unlimited_update plugin is designed to work around a
|
6
6
|
# MySQL warning in replicated environments, which occurs if
|
7
|
-
# you issue an UPDATE with a LIMIT clause.
|
8
|
-
# database Sequel supports will create an UPDATE clause with
|
9
|
-
# a LIMIT, and in non-replicated MySQL environments, MySQL
|
10
|
-
# doesn't issue a warning. Note that even in replicated
|
11
|
-
# environments the MySQL warning is harmless, as Sequel
|
12
|
-
# restricts an update to rows with a matching primary key,
|
13
|
-
# which should be unique.
|
7
|
+
# you issue an UPDATE with a LIMIT clause.
|
14
8
|
#
|
15
9
|
# Usage:
|
16
10
|
#
|
@@ -2,21 +2,21 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The update_or_create plugin adds
|
5
|
+
# The update_or_create plugin adds methods that make it easier
|
6
6
|
# to deal with objects which may or may not yet exist in the database.
|
7
7
|
# The first method is update_or_create, which updates an object if it
|
8
8
|
# exists in the database, or creates the object if it does not.
|
9
9
|
#
|
10
10
|
# You can call update_or_create with a block:
|
11
11
|
#
|
12
|
-
# Album.update_or_create(:
|
12
|
+
# Album.update_or_create(name: 'Hello') do |album|
|
13
13
|
# album.num_copies_sold = 1000
|
14
14
|
# end
|
15
15
|
#
|
16
16
|
# or provide two hashes, with the second one being the attributes
|
17
17
|
# to set.
|
18
18
|
#
|
19
|
-
# Album.update_or_create({:
|
19
|
+
# Album.update_or_create({name: 'Hello'}, num_copies_sold: 1000)
|
20
20
|
#
|
21
21
|
# In both cases, this will check the database to find the album with
|
22
22
|
# the name "Hello". If such an album exists, it will be updated to set
|
@@ -30,15 +30,15 @@ module Sequel
|
|
30
30
|
# dataset supports RETURNING.
|
31
31
|
#
|
32
32
|
# # Only include the artist column in RETURNING
|
33
|
-
# Album.plugin :update_refresh, :
|
33
|
+
# Album.plugin :update_refresh, columns: :artist
|
34
34
|
#
|
35
35
|
# # Only include the artist and title columns in RETURNING
|
36
|
-
# Album.plugin :update_refresh, :
|
36
|
+
# Album.plugin :update_refresh, columns: [:artist, :title]
|
37
37
|
module UpdateRefresh
|
38
38
|
# Set the specific columns to refresh, if the :columns option
|
39
39
|
# is provided.
|
40
40
|
def self.configure(model, opts=OPTS)
|
41
|
-
model.
|
41
|
+
model.instance_exec do
|
42
42
|
@update_refresh_columns = Array(opts[:columns]) || []
|
43
43
|
end
|
44
44
|
end
|
data/lib/sequel/plugins/uuid.rb
CHANGED
@@ -5,10 +5,7 @@ require 'securerandom'
|
|
5
5
|
module Sequel
|
6
6
|
module Plugins
|
7
7
|
# The uuid plugin creates hooks that automatically create a uuid for every
|
8
|
-
# instance.
|
9
|
-
# that method is not defined on ruby 1.8.7. If you would like to use this
|
10
|
-
# on ruby 1.8.7, you need to override the Model#create_uuid private method
|
11
|
-
# to return a valid uuid.
|
8
|
+
# instance.
|
12
9
|
#
|
13
10
|
# Usage:
|
14
11
|
#
|
@@ -17,7 +14,7 @@ module Sequel
|
|
17
14
|
# Sequel::Model.plugin :uuid
|
18
15
|
#
|
19
16
|
# # Uuid Album instances, with custom column name
|
20
|
-
# Album.plugin :uuid, :
|
17
|
+
# Album.plugin :uuid, field: :my_uuid
|
21
18
|
module Uuid
|
22
19
|
# Configure the plugin by setting the available options. Note that
|
23
20
|
# if this method is run more than once, previous settings are ignored,
|
@@ -25,7 +22,7 @@ module Sequel
|
|
25
22
|
# :field :: The field to hold the uuid (default: :uuid)
|
26
23
|
# :force :: Whether to overwrite an existing uuid (default: false)
|
27
24
|
def self.configure(model, opts=OPTS)
|
28
|
-
model.
|
25
|
+
model.instance_exec do
|
29
26
|
@uuid_field = opts[:field]||:uuid
|
30
27
|
@uuid_overwrite = opts[:force]||false
|
31
28
|
end
|
@@ -44,17 +41,16 @@ module Sequel
|
|
44
41
|
end
|
45
42
|
|
46
43
|
module InstanceMethods
|
47
|
-
private
|
48
|
-
|
49
44
|
# Set the uuid when creating
|
50
|
-
def
|
45
|
+
def before_validation
|
51
46
|
set_uuid if new?
|
52
47
|
super
|
53
48
|
end
|
54
49
|
|
50
|
+
private
|
51
|
+
|
55
52
|
# Create a new UUID. This method can be overridden to use a separate
|
56
|
-
# method for creating UUIDs.
|
57
|
-
# ruby 1.8.7, you will have to override it if you are using ruby 1.8.7.
|
53
|
+
# method for creating UUIDs.
|
58
54
|
def create_uuid
|
59
55
|
SecureRandom.uuid
|
60
56
|
end
|
@@ -56,7 +56,7 @@ module Sequel
|
|
56
56
|
# Initializes a new generator.
|
57
57
|
def initialize(receiver ,&block)
|
58
58
|
@receiver = receiver
|
59
|
-
|
59
|
+
instance_exec(&block)
|
60
60
|
end
|
61
61
|
|
62
62
|
# Delegates method calls to the receiver by calling receiver.validates_xxx.
|
@@ -97,15 +97,16 @@ module Sequel
|
|
97
97
|
#
|
98
98
|
# class MyClass < Sequel::Model
|
99
99
|
# validates do
|
100
|
-
# length_of :name, :
|
101
|
-
# length_of :password, :
|
100
|
+
# length_of :name, minimum: 6
|
101
|
+
# length_of :password, minimum: 8
|
102
102
|
# end
|
103
103
|
# end
|
104
104
|
#
|
105
105
|
# is equivalent to:
|
106
|
+
#
|
106
107
|
# class MyClass < Sequel::Model
|
107
|
-
# validates_length_of :name, :
|
108
|
-
# validates_length_of :password, :
|
108
|
+
# validates_length_of :name, minimum: 6
|
109
|
+
# validates_length_of :password, minimum: 8
|
109
110
|
# end
|
110
111
|
def validates(&block)
|
111
112
|
Generator.new(self, &block)
|
@@ -187,7 +188,7 @@ module Sequel
|
|
187
188
|
# Sequel will attempt to insert a NULL value into the database, instead of using the
|
188
189
|
# database's default.
|
189
190
|
# :allow_nil :: Whether to skip the validation if the value is nil.
|
190
|
-
# :if :: A symbol (indicating an instance_method) or proc (which is
|
191
|
+
# :if :: A symbol (indicating an instance_method) or proc (which is instance_execed)
|
191
192
|
# skipping this validation if it returns nil or false.
|
192
193
|
# :tag :: The tag to use for this validation.
|
193
194
|
def validates_each(*atts, &block)
|
@@ -273,7 +274,7 @@ module Sequel
|
|
273
274
|
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && v.size == i
|
274
275
|
end
|
275
276
|
if w = opts[:within]
|
276
|
-
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.
|
277
|
+
o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.public_send(w.respond_to?(:cover?) ? :cover? : :include?, v.size)
|
277
278
|
end
|
278
279
|
end
|
279
280
|
end
|
@@ -335,7 +336,7 @@ module Sequel
|
|
335
336
|
reflect_validation(:inclusion, opts, atts)
|
336
337
|
atts << opts
|
337
338
|
validates_each(*atts) do |o, a, v|
|
338
|
-
o.errors.add(a, opts[:message]) unless n.
|
339
|
+
o.errors.add(a, opts[:message]) unless n.public_send(n.respond_to?(:cover?) ? :cover? : :include?, v)
|
339
340
|
end
|
340
341
|
end
|
341
342
|
|
@@ -434,7 +435,7 @@ module Sequel
|
|
434
435
|
when Symbol
|
435
436
|
o.get_column_value(i)
|
436
437
|
when Proc
|
437
|
-
o.
|
438
|
+
o.instance_exec(&i)
|
438
439
|
else
|
439
440
|
raise(::Sequel::Error, "invalid value for :if validation option")
|
440
441
|
end
|
@@ -15,11 +15,11 @@ module Sequel
|
|
15
15
|
# end
|
16
16
|
# end
|
17
17
|
#
|
18
|
-
# Album.new(:
|
19
|
-
# Album.new(:
|
18
|
+
# Album.new(status_id: 1).valid?(validation_context: :initial) # => true
|
19
|
+
# Album.new(status_id: 2).valid?(validation_context: :initial) # => false
|
20
20
|
#
|
21
|
-
# Album.new(:
|
22
|
-
# Album.new(:
|
21
|
+
# Album.new(status_id: 1).valid?(validation_context: :approve) # => false
|
22
|
+
# Album.new(status_id: 2).valid?(validation_context: :approve) # => true
|
23
23
|
#
|
24
24
|
# There is no validation context used by default, so validation_context will be
|
25
25
|
# +nil+ if one is not specified. If you want to differentiate between creating new
|
@@ -38,17 +38,24 @@ module Sequel
|
|
38
38
|
# that argument is passed as an argument to the proc.
|
39
39
|
#
|
40
40
|
# The default validation options for all models can be modified by
|
41
|
-
#
|
42
|
-
# change change the default options on a per model basis
|
43
|
-
# by overriding a private instance method default_validation_helpers_options.
|
44
|
-
#
|
41
|
+
# overridding the Model#default_validation_helpers_options private method.
|
45
42
|
# By changing the default options, you can setup internationalization of the
|
46
43
|
# error messages. For example, you would modify the default options:
|
47
44
|
#
|
48
|
-
# Sequel::
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
45
|
+
# class Sequel::Model
|
46
|
+
# private
|
47
|
+
#
|
48
|
+
# def default_validation_helpers_options(type)
|
49
|
+
# case type
|
50
|
+
# when :exact_length
|
51
|
+
# {message: lambda{|exact| I18n.t("errors.exact_length", exact: exact)}
|
52
|
+
# when :integer
|
53
|
+
# {message: lambda{I18n.t("errors.integer")}
|
54
|
+
# else
|
55
|
+
# super
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
# end
|
52
59
|
#
|
53
60
|
# and then use something like this in your yaml translation file:
|
54
61
|
#
|
@@ -61,20 +68,16 @@ module Sequel
|
|
61
68
|
# you need to override the method. Here's an example:
|
62
69
|
#
|
63
70
|
# class Sequel::Model::Errors
|
64
|
-
# ATTRIBUTE_JOINER = I18n.t('errors.joiner').freeze
|
65
71
|
# def full_messages
|
66
72
|
# inject([]) do |m, kv|
|
67
73
|
# att, errors = *kv
|
68
74
|
# att.is_a?(Array) ? Array(att).map!{|v| I18n.t("attributes.#{v}")} : att = I18n.t("attributes.#{att}")
|
69
|
-
# errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(
|
75
|
+
# errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(I18n.t('errors.joiner'))} #{e}")}
|
70
76
|
# m
|
71
77
|
# end
|
72
78
|
# end
|
73
79
|
# end
|
74
80
|
module ValidationHelpers
|
75
|
-
# Default validation options used by Sequel. Can be modified to change the error
|
76
|
-
# messages for all models (e.g. for internationalization), or to set certain
|
77
|
-
# default options for validations (e.g. :allow_nil=>true for all validates_format).
|
78
81
|
DEFAULT_OPTIONS = {
|
79
82
|
:exact_length=>{:message=>lambda{|exact| "is not #{exact} characters"}},
|
80
83
|
:format=>{:message=>lambda{|with| 'is invalid'}},
|
@@ -89,9 +92,8 @@ module Sequel
|
|
89
92
|
:type=>{:message=>lambda{|klass| klass.is_a?(Array) ? "is not a valid #{klass.join(" or ").downcase}" : "is not a valid #{klass.to_s.downcase}"}},
|
90
93
|
:presence=>{:message=>lambda{"is not present"}},
|
91
94
|
:unique=>{:message=>lambda{'is already taken'}}
|
92
|
-
}
|
93
|
-
|
94
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_OPTIONS)
|
95
|
+
}.freeze
|
96
|
+
DEFAULT_OPTIONS.each_value(&:freeze)
|
95
97
|
|
96
98
|
module InstanceMethods
|
97
99
|
# Check that the attribute values are the given exact length.
|
@@ -106,7 +108,7 @@ module Sequel
|
|
106
108
|
|
107
109
|
# Check attribute value(s) is included in the given set.
|
108
110
|
def validates_includes(set, atts, opts=OPTS)
|
109
|
-
validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.
|
111
|
+
validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.public_send(set.respond_to?(:cover?) ? :cover? : :include?, v)}
|
110
112
|
end
|
111
113
|
|
112
114
|
# Check attribute value(s) string representation is a valid integer.
|
@@ -123,7 +125,7 @@ module Sequel
|
|
123
125
|
|
124
126
|
# Check that the attribute values length is in the specified range.
|
125
127
|
def validates_length_range(range, atts, opts=OPTS)
|
126
|
-
validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range) if v.nil? || !range.
|
128
|
+
validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range) if v.nil? || !range.cover?(v.length)}
|
127
129
|
end
|
128
130
|
|
129
131
|
# Check that the attribute values are not longer than the given max length.
|
@@ -165,7 +167,7 @@ module Sequel
|
|
165
167
|
# Check attribute value(s) against a specified value and operation, e.g.
|
166
168
|
# validates_operator(:>, 3, :value) validates that value > 3.
|
167
169
|
def validates_operator(operator, rhs, atts, opts=OPTS)
|
168
|
-
validatable_attributes_for_type(:operator, atts, opts){|a,v,m| validation_error_message(m, operator, rhs) if v.nil? || !v.
|
170
|
+
validatable_attributes_for_type(:operator, atts, opts){|a,v,m| validation_error_message(m, operator, rhs) if v.nil? || !v.public_send(operator, rhs)}
|
169
171
|
end
|
170
172
|
|
171
173
|
# Validates for all of the model columns (or just the given columns)
|
@@ -223,7 +225,7 @@ module Sequel
|
|
223
225
|
# model's dataset.
|
224
226
|
# :message :: The message to use (default: 'is already taken')
|
225
227
|
# :only_if_modified :: Only check the uniqueness if the object is new or
|
226
|
-
# one of the columns has been modified.
|
228
|
+
# one of the columns has been modified, true by default.
|
227
229
|
# :where :: A callable object where call takes three arguments, a dataset,
|
228
230
|
# the current object, and an array of columns, and should return
|
229
231
|
# a modified dataset that is filtered to include only rows with
|
@@ -232,9 +234,9 @@ module Sequel
|
|
232
234
|
# If you want to do a case insensitive uniqueness validation on a database that
|
233
235
|
# is case sensitive by default, you can use:
|
234
236
|
#
|
235
|
-
# validates_unique :column, :
|
237
|
+
# validates_unique :column, where:(lambda do |ds, obj, cols|
|
236
238
|
# ds.where(cols.map do |c|
|
237
|
-
# v = obj.
|
239
|
+
# v = obj.public_send(c)
|
238
240
|
# v = v.downcase if v
|
239
241
|
# [Sequel.function(:lower, c), v]
|
240
242
|
# end)
|
@@ -250,8 +252,7 @@ module Sequel
|
|
250
252
|
atts.each do |a|
|
251
253
|
arr = Array(a)
|
252
254
|
next if arr.any?{|x| errors.on(x)}
|
253
|
-
|
254
|
-
next if opts[:only_if_modified] && !new? && !arr.any?{|x| changed_columns.include?(x)}
|
255
|
+
next if opts.fetch(:only_if_modified, true) && !new? && !arr.any?{|x| changed_columns.include?(x)}
|
255
256
|
ds = opts[:dataset] || model.dataset
|
256
257
|
ds = if where
|
257
258
|
where.call(ds, self, arr)
|
@@ -276,7 +277,7 @@ module Sequel
|
|
276
277
|
# The hash return must include a :message option that is either a
|
277
278
|
# proc or string.
|
278
279
|
def default_validation_helpers_options(type)
|
279
|
-
|
280
|
+
DEFAULT_OPTIONS[type]
|
280
281
|
end
|
281
282
|
|
282
283
|
# Skip validating any attribute that matches one of the allow_* options.
|
@@ -34,12 +34,12 @@ module Sequel
|
|
34
34
|
# setter methods (methods that end in =) that you want to be used during
|
35
35
|
# mass assignment, they need to be listed here as well (without the =).
|
36
36
|
#
|
37
|
-
# It may be better to use
|
37
|
+
# It may be better to use +set_fields+ which lets you specify
|
38
38
|
# the allowed fields per call.
|
39
39
|
#
|
40
40
|
# Artist.set_allowed_columns(:name, :hometown)
|
41
|
-
# Artist.set(:
|
42
|
-
# Artist.set(:
|
41
|
+
# Artist.set(name: 'Bob', hometown: 'Sactown') # No Error
|
42
|
+
# Artist.set(name: 'Bob', records_sold: 30000) # Error
|
43
43
|
def set_allowed_columns(*cols)
|
44
44
|
clear_setter_methods_cache
|
45
45
|
@allowed_columns = cols
|
@@ -62,7 +62,7 @@ module Sequel
|
|
62
62
|
# allowed_columns in the model.
|
63
63
|
#
|
64
64
|
# Artist.set_allowed_columns(:num_albums)
|
65
|
-
# artist.set_all(:
|
65
|
+
# artist.set_all(name: 'Jim')
|
66
66
|
# artist.name # => 'Jim'
|
67
67
|
def set_all(hash)
|
68
68
|
set_restricted(hash, :all)
|
@@ -72,10 +72,10 @@ module Sequel
|
|
72
72
|
# is included in only. It may be a better idea to use +set_fields+
|
73
73
|
# instead of this method.
|
74
74
|
#
|
75
|
-
# artist.set_only({:
|
75
|
+
# artist.set_only({name: 'Jim'}, :name)
|
76
76
|
# artist.name # => 'Jim'
|
77
77
|
#
|
78
|
-
# artist.set_only({:
|
78
|
+
# artist.set_only({hometown: 'LA'}, :name) # Raise Error
|
79
79
|
def set_only(hash, *only)
|
80
80
|
set_restricted(hash, only.flatten)
|
81
81
|
end
|
@@ -84,7 +84,7 @@ module Sequel
|
|
84
84
|
# +allowed_columns+ in the model.
|
85
85
|
#
|
86
86
|
# Artist.set_allowed_columns(:num_albums)
|
87
|
-
# artist.update_all(:
|
87
|
+
# artist.update_all(name: 'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
|
88
88
|
def update_all(hash)
|
89
89
|
update_restricted(hash, :all)
|
90
90
|
end
|
@@ -93,10 +93,10 @@ module Sequel
|
|
93
93
|
# is included in only. It may be a better idea to use +update_fields+
|
94
94
|
# instead of this method.
|
95
95
|
#
|
96
|
-
# artist.update_only({:
|
96
|
+
# artist.update_only({name: 'Jim'}, :name)
|
97
97
|
# # UPDATE artists SET name = 'Jim' WHERE (id = 1)
|
98
98
|
#
|
99
|
-
# artist.update_only({:
|
99
|
+
# artist.update_only({hometown: 'LA'}, :name) # Raise Error
|
100
100
|
def update_only(hash, *only)
|
101
101
|
update_restricted(hash, only.flatten)
|
102
102
|
end
|
@@ -107,6 +107,10 @@ module Sequel
|
|
107
107
|
def setter_methods(type)
|
108
108
|
if type == :default && model.allowed_columns
|
109
109
|
model.setter_methods
|
110
|
+
elsif type.is_a?(Array)
|
111
|
+
type.map{|x| "#{x}="}
|
112
|
+
elsif type == :all && primary_key && model.restrict_primary_key?
|
113
|
+
super + Array(primary_key).map{|x| "#{x}="}
|
110
114
|
else
|
111
115
|
super
|
112
116
|
end
|