sequel 5.20.0 → 5.49.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 +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- 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.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.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- 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 +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- data/Rakefile +0 -151
- 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.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- 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/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- 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/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -519
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -63
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- 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 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- 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/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- 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/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_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/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_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 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "pg_row extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.connect('mock://postgres')
|
|
6
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
-
@db.extension(:pg_array, :pg_row)
|
|
8
|
-
@m = Sequel::Postgres::PGRow
|
|
9
|
-
@db.sqls
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "should parse record objects as arrays" do
|
|
13
|
-
a = @db.conversion_procs[2249].call("(a,b,c)")
|
|
14
|
-
a.class.must_equal(@m::ArrayRow)
|
|
15
|
-
a.to_a.must_be_kind_of(Array)
|
|
16
|
-
a[0].must_equal 'a'
|
|
17
|
-
a.must_equal %w'a b c'
|
|
18
|
-
a.db_type.must_be_nil
|
|
19
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should parse arrays of record objects as arrays of arrays" do
|
|
23
|
-
as = @db.conversion_procs[2287].call('{"(a,b,c)","(d,e,f)"}')
|
|
24
|
-
as.must_equal [%w'a b c', %w'd e f']
|
|
25
|
-
as.each do |a|
|
|
26
|
-
a.class.must_equal(@m::ArrayRow)
|
|
27
|
-
a.to_a.must_be_kind_of(Array)
|
|
28
|
-
a.db_type.must_be_nil
|
|
29
|
-
end
|
|
30
|
-
@db.literal(as).must_equal "ARRAY[ROW('a', 'b', 'c'),ROW('d', 'e', 'f')]::record[]"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should be able to register custom parsing of row types as array-like objects" do
|
|
34
|
-
klass = @m::ArrayRow.subclass(:foo)
|
|
35
|
-
parser = @m::Parser.new(:converter=>klass)
|
|
36
|
-
a = parser.call("(a,b,c)")
|
|
37
|
-
a.class.must_equal(klass)
|
|
38
|
-
a.to_a.must_be_kind_of(Array)
|
|
39
|
-
a[0].must_equal 'a'
|
|
40
|
-
a.must_equal %w'a b c'
|
|
41
|
-
a.db_type.must_equal :foo
|
|
42
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should be able to register custom parsing of row types as hash-like objects" do
|
|
46
|
-
klass = @m::HashRow.subclass(:foo, [:a, :b, :c])
|
|
47
|
-
parser = @m::Parser.new(:converter=>klass, :columns=>[:a, :b, :c])
|
|
48
|
-
a = parser.call("(a,b,c)")
|
|
49
|
-
a.class.must_equal(klass)
|
|
50
|
-
a.to_hash.must_be_kind_of(Hash)
|
|
51
|
-
a[:a].must_equal 'a'
|
|
52
|
-
a.must_equal(:a=>'a', :b=>'b', :c=>'c')
|
|
53
|
-
a.db_type.must_equal :foo
|
|
54
|
-
a.columns.must_equal [:a, :b, :c]
|
|
55
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should raise an error if attempting to literalize a HashRow without column information" do
|
|
59
|
-
h = @m::HashRow.call(:a=>'a', :b=>'b', :c=>'c')
|
|
60
|
-
proc{@db.literal(h)}.must_raise(Sequel::Error)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should be able to manually override db_type per ArrayRow instance" do
|
|
64
|
-
a = @m::ArrayRow.call(%w'a b c')
|
|
65
|
-
a.db_type = :foo
|
|
66
|
-
@db.literal(a).must_equal "ROW('a', 'b', 'c')::foo"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "should be able to manually override db_type and columns per HashRow instance" do
|
|
70
|
-
h = @m::HashRow.call(:a=>'a', :c=>'c', :b=>'b')
|
|
71
|
-
h.db_type = :foo
|
|
72
|
-
h.columns = [:a, :b, :c]
|
|
73
|
-
@db.literal(h).must_equal "ROW('a', 'b', 'c')::foo"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "should correctly split an empty row" do
|
|
77
|
-
@m::Splitter.new("()").parse.must_equal [nil]
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should correctly split a row with a single value" do
|
|
81
|
-
@m::Splitter.new("(1)").parse.must_equal %w'1'
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
it "should correctly split a row with multiple values" do
|
|
85
|
-
@m::Splitter.new("(1,2)").parse.must_equal %w'1 2'
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should correctly NULL values when splitting" do
|
|
89
|
-
@m::Splitter.new("(1,)").parse.must_equal ['1', nil]
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "should correctly empty string values when splitting" do
|
|
93
|
-
@m::Splitter.new('(1,"")').parse.must_equal ['1', '']
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should handle quoted values when splitting" do
|
|
97
|
-
@m::Splitter.new('("1","2")').parse.must_equal %w'1 2'
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "should handle escaped backslashes in quoted values when splitting" do
|
|
101
|
-
@m::Splitter.new('("\\\\1","2\\\\")').parse.must_equal ['\\1', '2\\']
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "should handle doubled quotes in quoted values when splitting" do
|
|
105
|
-
@m::Splitter.new('("""1","2""")').parse.must_equal ['"1', '2"']
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "should correctly convert types when parsing into an array" do
|
|
109
|
-
@m::Parser.new(:column_converters=>[proc{|s| s*2}, proc{|s| s*3}, proc{|s| s*4}]).call("(a,b,c)").must_equal %w'aa bbb cccc'
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should correctly convert types into hashes if columns are known" do
|
|
113
|
-
@m::Parser.new(:columns=>[:a, :b, :c]).call("(a,b,c)").must_equal(:a=>'a', :b=>'b', :c=>'c')
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "should correctly handle type conversion when converting into hashes" do
|
|
117
|
-
@m::Parser.new(:column_converters=>[proc{|s| s*2}, proc{|s| s*3}, proc{|s| s*4}], :columns=>[:a, :b, :c]).call("(a,b,c)").must_equal(:a=>'aa', :b=>'bbb', :c=>'cccc')
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "should correctly wrap arrays when converting" do
|
|
121
|
-
@m::Parser.new(:converter=>proc{|s| [:foo, s]}).call("(a,b,c)").must_equal [:foo, %w'a b c']
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "should correctly wrap hashes when converting" do
|
|
125
|
-
@m::Parser.new(:converter=>proc{|s| [:foo, s]}, :columns=>[:a, :b, :c]).call("(a,b,c)").must_equal [:foo, {:a=>'a', :b=>'b', :c=>'c'}]
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should have parser store reflection information" do
|
|
129
|
-
p = @m::Parser.new(:oid=>1, :column_oids=>[2], :columns=>[:a], :converter=>Array, :typecaster=>Hash, :column_converters=>[Array])
|
|
130
|
-
p.oid.must_equal 1
|
|
131
|
-
p.column_oids.must_equal [2]
|
|
132
|
-
p.columns.must_equal [:a]
|
|
133
|
-
p.converter.must_equal Array
|
|
134
|
-
p.typecaster.must_equal Hash
|
|
135
|
-
p.column_converters.must_equal [Array]
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it "should handle ArrayRows and HashRows in bound variables" do
|
|
139
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
140
|
-
@db.bound_variable_arg(@m::ArrayRow.call(["1", "abc\\'\","]), nil).must_equal '("1","abc\\\\\'\\",")'
|
|
141
|
-
@db.bound_variable_arg(@m::HashRow.subclass(nil, [:a, :b]).call(:a=>"1", :b=>"abc\\'\","), nil).must_equal '("1","abc\\\\\'\\",")'
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "should handle ArrayRows and HashRows in arrays in bound variables" do
|
|
145
|
-
@db.bound_variable_arg(1, nil).must_equal 1
|
|
146
|
-
@db.bound_variable_arg([@m::ArrayRow.call(["1", "abc\\'\","])], nil).must_equal '{"(\\"1\\",\\"abc\\\\\\\\\'\\\\\\",\\")"}'
|
|
147
|
-
@db.bound_variable_arg([@m::HashRow.subclass(nil, [:a, :b]).call(:a=>"1", :b=>"abc\\'\",")], nil).must_equal '{"(\\"1\\",\\"abc\\\\\\\\\'\\\\\\",\\")"}'
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it "should handle nils in bound variables" do
|
|
151
|
-
@db.bound_variable_arg(@m::ArrayRow.call([nil, nil]), nil).must_equal '(,)'
|
|
152
|
-
@db.bound_variable_arg(@m::HashRow.subclass(nil, [:a, :b]).call(:a=>nil, :b=>nil), nil).must_equal '(,)'
|
|
153
|
-
@db.bound_variable_arg([@m::ArrayRow.call([nil, nil])], nil).must_equal '{"(,)"}'
|
|
154
|
-
@db.bound_variable_arg([@m::HashRow.subclass(nil, [:a, :b]).call(:a=>nil, :b=>nil)], nil).must_equal '{"(,)"}'
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
it "should allow registering row type parsers by introspecting system tables" do
|
|
158
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
159
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
160
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
161
|
-
@db.register_row_type(:foo)
|
|
162
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type WHERE ((typtype = 'c') AND (typname = 'foo')) LIMIT 1",
|
|
163
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
164
|
-
p1 = @db.conversion_procs[1]
|
|
165
|
-
p1.columns.must_equal [:bar, :baz]
|
|
166
|
-
p1.column_oids.must_equal [4, 5]
|
|
167
|
-
p1.column_converters.must_equal [p4, p5]
|
|
168
|
-
p1.oid.must_equal 1
|
|
169
|
-
@db.send(:schema_column_type, 'foo').must_equal :pg_row_foo
|
|
170
|
-
@db.send(:schema_column_type, 'integer').must_equal :integer
|
|
171
|
-
|
|
172
|
-
c = p1.converter
|
|
173
|
-
c.superclass.must_equal @m::HashRow
|
|
174
|
-
c.columns.must_equal [:bar, :baz]
|
|
175
|
-
c.db_type.must_equal :foo
|
|
176
|
-
p1.typecaster.must_equal c
|
|
177
|
-
|
|
178
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
179
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').class.must_be :<, @m::HashRow
|
|
180
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
181
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
182
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo"
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it "should allow registering row type parsers for schema qualify types" do
|
|
186
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
187
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
188
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
189
|
-
@db.register_row_type(Sequel[:foo][:bar])
|
|
190
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type INNER JOIN pg_namespace ON ((pg_namespace.oid = pg_type.typnamespace) AND (pg_namespace.nspname = 'foo')) WHERE ((typtype = 'c') AND (typname = 'bar')) LIMIT 1",
|
|
191
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
192
|
-
p1 = @db.conversion_procs[1]
|
|
193
|
-
p1.columns.must_equal [:bar, :baz]
|
|
194
|
-
p1.column_oids.must_equal [4, 5]
|
|
195
|
-
p1.column_converters.must_equal [p4, p5]
|
|
196
|
-
p1.oid.must_equal 1
|
|
197
|
-
|
|
198
|
-
c = p1.converter
|
|
199
|
-
c.superclass.must_equal @m::HashRow
|
|
200
|
-
c.columns.must_equal [:bar, :baz]
|
|
201
|
-
c.db_type.must_equal Sequel[:foo][:bar]
|
|
202
|
-
p1.typecaster.must_equal c
|
|
203
|
-
|
|
204
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
205
|
-
@db.typecast_value(:pg_row_foo__bar, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
206
|
-
@db.typecast_value(:pg_row_foo__bar, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
207
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo.bar"
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
with_symbol_splitting "should allow registering row type parsers for schema qualify type symbols" do
|
|
211
|
-
@db.conversion_procs[4] = p4 = proc{|s| s.to_i}
|
|
212
|
-
@db.conversion_procs[5] = p5 = proc{|s| s * 2}
|
|
213
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
214
|
-
@db.register_row_type(:foo__bar)
|
|
215
|
-
@db.sqls.must_equal ["SELECT pg_type.oid, typrelid, typarray FROM pg_type INNER JOIN pg_namespace ON ((pg_namespace.oid = pg_type.typnamespace) AND (pg_namespace.nspname = 'foo')) WHERE ((typtype = 'c') AND (typname = 'bar')) LIMIT 1",
|
|
216
|
-
"SELECT attname, (CASE pg_type.typbasetype WHEN 0 THEN atttypid ELSE pg_type.typbasetype END) AS atttypid FROM pg_attribute INNER JOIN pg_type ON (pg_type.oid = pg_attribute.atttypid) WHERE ((attrelid = 2) AND (attnum > 0) AND NOT attisdropped) ORDER BY attnum"]
|
|
217
|
-
p1 = @db.conversion_procs[1]
|
|
218
|
-
p1.columns.must_equal [:bar, :baz]
|
|
219
|
-
p1.column_oids.must_equal [4, 5]
|
|
220
|
-
p1.column_converters.must_equal [p4, p5]
|
|
221
|
-
p1.oid.must_equal 1
|
|
222
|
-
|
|
223
|
-
c = p1.converter
|
|
224
|
-
c.superclass.must_equal @m::HashRow
|
|
225
|
-
c.columns.must_equal [:bar, :baz]
|
|
226
|
-
c.db_type.must_equal :foo__bar
|
|
227
|
-
p1.typecaster.must_equal c
|
|
228
|
-
|
|
229
|
-
p1.call('(1,b)').must_equal(:bar=>1, :baz=>'bb')
|
|
230
|
-
@db.typecast_value(:pg_row_foo__bar, %w'1 b').must_equal(:bar=>'1', :baz=>'b')
|
|
231
|
-
@db.typecast_value(:pg_row_foo__bar, :bar=>'1', :baz=>'b').must_equal(:bar=>'1', :baz=>'b')
|
|
232
|
-
@db.literal(p1.call('(1,b)')).must_equal "ROW(1, 'bb')::foo.bar"
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it "should not allow registering on a frozen database" do
|
|
236
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
237
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
238
|
-
@db.fetch = [[], [{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
239
|
-
c = proc{|h| [h]}
|
|
240
|
-
@db.freeze
|
|
241
|
-
proc{@db.register_row_type(:foo, :converter=>c)}.must_raise RuntimeError, TypeError
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
it "should allow registering with a custom converter" do
|
|
245
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
246
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
247
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
248
|
-
c = proc{|h| [h]}
|
|
249
|
-
@db.register_row_type(:foo, :converter=>c)
|
|
250
|
-
o = @db.conversion_procs[1].call('(1,b)')
|
|
251
|
-
o.must_equal [{:bar=>1, :baz=>'bb'}]
|
|
252
|
-
o.first.must_be_kind_of(Hash)
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
it "should allow registering with a custom typecaster" do
|
|
256
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
257
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
258
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
259
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
260
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_be_kind_of(Hash)
|
|
261
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>1, :baz=>'bb')
|
|
262
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
263
|
-
@db.typecast_value(:pg_row_foo, 'bar'=>'1', 'baz'=>'b').must_equal(:bar=>0, :baz=>'aa')
|
|
264
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
265
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar] || h['bar'] || 0).to_i, :baz=>(h[:baz] || h['baz'] || 'a')*2}})
|
|
266
|
-
@db.typecast_value(:pg_row_foo, %w'1 b').must_equal(:bar=>1, :baz=>'bb')
|
|
267
|
-
@db.typecast_value(:pg_row_foo, :bar=>'1', :baz=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
268
|
-
@db.typecast_value(:pg_row_foo, 'bar'=>'1', 'baz'=>'b').must_equal(:bar=>1, :baz=>'bb')
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
it "should handle nil values when converting columns" do
|
|
272
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
273
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}]]
|
|
274
|
-
called = false
|
|
275
|
-
@db.conversion_procs[4] = proc{|s| called = true; s}
|
|
276
|
-
@db.register_row_type(:foo)
|
|
277
|
-
@db.conversion_procs[1].call('()').must_equal(:bar=>nil)
|
|
278
|
-
called.must_equal false
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it "should registering array type for row type if type has an array oid" do
|
|
282
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
283
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
284
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
285
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
286
|
-
p3 = @db.conversion_procs[3]
|
|
287
|
-
|
|
288
|
-
p3.call('{"(1,b)"}').must_equal [{:bar=>1, :baz=>'bb'}]
|
|
289
|
-
@db.literal(p3.call('{"(1,b)"}')).must_equal "ARRAY[ROW(1, 'bb')::foo]::foo[]"
|
|
290
|
-
@db.typecast_value(:foo_array, [{:bar=>'1', :baz=>'b'}]).must_equal [{:bar=>1, :baz=>'bb'}]
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
it "should allow creating unregisted row types via Database#row_type" do
|
|
294
|
-
@db.literal(@db.row_type(:foo, [1, 2])).must_equal 'ROW(1, 2)::foo'
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
it "should allow typecasting of registered row types via Database#row_type" do
|
|
298
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
299
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
300
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
301
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| @m::HashRow.subclass(:foo, [:bar, :baz]).new({:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2})})
|
|
302
|
-
@db.literal(@db.row_type(:foo, ['1', 'b'])).must_equal "ROW(1, 'bb')::foo"
|
|
303
|
-
@db.literal(@db.row_type(:foo, {:bar=>'1', :baz=>'b'})).must_equal "ROW(1, 'bb')::foo"
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
it "should allow parsing when typecasting registered row types via Database#row_type" do
|
|
307
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
308
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
309
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
310
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| @m::HashRow.subclass(:foo, [:bar, :baz]).new(:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2)})
|
|
311
|
-
@db.literal(@db.row_type(:foo, ['1', 'b'])).must_equal "ROW(1, 'bb')::foo"
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
it "should raise an error if attempt to use Database#row_type with an unregistered type and hash" do
|
|
315
|
-
proc{@db.literal(@db.row_type(:foo, {:bar=>'1', :baz=>'b'}))}.must_raise(Sequel::InvalidValue)
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
it "should raise an error if attempt to use Database#row_type with an unhandled type" do
|
|
319
|
-
proc{@db.literal(@db.row_type(:foo, 1))}.must_raise(Sequel::InvalidValue)
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
it "should return ArrayRow and HashRow values as-is" do
|
|
323
|
-
h = @m::HashRow.call(:a=>1)
|
|
324
|
-
a = @m::ArrayRow.call([1])
|
|
325
|
-
@db.row_type(:foo, h).object_id.must_equal(h.object_id)
|
|
326
|
-
@db.row_type(:foo, a).object_id.must_equal(a.object_id)
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
it "should have Sequel.pg_row return a plain ArrayRow" do
|
|
330
|
-
@db.literal(Sequel.pg_row([1, 2, 3])).must_equal 'ROW(1, 2, 3)'
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
it "should raise an error if attempting to typecast a hash for a parser without columns" do
|
|
334
|
-
proc{@m::Parser.new.typecast(:a=>1)}.must_raise(Sequel::Error)
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
it "should raise an error if attempting to typecast a unhandled value for a parser" do
|
|
338
|
-
proc{@m::Parser.new.typecast(1)}.must_raise(Sequel::Error)
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it "should handle typecasting for a parser without a typecaster" do
|
|
342
|
-
@m::Parser.new.typecast([1]).must_equal [1]
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
it "should raise an error if no columns are returned when registering a custom row type" do
|
|
346
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}]]
|
|
347
|
-
proc{@db.register_row_type(:foo)}.must_raise(Sequel::Error)
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
it "should raise an error when registering a custom row type if the type is found found" do
|
|
351
|
-
@db.fetch = []
|
|
352
|
-
proc{@db.register_row_type(:foo)}.must_raise(Sequel::Error)
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
it "should return correct results for Database#schema_type_class" do
|
|
356
|
-
@db.conversion_procs[4] = proc{|s| s.to_i}
|
|
357
|
-
@db.conversion_procs[5] = proc{|s| s * 2}
|
|
358
|
-
@db.fetch = [[{:oid=>1, :typrelid=>2, :typarray=>3}], [{:attname=>'bar', :atttypid=>4}, {:attname=>'baz', :atttypid=>5}]]
|
|
359
|
-
@db.register_row_type(:foo, :typecaster=>proc{|h| {:bar=>(h[:bar]||0).to_i, :baz=>(h[:baz] || 'a')*2}})
|
|
360
|
-
@db.schema_type_class(:pg_row_foo).must_equal [Sequel::Postgres::PGRow::HashRow, Sequel::Postgres::PGRow::ArrayRow]
|
|
361
|
-
@db.schema_type_class(:integer).must_equal Integer
|
|
362
|
-
end
|
|
363
|
-
end
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "pg_static_cache_updater extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.connect('mock://postgres')
|
|
6
|
-
@db.extend_datasets{def quote_identifiers?; false end}
|
|
7
|
-
def @db.listen(chan, opts={})
|
|
8
|
-
execute("LISTEN #{chan}")
|
|
9
|
-
yield(*opts[:yield])
|
|
10
|
-
end
|
|
11
|
-
@db.extension(:pg_static_cache_updater)
|
|
12
|
-
@model = Class.new(Sequel::Model(@db[:table]))
|
|
13
|
-
@model.plugin :static_cache
|
|
14
|
-
@db.sqls
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "#create_static_cache_update_function should create a function in the database" do
|
|
18
|
-
@db.create_static_cache_update_function
|
|
19
|
-
@db.sqls.first.gsub(/\s+/, ' ').must_equal " CREATE FUNCTION sequel_static_cache_update() RETURNS trigger LANGUAGE plpgsql AS 'BEGIN PERFORM pg_notify(''sequel_static_cache_update'', TG_RELID::text); RETURN NULL; END ' "
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "#create_static_cache_update_function should support :channel_name and :function_name options" do
|
|
23
|
-
@db.create_static_cache_update_function(:channel_name=>'foo', :function_name=>'bar')
|
|
24
|
-
@db.sqls.first.gsub(/\s+/, ' ').must_equal " CREATE FUNCTION bar() RETURNS trigger LANGUAGE plpgsql AS 'BEGIN PERFORM pg_notify(''foo'', TG_RELID::text); RETURN NULL; END ' "
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "#create_static_cache_update_trigger should create a trigger for the database table" do
|
|
28
|
-
@db.create_static_cache_update_trigger(:tab)
|
|
29
|
-
@db.sqls.first.gsub(/\s+/, ' ').must_equal "CREATE TRIGGER sequel_static_cache_update AFTER INSERT OR UPDATE OR DELETE ON tab EXECUTE PROCEDURE sequel_static_cache_update()"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "#create_static_cache_update_trigger should support :trigger_name and :function_name options" do
|
|
33
|
-
@db.create_static_cache_update_trigger(:tab, :trigger_name=>'foo', :function_name=>'bar')
|
|
34
|
-
@db.sqls.first.gsub(/\s+/, ' ').must_equal "CREATE TRIGGER foo AFTER INSERT OR UPDATE OR DELETE ON tab EXECUTE PROCEDURE bar()"
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "#default_static_cache_update_name should return the default name for function, trigger, and channel" do
|
|
38
|
-
@db.default_static_cache_update_name.must_equal :sequel_static_cache_update
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "#listen_for_static_cache_updates should listen for changes to model tables and reload model classes" do
|
|
42
|
-
@db.fetch = {:v=>1234}
|
|
43
|
-
@db.listen_for_static_cache_updates([@model], :yield=>[nil, nil, 1234]).join
|
|
44
|
-
@db.sqls.must_equal ["SELECT CAST(CAST('table' AS regclass) AS oid) AS v LIMIT 1", "LISTEN sequel_static_cache_update", "SELECT * FROM table"]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "#listen_for_static_cache_updates should not reload model classes if oid doesn't match" do
|
|
48
|
-
@db.fetch = {:v=>1234}
|
|
49
|
-
@db.listen_for_static_cache_updates([@model], :yield=>[nil, nil, 12345]).join
|
|
50
|
-
@db.sqls.must_equal ["SELECT CAST(CAST('table' AS regclass) AS oid) AS v LIMIT 1", "LISTEN sequel_static_cache_update"]
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "#listen_for_static_cache_updates should support a single model argument" do
|
|
54
|
-
@db.fetch = {:v=>1234}
|
|
55
|
-
@db.listen_for_static_cache_updates(@model, :yield=>[nil, nil, 1234]).join
|
|
56
|
-
@db.sqls.must_equal ["SELECT CAST(CAST('table' AS regclass) AS oid) AS v LIMIT 1", "LISTEN sequel_static_cache_update", "SELECT * FROM table"]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "#listen_for_static_cache_updates should support the :channel_name option" do
|
|
60
|
-
@db.fetch = {:v=>1234}
|
|
61
|
-
@db.listen_for_static_cache_updates([@model], :yield=>[nil, nil, 12345], :channel_name=>:foo).join
|
|
62
|
-
@db.sqls.must_equal ["SELECT CAST(CAST('table' AS regclass) AS oid) AS v LIMIT 1", "LISTEN foo"]
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "#listen_for_static_cache_updates should raise an error if given an empty array" do
|
|
66
|
-
@db.fetch = {:v=>1234}
|
|
67
|
-
proc{@db.listen_for_static_cache_updates([])}.must_raise(Sequel::Error)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "#listen_for_static_cache_updates should raise an error if one of the models is not using the static cache plugin" do
|
|
71
|
-
@db.fetch = {:v=>1234}
|
|
72
|
-
proc{@db.listen_for_static_cache_updates(Class.new(Sequel::Model(@db[:table])))}.must_raise(Sequel::Error)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "#listen_for_static_cache_updates should raise an error if the database doesn't respond to listen" do
|
|
76
|
-
@db = Sequel.mock(:host=>'postgres')
|
|
77
|
-
@db.extension(:pg_static_cache_updater)
|
|
78
|
-
@db.fetch = {:v=>1234}
|
|
79
|
-
proc{@db.listen_for_static_cache_updates(Class.new(Sequel::Model(@db[:table])))}.must_raise(Sequel::Error)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it "#listen_for_static_cache_updates should handle a :before_thread_exit option" do
|
|
83
|
-
a = []
|
|
84
|
-
@db.listen_for_static_cache_updates([@model], :yield=>[nil, nil, 12345], :before_thread_exit=>proc{a << 1}).join
|
|
85
|
-
a.must_equal [1]
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "#listen_for_static_cache_updates should call :before_thread_exit option even if listen raises an exception" do
|
|
89
|
-
a = []
|
|
90
|
-
@db.listen_for_static_cache_updates([@model], :yield=>[nil, nil, 12345], :after_listen=>proc{raise ArgumentError}, :before_thread_exit=>proc{a << 1}).join
|
|
91
|
-
a.must_equal [1]
|
|
92
|
-
end
|
|
93
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "pg_timestamptz extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:host=>'postgres').extension :pg_timestamptz
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
it "should use timestamptz as default timestamp type" do
|
|
9
|
-
@db.create_table(:t){Time :t; DateTime :tz; Time :ot, :only_time=>true}
|
|
10
|
-
@db.sqls.must_equal ['CREATE TABLE "t" ("t" timestamptz, "tz" timestamptz, "ot" time)']
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should use timestamptz when casting" do
|
|
14
|
-
@db.get(Sequel.cast('a', Time))
|
|
15
|
-
@db.sqls.must_equal ["SELECT CAST('a' AS timestamptz) AS \"v\" LIMIT 1"]
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "prepared_statements_safe plugin" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
-
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
-
@c.columns :id, :name, :i
|
|
8
|
-
@c.instance_variable_set(:@db_schema, {:i=>{}, :name=>{}, :id=>{:primary_key=>true}})
|
|
9
|
-
@c.plugin :prepared_statements_safe
|
|
10
|
-
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
11
|
-
@db.sqls
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it "should load the prepared_statements plugin" do
|
|
15
|
-
@c.plugins.must_include(Sequel::Plugins::PreparedStatements)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should set default values correctly" do
|
|
19
|
-
@c.prepared_statements_column_defaults.must_equal(:name=>nil, :i=>nil)
|
|
20
|
-
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}, :bar=>{:ruby_default=>Sequel::CURRENT_TIMESTAMP}})
|
|
21
|
-
Class.new(@c).prepared_statements_column_defaults.must_equal(:name=>'foo')
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it "should set default values when creating" do
|
|
25
|
-
@c.create
|
|
26
|
-
@db.sqls.must_equal ['INSERT INTO people (i, name) VALUES (NULL, NULL)', "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
27
|
-
@c.create(:name=>'foo')
|
|
28
|
-
@db.sqls.must_equal ["INSERT INTO people (i, name) VALUES (NULL, 'foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
29
|
-
@c.create(:name=>'foo', :i=>2)
|
|
30
|
-
@db.sqls.must_equal ["INSERT INTO people (i, name) VALUES (2, 'foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should use database default values" do
|
|
34
|
-
@c.instance_variable_set(:@db_schema, {:i=>{:ruby_default=>2}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
35
|
-
c = Class.new(@c)
|
|
36
|
-
c.create
|
|
37
|
-
@db.sqls.must_equal ["INSERT INTO people (i, name) VALUES (2, 'foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "should not set defaults for unparseable dataset default values" do
|
|
41
|
-
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
42
|
-
c = Class.new(@c)
|
|
43
|
-
c.create
|
|
44
|
-
@db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should save all fields when updating" do
|
|
48
|
-
@p.update(:i=>3)
|
|
49
|
-
@db.sqls.must_equal ["UPDATE people SET name = 'foo', i = 3 WHERE (id = 1)"]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should work with abstract classes" do
|
|
53
|
-
c = Class.new(Sequel::Model)
|
|
54
|
-
c.plugin :prepared_statements_safe
|
|
55
|
-
c1 = Class.new(c)
|
|
56
|
-
def c1.get_db_schema; @db_schema = {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}} end
|
|
57
|
-
c1.set_dataset(:people)
|
|
58
|
-
c1.prepared_statements_column_defaults.must_equal(:name=>'foo')
|
|
59
|
-
Class.new(c1).prepared_statements_column_defaults.must_equal(:name=>'foo')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should freeze prepared statement column defaults when freezing model class" do
|
|
63
|
-
@c.freeze
|
|
64
|
-
@c.prepared_statements_column_defaults.frozen?.must_equal true
|
|
65
|
-
end
|
|
66
|
-
end
|