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
data/spec/model/model_spec.rb
DELETED
|
@@ -1,956 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Model()" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel::Model.db
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
it "should return a model subclass with the given dataset if given a dataset" do
|
|
9
|
-
ds = @db[:blah]
|
|
10
|
-
c = Sequel::Model(ds)
|
|
11
|
-
c.superclass.must_equal Sequel::Model
|
|
12
|
-
c.dataset.row_proc.must_equal c
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
|
|
16
|
-
c = Sequel::Model(:blah)
|
|
17
|
-
c.superclass.must_equal Sequel::Model
|
|
18
|
-
c.db.must_equal @db
|
|
19
|
-
c.table_name.must_equal :blah
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
|
|
23
|
-
c = Sequel::Model(Sequel.lit('blah'))
|
|
24
|
-
c.superclass.must_equal Sequel::Model
|
|
25
|
-
c.db.must_equal @db
|
|
26
|
-
c.table_name.must_equal Sequel.lit('blah')
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
|
|
30
|
-
c = Sequel::Model(Sequel.identifier(:blah))
|
|
31
|
-
c.superclass.must_equal Sequel::Model
|
|
32
|
-
c.db.must_equal @db
|
|
33
|
-
c.table_name.must_equal Sequel.identifier(:blah)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
|
|
37
|
-
c = Sequel::Model(Sequel.qualify(:boo, :blah))
|
|
38
|
-
c.superclass.must_equal Sequel::Model
|
|
39
|
-
c.db.must_equal @db
|
|
40
|
-
c.table_name.must_equal Sequel.qualify(:boo, :blah)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
|
|
44
|
-
c = Sequel::Model(Sequel.as(:blah, :boo))
|
|
45
|
-
c.superclass.must_equal Sequel::Model
|
|
46
|
-
c.db.must_equal @db
|
|
47
|
-
c.table_name.must_equal :boo
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
|
|
51
|
-
ds = @db[Sequel.identifier(:blah)]
|
|
52
|
-
c = Sequel::Model(ds)
|
|
53
|
-
c.superclass.must_equal Sequel::Model
|
|
54
|
-
c.dataset.row_proc.must_equal c
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should be callable on Sequel::Model" do
|
|
58
|
-
ds = @db[:blah]
|
|
59
|
-
c = Sequel::Model::Model(ds)
|
|
60
|
-
c.superclass.must_equal Sequel::Model
|
|
61
|
-
c.dataset.row_proc.must_equal c
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "should be callable on subclasses of Sequel::Model" do
|
|
65
|
-
ds = @db[:blah]
|
|
66
|
-
c = Class.new(Sequel::Model)
|
|
67
|
-
sc = c::Model(ds)
|
|
68
|
-
sc.superclass.must_equal c
|
|
69
|
-
sc.dataset.row_proc.must_equal sc
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it "should be callable on other modules if def_Model is used" do
|
|
73
|
-
m = Module.new
|
|
74
|
-
Sequel::Model.def_Model(m)
|
|
75
|
-
ds = @db[:blah]
|
|
76
|
-
c = m::Model(ds)
|
|
77
|
-
c.superclass.must_equal Sequel::Model
|
|
78
|
-
c.dataset.row_proc.must_equal c
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should be callable using model subclasses on other modules if def_Model is used" do
|
|
82
|
-
m = Module.new
|
|
83
|
-
c = Class.new(Sequel::Model)
|
|
84
|
-
c.def_Model(m)
|
|
85
|
-
ds = @db[:blah]
|
|
86
|
-
sc = m::Model(ds)
|
|
87
|
-
sc.superclass.must_equal c
|
|
88
|
-
sc.dataset.row_proc.must_equal sc
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "should return a model subclass associated to the given database if given a database" do
|
|
92
|
-
db = Sequel.mock
|
|
93
|
-
c = Sequel::Model(db)
|
|
94
|
-
c.superclass.must_equal Sequel::Model
|
|
95
|
-
c.db.must_equal db
|
|
96
|
-
proc{c.dataset}.must_raise(Sequel::Error)
|
|
97
|
-
class SmBlahTest < c
|
|
98
|
-
end
|
|
99
|
-
SmBlahTest.db.must_equal db
|
|
100
|
-
SmBlahTest.table_name.must_equal :sm_blah_tests
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
describe "reloading" do
|
|
104
|
-
before do
|
|
105
|
-
Sequel::Model.cache_anonymous_models = true
|
|
106
|
-
end
|
|
107
|
-
after do
|
|
108
|
-
Sequel::Model.cache_anonymous_models = false
|
|
109
|
-
Object.send(:remove_const, :Album) if defined?(::Album)
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should work without raising an exception with a symbol" do
|
|
113
|
-
class ::Album < Sequel::Model(:table); end
|
|
114
|
-
class ::Album < Sequel::Model(:table); end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "should work without raising an exception with an SQL::Identifier " do
|
|
118
|
-
class ::Album < Sequel::Model(Sequel.identifier(:table)); end
|
|
119
|
-
class ::Album < Sequel::Model(Sequel.identifier(:table)); end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "should work without raising an exception with an SQL::QualifiedIdentifier " do
|
|
123
|
-
class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
|
|
124
|
-
class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it "should work without raising an exception with an SQL::AliasedExpression" do
|
|
128
|
-
class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
|
|
129
|
-
class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
it "should work without raising an exception with an LiteralString" do
|
|
133
|
-
class ::Album < Sequel::Model(Sequel.lit('table')); end
|
|
134
|
-
class ::Album < Sequel::Model(Sequel.lit('table')); end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "should work without raising an exception with a database" do
|
|
138
|
-
class ::Album < Sequel::Model(@db); end
|
|
139
|
-
class ::Album < Sequel::Model(@db); end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "should work without raising an exception with a dataset" do
|
|
143
|
-
class ::Album < Sequel::Model(@db[:table]); end
|
|
144
|
-
class ::Album < Sequel::Model(@db[:table]); end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
it "should work without raising an exception with a dataset with an SQL::Identifier" do
|
|
148
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
|
149
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
it "should raise an exception if anonymous model caching is disabled" do
|
|
153
|
-
Sequel::Model.cache_anonymous_models = false
|
|
154
|
-
proc do
|
|
155
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
|
156
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
|
157
|
-
end.must_raise TypeError
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
it "should use separate anonymous cache for subclasses" do
|
|
161
|
-
c = Class.new(Sequel::Model)
|
|
162
|
-
c.cache_anonymous_models.must_equal true
|
|
163
|
-
class ::Album < c::Model(:table); end
|
|
164
|
-
class ::Album < c::Model(:table); end
|
|
165
|
-
|
|
166
|
-
c1 = c::Model(:t1)
|
|
167
|
-
c1.must_equal c::Model(:t1)
|
|
168
|
-
c1.wont_equal Sequel::Model(:t1)
|
|
169
|
-
|
|
170
|
-
c.cache_anonymous_models = false
|
|
171
|
-
Sequel::Model.cache_anonymous_models.must_equal true
|
|
172
|
-
c1.wont_equal c::Model(:t1)
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
describe "Sequel::Model.freeze" do
|
|
178
|
-
it "should freeze the model class and not allow any changes" do
|
|
179
|
-
model = Class.new(Sequel::Model(:items))
|
|
180
|
-
model.freeze
|
|
181
|
-
|
|
182
|
-
model.frozen?.must_equal true
|
|
183
|
-
model.dataset.frozen?.must_equal true
|
|
184
|
-
model.db_schema.frozen?.must_equal true
|
|
185
|
-
model.db_schema[:id].frozen?.must_equal true
|
|
186
|
-
model.columns.frozen?.must_equal true
|
|
187
|
-
model.setter_methods.frozen?.must_equal true
|
|
188
|
-
model.send(:overridable_methods_module).frozen?.must_equal true
|
|
189
|
-
model.default_set_fields_options.frozen?.must_equal true
|
|
190
|
-
|
|
191
|
-
proc{model.dataset_module{}}.must_raise RuntimeError
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "should work if the model is already frozen" do
|
|
195
|
-
model = Class.new(Sequel::Model(:items))
|
|
196
|
-
model.freeze.freeze
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it "should freeze a model class without a dataset without breaking" do
|
|
200
|
-
model = Class.new(Sequel::Model)
|
|
201
|
-
model.freeze
|
|
202
|
-
model.frozen?.must_equal true
|
|
203
|
-
proc{model.dataset}.must_raise Sequel::Error
|
|
204
|
-
model.db_schema.must_be_nil
|
|
205
|
-
model.columns.must_be_nil
|
|
206
|
-
model.setter_methods.must_equal []
|
|
207
|
-
model.send(:overridable_methods_module).frozen?.must_equal true
|
|
208
|
-
model.default_set_fields_options.frozen?.must_equal true
|
|
209
|
-
|
|
210
|
-
proc{model.dataset_module{}}.must_raise RuntimeError
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
it "should allow subclasses of frozen model classes to work correctly" do
|
|
214
|
-
model = Class.new(Sequel::Model(:items))
|
|
215
|
-
model.freeze
|
|
216
|
-
model = Class.new(model)
|
|
217
|
-
model.dataset = :items2
|
|
218
|
-
|
|
219
|
-
model.dataset_module{}
|
|
220
|
-
model.plugin Module.new
|
|
221
|
-
|
|
222
|
-
model.frozen?.must_equal false
|
|
223
|
-
model.db_schema.frozen?.must_equal false
|
|
224
|
-
model.db_schema[:id].frozen?.must_equal false
|
|
225
|
-
model.setter_methods.frozen?.must_equal false
|
|
226
|
-
model.dataset_module{}.frozen?.must_equal false
|
|
227
|
-
model.send(:overridable_methods_module).frozen?.must_equal false
|
|
228
|
-
model.default_set_fields_options.frozen?.must_equal false
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
describe Sequel::Model do
|
|
233
|
-
it "should have class method aliased as model" do
|
|
234
|
-
model_a = Class.new(Sequel::Model(:items))
|
|
235
|
-
model_a.new.model.must_be_same_as model_a
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
it "should be associated with a dataset" do
|
|
239
|
-
model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
|
|
240
|
-
|
|
241
|
-
model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
|
|
242
|
-
model_a.dataset.opts[:from].must_equal [:as]
|
|
243
|
-
|
|
244
|
-
model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
|
|
245
|
-
|
|
246
|
-
model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
|
|
247
|
-
model_b.dataset.opts[:from].must_equal [:bs]
|
|
248
|
-
|
|
249
|
-
model_a.dataset.opts[:from].must_equal [:as]
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
describe Sequel::Model do
|
|
254
|
-
before do
|
|
255
|
-
@model = Class.new(Sequel::Model(:items))
|
|
256
|
-
DB.reset
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it "should not allow dup/clone" do
|
|
260
|
-
proc{@model.dup}.must_raise NoMethodError
|
|
261
|
-
proc{@model.clone}.must_raise NoMethodError
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
it "has table_name return name of table" do
|
|
265
|
-
@model.table_name.must_equal :items
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
it "defaults to primary key of id" do
|
|
269
|
-
@model.primary_key.must_equal :id
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
it "allow primary key change" do
|
|
273
|
-
@model.set_primary_key :ssn
|
|
274
|
-
@model.primary_key.must_equal :ssn
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
it "allows dataset change" do
|
|
278
|
-
@model.set_dataset(DB[:foo])
|
|
279
|
-
@model.table_name.must_equal :foo
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
it "allows frozen dataset" do
|
|
283
|
-
@model.set_dataset(DB[:foo].freeze)
|
|
284
|
-
@model.table_name.must_equal :foo
|
|
285
|
-
@model.dataset.sql.must_equal 'SELECT * FROM foo'
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
it "table_name should respect table aliases" do
|
|
290
|
-
@model.set_dataset(Sequel[:foo].as(:x))
|
|
291
|
-
@model.table_name.must_equal :x
|
|
292
|
-
end
|
|
293
|
-
|
|
294
|
-
with_symbol_splitting "table_name should respect table alias symbols" do
|
|
295
|
-
@model.set_dataset(:foo___x)
|
|
296
|
-
@model.table_name.must_equal :x
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
it "set_dataset should raise an error unless given a Symbol or Dataset" do
|
|
300
|
-
proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
it "set_dataset should use a subquery for joined datasets" do
|
|
304
|
-
@model.set_dataset(DB.from(:foo, :bar))
|
|
305
|
-
@model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo, bar) AS foo'
|
|
306
|
-
@model.set_dataset(DB[:foo].cross_join(:bar))
|
|
307
|
-
@model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo CROSS JOIN bar) AS foo'
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
it "set_dataset should add the destroy method to the dataset that destroys each object" do
|
|
311
|
-
ds = DB[:foo]
|
|
312
|
-
ds.wont_respond_to(:destroy)
|
|
313
|
-
ds = @model.set_dataset(ds).dataset
|
|
314
|
-
ds.must_respond_to(:destroy)
|
|
315
|
-
DB.sqls
|
|
316
|
-
ds.with_fetch([{:id=>1}, {:id=>2}]).destroy.must_equal 2
|
|
317
|
-
DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
it "set_dataset should add the destroy method that respects sharding with transactions" do
|
|
321
|
-
db = Sequel.mock(:servers=>{:s1=>{}})
|
|
322
|
-
ds = db[:foo].server(:s1)
|
|
323
|
-
@model.use_transactions = true
|
|
324
|
-
ds = @model.set_dataset(ds).dataset
|
|
325
|
-
db.sqls
|
|
326
|
-
ds.destroy.must_equal 0
|
|
327
|
-
db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
it "should raise an error on set_dataset if there is an error connecting to the database" do
|
|
331
|
-
def @model.columns() raise Sequel::DatabaseConnectionError end
|
|
332
|
-
proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah).from_self)}.must_raise Sequel::DatabaseConnectionError
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
it "should not raise an error if there is a problem getting the columns for a dataset" do
|
|
336
|
-
def @model.columns() raise Sequel::Error end
|
|
337
|
-
@model.set_dataset(DB[:foo].join(:blah).from_self)
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
|
|
341
|
-
db = Sequel.mock
|
|
342
|
-
def db.schema(*) raise Sequel::Error; end
|
|
343
|
-
@model.set_dataset(db[:foo])
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
it "reload_db_schema? should be false by default" do
|
|
347
|
-
c = Class.new
|
|
348
|
-
c.extend Sequel::Model::ClassMethods
|
|
349
|
-
c.send(:reload_db_schema?).must_equal false
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
it "doesn't raise an error on inherited if there is an error setting the dataset" do
|
|
353
|
-
db = Sequel.mock
|
|
354
|
-
def db.schema(*) raise Sequel::Error; end
|
|
355
|
-
@model.dataset = db[:foo]
|
|
356
|
-
Class.new(@model)
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
it "uses a savepoint if inside a transaction when getting the columns" do
|
|
360
|
-
db = Sequel.mock
|
|
361
|
-
def db.supports_savepoints?; true end
|
|
362
|
-
Sequel::Model(db[:table])
|
|
363
|
-
db.sqls.must_equal ["SELECT * FROM table LIMIT 1"]
|
|
364
|
-
db.transaction{Sequel::Model(db[:table])}
|
|
365
|
-
db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "SELECT * FROM table LIMIT 1", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
it "should raise if bad inherited instance variable value is used" do
|
|
369
|
-
def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
|
|
370
|
-
@model.instance_eval{@a=1}
|
|
371
|
-
proc{Class.new(@model)}.must_raise(Sequel::Error)
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
it "copy inherited instance variables into subclass if set" do
|
|
375
|
-
def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
|
|
376
|
-
@model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
|
|
377
|
-
m = Class.new(@model)
|
|
378
|
-
@model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
|
|
379
|
-
m.instance_eval do
|
|
380
|
-
@a.must_equal 1
|
|
381
|
-
@b.must_equal [2]
|
|
382
|
-
@c.must_equal(3=>[4])
|
|
383
|
-
@d.must_equal 20
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
describe Sequel::Model do
|
|
389
|
-
before do
|
|
390
|
-
@model = Class.new(Sequel::Model)
|
|
391
|
-
DB.reset
|
|
392
|
-
end
|
|
393
|
-
|
|
394
|
-
it "allows set_dataset to accept a Symbol" do
|
|
395
|
-
@model.set_dataset(:foo)
|
|
396
|
-
@model.table_name.must_equal :foo
|
|
397
|
-
end
|
|
398
|
-
|
|
399
|
-
it "allows set_dataset to accept a LiteralString" do
|
|
400
|
-
@model.set_dataset(Sequel.lit('foo'))
|
|
401
|
-
@model.table_name.must_equal Sequel.lit('foo')
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
it "allows set_dataset to acceptan SQL::Identifier" do
|
|
405
|
-
@model.set_dataset(Sequel.identifier(:foo))
|
|
406
|
-
@model.table_name.must_equal Sequel.identifier(:foo)
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
|
|
410
|
-
@model.set_dataset(Sequel.qualify(:bar, :foo))
|
|
411
|
-
@model.table_name.must_equal Sequel.qualify(:bar, :foo)
|
|
412
|
-
end
|
|
413
|
-
|
|
414
|
-
it "allows set_dataset to acceptan SQL::AliasedExpression" do
|
|
415
|
-
@model.set_dataset(Sequel.as(:foo, :bar))
|
|
416
|
-
@model.table_name.must_equal :bar
|
|
417
|
-
end
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
describe Sequel::Model, ".require_valid_table = true" do
|
|
421
|
-
before do
|
|
422
|
-
@db = Sequel.mock
|
|
423
|
-
@db.columns = proc do |sql|
|
|
424
|
-
raise Sequel::Error if sql =~ /foos/
|
|
425
|
-
[:id]
|
|
426
|
-
end
|
|
427
|
-
def @db.supports_schema_parsing?; true end
|
|
428
|
-
def @db.schema(t, *) t.first_source == :foos ? (raise Sequel::Error) : [[:id, {}]] end
|
|
429
|
-
Sequel::Model.db = @db
|
|
430
|
-
Sequel::Model.require_valid_table = true
|
|
431
|
-
end
|
|
432
|
-
after do
|
|
433
|
-
Sequel::Model.require_valid_table = false
|
|
434
|
-
Sequel::Model.db = DB
|
|
435
|
-
if Object.const_defined?(:Bar)
|
|
436
|
-
Object.send(:remove_const, :Bar)
|
|
437
|
-
end
|
|
438
|
-
if Object.const_defined?(:Foo)
|
|
439
|
-
Object.send(:remove_const, :Foo)
|
|
440
|
-
end
|
|
441
|
-
end
|
|
442
|
-
|
|
443
|
-
it "should raise an exception when creating a model with an invalid implicit table" do
|
|
444
|
-
proc{class ::Foo < Sequel::Model; end}.must_raise Sequel::Error
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
it "should not raise an exception when creating a model with a valid implicit table" do
|
|
448
|
-
class ::Bar < Sequel::Model; end
|
|
449
|
-
Bar.columns.must_equal [:id]
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
it "should raise an exception when creating a model with an invalid explicit table" do
|
|
453
|
-
proc{Sequel::Model(@db[:foos])}.must_raise Sequel::Error
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
it "should not raise an exception when creating a model with a valid explicit table" do
|
|
457
|
-
c = Sequel::Model(@db[:bars])
|
|
458
|
-
c.columns.must_equal [:id]
|
|
459
|
-
end
|
|
460
|
-
|
|
461
|
-
it "should raise an exception when calling set_dataset with an invalid table" do
|
|
462
|
-
c = Class.new(Sequel::Model)
|
|
463
|
-
proc{c.set_dataset @db[:foos]}.must_raise Sequel::Error
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
it "should not raise an exception when calling set_dataset with an valid table" do
|
|
467
|
-
c = Class.new(Sequel::Model)
|
|
468
|
-
c.set_dataset @db[:bars]
|
|
469
|
-
c.columns.must_equal [:id]
|
|
470
|
-
end
|
|
471
|
-
|
|
472
|
-
it "should assume nil value is the same as false" do
|
|
473
|
-
c = Class.new(Sequel::Model)
|
|
474
|
-
c.require_valid_table = nil
|
|
475
|
-
ds = @db.dataset.with_extend{def columns; raise Sequel::Error; end}
|
|
476
|
-
c.set_dataset(ds)
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
|
|
480
|
-
describe Sequel::Model, "constructors" do
|
|
481
|
-
before do
|
|
482
|
-
@m = Class.new(Sequel::Model)
|
|
483
|
-
@m.columns :a, :b
|
|
484
|
-
end
|
|
485
|
-
|
|
486
|
-
it "should accept a hash" do
|
|
487
|
-
m = @m.new(:a => 1, :b => 2)
|
|
488
|
-
m.values.must_equal(:a => 1, :b => 2)
|
|
489
|
-
m.must_be :new?
|
|
490
|
-
end
|
|
491
|
-
|
|
492
|
-
it "should accept a block and yield itself to the block" do
|
|
493
|
-
block_called = false
|
|
494
|
-
m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
|
|
495
|
-
|
|
496
|
-
block_called.must_equal true
|
|
497
|
-
m.values[:a].must_equal 1
|
|
498
|
-
end
|
|
499
|
-
|
|
500
|
-
it "should have dataset row_proc create an existing object" do
|
|
501
|
-
@m.dataset = Sequel.mock.dataset
|
|
502
|
-
o = @m.dataset.row_proc.call(:a=>1)
|
|
503
|
-
o.must_be_kind_of(@m)
|
|
504
|
-
o.values.must_equal(:a=>1)
|
|
505
|
-
o.new?.must_equal false
|
|
506
|
-
end
|
|
507
|
-
|
|
508
|
-
it "should have .call create an existing object" do
|
|
509
|
-
o = @m.call(:a=>1)
|
|
510
|
-
o.must_be_kind_of(@m)
|
|
511
|
-
o.values.must_equal(:a=>1)
|
|
512
|
-
o.new?.must_equal false
|
|
513
|
-
end
|
|
514
|
-
|
|
515
|
-
it "should have .load create an existing object" do
|
|
516
|
-
o = @m.load(:a=>1)
|
|
517
|
-
o.must_be_kind_of(@m)
|
|
518
|
-
o.values.must_equal(:a=>1)
|
|
519
|
-
o.new?.must_equal false
|
|
520
|
-
end
|
|
521
|
-
end
|
|
522
|
-
|
|
523
|
-
describe Sequel::Model, "new" do
|
|
524
|
-
before do
|
|
525
|
-
@m = Class.new(Sequel::Model) do
|
|
526
|
-
set_dataset DB[:items]
|
|
527
|
-
columns :x, :id
|
|
528
|
-
end
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
it "should be marked as new?" do
|
|
532
|
-
o = @m.new
|
|
533
|
-
o.must_be :new?
|
|
534
|
-
end
|
|
535
|
-
|
|
536
|
-
it "should not be marked as new? once it is saved" do
|
|
537
|
-
o = @m.new(:x => 1)
|
|
538
|
-
o.must_be :new?
|
|
539
|
-
o.save
|
|
540
|
-
o.wont_be :new?
|
|
541
|
-
end
|
|
542
|
-
|
|
543
|
-
it "should use the last inserted id as primary key if not in values" do
|
|
544
|
-
@m.dataset = @m.dataset.with_fetch(:x => 1, :id => 1234).with_autoid(1234)
|
|
545
|
-
|
|
546
|
-
o = @m.new(:x => 1)
|
|
547
|
-
o.save
|
|
548
|
-
o.id.must_equal 1234
|
|
549
|
-
|
|
550
|
-
o = @m.load(:x => 1, :id => 333)
|
|
551
|
-
o.save
|
|
552
|
-
o.id.must_equal 333
|
|
553
|
-
end
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
describe Sequel::Model, ".find" do
|
|
557
|
-
before do
|
|
558
|
-
@c = Class.new(Sequel::Model(:items))
|
|
559
|
-
@c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
|
|
560
|
-
DB.reset
|
|
561
|
-
end
|
|
562
|
-
|
|
563
|
-
it "should return the first record matching the given filter" do
|
|
564
|
-
@c.find(:name => 'sharon').must_be_kind_of(@c)
|
|
565
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
|
|
566
|
-
|
|
567
|
-
@c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
|
|
568
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
|
|
569
|
-
end
|
|
570
|
-
|
|
571
|
-
it "should accept filter blocks" do
|
|
572
|
-
@c.find{id > 1}.must_be_kind_of(@c)
|
|
573
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
|
|
574
|
-
|
|
575
|
-
@c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
|
|
576
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
|
|
577
|
-
end
|
|
578
|
-
end
|
|
579
|
-
|
|
580
|
-
describe Sequel::Model, ".fetch" do
|
|
581
|
-
before do
|
|
582
|
-
DB.reset
|
|
583
|
-
@c = Class.new(Sequel::Model(:items))
|
|
584
|
-
end
|
|
585
|
-
|
|
586
|
-
it "should return instances of Model" do
|
|
587
|
-
@c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
|
|
588
|
-
end
|
|
589
|
-
|
|
590
|
-
it "should return true for .empty? and not raise an error on empty selection" do
|
|
591
|
-
@c.dataset = @c.dataset.with_extend do
|
|
592
|
-
def fetch_rows(sql)
|
|
593
|
-
yield({:count => 0})
|
|
594
|
-
end
|
|
595
|
-
end
|
|
596
|
-
@c.fetch("SELECT * FROM items WHERE FALSE").empty?
|
|
597
|
-
end
|
|
598
|
-
end
|
|
599
|
-
|
|
600
|
-
describe Sequel::Model, ".find_or_create" do
|
|
601
|
-
before do
|
|
602
|
-
@db = Sequel.mock
|
|
603
|
-
@c = Class.new(Sequel::Model(@db[:items])) do
|
|
604
|
-
set_primary_key :id
|
|
605
|
-
columns :x
|
|
606
|
-
end
|
|
607
|
-
@db.sqls
|
|
608
|
-
end
|
|
609
|
-
|
|
610
|
-
it "should find the record" do
|
|
611
|
-
@db.fetch = [{:x=>1, :id=>1}]
|
|
612
|
-
@db.autoid = 1
|
|
613
|
-
@c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
|
|
614
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
|
|
615
|
-
end
|
|
616
|
-
|
|
617
|
-
it "should create the record if not found" do
|
|
618
|
-
@db.fetch = [[], {:x=>1, :id=>1}]
|
|
619
|
-
@db.autoid = 1
|
|
620
|
-
@c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
|
|
621
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
|
|
622
|
-
"INSERT INTO items (x) VALUES (1)",
|
|
623
|
-
"SELECT * FROM items WHERE id = 1"]
|
|
624
|
-
end
|
|
625
|
-
|
|
626
|
-
it "should pass the new record to be created to the block if no record is found" do
|
|
627
|
-
@db.fetch = [[], {:x=>1, :id=>1}]
|
|
628
|
-
@db.autoid = 1
|
|
629
|
-
@c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
|
|
630
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
|
|
631
|
-
"INSERT INTO items (x, y) VALUES (1, 2)",
|
|
632
|
-
"SELECT * FROM items WHERE id = 1"]
|
|
633
|
-
end
|
|
634
|
-
end
|
|
635
|
-
|
|
636
|
-
describe Sequel::Model, ".all" do
|
|
637
|
-
it "should return all records in the dataset" do
|
|
638
|
-
c = Class.new(Sequel::Model(:items))
|
|
639
|
-
c.all.must_equal [c.load(:x=>1, :id=>1)]
|
|
640
|
-
end
|
|
641
|
-
end
|
|
642
|
-
|
|
643
|
-
describe Sequel::Model, "A model class without a primary key" do
|
|
644
|
-
before do
|
|
645
|
-
@c = Class.new(Sequel::Model(:items)) do
|
|
646
|
-
columns :x
|
|
647
|
-
no_primary_key
|
|
648
|
-
end
|
|
649
|
-
DB.reset
|
|
650
|
-
end
|
|
651
|
-
|
|
652
|
-
it "should be able to insert records without selecting them back" do
|
|
653
|
-
i = nil
|
|
654
|
-
i = @c.create(:x => 1)
|
|
655
|
-
i.class.wont_be_nil
|
|
656
|
-
i.values.to_hash.must_equal(:x => 1)
|
|
657
|
-
|
|
658
|
-
DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
|
|
659
|
-
end
|
|
660
|
-
|
|
661
|
-
it "should raise when deleting" do
|
|
662
|
-
proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
|
|
663
|
-
end
|
|
664
|
-
|
|
665
|
-
it "should raise when updating" do
|
|
666
|
-
proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
it "should insert a record when saving" do
|
|
670
|
-
o = @c.new(:x => 2)
|
|
671
|
-
o.must_be :new?
|
|
672
|
-
o.save
|
|
673
|
-
DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
|
|
674
|
-
end
|
|
675
|
-
end
|
|
676
|
-
|
|
677
|
-
describe Sequel::Model, "attribute accessors" do
|
|
678
|
-
before do
|
|
679
|
-
db = Sequel.mock
|
|
680
|
-
def db.supports_schema_parsing?() true end
|
|
681
|
-
def db.schema(*)
|
|
682
|
-
[[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
|
|
683
|
-
end
|
|
684
|
-
@dataset = db[:items].columns(:x, :z)
|
|
685
|
-
@c = Class.new(Sequel::Model)
|
|
686
|
-
DB.reset
|
|
687
|
-
end
|
|
688
|
-
|
|
689
|
-
it "should be created on set_dataset" do
|
|
690
|
-
a = [:x, :z, :x= ,:z=]
|
|
691
|
-
(a - @c.instance_methods).must_equal a
|
|
692
|
-
@c.set_dataset(@dataset)
|
|
693
|
-
(a - @c.instance_methods).must_equal []
|
|
694
|
-
o = @c.new
|
|
695
|
-
(a - o.methods).must_equal []
|
|
696
|
-
|
|
697
|
-
o.x.must_be_nil
|
|
698
|
-
o.x = 34
|
|
699
|
-
o.x.must_equal 34
|
|
700
|
-
end
|
|
701
|
-
|
|
702
|
-
it "should be only accept one argument for the write accessor" do
|
|
703
|
-
@c.set_dataset(@dataset)
|
|
704
|
-
o = @c.new
|
|
705
|
-
|
|
706
|
-
o.x = 34
|
|
707
|
-
o.x.must_equal 34
|
|
708
|
-
proc{o.send(:x=)}.must_raise ArgumentError
|
|
709
|
-
proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
|
|
710
|
-
end
|
|
711
|
-
|
|
712
|
-
it "should have a working typecasting setter even if the column is not selected" do
|
|
713
|
-
@c.set_dataset(@dataset.select(:z).columns(:z))
|
|
714
|
-
o = @c.new
|
|
715
|
-
|
|
716
|
-
o.x = '34'
|
|
717
|
-
o.x.must_equal 34
|
|
718
|
-
end
|
|
719
|
-
|
|
720
|
-
it "should typecast if the new value is the same as the existing but has a different class" do
|
|
721
|
-
@c.set_dataset(@dataset.select(:z).columns(:z))
|
|
722
|
-
o = @c.new
|
|
723
|
-
|
|
724
|
-
o.x = 34
|
|
725
|
-
o.x = 34.0
|
|
726
|
-
o.x.must_equal 34.0
|
|
727
|
-
o.x = 34
|
|
728
|
-
o.x.must_equal 34
|
|
729
|
-
end
|
|
730
|
-
end
|
|
731
|
-
|
|
732
|
-
describe Sequel::Model, ".[]" do
|
|
733
|
-
before do
|
|
734
|
-
@c = Class.new(Sequel::Model(:items))
|
|
735
|
-
@c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
|
|
736
|
-
DB.reset
|
|
737
|
-
end
|
|
738
|
-
|
|
739
|
-
it "should return the first record for the given pk" do
|
|
740
|
-
@c[1].must_equal @c.load(:name => 'sharon', :id => 1)
|
|
741
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
|
742
|
-
@c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
|
|
743
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
|
|
744
|
-
end
|
|
745
|
-
|
|
746
|
-
it "should have #[] return nil if no rows match" do
|
|
747
|
-
@c.dataset = @c.dataset.with_fetch([])
|
|
748
|
-
@c[1].must_be_nil
|
|
749
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
|
750
|
-
end
|
|
751
|
-
|
|
752
|
-
it "should work correctly for custom primary key" do
|
|
753
|
-
@c.set_primary_key :name
|
|
754
|
-
@c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
|
|
755
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
|
|
756
|
-
end
|
|
757
|
-
|
|
758
|
-
it "should handle a dataset that uses a subquery" do
|
|
759
|
-
@c.dataset = @c.dataset.cross_join(:a).from_self(:alias=>:b)
|
|
760
|
-
@c[1].must_equal @c.load(:name => 'sharon', :id => 1)
|
|
761
|
-
DB.sqls.must_equal ["SELECT * FROM (SELECT * FROM items CROSS JOIN a) AS b WHERE (id = 1) LIMIT 1"]
|
|
762
|
-
end
|
|
763
|
-
|
|
764
|
-
it "should work correctly for composite primary key specified as array" do
|
|
765
|
-
@c.set_primary_key [:node_id, :kind]
|
|
766
|
-
@c[3921, 201].must_be_kind_of(@c)
|
|
767
|
-
DB.sqls.must_equal ['SELECT * FROM items WHERE ((node_id = 3921) AND (kind = 201)) LIMIT 1']
|
|
768
|
-
end
|
|
769
|
-
end
|
|
770
|
-
|
|
771
|
-
describe "Model#inspect" do
|
|
772
|
-
it "should include the class name and the values" do
|
|
773
|
-
Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
|
|
774
|
-
end
|
|
775
|
-
end
|
|
776
|
-
|
|
777
|
-
describe "Model.db_schema" do
|
|
778
|
-
before do
|
|
779
|
-
@c = Class.new(Sequel::Model(:items)) do
|
|
780
|
-
def self.columns; orig_columns; end
|
|
781
|
-
end
|
|
782
|
-
@db = Sequel.mock
|
|
783
|
-
def @db.supports_schema_parsing?() true end
|
|
784
|
-
@dataset = @db[:items]
|
|
785
|
-
end
|
|
786
|
-
|
|
787
|
-
it "should not call database's schema if it isn't supported" do
|
|
788
|
-
def @db.supports_schema_parsing?() false end
|
|
789
|
-
def @db.schema(table, opts = {})
|
|
790
|
-
raise Sequel::Error
|
|
791
|
-
end
|
|
792
|
-
@dataset = @dataset.with_extend do
|
|
793
|
-
def columns
|
|
794
|
-
[:x, :y]
|
|
795
|
-
end
|
|
796
|
-
end
|
|
797
|
-
|
|
798
|
-
@c.dataset = @dataset
|
|
799
|
-
@c.db_schema.must_equal(:x=>{}, :y=>{})
|
|
800
|
-
@c.columns.must_equal [:x, :y]
|
|
801
|
-
|
|
802
|
-
@c.instance_eval{@db_schema = nil}
|
|
803
|
-
@c.db_schema.must_equal(:x=>{}, :y=>{})
|
|
804
|
-
@c.columns.must_equal [:x, :y]
|
|
805
|
-
end
|
|
806
|
-
|
|
807
|
-
it "should use the database's schema and set the columns and dataset columns" do
|
|
808
|
-
def @db.schema(table, opts = {})
|
|
809
|
-
[[:x, {:type=>:integer}], [:y, {:type=>:string}]]
|
|
810
|
-
end
|
|
811
|
-
@c.dataset = @dataset
|
|
812
|
-
@c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
|
|
813
|
-
@c.columns.must_equal [:x, :y]
|
|
814
|
-
@c.dataset.columns.must_equal [:x, :y]
|
|
815
|
-
end
|
|
816
|
-
|
|
817
|
-
it "should not restrict the schema for datasets with a :select option" do
|
|
818
|
-
def @c.columns; [:x, :z]; end
|
|
819
|
-
def @db.schema(table, opts = {})
|
|
820
|
-
[[:x, {:type=>:integer}], [:y, {:type=>:string}]]
|
|
821
|
-
end
|
|
822
|
-
@c.dataset = @dataset.select(:x, :y___z)
|
|
823
|
-
@c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
|
|
824
|
-
end
|
|
825
|
-
|
|
826
|
-
it "should not raise error if setting dataset where getting schema and columns raises an error and require_valid_table is false" do
|
|
827
|
-
@c.require_valid_table = false
|
|
828
|
-
def @db.schema(table, opts={})
|
|
829
|
-
raise Sequel::Error
|
|
830
|
-
end
|
|
831
|
-
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
|
832
|
-
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
|
833
|
-
end
|
|
834
|
-
|
|
835
|
-
it "should raise error if setting dataset where getting schema and columns raises an error and require_valid_table is true" do
|
|
836
|
-
@c.require_valid_table = true
|
|
837
|
-
def @db.schema(table, opts={})
|
|
838
|
-
raise Sequel::Error
|
|
839
|
-
end
|
|
840
|
-
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
|
841
|
-
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
|
842
|
-
end
|
|
843
|
-
|
|
844
|
-
it "should use dataset columns if getting schema raises an error and require_valid_table is false" do
|
|
845
|
-
@c.require_valid_table = false
|
|
846
|
-
def @db.schema(table, opts={})
|
|
847
|
-
raise Sequel::Error
|
|
848
|
-
end
|
|
849
|
-
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
|
850
|
-
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
|
851
|
-
end
|
|
852
|
-
|
|
853
|
-
it "should use dataset columns if getting schema raises an error and require_valid_table is true" do
|
|
854
|
-
@c.require_valid_table = true
|
|
855
|
-
def @db.schema(table, opts={})
|
|
856
|
-
raise Sequel::Error
|
|
857
|
-
end
|
|
858
|
-
@c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
|
|
859
|
-
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
|
860
|
-
end
|
|
861
|
-
|
|
862
|
-
it "should automatically set a singular primary key based on the schema" do
|
|
863
|
-
ds = @dataset
|
|
864
|
-
d = ds.db
|
|
865
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
|
|
866
|
-
@c.primary_key.must_equal :id
|
|
867
|
-
@c.dataset = ds
|
|
868
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true})
|
|
869
|
-
@c.primary_key.must_equal :x
|
|
870
|
-
end
|
|
871
|
-
|
|
872
|
-
it "should automatically set a singular primary key even if there are specific columns selected" do
|
|
873
|
-
ds = @dataset.select(:a, :b, :x)
|
|
874
|
-
d = ds.db
|
|
875
|
-
def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
|
|
876
|
-
@c.primary_key.must_equal :id
|
|
877
|
-
@c.dataset = ds
|
|
878
|
-
@c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
|
|
879
|
-
@c.primary_key.must_equal :x
|
|
880
|
-
end
|
|
881
|
-
|
|
882
|
-
it "should automatically set the composite primary key based on the schema" do
|
|
883
|
-
ds = @dataset
|
|
884
|
-
d = ds.db
|
|
885
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
|
|
886
|
-
@c.primary_key.must_equal :id
|
|
887
|
-
@c.dataset = ds
|
|
888
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
|
|
889
|
-
@c.primary_key.must_equal [:x, :y]
|
|
890
|
-
end
|
|
891
|
-
|
|
892
|
-
it "should set an immutable composite primary key based on the schema" do
|
|
893
|
-
ds = @dataset
|
|
894
|
-
d = ds.db
|
|
895
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
|
|
896
|
-
@c.dataset = ds
|
|
897
|
-
@c.primary_key.must_equal [:x, :y]
|
|
898
|
-
proc{@c.primary_key.pop}.must_raise
|
|
899
|
-
end
|
|
900
|
-
|
|
901
|
-
it "should automatically set no primary key based on the schema" do
|
|
902
|
-
ds = @dataset
|
|
903
|
-
d = ds.db
|
|
904
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
|
|
905
|
-
@c.primary_key.must_equal :id
|
|
906
|
-
@c.dataset = ds
|
|
907
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
|
|
908
|
-
@c.primary_key.must_be_nil
|
|
909
|
-
end
|
|
910
|
-
|
|
911
|
-
it "should automatically set primary key for dataset selecting table.*" do
|
|
912
|
-
ds = @dataset.select_all(:items)
|
|
913
|
-
d = ds.db
|
|
914
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
|
|
915
|
-
@c.primary_key.must_equal :id
|
|
916
|
-
@c.dataset = ds
|
|
917
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true})
|
|
918
|
-
@c.primary_key.must_equal :x
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
|
|
922
|
-
ds = @dataset
|
|
923
|
-
d = ds.db
|
|
924
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
|
|
925
|
-
@c.primary_key.must_equal :id
|
|
926
|
-
@c.dataset = ds
|
|
927
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
|
|
928
|
-
@c.primary_key.must_equal :id
|
|
929
|
-
end
|
|
930
|
-
end
|
|
931
|
-
|
|
932
|
-
describe "Model#use_transactions" do
|
|
933
|
-
before do
|
|
934
|
-
@c = Class.new(Sequel::Model(:items))
|
|
935
|
-
end
|
|
936
|
-
|
|
937
|
-
it "should return class value by default" do
|
|
938
|
-
@c.use_transactions = true
|
|
939
|
-
@c.new.use_transactions.must_equal true
|
|
940
|
-
@c.use_transactions = false
|
|
941
|
-
@c.new.use_transactions.must_equal false
|
|
942
|
-
end
|
|
943
|
-
|
|
944
|
-
it "should return set value if manually set" do
|
|
945
|
-
instance = @c.new
|
|
946
|
-
instance.use_transactions = false
|
|
947
|
-
instance.use_transactions.must_equal false
|
|
948
|
-
@c.use_transactions = true
|
|
949
|
-
instance.use_transactions.must_equal false
|
|
950
|
-
|
|
951
|
-
instance.use_transactions = true
|
|
952
|
-
instance.use_transactions.must_equal true
|
|
953
|
-
@c.use_transactions = false
|
|
954
|
-
instance.use_transactions.must_equal true
|
|
955
|
-
end
|
|
956
|
-
end
|