sequel 4.26.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
-
|
|
3
|
-
connection_validator_specs = shared_description do
|
|
4
|
-
describe "connection validator" do
|
|
5
|
-
before do
|
|
6
|
-
@db.extend(Module.new do
|
|
7
|
-
def disconnect_connection(conn)
|
|
8
|
-
@sqls << 'disconnect'
|
|
9
|
-
end
|
|
10
|
-
def valid_connection?(conn)
|
|
11
|
-
super
|
|
12
|
-
conn.valid
|
|
13
|
-
end
|
|
14
|
-
def connect(server)
|
|
15
|
-
conn = super
|
|
16
|
-
conn.extend(Module.new do
|
|
17
|
-
attr_accessor :valid
|
|
18
|
-
end)
|
|
19
|
-
conn.valid = true
|
|
20
|
-
conn
|
|
21
|
-
end
|
|
22
|
-
end)
|
|
23
|
-
@db.extension(:connection_validator)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should still allow new connections" do
|
|
27
|
-
@db.synchronize{|c| c}.must_be_kind_of(Sequel::Mock::Connection)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should only validate if connection idle longer than timeout" do
|
|
31
|
-
c1 = @db.synchronize{|c| c}
|
|
32
|
-
@db.sqls.must_equal []
|
|
33
|
-
@db.synchronize{|c| c}.must_be_same_as(c1)
|
|
34
|
-
@db.sqls.must_equal []
|
|
35
|
-
@db.pool.connection_validation_timeout = -1
|
|
36
|
-
@db.synchronize{|c| c}.must_be_same_as(c1)
|
|
37
|
-
@db.sqls.must_equal ['SELECT NULL']
|
|
38
|
-
@db.pool.connection_validation_timeout = 1
|
|
39
|
-
@db.synchronize{|c| c}.must_be_same_as(c1)
|
|
40
|
-
@db.sqls.must_equal []
|
|
41
|
-
@db.synchronize{|c| c}.must_be_same_as(c1)
|
|
42
|
-
@db.sqls.must_equal []
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should disconnect connection if not valid" do
|
|
46
|
-
c1 = @db.synchronize{|c| c}
|
|
47
|
-
@db.sqls.must_equal []
|
|
48
|
-
c1.valid = false
|
|
49
|
-
@db.pool.connection_validation_timeout = -1
|
|
50
|
-
c2 = @db.synchronize{|c| c}
|
|
51
|
-
@db.sqls.must_equal ['SELECT NULL', 'disconnect']
|
|
52
|
-
c2.wont_be_same_as(c1)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "should disconnect multiple connections repeatedly if they are not valid" do
|
|
56
|
-
q, q1 = Queue.new, Queue.new
|
|
57
|
-
c1 = nil
|
|
58
|
-
c2 = nil
|
|
59
|
-
@db.pool.connection_validation_timeout = -1
|
|
60
|
-
@db.synchronize do |c|
|
|
61
|
-
Thread.new do
|
|
62
|
-
@db.synchronize do |cc|
|
|
63
|
-
c2 = cc
|
|
64
|
-
end
|
|
65
|
-
q1.pop
|
|
66
|
-
q.push nil
|
|
67
|
-
end
|
|
68
|
-
q1.push nil
|
|
69
|
-
q.pop
|
|
70
|
-
c1 = c
|
|
71
|
-
end
|
|
72
|
-
c1.valid = false
|
|
73
|
-
c2.valid = false
|
|
74
|
-
|
|
75
|
-
c3 = @db.synchronize{|c| c}
|
|
76
|
-
@db.sqls.must_equal ['SELECT NULL', 'disconnect', 'SELECT NULL', 'disconnect']
|
|
77
|
-
c3.wont_be_same_as(c1)
|
|
78
|
-
c3.wont_be_same_as(c2)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should not leak connection references" do
|
|
82
|
-
c1 = @db.synchronize do |c|
|
|
83
|
-
@db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
|
|
84
|
-
c
|
|
85
|
-
end
|
|
86
|
-
@db.pool.instance_variable_get(:@connection_timestamps).must_include(c1)
|
|
87
|
-
|
|
88
|
-
c1.valid = false
|
|
89
|
-
@db.pool.connection_validation_timeout = -1
|
|
90
|
-
c2 = @db.synchronize do |c|
|
|
91
|
-
@db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
|
|
92
|
-
c
|
|
93
|
-
end
|
|
94
|
-
c2.wont_be_same_as(c1)
|
|
95
|
-
@db.pool.instance_variable_get(:@connection_timestamps).wont_include(c1)
|
|
96
|
-
@db.pool.instance_variable_get(:@connection_timestamps).must_include(c2)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "should handle case where determining validity requires a connection" do
|
|
100
|
-
@db.meta_def(:valid_connection?){|c| synchronize{}; true}
|
|
101
|
-
@db.pool.connection_validation_timeout = -1
|
|
102
|
-
c1 = @db.synchronize{|c| c}
|
|
103
|
-
@db.synchronize{|c| c}.must_be_same_as(c1)
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
describe "Sequel::ConnectionValidator with threaded pool" do
|
|
109
|
-
before do
|
|
110
|
-
@db = Sequel.mock
|
|
111
|
-
end
|
|
112
|
-
include connection_validator_specs
|
|
113
|
-
end
|
|
114
|
-
describe "Sequel::ConnectionValidator with sharded threaded pool" do
|
|
115
|
-
before do
|
|
116
|
-
@db = Sequel.mock(:servers=>{})
|
|
117
|
-
end
|
|
118
|
-
include connection_validator_specs
|
|
119
|
-
end
|
|
120
|
-
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::ConstraintValidations" do
|
|
4
|
-
def model_class(opts={})
|
|
5
|
-
return @c if @c
|
|
6
|
-
@c = Class.new(Sequel::Model(@db[:items]))
|
|
7
|
-
@c.columns :name
|
|
8
|
-
@db.sqls
|
|
9
|
-
set_fetch(opts)
|
|
10
|
-
@c.plugin :constraint_validations
|
|
11
|
-
@c
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def set_fetch(opts)
|
|
15
|
-
@db.fetch = {:table=>'items', :message=>nil, :allow_nil=>nil, :constraint_name=>nil, :validation_type=>'presence', :argument=>nil, :column=>'name'}.merge(opts)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
before do
|
|
19
|
-
@db = Sequel.mock
|
|
20
|
-
set_fetch({})
|
|
21
|
-
@ds = @db[:items]
|
|
22
|
-
@ds.instance_variable_set(:@columns, [:name])
|
|
23
|
-
@ds2 = Sequel.mock[:items2]
|
|
24
|
-
@ds2.instance_variable_set(:@columns, [:name])
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "should load the validation_helpers plugin into the class" do
|
|
28
|
-
model_class.new.must_respond_to(:validates_presence)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "should parse constraint validations when loading plugin" do
|
|
32
|
-
@c = model_class
|
|
33
|
-
@db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
|
|
34
|
-
@db.constraint_validations.must_equal("items"=>[{:allow_nil=>nil, :constraint_name=>nil, :message=>nil, :validation_type=>"presence", :column=>"name", :argument=>nil, :table=>"items"}])
|
|
35
|
-
@c.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
36
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should parse constraint validations with a custom constraint validations table" do
|
|
40
|
-
c = Class.new(Sequel::Model(@db[:items]))
|
|
41
|
-
@db.sqls
|
|
42
|
-
c.plugin :constraint_validations, :constraint_validations_table=>:foo
|
|
43
|
-
@db.sqls.must_equal ["SELECT * FROM foo"]
|
|
44
|
-
@db.constraint_validations.must_equal("items"=>[{:allow_nil=>nil, :constraint_name=>nil, :message=>nil, :validation_type=>"presence", :column=>"name", :argument=>nil, :table=>"items"}])
|
|
45
|
-
c.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
46
|
-
c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "should populate constraint_validations when subclassing" do
|
|
50
|
-
c = Class.new(Sequel::Model(@db))
|
|
51
|
-
c.plugin :constraint_validations
|
|
52
|
-
@db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
|
|
53
|
-
sc = Class.new(c)
|
|
54
|
-
sc.set_dataset @ds
|
|
55
|
-
@db.sqls.must_equal []
|
|
56
|
-
sc.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
57
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it "should handle plugin being loaded in subclass when superclass uses a custom constraint validations table" do
|
|
61
|
-
c = Class.new(Sequel::Model(@db))
|
|
62
|
-
c.plugin :constraint_validations, :constraint_validations_table=>:foo
|
|
63
|
-
@db.sqls.must_equal ["SELECT * FROM foo"]
|
|
64
|
-
sc = Class.new(c)
|
|
65
|
-
sc.plugin :constraint_validations
|
|
66
|
-
sc.constraint_validations_table.must_equal :foo
|
|
67
|
-
sc.set_dataset @ds
|
|
68
|
-
@db.sqls.must_equal []
|
|
69
|
-
sc.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
70
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should populate constraint_validations when changing the model's dataset" do
|
|
74
|
-
c = Class.new(Sequel::Model(@db[:foo]))
|
|
75
|
-
c.columns :name
|
|
76
|
-
@db.sqls
|
|
77
|
-
c.plugin :constraint_validations
|
|
78
|
-
@db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
|
|
79
|
-
sc = Class.new(c)
|
|
80
|
-
sc.set_dataset @ds
|
|
81
|
-
@db.sqls.must_equal []
|
|
82
|
-
sc.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
83
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "should reparse constraint validations when changing the model's database" do
|
|
87
|
-
c = Class.new(Sequel::Model(@ds2))
|
|
88
|
-
c.plugin :constraint_validations
|
|
89
|
-
@ds2.db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
|
|
90
|
-
sc = Class.new(c)
|
|
91
|
-
sc.set_dataset @ds
|
|
92
|
-
@db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
|
|
93
|
-
sc.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
94
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "should reparse constraint validations when changing the model's database with a custom constraint validations table" do
|
|
98
|
-
c = Class.new(Sequel::Model(@ds2))
|
|
99
|
-
c.plugin :constraint_validations, :constraint_validations_table=>:foo
|
|
100
|
-
@ds2.db.sqls.must_equal ["SELECT * FROM foo"]
|
|
101
|
-
sc = Class.new(c)
|
|
102
|
-
sc.set_dataset @ds
|
|
103
|
-
@db.sqls.must_equal ["SELECT * FROM foo"]
|
|
104
|
-
sc.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
105
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "should correctly retrieve :message option from constraint validations table" do
|
|
109
|
-
model_class(:message=>'foo').constraint_validations.must_equal [[:validates_presence, :name, {:message=>'foo'}]]
|
|
110
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:presence, {:message=>'foo'}]])
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "should correctly retrieve :allow_nil option from constraint validations table" do
|
|
114
|
-
model_class(:allow_nil=>true).constraint_validations.must_equal [[:validates_presence, :name, {:allow_nil=>true}]]
|
|
115
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:presence, {:allow_nil=>true}]])
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
it "should handle presence validation" do
|
|
119
|
-
model_class(:validation_type=>'presence').constraint_validations.must_equal [[:validates_presence, :name]]
|
|
120
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it "should handle exact_length validation" do
|
|
124
|
-
model_class(:validation_type=>'exact_length', :argument=>'5').constraint_validations.must_equal [[:validates_exact_length, 5, :name]]
|
|
125
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:exact_length, {:argument=>5}]])
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should handle min_length validation" do
|
|
129
|
-
model_class(:validation_type=>'min_length', :argument=>'5').constraint_validations.must_equal [[:validates_min_length, 5, :name]]
|
|
130
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:min_length, {:argument=>5}]])
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "should handle max_length validation" do
|
|
134
|
-
model_class(:validation_type=>'max_length', :argument=>'5').constraint_validations.must_equal [[:validates_max_length, 5, :name]]
|
|
135
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:max_length, {:argument=>5}]])
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it "should handle length_range validation" do
|
|
139
|
-
model_class(:validation_type=>'length_range', :argument=>'3..5').constraint_validations.must_equal [[:validates_length_range, 3..5, :name]]
|
|
140
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:length_range, {:argument=>3..5}]])
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should handle length_range validation with an exclusive end" do
|
|
144
|
-
model_class(:validation_type=>'length_range', :argument=>'3...5').constraint_validations.must_equal [[:validates_length_range, 3...5, :name]]
|
|
145
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:length_range, {:argument=>3...5}]])
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
it "should handle format validation" do
|
|
149
|
-
model_class(:validation_type=>'format', :argument=>'^foo.*').constraint_validations.must_equal [[:validates_format, /^foo.*/, :name]]
|
|
150
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/^foo.*/}]])
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "should handle format validation with case insensitive format" do
|
|
154
|
-
model_class(:validation_type=>'iformat', :argument=>'^foo.*').constraint_validations.must_equal [[:validates_format, /^foo.*/i, :name]]
|
|
155
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/^foo.*/i}]])
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
it "should handle includes validation with array of strings" do
|
|
159
|
-
model_class(:validation_type=>'includes_str_array', :argument=>'a,b,c').constraint_validations.must_equal [[:validates_includes, %w'a b c', :name]]
|
|
160
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>%w'a b c'}]])
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "should handle includes validation with array of integers" do
|
|
164
|
-
model_class(:validation_type=>'includes_int_array', :argument=>'1,2,3').constraint_validations.must_equal [[:validates_includes, [1, 2, 3], :name]]
|
|
165
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>[1, 2, 3]}]])
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
it "should handle includes validation with inclusive range of integers" do
|
|
169
|
-
model_class(:validation_type=>'includes_int_range', :argument=>'3..5').constraint_validations.must_equal [[:validates_includes, 3..5, :name]]
|
|
170
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>3..5}]])
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should handle includes validation with exclusive range of integers" do
|
|
174
|
-
model_class(:validation_type=>'includes_int_range', :argument=>'3...5').constraint_validations.must_equal [[:validates_includes, 3...5, :name]]
|
|
175
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>3...5}]])
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "should handle like validation" do
|
|
179
|
-
model_class(:validation_type=>'like', :argument=>'foo').constraint_validations.must_equal [[:validates_format, /\Afoo\z/, :name]]
|
|
180
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Afoo\z/}]])
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "should handle ilike validation" do
|
|
184
|
-
model_class(:validation_type=>'ilike', :argument=>'foo').constraint_validations.must_equal [[:validates_format, /\Afoo\z/i, :name]]
|
|
185
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Afoo\z/i}]])
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
it "should handle like validation with % metacharacter" do
|
|
189
|
-
model_class(:validation_type=>'like', :argument=>'%foo%').constraint_validations.must_equal [[:validates_format, /\A.*foo.*\z/, :name]]
|
|
190
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A.*foo.*\z/}]])
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
it "should handle like validation with %% metacharacter" do
|
|
194
|
-
model_class(:validation_type=>'like', :argument=>'%%foo%%').constraint_validations.must_equal [[:validates_format, /\A%foo%\z/, :name]]
|
|
195
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A%foo%\z/}]])
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it "should handle like validation with _ metacharacter" do
|
|
199
|
-
model_class(:validation_type=>'like', :argument=>'f_o').constraint_validations.must_equal [[:validates_format, /\Af.o\z/, :name]]
|
|
200
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Af.o\z/}]])
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
it "should handle like validation with Regexp metacharacter" do
|
|
204
|
-
model_class(:validation_type=>'like', :argument=>'\wfoo\d').constraint_validations.must_equal [[:validates_format, /\A\\wfoo\\d\z/, :name]]
|
|
205
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A\\wfoo\\d\z/}]])
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
it "should handle unique validation" do
|
|
209
|
-
model_class(:validation_type=>'unique').constraint_validations.must_equal [[:validates_unique, [:name]]]
|
|
210
|
-
@c.constraint_validation_reflections.must_equal(:name=>[[:unique, {}]])
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
it "should handle unique validation with multiple columns" do
|
|
214
|
-
model_class(:validation_type=>'unique', :column=>'name,id').constraint_validations.must_equal [[:validates_unique, [:name, :id]]]
|
|
215
|
-
@c.constraint_validation_reflections.must_equal([:name, :id]=>[[:unique, {}]])
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
it "should handle :validation_options" do
|
|
219
|
-
c = model_class(:validation_type=>'unique', :column=>'name')
|
|
220
|
-
c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad'}}
|
|
221
|
-
c.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad'}]]
|
|
222
|
-
c.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad'}]])
|
|
223
|
-
c.dataset._fetch = {:count=>1}
|
|
224
|
-
o = c.new(:name=>'a')
|
|
225
|
-
o.valid?.must_equal false
|
|
226
|
-
o.errors.full_messages.must_equal ['name is bad']
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
it "should handle :validation_options merging with constraint validation options" do
|
|
230
|
-
c = model_class(:validation_type=>'unique', :column=>'name', :allow_nil=>true)
|
|
231
|
-
c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad'}}
|
|
232
|
-
c.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad', :allow_nil=>true}]]
|
|
233
|
-
c.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad', :allow_nil=>true}]])
|
|
234
|
-
c.dataset._fetch = {:count=>1}
|
|
235
|
-
o = c.new(:name=>'a')
|
|
236
|
-
o.valid?.must_equal false
|
|
237
|
-
o.errors.full_messages.must_equal ['name is bad']
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
it "should handle :validation_options merging with subclasses" do
|
|
241
|
-
c = model_class(:validation_type=>'unique', :column=>'name')
|
|
242
|
-
c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad', :allow_nil=>true}}
|
|
243
|
-
sc = Class.new(c)
|
|
244
|
-
sc.plugin :constraint_validations, :validation_options=>{:unique=>{:allow_missing=>true, :allow_nil=>false}}
|
|
245
|
-
sc.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad', :allow_missing=>true, :allow_nil=>false}]]
|
|
246
|
-
sc.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad', :allow_missing=>true, :allow_nil=>false}]])
|
|
247
|
-
sc.dataset._fetch = {:count=>1}
|
|
248
|
-
o = sc.new(:name=>'a')
|
|
249
|
-
o.valid?.must_equal false
|
|
250
|
-
o.errors.full_messages.must_equal ['name is bad']
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "should used parsed constraint validations when validating" do
|
|
254
|
-
o = model_class.new
|
|
255
|
-
o.valid?.must_equal false
|
|
256
|
-
o.errors.full_messages.must_equal ['name is not present']
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it "should handle a table name specified as SQL::Identifier" do
|
|
260
|
-
set_fetch(:table=>'sch__items')
|
|
261
|
-
c = Class.new(Sequel::Model(@db[Sequel.identifier(:sch__items)]))
|
|
262
|
-
c.plugin :constraint_validations
|
|
263
|
-
c.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
264
|
-
c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
it "should handle a table name specified as SQL::QualifiedIdentifier" do
|
|
268
|
-
set_fetch(:table=>'sch.items')
|
|
269
|
-
c = Class.new(Sequel::Model(@db[Sequel.qualify(:sch, :items)]))
|
|
270
|
-
c.plugin :constraint_validations
|
|
271
|
-
c.constraint_validations.must_equal [[:validates_presence, :name]]
|
|
272
|
-
c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
|
|
273
|
-
end
|
|
274
|
-
end
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
-
|
|
3
|
-
describe "constraint_validations extension" do
|
|
4
|
-
def parse_insert(s)
|
|
5
|
-
m = /\AINSERT INTO sequel_constraint_validations \((.*)\) VALUES \((.*)\)\z/.match(s)
|
|
6
|
-
Hash[*m[1].split(', ').map{|v| v.to_sym}.zip(m[2].split(', ').map{|v| parse_insert_value(v)}).reject{|k, v| v.nil?}.flatten]
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def parse_insert_value(s)
|
|
10
|
-
case s
|
|
11
|
-
when 'NULL'
|
|
12
|
-
nil
|
|
13
|
-
when /\A'(.*)'\z/
|
|
14
|
-
$1
|
|
15
|
-
else
|
|
16
|
-
raise Sequel::Error, "unhandled insert value: #{s.inspect}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
before do
|
|
21
|
-
@db = Sequel.mock
|
|
22
|
-
@db.extend(Module.new{attr_writer :schema; def schema(table, *) execute("parse schema for #{table}"); @schema; end})
|
|
23
|
-
@db.extension(:constraint_validations)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should allow creating the sequel_constraint_validations table" do
|
|
27
|
-
@db.create_constraint_validations_table
|
|
28
|
-
@db.sqls.must_equal ["CREATE TABLE sequel_constraint_validations (table varchar(255) NOT NULL, constraint_name varchar(255), validation_type varchar(255) NOT NULL, column varchar(255) NOT NULL, argument varchar(255), message varchar(255), allow_nil boolean)"]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "should allow creating the sequel_constraint_validations table with a non-default table name" do
|
|
32
|
-
@db.constraint_validations_table = :foo
|
|
33
|
-
@db.create_constraint_validations_table
|
|
34
|
-
@db.sqls.must_equal ["CREATE TABLE foo (table varchar(255) NOT NULL, constraint_name varchar(255), validation_type varchar(255) NOT NULL, column varchar(255) NOT NULL, argument varchar(255), message varchar(255), allow_nil boolean)"]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "should allow dropping the sequel_constraint_validations table" do
|
|
38
|
-
@db.drop_constraint_validations_table
|
|
39
|
-
@db.sqls.must_equal ["DROP TABLE sequel_constraint_validations"]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
it "should allow dropping the sequel_constraint_validations table with a non-default table name" do
|
|
43
|
-
@db.constraint_validations_table = :foo
|
|
44
|
-
@db.drop_constraint_validations_table
|
|
45
|
-
@db.sqls.must_equal ["DROP TABLE foo"]
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "should allow dropping validations for a given table" do
|
|
49
|
-
@db.drop_constraint_validations_for(:table=>:foo)
|
|
50
|
-
@db.sqls.must_equal ["DELETE FROM sequel_constraint_validations WHERE (table = 'foo')"]
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "should allow dropping validations for a given table and column" do
|
|
54
|
-
@db.drop_constraint_validations_for(:table=>:foo, :column=>:bar)
|
|
55
|
-
@db.sqls.must_equal ["DELETE FROM sequel_constraint_validations WHERE ((table = 'foo') AND (column = 'bar'))"]
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should allow dropping validations for a given table and constraint" do
|
|
59
|
-
@db.drop_constraint_validations_for(:table=>:foo, :constraint=>:bar)
|
|
60
|
-
@db.sqls.must_equal ["DELETE FROM sequel_constraint_validations WHERE ((table = 'foo') AND (constraint_name = 'bar'))"]
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should allow dropping validations for a non-default constraint_validations table" do
|
|
64
|
-
@db.constraint_validations_table = :cv
|
|
65
|
-
@db.drop_constraint_validations_for(:table=>:foo)
|
|
66
|
-
@db.sqls.must_equal ["DELETE FROM cv WHERE (table = 'foo')"]
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "should raise an error without deleting if attempting to drop validations without table, column, or constraint" do
|
|
70
|
-
proc{@db.drop_constraint_validations_for({})}.must_raise(Sequel::Error)
|
|
71
|
-
@db.sqls.must_equal []
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should allow adding constraint validations via create_table validate" do
|
|
75
|
-
@db.create_table(:foo){String :name; validate{presence :name}}
|
|
76
|
-
sqls = @db.sqls
|
|
77
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
78
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (trim(name) != '')))"]
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should allow adding constraint validations via alter_table validate" do
|
|
82
|
-
@db.schema = [[:name, {:type=>:string}]]
|
|
83
|
-
@db.alter_table(:foo){validate{presence :name}}
|
|
84
|
-
sqls = @db.sqls
|
|
85
|
-
parse_insert(sqls.slice!(2)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
86
|
-
sqls.must_equal ["parse schema for foo", "BEGIN", "COMMIT", "ALTER TABLE foo ADD CHECK ((name IS NOT NULL) AND (trim(name) != ''))"]
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should handle :message option when adding validations" do
|
|
90
|
-
@db.create_table(:foo){String :name; validate{presence :name, :message=>'not there'}}
|
|
91
|
-
sqls = @db.sqls
|
|
92
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo", :message=>'not there')
|
|
93
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (trim(name) != '')))"]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should handle :allow_nil option when adding validations" do
|
|
97
|
-
@db.create_table(:foo){String :name; validate{presence :name, :allow_nil=>true}}
|
|
98
|
-
sqls = @db.sqls
|
|
99
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo", :allow_nil=>'t')
|
|
100
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NULL) OR (trim(name) != '')))"]
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
it "should handle :name option when adding validations" do
|
|
104
|
-
@db.create_table(:foo){String :name; validate{presence :name, :name=>'cons'}}
|
|
105
|
-
sqls = @db.sqls
|
|
106
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo", :constraint_name=>'cons')
|
|
107
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CONSTRAINT cons CHECK ((name IS NOT NULL) AND (trim(name) != '')))"]
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it "should handle multiple columns when adding validations" do
|
|
111
|
-
@db.create_table(:foo){String :name; String :bar; validate{presence [:name, :bar]}}
|
|
112
|
-
sqls = @db.sqls
|
|
113
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
114
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"bar", :table=>"foo")
|
|
115
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), bar varchar(255), CHECK ((name IS NOT NULL) AND (bar IS NOT NULL) AND (trim(name) != '') AND (trim(bar) != '')))"]
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
it "should handle presence validation on non-String columns" do
|
|
119
|
-
@db.create_table(:foo){Integer :name; validate{presence :name}}
|
|
120
|
-
sqls = @db.sqls
|
|
121
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
122
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK (name IS NOT NULL))"]
|
|
123
|
-
|
|
124
|
-
@db.schema = [[:name, {:type=>:integer}]]
|
|
125
|
-
@db.alter_table(:foo){validate{presence :name}}
|
|
126
|
-
sqls = @db.sqls
|
|
127
|
-
parse_insert(sqls.slice!(2)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
128
|
-
sqls.must_equal ["parse schema for foo", "BEGIN", "COMMIT", "ALTER TABLE foo ADD CHECK (name IS NOT NULL)"]
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should handle presence validation on Oracle with IS NOT NULL instead of != ''" do
|
|
132
|
-
@db = Sequel.mock(:host=>'oracle')
|
|
133
|
-
@db.extension(:constraint_validations)
|
|
134
|
-
@db.create_table(:foo){String :name; validate{presence :name}}
|
|
135
|
-
sqls = @db.sqls
|
|
136
|
-
s = sqls.slice!(1)
|
|
137
|
-
m = /\AINSERT INTO sequel_constraint_validations \((.*)\) SELECT (.*) FROM DUAL\z/.match(s)
|
|
138
|
-
Hash[*m[1].split(', ').map{|v| v.to_sym}.zip(m[2].split(', ').map{|v| parse_insert_value(v)}).reject{|k, v| v.nil?}.flatten].must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo")
|
|
139
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (trim(name) IS NOT NULL)))"]
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "should assume column is not a String if it can't determine the type" do
|
|
143
|
-
@db.create_table(:foo){Integer :name; validate{presence :bar}}
|
|
144
|
-
sqls = @db.sqls
|
|
145
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"bar", :table=>"foo")
|
|
146
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer, CHECK (bar IS NOT NULL))"]
|
|
147
|
-
|
|
148
|
-
@db.schema = [[:name, {:type=>:integer}]]
|
|
149
|
-
@db.alter_table(:foo){validate{presence :bar}}
|
|
150
|
-
sqls = @db.sqls
|
|
151
|
-
parse_insert(sqls.slice!(2)).must_equal(:validation_type=>"presence", :column=>"bar", :table=>"foo")
|
|
152
|
-
sqls.must_equal ["parse schema for foo", "BEGIN", "COMMIT", "ALTER TABLE foo ADD CHECK (bar IS NOT NULL)"]
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it "should handle presence validation on non-String columns with :allow_nil option" do
|
|
156
|
-
@db.create_table(:foo){Integer :name; validate{presence :name, :allow_nil=>true}}
|
|
157
|
-
sqls = @db.sqls
|
|
158
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"foo", :allow_nil=>'t')
|
|
159
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name integer)"]
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
it "should support :exact_length constraint validation" do
|
|
163
|
-
@db.create_table(:foo){String :name; validate{exact_length 5, :name}}
|
|
164
|
-
sqls = @db.sqls
|
|
165
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"exact_length", :column=>"name", :table=>"foo", :argument=>'5')
|
|
166
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (char_length(name) = 5)))"]
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it "should support :min_length constraint validation" do
|
|
170
|
-
@db.create_table(:foo){String :name; validate{min_length 5, :name}}
|
|
171
|
-
sqls = @db.sqls
|
|
172
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"min_length", :column=>"name", :table=>"foo", :argument=>'5')
|
|
173
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (char_length(name) >= 5)))"]
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
it "should support :max_length constraint validation" do
|
|
177
|
-
@db.create_table(:foo){String :name; validate{max_length 5, :name}}
|
|
178
|
-
sqls = @db.sqls
|
|
179
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"max_length", :column=>"name", :table=>"foo", :argument=>'5')
|
|
180
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (char_length(name) <= 5)))"]
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "should support :length_range constraint validation" do
|
|
184
|
-
@db.create_table(:foo){String :name; validate{length_range 3..5, :name}}
|
|
185
|
-
sqls = @db.sqls
|
|
186
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"length_range", :column=>"name", :table=>"foo", :argument=>'3..5')
|
|
187
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (char_length(name) >= 3) AND (char_length(name) <= 5)))"]
|
|
188
|
-
|
|
189
|
-
@db.create_table(:foo){String :name; validate{length_range 3...5, :name}}
|
|
190
|
-
sqls = @db.sqls
|
|
191
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"length_range", :column=>"name", :table=>"foo", :argument=>'3...5')
|
|
192
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (char_length(name) >= 3) AND (char_length(name) < 5)))"]
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
it "should support :format constraint validation" do
|
|
196
|
-
@db = Sequel.mock(:host=>'postgres')
|
|
197
|
-
@db.extension(:constraint_validations)
|
|
198
|
-
@db.create_table(:foo){String :name; validate{format(/^foo.*/, :name)}}
|
|
199
|
-
sqls = @db.sqls
|
|
200
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"format", :column=>"name", :table=>"foo", :argument=>'^foo.*')
|
|
201
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name text, CHECK ((name IS NOT NULL) AND (name ~ '^foo.*')))"]
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
it "should support :format constraint validation with case insensitive format" do
|
|
205
|
-
@db = Sequel.mock(:host=>'postgres')
|
|
206
|
-
@db.extension(:constraint_validations)
|
|
207
|
-
@db.create_table(:foo){String :name; validate{format(/^foo.*/i, :name)}}
|
|
208
|
-
sqls = @db.sqls
|
|
209
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"iformat", :column=>"name", :table=>"foo", :argument=>'^foo.*')
|
|
210
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name text, CHECK ((name IS NOT NULL) AND (name ~* '^foo.*')))"]
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
it "should support :includes constraint validation with an array of strings" do
|
|
214
|
-
@db.create_table(:foo){String :name; validate{includes %w'a b c', :name}}
|
|
215
|
-
sqls = @db.sqls
|
|
216
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"includes_str_array", :column=>"name", :table=>"foo", :argument=>'a,b,c')
|
|
217
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name IN ('a', 'b', 'c'))))"]
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
it "should support :includes constraint validation with an array of integers" do
|
|
221
|
-
@db.create_table(:foo){String :name; validate{includes [1, 2, 3], :name}}
|
|
222
|
-
sqls = @db.sqls
|
|
223
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"includes_int_array", :column=>"name", :table=>"foo", :argument=>'1,2,3')
|
|
224
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name IN (1, 2, 3))))"]
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it "should support :includes constraint validation with a inclusive range of integers" do
|
|
228
|
-
@db.create_table(:foo){String :name; validate{includes 3..5, :name}}
|
|
229
|
-
sqls = @db.sqls
|
|
230
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"includes_int_range", :column=>"name", :table=>"foo", :argument=>'3..5')
|
|
231
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name >= 3) AND (name <= 5)))"]
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
it "should support :includes constraint validation with a exclusive range of integers" do
|
|
235
|
-
@db.create_table(:foo){String :name; validate{includes 3...5, :name}}
|
|
236
|
-
sqls = @db.sqls
|
|
237
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"includes_int_range", :column=>"name", :table=>"foo", :argument=>'3...5')
|
|
238
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name >= 3) AND (name < 5)))"]
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
it "should support :like constraint validation" do
|
|
242
|
-
@db.create_table(:foo){String :name; validate{like 'foo%', :name}}
|
|
243
|
-
sqls = @db.sqls
|
|
244
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"like", :column=>"name", :table=>"foo", :argument=>'foo%')
|
|
245
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (name LIKE 'foo%' ESCAPE '\\')))"]
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
it "should support :ilike constraint validation" do
|
|
249
|
-
@db.create_table(:foo){String :name; validate{ilike 'foo%', :name}}
|
|
250
|
-
sqls = @db.sqls
|
|
251
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"ilike", :column=>"name", :table=>"foo", :argument=>'foo%')
|
|
252
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), CHECK ((name IS NOT NULL) AND (UPPER(name) LIKE UPPER('foo%') ESCAPE '\\')))"]
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
it "should support :unique constraint validation" do
|
|
256
|
-
@db.create_table(:foo){String :name; validate{unique :name}}
|
|
257
|
-
sqls = @db.sqls
|
|
258
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"unique", :column=>"name", :table=>"foo")
|
|
259
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), UNIQUE (name))"]
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
it "should support :unique constraint validation with multiple columns" do
|
|
263
|
-
@db.create_table(:foo){String :name; Integer :id; validate{unique [:name, :id]}}
|
|
264
|
-
sqls = @db.sqls
|
|
265
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"unique", :column=>"name,id", :table=>"foo")
|
|
266
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE foo (name varchar(255), id integer, UNIQUE (name, id))"]
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "should support :unique constraint validation in alter_table" do
|
|
270
|
-
@db.alter_table(:foo){validate{unique :name}}
|
|
271
|
-
sqls = @db.sqls
|
|
272
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"unique", :column=>"name", :table=>"foo")
|
|
273
|
-
sqls.must_equal ["BEGIN", "COMMIT", "ALTER TABLE foo ADD UNIQUE (name)"]
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
it "should drop constraints and validations when dropping a constraint validation" do
|
|
277
|
-
@db.alter_table(:foo){String :name; validate{drop :bar}}
|
|
278
|
-
@db.sqls.must_equal ["DELETE FROM sequel_constraint_validations WHERE ((table, constraint_name) IN (('foo', 'bar')))", "ALTER TABLE foo DROP CONSTRAINT bar"]
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it "should drop constraints and validations before adding new ones" do
|
|
282
|
-
@db.alter_table(:foo){String :name; validate{unique :name; drop :bar}}
|
|
283
|
-
sqls = @db.sqls
|
|
284
|
-
parse_insert(sqls.slice!(2)).must_equal(:validation_type=>"unique", :column=>"name", :table=>"foo")
|
|
285
|
-
sqls.must_equal ["DELETE FROM sequel_constraint_validations WHERE ((table, constraint_name) IN (('foo', 'bar')))", "BEGIN", "COMMIT", "ALTER TABLE foo ADD UNIQUE (name)", "ALTER TABLE foo DROP CONSTRAINT bar"]
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
it "should raise an error if attempting to validate inclusion with a range of non-integers" do
|
|
289
|
-
proc{@db.create_table(:foo){String :name; validate{includes 'a'..'z', :name}}}.must_raise(Sequel::Error)
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
it "should raise an error if attempting to validate inclusion with a range of non-integers or strings" do
|
|
293
|
-
proc{@db.create_table(:foo){String :name; validate{includes [1.0, 2.0], :name}}}.must_raise(Sequel::Error)
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
it "should raise an error if attempting to validate inclusion with a unsupported object" do
|
|
297
|
-
proc{@db.create_table(:foo){String :name; validate{includes 'a', :name}}}.must_raise(Sequel::Error)
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
it "should raise an error if attempting to drop a constraint validation in a create_table generator" do
|
|
301
|
-
proc{@db.create_table(:foo){String :name; validate{drop :foo}}}.must_raise(Sequel::Error)
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
it "should raise an error if attempting to drop a constraint validation without a name" do
|
|
305
|
-
proc{@db.alter_table(:foo){String :name; validate{drop nil}}}.must_raise(Sequel::Error)
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
it "should raise an error if attempting attempting to process a constraint validation with an unsupported type" do
|
|
309
|
-
proc{@db.alter_table(:foo){String :name; validations << {:type=>:foo}}}.must_raise(Sequel::Error)
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
it "should allow adding constraint validations for tables specified as a SQL::Identifier" do
|
|
313
|
-
@db.create_table(Sequel.identifier(:sch__foo)){String :name; validate{presence :name}}
|
|
314
|
-
sqls = @db.sqls
|
|
315
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"sch__foo")
|
|
316
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE sch__foo (name varchar(255), CHECK ((name IS NOT NULL) AND (trim(name) != '')))"]
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it "should allow adding constraint validations for tables specified as a SQL::QualifiedIdentifier" do
|
|
320
|
-
@db.create_table(Sequel.qualify(:sch, :foo)){String :name; validate{presence :name}}
|
|
321
|
-
sqls = @db.sqls
|
|
322
|
-
parse_insert(sqls.slice!(1)).must_equal(:validation_type=>"presence", :column=>"name", :table=>"sch.foo")
|
|
323
|
-
sqls.must_equal ["BEGIN", "COMMIT", "CREATE TABLE sch.foo (name varchar(255), CHECK ((name IS NOT NULL) AND (trim(name) != '')))"]
|
|
324
|
-
end
|
|
325
|
-
end
|