sequel 5.20.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -519
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -63
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
require 'yaml'
|
|
3
|
-
|
|
4
|
-
describe "Sequel::Plugins::LazyAttributes" do
|
|
5
|
-
before do
|
|
6
|
-
@db = Sequel.mock
|
|
7
|
-
def @db.supports_schema_parsing?() true end
|
|
8
|
-
def @db.schema(*a) [[:id, {:type=>:integer}], [:name,{:type=>:string}]] end
|
|
9
|
-
class ::LazyAttributesModel < Sequel::Model(@db[:la])
|
|
10
|
-
plugin :lazy_attributes
|
|
11
|
-
set_columns([:id, :name])
|
|
12
|
-
def self.columns; [:id, :name] end
|
|
13
|
-
lazy_attributes :name
|
|
14
|
-
def self.columns; [:id] end
|
|
15
|
-
set_dataset dataset.with_fetch(proc do |sql|
|
|
16
|
-
if sql !~ /WHERE/
|
|
17
|
-
if sql =~ /name/
|
|
18
|
-
[{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
19
|
-
else
|
|
20
|
-
[{:id=>1}, {:id=>2}]
|
|
21
|
-
end
|
|
22
|
-
else
|
|
23
|
-
if sql =~ /id IN \(([\d, ]+)\)/
|
|
24
|
-
$1.split(', ')
|
|
25
|
-
elsif sql =~ /id = (\d)/
|
|
26
|
-
[$1]
|
|
27
|
-
end.map do |x|
|
|
28
|
-
if sql =~ /SELECT (la.)?name FROM/
|
|
29
|
-
{:name=>x.to_s}
|
|
30
|
-
else
|
|
31
|
-
{:id=>x.to_i, :name=>x.to_s}
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end)
|
|
36
|
-
end
|
|
37
|
-
@c = ::LazyAttributesModel
|
|
38
|
-
@ds = LazyAttributesModel.dataset
|
|
39
|
-
@db.sqls
|
|
40
|
-
end
|
|
41
|
-
after do
|
|
42
|
-
Object.send(:remove_const, :LazyAttributesModel)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should allowing adding additional lazy attributes via plugin :lazy_attributes" do
|
|
46
|
-
@c.set_dataset(@ds.select(:id, :blah))
|
|
47
|
-
@c.dataset.sql.must_equal 'SELECT id, blah FROM la'
|
|
48
|
-
@c.plugin :lazy_attributes, :blah
|
|
49
|
-
@c.dataset.sql.must_equal 'SELECT id FROM la'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should allowing adding additional lazy attributes via lazy_attributes" do
|
|
53
|
-
@c.set_dataset(@ds.select(:id, :blah))
|
|
54
|
-
@c.dataset.sql.must_equal 'SELECT id, blah FROM la'
|
|
55
|
-
@c.lazy_attributes :blah
|
|
56
|
-
@c.dataset.sql.must_equal 'SELECT id FROM la'
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "should handle lazy attributes that are qualified in the selection" do
|
|
60
|
-
@c.set_dataset(@ds.select(Sequel[:la][:id], Sequel[:la][:blah]))
|
|
61
|
-
@c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
|
|
62
|
-
@c.plugin :lazy_attributes, :blah
|
|
63
|
-
@c.dataset.sql.must_equal 'SELECT la.id FROM la'
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
with_symbol_splitting "should handle lazy attributes that are qualified in the selection using symbol splitting" do
|
|
67
|
-
@c.set_dataset(@ds.select(:la__id, :la__blah))
|
|
68
|
-
@c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
|
|
69
|
-
@c.plugin :lazy_attributes, :blah
|
|
70
|
-
@c.dataset.sql.must_equal 'SELECT la.id FROM la'
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should remove the attributes given from the SELECT columns of the model's dataset" do
|
|
74
|
-
@ds.sql.must_equal 'SELECT la.id FROM la'
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should still typecast correctly in lazy loaded column setters" do
|
|
78
|
-
m = @c.new
|
|
79
|
-
m.name = 1
|
|
80
|
-
m.name.must_equal '1'
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should raise error if the model has no primary key" do
|
|
84
|
-
m = @c.first
|
|
85
|
-
@c.no_primary_key
|
|
86
|
-
proc{m.name}.must_raise(Sequel::Error)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should lazily load the attribute for a single model object" do
|
|
90
|
-
m = @c.first
|
|
91
|
-
m.values.must_equal(:id=>1)
|
|
92
|
-
m.name.must_equal '1'
|
|
93
|
-
m.values.must_equal(:id=>1, :name=>'1')
|
|
94
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "should lazily load the attribute for a frozen model object" do
|
|
98
|
-
m = @c.first
|
|
99
|
-
m.freeze
|
|
100
|
-
m.name.must_equal '1'
|
|
101
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
102
|
-
m.name.must_equal '1'
|
|
103
|
-
@db.sqls.must_equal ['SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "should not lazily load the attribute for a single model object if the value already exists" do
|
|
107
|
-
m = @c.first
|
|
108
|
-
m.values.must_equal(:id=>1)
|
|
109
|
-
m[:name] = '1'
|
|
110
|
-
m.name.must_equal '1'
|
|
111
|
-
m.values.must_equal(:id=>1, :name=>'1')
|
|
112
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1']
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should not lazily load the attribute for a single model object if it is a new record" do
|
|
116
|
-
m = @c.new
|
|
117
|
-
m.values.must_equal({})
|
|
118
|
-
m.name.must_be_nil
|
|
119
|
-
@db.sqls.must_equal []
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "should eagerly load the attribute for all model objects reteived with it" do
|
|
123
|
-
ms = @c.all
|
|
124
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
125
|
-
ms.map{|m| m.name}.must_equal %w'1 2'
|
|
126
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
127
|
-
sqls = @db.sqls
|
|
128
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
129
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
130
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "should not eagerly load the attribute if model instance is frozen, and deal with other frozen instances if not frozen" do
|
|
134
|
-
ms = @c.all
|
|
135
|
-
ms.first.freeze
|
|
136
|
-
ms.map{|m| m.name}.must_equal %w'1 2'
|
|
137
|
-
@db.sqls.must_equal ['SELECT la.id FROM la', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1', 'SELECT la.id, la.name FROM la WHERE (la.id IN (2))']
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
it "should add the accessors to a module included in the class, so they can be easily overridden" do
|
|
141
|
-
@c.class_eval do
|
|
142
|
-
def name
|
|
143
|
-
"#{super}-blah"
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
ms = @c.all
|
|
147
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
148
|
-
ms.map{|m| m.name}.must_equal %w'1-blah 2-blah'
|
|
149
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
150
|
-
sqls = @db.sqls
|
|
151
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
152
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
153
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it "should work with the serialization plugin" do
|
|
157
|
-
@c.plugin :serialization, :yaml, :name
|
|
158
|
-
@ds = @c.dataset = @ds.with_fetch([[{:id=>1}, {:id=>2}], [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}], [{:id=>1}], [{:name=>"--- 3\n"}]])
|
|
159
|
-
ms = @ds.all
|
|
160
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
161
|
-
ms.map{|m| m.name}.must_equal [3,6]
|
|
162
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}]
|
|
163
|
-
ms.map{|m| m.deserialized_values}.must_equal [{:name=>3}, {:name=>6}]
|
|
164
|
-
ms.map{|m| m.name}.must_equal [3,6]
|
|
165
|
-
sqls = @db.sqls
|
|
166
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
167
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
168
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
169
|
-
m = @ds.first
|
|
170
|
-
m.values.must_equal(:id=>1)
|
|
171
|
-
m.name.must_equal 3
|
|
172
|
-
m.values.must_equal(:id=>1, :name=>"--- 3\n")
|
|
173
|
-
m.deserialized_values.must_equal(:name=>3)
|
|
174
|
-
m.name.must_equal 3
|
|
175
|
-
@db.sqls.must_equal ["SELECT la.id FROM la LIMIT 1", "SELECT la.name FROM la WHERE (id = 1) LIMIT 1"]
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "should not allow additional lazy attributes after freezing" do
|
|
179
|
-
@c.plugin :lazy_attributes, :blah
|
|
180
|
-
@c.freeze
|
|
181
|
-
proc{@c.lazy_attributes :name}.must_raise RuntimeError, TypeError
|
|
182
|
-
end
|
|
183
|
-
end
|
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "List plugin" do
|
|
4
|
-
def klass(opts={})
|
|
5
|
-
@db = DB
|
|
6
|
-
c = Class.new(Sequel::Model(@db[:items]))
|
|
7
|
-
c.class_eval do
|
|
8
|
-
columns :id, :position, :scope_id, :pos
|
|
9
|
-
plugin :list, opts
|
|
10
|
-
self.use_transactions = false
|
|
11
|
-
end
|
|
12
|
-
c
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
before do
|
|
16
|
-
@c = klass
|
|
17
|
-
@o = @c.load(:id=>7, :position=>3)
|
|
18
|
-
@sc = klass(:scope=>:scope_id)
|
|
19
|
-
@so = @sc.load(:id=>7, :position=>3, :scope_id=>5)
|
|
20
|
-
@tc = klass(:top=>0)
|
|
21
|
-
@to = @tc.load(:id=>7, :position=>3)
|
|
22
|
-
@db.reset
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "should default to using :position as the position field" do
|
|
26
|
-
@c.position_field.must_equal :position
|
|
27
|
-
@c.new.list_dataset.sql.must_equal 'SELECT * FROM items ORDER BY position'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should accept a :field option to modify the position field" do
|
|
31
|
-
klass(:field=>:pos).position_field.must_equal :pos
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should accept a :scope option with a symbol for a single scope column" do
|
|
35
|
-
@sc.new(:scope_id=>4).list_dataset.sql.must_equal 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should accept a :scope option with an array of symbols for multiple scope columns" do
|
|
39
|
-
['SELECT * FROM items WHERE ((scope_id = 4) AND (pos = 3)) ORDER BY scope_id, pos, position',
|
|
40
|
-
'SELECT * FROM items WHERE ((pos = 3) AND (scope_id = 4)) ORDER BY scope_id, pos, position'].
|
|
41
|
-
must_include(klass(:scope=>[:scope_id, :pos]).new(:scope_id=>4, :pos=>3).list_dataset.sql)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should accept a :scope option with a proc for a custom list scope" do
|
|
45
|
-
klass(:scope=>proc{|o| o.model.dataset.filter(:active).filter(:scope_id=>o.scope_id)}).new(:scope_id=>4).list_dataset.sql.must_equal 'SELECT * FROM items WHERE (active AND (scope_id = 4)) ORDER BY position'
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "should default top of the list to 1" do
|
|
49
|
-
@c.top_of_list.must_equal 1
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should accept a :top option to set top of the list" do
|
|
53
|
-
@tc.top_of_list.must_equal 0
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "should modify the order when using the plugin" do
|
|
57
|
-
c = Class.new(Sequel::Model(:items))
|
|
58
|
-
c.dataset.sql.must_equal 'SELECT * FROM items'
|
|
59
|
-
c.plugin :list
|
|
60
|
-
c.dataset.sql.must_equal 'SELECT * FROM items ORDER BY position'
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should be able to access the position field as a class attribute" do
|
|
64
|
-
@c.position_field.must_equal :position
|
|
65
|
-
klass(:field=>:pos).position_field.must_equal :pos
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "should be able to access the scope proc as a class attribute" do
|
|
69
|
-
@c.scope_proc.must_be_nil
|
|
70
|
-
@sc.scope_proc[@sc.new(:scope_id=>4)].sql.must_equal 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should work correctly in subclasses" do
|
|
74
|
-
c = Class.new(klass(:scope=>:scope_id))
|
|
75
|
-
c.position_field.must_equal :position
|
|
76
|
-
c.scope_proc[c.new(:scope_id=>4)].sql.must_equal 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should have at_position return the model object at the given position" do
|
|
80
|
-
@c.dataset = @c.dataset.with_fetch(:id=>1, :position=>1)
|
|
81
|
-
@o.at_position(10).must_equal @c.load(:id=>1, :position=>1)
|
|
82
|
-
@sc.dataset = @sc.dataset.with_fetch(:id=>2, :position=>2, :scope_id=>5)
|
|
83
|
-
@so.at_position(20).must_equal @sc.load(:id=>2, :position=>2, :scope_id=>5)
|
|
84
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 10) ORDER BY position LIMIT 1",
|
|
85
|
-
"SELECT * FROM items WHERE ((scope_id = 5) AND (position = 20)) ORDER BY scope_id, position LIMIT 1"]
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should have position field set to max+1 when creating if not already set" do
|
|
89
|
-
@c.dataset = @c.dataset.with_autoid(1).with_fetch([[{:pos=>nil}], [{:id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :position=>2}]])
|
|
90
|
-
@c.create.values.must_equal(:id=>1, :position=>1)
|
|
91
|
-
@c.create.values.must_equal(:id=>2, :position=>2)
|
|
92
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
93
|
-
"INSERT INTO items (position) VALUES (1)",
|
|
94
|
-
"SELECT * FROM items WHERE (id = 1) ORDER BY position LIMIT 1",
|
|
95
|
-
"SELECT max(position) AS max FROM items LIMIT 1",
|
|
96
|
-
"INSERT INTO items (position) VALUES (2)",
|
|
97
|
-
"SELECT * FROM items WHERE (id = 2) ORDER BY position LIMIT 1"]
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "should have position field set to max+1 in scope when creating if not already set" do
|
|
101
|
-
@sc.dataset = @sc.dataset.with_autoid(1).with_fetch([[{:pos=>nil}], [{:id=>1, :scope_id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :scope_id=>1, :position=>2}], [{:pos=>nil}], [{:id=>3, :scope_id=>2, :position=>1}]])
|
|
102
|
-
@sc.create(:scope_id=>1).values.must_equal(:id=>1, :scope_id=>1, :position=>1)
|
|
103
|
-
@sc.create(:scope_id=>1).values.must_equal(:id=>2, :scope_id=>1, :position=>2)
|
|
104
|
-
@sc.create(:scope_id=>2).values.must_equal(:id=>3, :scope_id=>2, :position=>1)
|
|
105
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items WHERE (scope_id = 1) LIMIT 1",
|
|
106
|
-
'INSERT INTO items (scope_id, position) VALUES (1, 1)',
|
|
107
|
-
"SELECT * FROM items WHERE (id = 1) ORDER BY scope_id, position LIMIT 1",
|
|
108
|
-
"SELECT max(position) AS max FROM items WHERE (scope_id = 1) LIMIT 1",
|
|
109
|
-
'INSERT INTO items (scope_id, position) VALUES (1, 2)',
|
|
110
|
-
"SELECT * FROM items WHERE (id = 2) ORDER BY scope_id, position LIMIT 1",
|
|
111
|
-
"SELECT max(position) AS max FROM items WHERE (scope_id = 2) LIMIT 1",
|
|
112
|
-
'INSERT INTO items (scope_id, position) VALUES (2, 1)',
|
|
113
|
-
"SELECT * FROM items WHERE (id = 3) ORDER BY scope_id, position LIMIT 1"]
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "should update positions automatically on deletion" do
|
|
117
|
-
@o.destroy
|
|
118
|
-
@db.sqls.must_equal ["DELETE FROM items WHERE (id = 7)", "UPDATE items SET position = (position - 1) WHERE (position > 3)"]
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "should have last_position return the last position in the list" do
|
|
122
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
123
|
-
@o.last_position.must_equal 10
|
|
124
|
-
@sc.dataset = @sc.dataset.with_fetch(:max=>20)
|
|
125
|
-
@so.last_position.must_equal 20
|
|
126
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
127
|
-
"SELECT max(position) AS max FROM items WHERE (scope_id = 5) LIMIT 1"]
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
it "should have list_dataset return the model's dataset for non scoped lists" do
|
|
131
|
-
@o.list_dataset.sql.must_equal 'SELECT * FROM items ORDER BY position'
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
it "should have list dataset return a scoped dataset for scoped lists" do
|
|
135
|
-
@so.list_dataset.sql.must_equal 'SELECT * FROM items WHERE (scope_id = 5) ORDER BY scope_id, position'
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
it "should have move_down without an argument move down a single position" do
|
|
139
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
140
|
-
@o.move_down.must_equal @o
|
|
141
|
-
@o.position.must_equal 4
|
|
142
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
143
|
-
"UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))",
|
|
144
|
-
"UPDATE items SET position = 4 WHERE (id = 7)"]
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
it "should have move_down with an argument move down the given number of positions" do
|
|
148
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
149
|
-
@o.move_down(3).must_equal @o
|
|
150
|
-
@o.position.must_equal 6
|
|
151
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
152
|
-
"UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 6))",
|
|
153
|
-
"UPDATE items SET position = 6 WHERE (id = 7)"]
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it "should have move_down with a negative argument move up the given number of positions" do
|
|
157
|
-
@o.move_down(-1).must_equal @o
|
|
158
|
-
@o.position.must_equal 2
|
|
159
|
-
@db.sqls.must_equal ["UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
|
|
160
|
-
"UPDATE items SET position = 2 WHERE (id = 7)"]
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "should have move_to handle out of range targets" do
|
|
164
|
-
@o.move_to(0)
|
|
165
|
-
@o.position.must_equal 1
|
|
166
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
167
|
-
@o.move_to(11)
|
|
168
|
-
@o.position.must_equal 10
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
it "should have move_to use a transaction if the instance is configured to use transactions" do
|
|
172
|
-
@o.use_transactions = true
|
|
173
|
-
@o.move_to(2)
|
|
174
|
-
@db.sqls.must_equal ["BEGIN",
|
|
175
|
-
"UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
|
|
176
|
-
"UPDATE items SET position = 2 WHERE (id = 7)",
|
|
177
|
-
"COMMIT"]
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
it "should have move_to do nothing if the target position is the same as the current position" do
|
|
181
|
-
@o.use_transactions = true
|
|
182
|
-
@o.move_to(@o.position).must_equal @o
|
|
183
|
-
@o.position.must_equal 3
|
|
184
|
-
@db.sqls.must_equal []
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
it "should have move to shift entries correctly between current and target if moving up" do
|
|
188
|
-
@o.move_to(2)
|
|
189
|
-
@db.sqls.first.must_equal "UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))"
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
it "should have move to shift entries correctly between current and target if moving down" do
|
|
193
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
194
|
-
@o.move_to(4)
|
|
195
|
-
@db.sqls[1].must_equal "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))"
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it "should have move_to_bottom move the item to the last position" do
|
|
199
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
200
|
-
@o.move_to_bottom
|
|
201
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
202
|
-
"UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 10))",
|
|
203
|
-
"UPDATE items SET position = 10 WHERE (id = 7)"]
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
it "should have move_to_top move the item to the first position" do
|
|
207
|
-
@o.move_to_top
|
|
208
|
-
@db.sqls.must_equal ["UPDATE items SET position = (position + 1) WHERE ((position >= 1) AND (position < 3))",
|
|
209
|
-
"UPDATE items SET position = 1 WHERE (id = 7)"]
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
it "should have move_to_top use position 0 when :top_of_list is 0" do
|
|
213
|
-
@to.move_to_top
|
|
214
|
-
@db.sqls.must_equal ["UPDATE items SET position = (position + 1) WHERE ((position >= 0) AND (position < 3))",
|
|
215
|
-
"UPDATE items SET position = 0 WHERE (id = 7)"]
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
it "should have move_up without an argument move up a single position" do
|
|
219
|
-
@o.move_up.must_equal @o
|
|
220
|
-
@o.position.must_equal 2
|
|
221
|
-
@db.sqls.must_equal ["UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
|
|
222
|
-
"UPDATE items SET position = 2 WHERE (id = 7)"]
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
it "should have move_up with an argument move up the given number of positions" do
|
|
226
|
-
@o.move_up(2).must_equal @o
|
|
227
|
-
@o.position.must_equal 1
|
|
228
|
-
@db.sqls.must_equal ["UPDATE items SET position = (position + 1) WHERE ((position >= 1) AND (position < 3))",
|
|
229
|
-
"UPDATE items SET position = 1 WHERE (id = 7)"]
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
it "should have move_up with a negative argument move down the given number of positions" do
|
|
233
|
-
@c.dataset = @c.dataset.with_fetch(:max=>10)
|
|
234
|
-
@o.move_up(-1).must_equal @o
|
|
235
|
-
@o.position.must_equal 4
|
|
236
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1",
|
|
237
|
-
"UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))",
|
|
238
|
-
"UPDATE items SET position = 4 WHERE (id = 7)"]
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
it "should have next return the next entry in the list if not given an argument" do
|
|
242
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>4)
|
|
243
|
-
@o.next.must_equal @c.load(:id=>9, :position=>4)
|
|
244
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
it "should have next return the entry the given number of positions below the instance if given an argument" do
|
|
248
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>5)
|
|
249
|
-
@o.next(2).must_equal @c.load(:id=>9, :position=>5)
|
|
250
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 5) ORDER BY position LIMIT 1"]
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "should have next return a previous entry if given a negative argument" do
|
|
254
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>2)
|
|
255
|
-
@o.next(-1).must_equal @c.load(:id=>9, :position=>2)
|
|
256
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it "should have position_value return the value of the position field" do
|
|
260
|
-
@o.position_value.must_equal 3
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
it "should have prev return the previous entry in the list if not given an argument" do
|
|
264
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>2)
|
|
265
|
-
@o.prev.must_equal @c.load(:id=>9, :position=>2)
|
|
266
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "should have prev return the entry the given number of positions above the instance if given an argument" do
|
|
270
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>1)
|
|
271
|
-
@o.prev(2).must_equal @c.load(:id=>9, :position=>1)
|
|
272
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 1) ORDER BY position LIMIT 1"]
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
it "should have prev return a following entry if given a negative argument" do
|
|
276
|
-
@c.dataset = @c.dataset.with_fetch(:id=>9, :position=>4)
|
|
277
|
-
@o.prev(-1).must_equal @c.load(:id=>9, :position=>4)
|
|
278
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it "should work correctly with validation on position" do
|
|
282
|
-
@c.class_eval do
|
|
283
|
-
def validate
|
|
284
|
-
super
|
|
285
|
-
errors.add(:position, "not set") unless position
|
|
286
|
-
end
|
|
287
|
-
end
|
|
288
|
-
@c.create
|
|
289
|
-
@db.sqls.must_equal ["SELECT max(position) AS max FROM items LIMIT 1", "INSERT INTO items (position) VALUES (2)", "SELECT * FROM items WHERE (id = 10) ORDER BY position LIMIT 1"]
|
|
290
|
-
end
|
|
291
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "LooserTypecasting Extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock
|
|
6
|
-
def @db.supports_schema_parsing?() true end
|
|
7
|
-
def @db.schema(*args)
|
|
8
|
-
[[:id, {}], [:z, {:type=>:float}], [:b, {:type=>:integer}], [:d, {:type=>:decimal}], [:s, {:type=>:string}]]
|
|
9
|
-
end
|
|
10
|
-
@c = Class.new(Sequel::Model(@db[:items]))
|
|
11
|
-
@db.extension(:looser_typecasting)
|
|
12
|
-
@c.instance_eval do
|
|
13
|
-
@columns = [:id, :b, :z, :d, :s]
|
|
14
|
-
def columns; @columns; end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should not raise errors for invalid strings in integer columns" do
|
|
19
|
-
@c.new(:b=>'a').b.must_equal 0
|
|
20
|
-
@c.new(:b=>'a').b.must_be_kind_of(Integer)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "should not raise errors for invalid strings in float columns" do
|
|
24
|
-
@c.new(:z=>'a').z.must_equal 0.0
|
|
25
|
-
@c.new(:z=>'a').z.must_be_kind_of(Float)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "should not raise errors for hash or array input to string columns" do
|
|
29
|
-
@c.new(:s=>'a').s.must_equal 'a'
|
|
30
|
-
@c.new(:s=>[]).s.must_be_kind_of(String)
|
|
31
|
-
@c.new(:s=>{}).s.must_be_kind_of(String)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should not raise errors for invalid strings in decimal columns" do
|
|
35
|
-
@c.new(:d=>'a').d.must_equal 0.0
|
|
36
|
-
@c.new(:d=>'a').d.must_be_kind_of(BigDecimal)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should not affect conversions of other types in decimal columns" do
|
|
40
|
-
@c.new(:d=>1).d.must_equal 1
|
|
41
|
-
@c.new(:d=>1).d.must_be_kind_of(BigDecimal)
|
|
42
|
-
end
|
|
43
|
-
end
|