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/base_spec.rb
DELETED
|
@@ -1,875 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Model attribute setters" do
|
|
4
|
-
before do
|
|
5
|
-
@c = Class.new(Sequel::Model(:items)) do
|
|
6
|
-
columns :id, :x, :y, :"x y"
|
|
7
|
-
end
|
|
8
|
-
@o = @c.new
|
|
9
|
-
DB.reset
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "refresh should return self" do
|
|
13
|
-
@o = @c[1]
|
|
14
|
-
def @o._refresh(*) [] end
|
|
15
|
-
@o.refresh.must_equal @o
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should mark the column value as changed" do
|
|
19
|
-
@o.changed_columns.must_equal []
|
|
20
|
-
|
|
21
|
-
@o.x = 2
|
|
22
|
-
@o.changed_columns.must_equal [:x]
|
|
23
|
-
|
|
24
|
-
@o.y = 3
|
|
25
|
-
@o.changed_columns.must_equal [:x, :y]
|
|
26
|
-
|
|
27
|
-
@o.changed_columns.clear
|
|
28
|
-
|
|
29
|
-
@o[:x] = 2
|
|
30
|
-
@o.changed_columns.must_equal [:x]
|
|
31
|
-
|
|
32
|
-
@o[:y] = 3
|
|
33
|
-
@o.changed_columns.must_equal [:x, :y]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "should handle columns that can't be called like normal ruby methods" do
|
|
37
|
-
@o.send(:"x y=", 3)
|
|
38
|
-
@o.changed_columns.must_equal [:"x y"]
|
|
39
|
-
@o.values.must_equal(:"x y"=>3)
|
|
40
|
-
@o.send(:"x y").must_equal 3
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
describe "Model attribute getters/setters" do
|
|
45
|
-
before do
|
|
46
|
-
a = @a = []
|
|
47
|
-
@c = Class.new(Sequel::Model(:items)) do
|
|
48
|
-
columns :id, :x, :"x y", :require_modification
|
|
49
|
-
|
|
50
|
-
[:x, :"x y"].each do |c|
|
|
51
|
-
define_method(c) do
|
|
52
|
-
a << c
|
|
53
|
-
super()
|
|
54
|
-
end
|
|
55
|
-
define_method(:"#{c}=") do |v|
|
|
56
|
-
a << :"#{c}=" << v
|
|
57
|
-
super(v)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
DB.reset
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "should not override existing methods" do
|
|
65
|
-
@o = @c.new
|
|
66
|
-
@o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
|
|
67
|
-
@o.x.must_equal 4
|
|
68
|
-
@o.x = 1
|
|
69
|
-
@o.send(:"x y").must_equal 5
|
|
70
|
-
@o.send(:"x y=", 2)
|
|
71
|
-
@o.require_modification.must_equal true
|
|
72
|
-
@o.require_modification = 3
|
|
73
|
-
@o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
|
|
74
|
-
@a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should not override existing methods in subclasses" do
|
|
78
|
-
@c = Class.new(@c)
|
|
79
|
-
@c.columns(:id, :x, :y, :"x y", :require_modification)
|
|
80
|
-
@o = @c.new
|
|
81
|
-
@o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
|
|
82
|
-
@o.x.must_equal 4
|
|
83
|
-
@o.x = 1
|
|
84
|
-
@o.send(:"x y").must_equal 5
|
|
85
|
-
@o.send(:"x y=", 2)
|
|
86
|
-
@o.require_modification.must_equal true
|
|
87
|
-
@o.require_modification = 3
|
|
88
|
-
@o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
|
|
89
|
-
@a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
describe "Model.def_column_alias" do
|
|
94
|
-
before do
|
|
95
|
-
@o = Class.new(Sequel::Model(:items)) do
|
|
96
|
-
columns :id
|
|
97
|
-
def_column_alias(:id2, :id)
|
|
98
|
-
end.load(:id=>1)
|
|
99
|
-
DB.reset
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it "should create an getter alias for the column" do
|
|
103
|
-
@o.id2.must_equal 1
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "should create an setter alias for the column" do
|
|
107
|
-
@o.id2 = 2
|
|
108
|
-
@o.id2.must_equal 2
|
|
109
|
-
@o.values.must_equal(:id => 2)
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
describe Sequel::Model, "dataset" do
|
|
114
|
-
before do
|
|
115
|
-
@a = Class.new(Sequel::Model(:items))
|
|
116
|
-
@b = Class.new(Sequel::Model)
|
|
117
|
-
class ::Elephant < Sequel::Model(:ele1); end
|
|
118
|
-
class ::Maggot < Sequel::Model; end
|
|
119
|
-
class ::ShoeSize < Sequel::Model; end
|
|
120
|
-
class ::BootSize < ShoeSize; end
|
|
121
|
-
end
|
|
122
|
-
after do
|
|
123
|
-
[:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
it "should default to the plural of the class name" do
|
|
127
|
-
Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
|
|
128
|
-
ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should return the dataset for the superclass if available" do
|
|
132
|
-
BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "should return the correct dataset if set explicitly" do
|
|
136
|
-
Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
|
|
137
|
-
@a.dataset.sql.must_equal 'SELECT * FROM items'
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
it "should raise if no dataset is explicitly set and the class is anonymous" do
|
|
141
|
-
proc {@b.dataset}.must_raise(Sequel::Error)
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "should not override dataset explicitly set when subclassing" do
|
|
145
|
-
sc = Class.new(::Elephant) do
|
|
146
|
-
set_dataset :foo
|
|
147
|
-
end
|
|
148
|
-
sc.table_name.must_equal :foo
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
describe Sequel::Model, "has_dataset?" do
|
|
153
|
-
it "should return whether the model has a dataset" do
|
|
154
|
-
c = Class.new(Sequel::Model)
|
|
155
|
-
c.has_dataset?.must_equal false
|
|
156
|
-
c.dataset = c.db[:table]
|
|
157
|
-
c.has_dataset?.must_equal true
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
describe Sequel::Model, "implicit table names" do
|
|
162
|
-
after do
|
|
163
|
-
Object.send(:remove_const, :BlahBlah)
|
|
164
|
-
end
|
|
165
|
-
it "should disregard namespaces for the table name" do
|
|
166
|
-
module ::BlahBlah
|
|
167
|
-
class MwaHaHa < Sequel::Model
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should automatically set datasets when anonymous class of Sequel::Model is used as superclass" do
|
|
174
|
-
class BlahBlah < Class.new(Sequel::Model); end
|
|
175
|
-
BlahBlah.dataset.sql.must_equal 'SELECT * FROM blah_blahs'
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
describe Sequel::Model, ".dataset_module" do
|
|
180
|
-
before do
|
|
181
|
-
@c = Class.new(Sequel::Model(:items))
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
it "should extend the dataset with the module if the model has a dataset" do
|
|
185
|
-
@c.dataset_module{def return_3() 3 end}
|
|
186
|
-
@c.dataset.return_3.must_equal 3
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
it "should also extend the instance_dataset with the module if the model has a dataset" do
|
|
190
|
-
@c.dataset_module{def return_3() 3 end}
|
|
191
|
-
@c.instance_dataset.return_3.must_equal 3
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "should add methods defined in the module to the class" do
|
|
195
|
-
@c.dataset_module{def return_3() 3 end}
|
|
196
|
-
@c.return_3.must_equal 3
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it "should add methods defined in the module outside the block to the class" do
|
|
200
|
-
@c.dataset_module.module_eval{def return_3() 3 end}
|
|
201
|
-
@c.return_3.must_equal 3
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
it "should add methods that can't be called with normal method syntax as class methods" do
|
|
205
|
-
@c.dataset_module.module_eval{define_method(:'return 3'){3}}
|
|
206
|
-
@c.send(:'return 3').must_equal 3
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
it "should not add private or protected methods defined in the module to the class" do
|
|
210
|
-
@c.dataset_module{private; def return_3() 3 end}
|
|
211
|
-
@c.dataset_module{protected; def return_4() 4 end}
|
|
212
|
-
@c.respond_to?(:return_3).must_equal false
|
|
213
|
-
@c.respond_to?(:return_4).must_equal false
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "should cache calls and readd methods if set_dataset is used" do
|
|
217
|
-
@c.dataset_module{def return_3() 3 end}
|
|
218
|
-
@c.set_dataset :items
|
|
219
|
-
@c.return_3.must_equal 3
|
|
220
|
-
@c.dataset.return_3.must_equal 3
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it "should readd methods to subclasses, if set_dataset is used in a subclass" do
|
|
224
|
-
@c.dataset_module{def return_3() 3 end}
|
|
225
|
-
c = Class.new(@c)
|
|
226
|
-
c.set_dataset :items
|
|
227
|
-
c.return_3.must_equal 3
|
|
228
|
-
c.dataset.return_3.must_equal 3
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
it "should only have a single dataset_module per class" do
|
|
232
|
-
@c.dataset_module{def return_3() 3 end}
|
|
233
|
-
@c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
|
|
234
|
-
@c.return_3.must_equal 4
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
it "should not have subclasses share the dataset_module" do
|
|
238
|
-
@c.dataset_module{def return_3() 3 end}
|
|
239
|
-
c = Class.new(@c)
|
|
240
|
-
c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
|
|
241
|
-
c.return_3.must_equal 6
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
it "should accept a module object and extend the dataset with it" do
|
|
245
|
-
@c.dataset_module Module.new{def return_3() 3 end}
|
|
246
|
-
@c.dataset.return_3.must_equal 3
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
it "should be able to call dataset_module with a module multiple times" do
|
|
250
|
-
@c.dataset_module Module.new{def return_3() 3 end}
|
|
251
|
-
@c.dataset_module Module.new{def return_4() 4 end}
|
|
252
|
-
@c.dataset.return_3.must_equal 3
|
|
253
|
-
@c.dataset.return_4.must_equal 4
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
it "should be able mix dataset_module calls with and without arguments" do
|
|
257
|
-
@c.dataset_module{def return_3() 3 end}
|
|
258
|
-
@c.dataset_module Module.new{def return_4() 4 end}
|
|
259
|
-
@c.dataset.return_3.must_equal 3
|
|
260
|
-
@c.dataset.return_4.must_equal 4
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
it "should have modules provided to dataset_module extend subclass datasets" do
|
|
264
|
-
@c.dataset_module{def return_3() 3 end}
|
|
265
|
-
@c.dataset_module Module.new{def return_4() 4 end}
|
|
266
|
-
c = Class.new(@c)
|
|
267
|
-
c.set_dataset :a
|
|
268
|
-
c.dataset.return_3.must_equal 3
|
|
269
|
-
c.dataset.return_4.must_equal 4
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
it "should return the dataset module if given a block" do
|
|
273
|
-
Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
it "should return the argument if given one" do
|
|
277
|
-
Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
it "should have dataset_module support a subset method" do
|
|
281
|
-
@c.dataset_module{subset :released, :released}
|
|
282
|
-
@c.released.sql.must_equal 'SELECT * FROM items WHERE released'
|
|
283
|
-
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
it "should have dataset_module support a where method" do
|
|
287
|
-
@c.dataset_module{where :released, :released}
|
|
288
|
-
@c.released.sql.must_equal 'SELECT * FROM items WHERE released'
|
|
289
|
-
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
if Sequel::Model.dataset_module_class == Sequel::Model::DatasetModule
|
|
293
|
-
it "should have dataset_module not support an eager method" do
|
|
294
|
-
proc{@c.dataset_module{eager :foo}}.must_raise NoMethodError
|
|
295
|
-
end
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
it "should have dataset_module support a having method" do
|
|
299
|
-
@c.dataset_module{having(:released){released}}
|
|
300
|
-
@c.released.sql.must_equal 'SELECT * FROM items HAVING released'
|
|
301
|
-
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
it "should have dataset_module support an exclude method" do
|
|
305
|
-
@c.dataset_module{exclude :released, :released}
|
|
306
|
-
@c.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
|
|
307
|
-
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
it "should have dataset_module support an exclude_having method" do
|
|
311
|
-
@c.dataset_module{exclude_having :released, :released}
|
|
312
|
-
@c.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
|
|
313
|
-
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
it "should have dataset_module support a distinct method" do
|
|
317
|
-
@c.dataset = @c.dataset.with_extend{def supports_distinct_on?; true end}
|
|
318
|
-
@c.dataset_module{distinct :foo, :baz}
|
|
319
|
-
@c.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
|
|
320
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
it "should have dataset_module support a grep method" do
|
|
324
|
-
@c.dataset_module{grep :foo, :baz, 'quux%'}
|
|
325
|
-
@c.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
|
|
326
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
it "should have dataset_module support a group method" do
|
|
330
|
-
@c.dataset_module{group :foo, :baz}
|
|
331
|
-
@c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
|
|
332
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
it "should have dataset_module support a group_and_count method" do
|
|
336
|
-
@c.dataset_module{group_and_count :foo, :baz}
|
|
337
|
-
@c.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
|
|
338
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it "should have dataset_module support a group_append method" do
|
|
342
|
-
@c.dataset_module{group_append :foo, :baz}
|
|
343
|
-
@c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
|
|
344
|
-
@c.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
it "should have dataset_module support a limit method" do
|
|
348
|
-
@c.dataset_module{limit :foo, 1}
|
|
349
|
-
@c.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
|
|
350
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
it "should have dataset_module support a offset method" do
|
|
354
|
-
@c.dataset_module{offset :foo, 1}
|
|
355
|
-
@c.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
|
|
356
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
it "should have dataset_module support a order method" do
|
|
360
|
-
@c.dataset_module{order(:foo){:baz}}
|
|
361
|
-
@c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
362
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
it "should have dataset_module support a order_append method" do
|
|
366
|
-
@c.dataset_module{order_append :foo, :baz}
|
|
367
|
-
@c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
368
|
-
@c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
it "should have dataset_module support a order_prepend method" do
|
|
372
|
-
@c.dataset_module{order_prepend :foo, :baz}
|
|
373
|
-
@c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
374
|
-
@c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
it "should have dataset_module support a reverse method" do
|
|
378
|
-
@c.dataset_module{reverse(:foo){:baz}}
|
|
379
|
-
@c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz DESC'
|
|
380
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz DESC'
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
it "should have dataset_module support a select method" do
|
|
384
|
-
@c.dataset_module{select :foo, :baz}
|
|
385
|
-
@c.foo.sql.must_equal 'SELECT baz FROM items'
|
|
386
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
|
|
387
|
-
end
|
|
388
|
-
|
|
389
|
-
it "should have dataset_module support a select_all method" do
|
|
390
|
-
@c.dataset_module{select_all :foo, :baz}
|
|
391
|
-
@c.foo.sql.must_equal 'SELECT baz.* FROM items'
|
|
392
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
it "should have dataset_module support a select_append method" do
|
|
396
|
-
@c.dataset_module{select_append :foo, :baz}
|
|
397
|
-
@c.foo.sql.must_equal 'SELECT *, baz FROM items'
|
|
398
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
it "should have dataset_module support a select_group method" do
|
|
402
|
-
@c.dataset_module{select_group :foo, :baz}
|
|
403
|
-
@c.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
|
|
404
|
-
@c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
it "should have dataset_module support a server method" do
|
|
408
|
-
@c.dataset_module{server :foo, :baz}
|
|
409
|
-
@c.foo.opts[:server].must_equal :baz
|
|
410
|
-
@c.where(:bar).foo.opts[:server].must_equal :baz
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
it "should raise error if called with both an argument and a block" do
|
|
414
|
-
proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
|
|
415
|
-
end
|
|
416
|
-
end
|
|
417
|
-
|
|
418
|
-
describe "A model class with implicit table name" do
|
|
419
|
-
before do
|
|
420
|
-
class ::Donkey < Sequel::Model
|
|
421
|
-
end
|
|
422
|
-
end
|
|
423
|
-
after do
|
|
424
|
-
Object.send(:remove_const, :Donkey)
|
|
425
|
-
end
|
|
426
|
-
|
|
427
|
-
it "should have a dataset associated with the model class" do
|
|
428
|
-
Donkey.dataset.model.must_equal Donkey
|
|
429
|
-
end
|
|
430
|
-
end
|
|
431
|
-
|
|
432
|
-
describe "A model inheriting from a model" do
|
|
433
|
-
before do
|
|
434
|
-
class ::Feline < Sequel::Model; end
|
|
435
|
-
class ::Leopard < Feline; end
|
|
436
|
-
end
|
|
437
|
-
after do
|
|
438
|
-
Object.send(:remove_const, :Leopard)
|
|
439
|
-
Object.send(:remove_const, :Feline)
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
it "should have a dataset associated with itself" do
|
|
443
|
-
Feline.dataset.model.must_equal Feline
|
|
444
|
-
Leopard.dataset.model.must_equal Leopard
|
|
445
|
-
end
|
|
446
|
-
end
|
|
447
|
-
|
|
448
|
-
describe "A model inheriting from a custom base that sets @dataset" do
|
|
449
|
-
before do
|
|
450
|
-
::Feline = Class.new(Sequel::Model)
|
|
451
|
-
def Feline.inherited(subclass)
|
|
452
|
-
subclass.instance_variable_set(:@dataset, nil)
|
|
453
|
-
superclass.inherited(subclass)
|
|
454
|
-
end
|
|
455
|
-
class ::Leopard < Feline; end
|
|
456
|
-
end
|
|
457
|
-
after do
|
|
458
|
-
Object.send(:remove_const, :Leopard)
|
|
459
|
-
Object.send(:remove_const, :Feline)
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
it "should not infer the dataset of the subclass" do
|
|
463
|
-
proc{Leopard.dataset}.must_raise(Sequel::Error)
|
|
464
|
-
end
|
|
465
|
-
end
|
|
466
|
-
|
|
467
|
-
describe "Model.primary_key" do
|
|
468
|
-
before do
|
|
469
|
-
@c = Class.new(Sequel::Model)
|
|
470
|
-
end
|
|
471
|
-
|
|
472
|
-
it "should default to id" do
|
|
473
|
-
@c.primary_key.must_equal :id
|
|
474
|
-
end
|
|
475
|
-
|
|
476
|
-
it "should be overridden by set_primary_key" do
|
|
477
|
-
@c.set_primary_key :cid
|
|
478
|
-
@c.primary_key.must_equal :cid
|
|
479
|
-
|
|
480
|
-
@c.set_primary_key([:id1, :id2])
|
|
481
|
-
@c.primary_key.must_equal [:id1, :id2]
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
it "should use nil for no primary key" do
|
|
485
|
-
@c.no_primary_key
|
|
486
|
-
@c.primary_key.must_be_nil
|
|
487
|
-
end
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
describe "Model.primary_key_hash" do
|
|
491
|
-
before do
|
|
492
|
-
@c = Class.new(Sequel::Model)
|
|
493
|
-
end
|
|
494
|
-
|
|
495
|
-
it "should handle a single primary key" do
|
|
496
|
-
@c.primary_key_hash(1).must_equal(:id=>1)
|
|
497
|
-
end
|
|
498
|
-
|
|
499
|
-
it "should handle a composite primary key" do
|
|
500
|
-
@c.set_primary_key([:id1, :id2])
|
|
501
|
-
@c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
it "should raise an error for no primary key" do
|
|
505
|
-
@c.no_primary_key
|
|
506
|
-
proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
|
|
507
|
-
end
|
|
508
|
-
end
|
|
509
|
-
|
|
510
|
-
describe "Model.qualified_primary_key_hash" do
|
|
511
|
-
before do
|
|
512
|
-
@c = Class.new(Sequel::Model(:items))
|
|
513
|
-
end
|
|
514
|
-
|
|
515
|
-
it "should handle a single primary key" do
|
|
516
|
-
@c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
|
|
517
|
-
end
|
|
518
|
-
|
|
519
|
-
it "should handle a composite primary key" do
|
|
520
|
-
@c.set_primary_key([:id1, :id2])
|
|
521
|
-
@c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
|
|
522
|
-
end
|
|
523
|
-
|
|
524
|
-
it "should raise an error for no primary key" do
|
|
525
|
-
@c.no_primary_key
|
|
526
|
-
proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
|
|
527
|
-
end
|
|
528
|
-
|
|
529
|
-
it "should allow specifying a different qualifier" do
|
|
530
|
-
@c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
|
|
531
|
-
@c.set_primary_key([:id1, :id2])
|
|
532
|
-
@c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
|
|
533
|
-
end
|
|
534
|
-
end
|
|
535
|
-
|
|
536
|
-
describe "Model.db" do
|
|
537
|
-
before do
|
|
538
|
-
@db = Sequel.mock
|
|
539
|
-
@databases = Sequel::DATABASES.dup
|
|
540
|
-
@model_db = Sequel::Model.db
|
|
541
|
-
Sequel::Model.db = nil
|
|
542
|
-
Sequel::DATABASES.clear
|
|
543
|
-
end
|
|
544
|
-
after do
|
|
545
|
-
Sequel::Model.instance_variable_get(:@db).must_be_nil
|
|
546
|
-
Sequel::DATABASES.replace(@databases)
|
|
547
|
-
Sequel::Model.db = @model_db
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
it "should be required when creating named model classes" do
|
|
551
|
-
begin
|
|
552
|
-
proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
|
|
553
|
-
ensure
|
|
554
|
-
Object.send(:remove_const, :ModelTest)
|
|
555
|
-
end
|
|
556
|
-
end
|
|
557
|
-
|
|
558
|
-
it "should be required when creating anonymous model classes without a database" do
|
|
559
|
-
proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
|
|
560
|
-
end
|
|
561
|
-
|
|
562
|
-
it "should not be required when creating anonymous model classes with a database" do
|
|
563
|
-
Sequel::Model(@db).db.must_equal @db
|
|
564
|
-
Sequel::Model(@db[:foo]).db.must_equal @db
|
|
565
|
-
end
|
|
566
|
-
|
|
567
|
-
it "should work correctly when subclassing anonymous model classes with a database" do
|
|
568
|
-
begin
|
|
569
|
-
Class.new(Sequel::Model(@db)).db.must_equal @db
|
|
570
|
-
Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
|
|
571
|
-
class ModelTest < Sequel::Model(@db)
|
|
572
|
-
db.must_equal @db
|
|
573
|
-
end
|
|
574
|
-
class ModelTest2 < Sequel::Model(@db[:foo])
|
|
575
|
-
db.must_equal @db
|
|
576
|
-
end
|
|
577
|
-
ModelTest.instance_variable_set(:@db, nil)
|
|
578
|
-
ModelTest.db.must_equal @db
|
|
579
|
-
ensure
|
|
580
|
-
Object.send(:remove_const, :ModelTest)
|
|
581
|
-
Object.send(:remove_const, :ModelTest2)
|
|
582
|
-
end
|
|
583
|
-
end
|
|
584
|
-
end
|
|
585
|
-
|
|
586
|
-
describe "Model.db=" do
|
|
587
|
-
before do
|
|
588
|
-
@db1 = Sequel.mock
|
|
589
|
-
@db2 = Sequel.mock
|
|
590
|
-
@m = Class.new(Sequel::Model(@db1))
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
it "should change database for model" do
|
|
594
|
-
@m.db = @db2
|
|
595
|
-
@m.db.must_equal @db2
|
|
596
|
-
end
|
|
597
|
-
|
|
598
|
-
it "should raise Error for model with existing dataset" do
|
|
599
|
-
@m.dataset = :table
|
|
600
|
-
proc{@m.db = @db2}.must_raise Sequel::Error
|
|
601
|
-
end
|
|
602
|
-
|
|
603
|
-
it "should use the database for subclasses" do
|
|
604
|
-
Class.new(@m).db.must_equal @db1
|
|
605
|
-
end
|
|
606
|
-
end
|
|
607
|
-
|
|
608
|
-
describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
|
|
609
|
-
before do
|
|
610
|
-
@c = Class.new(Sequel::Model(:blahblah)) do
|
|
611
|
-
set_primary_key :id
|
|
612
|
-
columns :x, :y, :z, :id
|
|
613
|
-
end
|
|
614
|
-
@c.strict_param_setting = false
|
|
615
|
-
end
|
|
616
|
-
|
|
617
|
-
it "should restrict updates to primary key by default" do
|
|
618
|
-
i = @c.new(:x => 1, :y => 2, :id => 3)
|
|
619
|
-
i.values.must_equal(:x => 1, :y => 2)
|
|
620
|
-
i.set(:x => 4, :y => 5, :id => 6)
|
|
621
|
-
i.values.must_equal(:x => 4, :y => 5)
|
|
622
|
-
end
|
|
623
|
-
|
|
624
|
-
it "should allow updates to primary key if unrestrict_primary_key is used" do
|
|
625
|
-
@c.unrestrict_primary_key
|
|
626
|
-
i = @c.new(:x => 1, :y => 2, :id => 3)
|
|
627
|
-
i.values.must_equal(:x => 1, :y => 2, :id=>3)
|
|
628
|
-
i.set(:x => 4, :y => 5, :id => 6)
|
|
629
|
-
i.values.must_equal(:x => 4, :y => 5, :id=>6)
|
|
630
|
-
end
|
|
631
|
-
|
|
632
|
-
it "should have restrict_primary_key? return true or false depending" do
|
|
633
|
-
@c.restrict_primary_key?.must_equal true
|
|
634
|
-
@c.unrestrict_primary_key
|
|
635
|
-
@c.restrict_primary_key?.must_equal false
|
|
636
|
-
c1 = Class.new(@c)
|
|
637
|
-
c1.restrict_primary_key?.must_equal false
|
|
638
|
-
@c.restrict_primary_key
|
|
639
|
-
@c.restrict_primary_key?.must_equal true
|
|
640
|
-
c1.restrict_primary_key?.must_equal false
|
|
641
|
-
c2 = Class.new(@c)
|
|
642
|
-
c2.restrict_primary_key?.must_equal true
|
|
643
|
-
end
|
|
644
|
-
end
|
|
645
|
-
|
|
646
|
-
describe Sequel::Model, ".strict_param_setting" do
|
|
647
|
-
before do
|
|
648
|
-
@c = Class.new(Sequel::Model(:blahblah)) do
|
|
649
|
-
columns :x, :y, :z, :id
|
|
650
|
-
end
|
|
651
|
-
end
|
|
652
|
-
|
|
653
|
-
it "should be enabled by default" do
|
|
654
|
-
@c.strict_param_setting.must_equal true
|
|
655
|
-
end
|
|
656
|
-
|
|
657
|
-
it "should raise an error if a missing/restricted column/method is accessed" do
|
|
658
|
-
proc{@c.new(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
659
|
-
proc{@c.create(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
660
|
-
c = @c.new
|
|
661
|
-
proc{c.set(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
662
|
-
proc{c.update(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
663
|
-
end
|
|
664
|
-
|
|
665
|
-
it "should be disabled by strict_param_setting = false" do
|
|
666
|
-
@c.strict_param_setting = false
|
|
667
|
-
@c.strict_param_setting.must_equal false
|
|
668
|
-
@c.new(:a=>1)
|
|
669
|
-
end
|
|
670
|
-
end
|
|
671
|
-
|
|
672
|
-
describe Sequel::Model, ".require_modification" do
|
|
673
|
-
before do
|
|
674
|
-
@ds1 = DB[:items].with_extend{def provides_accurate_rows_matched?; false end}
|
|
675
|
-
@ds2 = DB[:items].with_extend{def provides_accurate_rows_matched?; true end}
|
|
676
|
-
end
|
|
677
|
-
after do
|
|
678
|
-
Sequel::Model.require_modification = nil
|
|
679
|
-
end
|
|
680
|
-
|
|
681
|
-
it "should depend on whether the dataset provides an accurate number of rows matched by default" do
|
|
682
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
683
|
-
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
|
|
684
|
-
end
|
|
685
|
-
|
|
686
|
-
it "should obey global setting regardless of dataset support if set" do
|
|
687
|
-
Sequel::Model.require_modification = true
|
|
688
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
|
|
689
|
-
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
|
|
690
|
-
|
|
691
|
-
Sequel::Model.require_modification = false
|
|
692
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
693
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
694
|
-
end
|
|
695
|
-
end
|
|
696
|
-
|
|
697
|
-
describe Sequel::Model, ".[] optimization" do
|
|
698
|
-
before do
|
|
699
|
-
@db = Sequel.mock
|
|
700
|
-
def @db.schema(*) [[:id, {:primary_key=>true}]] end
|
|
701
|
-
def @db.supports_schema_parsing?() true end
|
|
702
|
-
@c = Class.new(Sequel::Model(@db))
|
|
703
|
-
@ds = @db.dataset.with_quote_identifiers(true)
|
|
704
|
-
end
|
|
705
|
-
|
|
706
|
-
it "should set simple_pk to the literalized primary key column name if a single primary key" do
|
|
707
|
-
@c.set_primary_key :id
|
|
708
|
-
@c.simple_pk.must_equal 'id'
|
|
709
|
-
@c.set_primary_key :b
|
|
710
|
-
@c.simple_pk.must_equal 'b'
|
|
711
|
-
@c.set_primary_key Sequel.identifier(:b__a)
|
|
712
|
-
@c.simple_pk.must_equal 'b__a'
|
|
713
|
-
end
|
|
714
|
-
|
|
715
|
-
it "should have simple_pk be blank if compound or no primary key" do
|
|
716
|
-
@c.no_primary_key
|
|
717
|
-
@c.simple_pk.must_be_nil
|
|
718
|
-
@c.set_primary_key [:b, :a]
|
|
719
|
-
@c.simple_pk.must_be_nil
|
|
720
|
-
end
|
|
721
|
-
|
|
722
|
-
it "should have simple table set if passed a Symbol to set_dataset" do
|
|
723
|
-
@c.set_dataset :a
|
|
724
|
-
@c.simple_table.must_equal 'a'
|
|
725
|
-
@c.set_dataset :b
|
|
726
|
-
@c.simple_table.must_equal 'b'
|
|
727
|
-
end
|
|
728
|
-
|
|
729
|
-
it "should have simple_table set if passed a simple select all dataset to set_dataset" do
|
|
730
|
-
@c.set_dataset @ds.from(:a)
|
|
731
|
-
@c.simple_table.must_equal '"a"'
|
|
732
|
-
@c.set_dataset @ds.from(:b)
|
|
733
|
-
@c.simple_table.must_equal '"b"'
|
|
734
|
-
@c.set_dataset @ds.from(Sequel[:b][:a])
|
|
735
|
-
@c.simple_table.must_equal '"b"."a"'
|
|
736
|
-
end
|
|
737
|
-
|
|
738
|
-
with_symbol_splitting "should have simple_table set using qualified symbol" do
|
|
739
|
-
@c.set_dataset :b__a
|
|
740
|
-
@c.simple_table.must_equal 'b.a'
|
|
741
|
-
@c.set_dataset @ds.from(:b__a)
|
|
742
|
-
@c.simple_table.must_equal '"b"."a"'
|
|
743
|
-
end
|
|
744
|
-
|
|
745
|
-
it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
|
|
746
|
-
@c.set_dataset @c.db[:a].filter(:active)
|
|
747
|
-
@c.simple_table.must_be_nil
|
|
748
|
-
end
|
|
749
|
-
|
|
750
|
-
it "should have simple_table inherit superclass's setting" do
|
|
751
|
-
Class.new(@c).simple_table.must_be_nil
|
|
752
|
-
@c.set_dataset :a
|
|
753
|
-
Class.new(@c).simple_table.must_equal 'a'
|
|
754
|
-
end
|
|
755
|
-
|
|
756
|
-
it "should use Dataset#with_sql if simple_table and simple_pk are true" do
|
|
757
|
-
@c.set_dataset @db[:a].with_fetch(:id=>1)
|
|
758
|
-
@c[1].must_equal @c.load(:id=>1)
|
|
759
|
-
@db.sqls.must_equal ['SELECT * FROM a WHERE id = 1']
|
|
760
|
-
end
|
|
761
|
-
|
|
762
|
-
it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
|
|
763
|
-
@c.set_dataset @db[:a].where(:active).with_fetch(:id=>1)
|
|
764
|
-
@c[1].must_equal @c.load(:id=>1)
|
|
765
|
-
@db.sqls.must_equal ['SELECT * FROM a WHERE (active AND (id = 1)) LIMIT 1']
|
|
766
|
-
end
|
|
767
|
-
end
|
|
768
|
-
|
|
769
|
-
describe "Model datasets #with_pk with #with_pk!" do
|
|
770
|
-
before do
|
|
771
|
-
@c = Class.new(Sequel::Model(:a))
|
|
772
|
-
@ds = @c.dataset = @c.dataset.with_fetch(:id=>1)
|
|
773
|
-
DB.reset
|
|
774
|
-
end
|
|
775
|
-
|
|
776
|
-
it "should be callable on the model class with optimized SQL" do
|
|
777
|
-
@c.with_pk(1).must_equal @c.load(:id=>1)
|
|
778
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
779
|
-
@c.with_pk!(1).must_equal @c.load(:id=>1)
|
|
780
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
781
|
-
end
|
|
782
|
-
|
|
783
|
-
it "should return the first record where the primary key matches" do
|
|
784
|
-
@ds.with_pk(1).must_equal @c.load(:id=>1)
|
|
785
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
786
|
-
@ds.with_pk!(1).must_equal @c.load(:id=>1)
|
|
787
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
788
|
-
end
|
|
789
|
-
|
|
790
|
-
it "should work when called repeatedly on a frozen dataset" do
|
|
791
|
-
@ds.freeze
|
|
792
|
-
5.times do
|
|
793
|
-
@ds.with_pk(1).must_equal @c.load(:id=>1)
|
|
794
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
795
|
-
end
|
|
796
|
-
end
|
|
797
|
-
|
|
798
|
-
it "should handle existing filters" do
|
|
799
|
-
@ds.filter(:a=>2).with_pk(1)
|
|
800
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
|
|
801
|
-
@ds.filter(:a=>2).with_pk!(1)
|
|
802
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
|
|
803
|
-
end
|
|
804
|
-
|
|
805
|
-
it "should work with string values" do
|
|
806
|
-
@ds.with_pk("foo")
|
|
807
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
|
|
808
|
-
@ds.with_pk!("foo")
|
|
809
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
|
|
810
|
-
end
|
|
811
|
-
|
|
812
|
-
it "should handle an array for composite primary keys" do
|
|
813
|
-
@c.set_primary_key [:id1, :id2]
|
|
814
|
-
@ds.with_pk([1, 2])
|
|
815
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
|
|
816
|
-
|
|
817
|
-
@ds.with_pk!([1, 2])
|
|
818
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
|
|
819
|
-
end
|
|
820
|
-
|
|
821
|
-
it "should work with composite primary keys when called repeatedly on a frozen dataset with" do
|
|
822
|
-
@c.set_primary_key [:id1, :id2]
|
|
823
|
-
@ds.freeze
|
|
824
|
-
5.times do
|
|
825
|
-
@ds.with_pk([1,2])
|
|
826
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
|
|
827
|
-
end
|
|
828
|
-
end
|
|
829
|
-
|
|
830
|
-
it "should have with_pk return nil and with_pk! raise if no rows match" do
|
|
831
|
-
@ds = @ds.with_fetch([])
|
|
832
|
-
@ds.with_pk(1).must_be_nil
|
|
833
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
834
|
-
proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
|
|
835
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
836
|
-
end
|
|
837
|
-
|
|
838
|
-
it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
|
|
839
|
-
@c.dataset = @c.dataset.with_fetch([])
|
|
840
|
-
@c.with_pk(1).must_be_nil
|
|
841
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
842
|
-
proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
|
|
843
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
844
|
-
end
|
|
845
|
-
|
|
846
|
-
it "should have #[] consider an integer as a primary key lookup" do
|
|
847
|
-
@ds[1].must_equal @c.load(:id=>1)
|
|
848
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
849
|
-
end
|
|
850
|
-
|
|
851
|
-
it "should not have #[] consider a literal string as a primary key lookup" do
|
|
852
|
-
@ds[Sequel.lit('foo')].must_equal @c.load(:id=>1)
|
|
853
|
-
DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
|
|
854
|
-
end
|
|
855
|
-
|
|
856
|
-
it "should raise Error if called on a dataset with no primary key" do
|
|
857
|
-
@c.no_primary_key
|
|
858
|
-
@ds.freeze
|
|
859
|
-
5.times do
|
|
860
|
-
proc{@ds.with_pk(1)}.must_raise Sequel::Error
|
|
861
|
-
end
|
|
862
|
-
end
|
|
863
|
-
end
|
|
864
|
-
|
|
865
|
-
describe "Model::include" do
|
|
866
|
-
it "shouldn't change the signature of Module::include" do
|
|
867
|
-
mod1 = Module.new
|
|
868
|
-
mod2 = Module.new
|
|
869
|
-
including_class = Class.new(Sequel::Model(:items)) do
|
|
870
|
-
include(mod1, mod2)
|
|
871
|
-
end
|
|
872
|
-
including_class.included_modules.must_include(mod1)
|
|
873
|
-
including_class.included_modules.must_include(mod2)
|
|
874
|
-
end
|
|
875
|
-
end
|