sequel 4.36.0 → 5.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -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/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.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.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/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 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- 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/spec_config.rb +0 -10
data/spec/model/model_spec.rb
DELETED
@@ -1,1097 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
|
-
|
3
|
-
describe "Sequel::Model()" do
|
4
|
-
before do
|
5
|
-
@db = Sequel::Model.db
|
6
|
-
end
|
7
|
-
|
8
|
-
it "should return a model subclass with the given dataset if given a dataset" do
|
9
|
-
ds = @db[:blah]
|
10
|
-
c = Sequel::Model(ds)
|
11
|
-
c.superclass.must_equal Sequel::Model
|
12
|
-
c.dataset.must_equal ds
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
|
16
|
-
c = Sequel::Model(:blah)
|
17
|
-
c.superclass.must_equal Sequel::Model
|
18
|
-
c.db.must_equal @db
|
19
|
-
c.table_name.must_equal :blah
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
|
23
|
-
c = Sequel::Model(Sequel.lit('blah'))
|
24
|
-
c.superclass.must_equal Sequel::Model
|
25
|
-
c.db.must_equal @db
|
26
|
-
c.table_name.must_equal Sequel.lit('blah')
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
|
30
|
-
c = Sequel::Model(Sequel.identifier(:blah))
|
31
|
-
c.superclass.must_equal Sequel::Model
|
32
|
-
c.db.must_equal @db
|
33
|
-
c.table_name.must_equal Sequel.identifier(:blah)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
|
37
|
-
c = Sequel::Model(Sequel.qualify(:boo, :blah))
|
38
|
-
c.superclass.must_equal Sequel::Model
|
39
|
-
c.db.must_equal @db
|
40
|
-
c.table_name.must_equal Sequel.qualify(:boo, :blah)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
|
44
|
-
c = Sequel::Model(Sequel.as(:blah, :boo))
|
45
|
-
c.superclass.must_equal Sequel::Model
|
46
|
-
c.db.must_equal @db
|
47
|
-
c.table_name.must_equal :boo
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
|
51
|
-
ds = @db[Sequel.identifier(:blah)]
|
52
|
-
c = Sequel::Model(ds)
|
53
|
-
c.superclass.must_equal Sequel::Model
|
54
|
-
c.dataset.must_equal ds
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should be callable on Sequel::Model" do
|
58
|
-
ds = @db[:blah]
|
59
|
-
c = Sequel::Model::Model(ds)
|
60
|
-
c.superclass.must_equal Sequel::Model
|
61
|
-
c.dataset.must_equal ds
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should be callable on subclasses of Sequel::Model" do
|
65
|
-
ds = @db[:blah]
|
66
|
-
c = Class.new(Sequel::Model)
|
67
|
-
sc = c::Model(ds)
|
68
|
-
sc.superclass.must_equal c
|
69
|
-
sc.dataset.must_equal ds
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should be callable on other modules if def_Model is used" do
|
73
|
-
m = Module.new
|
74
|
-
Sequel::Model.def_Model(m)
|
75
|
-
ds = @db[:blah]
|
76
|
-
c = m::Model(ds)
|
77
|
-
c.superclass.must_equal Sequel::Model
|
78
|
-
c.dataset.must_equal ds
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should be callable using model subclasses on other modules if def_Model is used" do
|
82
|
-
m = Module.new
|
83
|
-
c = Class.new(Sequel::Model)
|
84
|
-
c.def_Model(m)
|
85
|
-
ds = @db[:blah]
|
86
|
-
sc = m::Model(ds)
|
87
|
-
sc.superclass.must_equal c
|
88
|
-
sc.dataset.must_equal ds
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should return a model subclass associated to the given database if given a database" do
|
92
|
-
db = Sequel.mock
|
93
|
-
c = Sequel::Model(db)
|
94
|
-
c.superclass.must_equal Sequel::Model
|
95
|
-
c.db.must_equal db
|
96
|
-
proc{c.dataset}.must_raise(Sequel::Error)
|
97
|
-
class SmBlahTest < c
|
98
|
-
end
|
99
|
-
SmBlahTest.db.must_equal db
|
100
|
-
SmBlahTest.table_name.must_equal :sm_blah_tests
|
101
|
-
end
|
102
|
-
|
103
|
-
describe "reloading" do
|
104
|
-
before do
|
105
|
-
Sequel.cache_anonymous_models = true
|
106
|
-
end
|
107
|
-
after do
|
108
|
-
Sequel.cache_anonymous_models = false
|
109
|
-
Object.send(:remove_const, :Album) if defined?(::Album)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should work without raising an exception with a symbol" do
|
113
|
-
class ::Album < Sequel::Model(:table); end
|
114
|
-
class ::Album < Sequel::Model(:table); end
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should work without raising an exception with an SQL::Identifier " do
|
118
|
-
class ::Album < Sequel::Model(Sequel.identifier(:table)); end
|
119
|
-
class ::Album < Sequel::Model(Sequel.identifier(:table)); end
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should work without raising an exception with an SQL::QualifiedIdentifier " do
|
123
|
-
class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
|
124
|
-
class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should work without raising an exception with an SQL::AliasedExpression" do
|
128
|
-
class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
|
129
|
-
class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
|
130
|
-
end
|
131
|
-
|
132
|
-
it "should work without raising an exception with an LiteralString" do
|
133
|
-
class ::Album < Sequel::Model(Sequel.lit('table')); end
|
134
|
-
class ::Album < Sequel::Model(Sequel.lit('table')); end
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should work without raising an exception with a database" do
|
138
|
-
class ::Album < Sequel::Model(@db); end
|
139
|
-
class ::Album < Sequel::Model(@db); end
|
140
|
-
end
|
141
|
-
|
142
|
-
it "should work without raising an exception with a dataset" do
|
143
|
-
class ::Album < Sequel::Model(@db[:table]); end
|
144
|
-
class ::Album < Sequel::Model(@db[:table]); end
|
145
|
-
end
|
146
|
-
|
147
|
-
it "should work without raising an exception with a dataset with an SQL::Identifier" do
|
148
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
149
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
150
|
-
end
|
151
|
-
|
152
|
-
it "should raise an exception if anonymous model caching is disabled" do
|
153
|
-
Sequel.cache_anonymous_models = false
|
154
|
-
proc do
|
155
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
156
|
-
class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
|
157
|
-
end.must_raise TypeError
|
158
|
-
end
|
159
|
-
|
160
|
-
it "should use separate cache and cache settings for subclasses" do
|
161
|
-
c = Class.new(Sequel::Model)
|
162
|
-
c.cache_anonymous_models.must_equal true
|
163
|
-
class ::Album < c::Model(:table); end
|
164
|
-
class ::Album < c::Model(:table); end
|
165
|
-
|
166
|
-
c1 = c::Model(:t1)
|
167
|
-
c1.must_equal c::Model(:t1)
|
168
|
-
c1.wont_equal Sequel::Model(:t1)
|
169
|
-
|
170
|
-
c.cache_anonymous_models = false
|
171
|
-
Sequel::Model.cache_anonymous_models.must_equal true
|
172
|
-
c1.wont_equal c::Model(:t1)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
describe Sequel::Model do
|
178
|
-
it "should have class method aliased as model" do
|
179
|
-
Sequel::Model.instance_methods.collect{|x| x.to_s}.must_include("model")
|
180
|
-
|
181
|
-
model_a = Class.new(Sequel::Model(:items))
|
182
|
-
model_a.new.model.wont_be_nil
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should be associated with a dataset" do
|
186
|
-
model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
|
187
|
-
|
188
|
-
model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
|
189
|
-
model_a.dataset.opts[:from].must_equal [:as]
|
190
|
-
|
191
|
-
model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
|
192
|
-
|
193
|
-
model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
|
194
|
-
model_b.dataset.opts[:from].must_equal [:bs]
|
195
|
-
|
196
|
-
model_a.dataset.opts[:from].must_equal [:as]
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
describe Sequel::Model do
|
201
|
-
before do
|
202
|
-
@model = Class.new(Sequel::Model(:items))
|
203
|
-
DB.reset
|
204
|
-
end
|
205
|
-
|
206
|
-
it "has table_name return name of table" do
|
207
|
-
@model.table_name.must_equal :items
|
208
|
-
end
|
209
|
-
|
210
|
-
it "defaults to primary key of id" do
|
211
|
-
@model.primary_key.must_equal :id
|
212
|
-
end
|
213
|
-
|
214
|
-
it "allow primary key change" do
|
215
|
-
@model.set_primary_key :ssn
|
216
|
-
@model.primary_key.must_equal :ssn
|
217
|
-
end
|
218
|
-
|
219
|
-
it "allows dataset change" do
|
220
|
-
@model.set_dataset(DB[:foo])
|
221
|
-
@model.table_name.must_equal :foo
|
222
|
-
end
|
223
|
-
|
224
|
-
it "allows set_dataset to accept a Symbol" do
|
225
|
-
@model.db = DB
|
226
|
-
@model.set_dataset(:foo)
|
227
|
-
@model.table_name.must_equal :foo
|
228
|
-
end
|
229
|
-
|
230
|
-
it "allows set_dataset to accept a LiteralString" do
|
231
|
-
@model.db = DB
|
232
|
-
@model.set_dataset(Sequel.lit('foo'))
|
233
|
-
@model.table_name.must_equal Sequel.lit('foo')
|
234
|
-
end
|
235
|
-
|
236
|
-
it "allows set_dataset to acceptan SQL::Identifier" do
|
237
|
-
@model.db = DB
|
238
|
-
@model.set_dataset(Sequel.identifier(:foo))
|
239
|
-
@model.table_name.must_equal Sequel.identifier(:foo)
|
240
|
-
end
|
241
|
-
|
242
|
-
it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
|
243
|
-
@model.db = DB
|
244
|
-
@model.set_dataset(Sequel.qualify(:bar, :foo))
|
245
|
-
@model.table_name.must_equal Sequel.qualify(:bar, :foo)
|
246
|
-
end
|
247
|
-
|
248
|
-
it "allows set_dataset to acceptan SQL::AliasedExpression" do
|
249
|
-
@model.db = DB
|
250
|
-
@model.set_dataset(Sequel.as(:foo, :bar))
|
251
|
-
@model.table_name.must_equal :bar
|
252
|
-
end
|
253
|
-
|
254
|
-
it "table_name should respect table aliases" do
|
255
|
-
@model.set_dataset(:foo___x)
|
256
|
-
@model.table_name.must_equal :x
|
257
|
-
end
|
258
|
-
|
259
|
-
it "set_dataset should raise an error unless given a Symbol or Dataset" do
|
260
|
-
proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
|
261
|
-
end
|
262
|
-
|
263
|
-
it "set_dataset should add the destroy method to the dataset that destroys each object" do
|
264
|
-
ds = DB[:foo]
|
265
|
-
ds.wont_respond_to(:destroy)
|
266
|
-
@model.set_dataset(ds)
|
267
|
-
ds.must_respond_to(:destroy)
|
268
|
-
DB.sqls
|
269
|
-
ds._fetch = [{:id=>1}, {:id=>2}]
|
270
|
-
ds.destroy.must_equal 2
|
271
|
-
DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
|
272
|
-
end
|
273
|
-
|
274
|
-
it "set_dataset should add the destroy method that respects sharding with transactions" do
|
275
|
-
db = Sequel.mock(:servers=>{:s1=>{}})
|
276
|
-
ds = db[:foo].server(:s1)
|
277
|
-
@model.use_transactions = true
|
278
|
-
@model.set_dataset(ds)
|
279
|
-
db.sqls
|
280
|
-
ds.destroy.must_equal 0
|
281
|
-
db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should raise an error on set_dataset if there is an error connecting to the database" do
|
285
|
-
def @model.columns() raise Sequel::DatabaseConnectionError end
|
286
|
-
proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah))}.must_raise Sequel::DatabaseConnectionError
|
287
|
-
end
|
288
|
-
|
289
|
-
it "should not raise an error if there is a problem getting the columns for a dataset" do
|
290
|
-
def @model.columns() raise Sequel::Error end
|
291
|
-
@model.set_dataset(DB[:foo].join(:blah))
|
292
|
-
end
|
293
|
-
|
294
|
-
it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
|
295
|
-
db = Sequel.mock
|
296
|
-
def db.schema(*) raise Sequel::Error; end
|
297
|
-
@model.set_dataset(db[:foo])
|
298
|
-
end
|
299
|
-
|
300
|
-
it "reload_db_schema? should be false by default" do
|
301
|
-
c = Class.new
|
302
|
-
c.extend Sequel::Model::ClassMethods
|
303
|
-
c.send(:reload_db_schema?).must_equal false
|
304
|
-
end
|
305
|
-
|
306
|
-
it "doesn't raise an error on inherited if there is an error setting the dataset" do
|
307
|
-
db = Sequel.mock
|
308
|
-
def db.schema(*) raise Sequel::Error; end
|
309
|
-
@model.db = db
|
310
|
-
Class.new(@model)
|
311
|
-
end
|
312
|
-
|
313
|
-
it "uses a savepoint if inside a transaction when getting the columns" do
|
314
|
-
db = Sequel.mock
|
315
|
-
def db.supports_savepoints?; true end
|
316
|
-
Sequel::Model(db[:table])
|
317
|
-
db.sqls.must_equal ["SELECT * FROM table LIMIT 1"]
|
318
|
-
c = db.transaction{Sequel::Model(db[:table])}
|
319
|
-
db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "SELECT * FROM table LIMIT 1", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
|
320
|
-
end
|
321
|
-
|
322
|
-
it "should raise if bad inherited instance variable value is used" do
|
323
|
-
def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
|
324
|
-
@model.instance_eval{@a=1}
|
325
|
-
proc{Class.new(@model)}.must_raise(Sequel::Error)
|
326
|
-
end
|
327
|
-
|
328
|
-
it "copy inherited instance variables into subclass if set" do
|
329
|
-
def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
|
330
|
-
@model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
|
331
|
-
m = Class.new(@model)
|
332
|
-
@model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
|
333
|
-
m.instance_eval do
|
334
|
-
@a.must_equal 1
|
335
|
-
@b.must_equal [2]
|
336
|
-
@c.must_equal(3=>[4])
|
337
|
-
@d.must_equal 20
|
338
|
-
end
|
339
|
-
end
|
340
|
-
end
|
341
|
-
|
342
|
-
describe Sequel::Model, ".require_valid_table = true" do
|
343
|
-
before do
|
344
|
-
@db = Sequel.mock
|
345
|
-
@db.columns = proc do |sql|
|
346
|
-
raise Sequel::Error if sql =~ /foos/
|
347
|
-
[:id]
|
348
|
-
end
|
349
|
-
def @db.supports_schema_parsing?; true end
|
350
|
-
def @db.schema(t, *) t.first_source == :foos ? (raise Sequel::Error) : [[:id, {}]] end
|
351
|
-
Sequel::Model.db = @db
|
352
|
-
Sequel::Model.require_valid_table = true
|
353
|
-
end
|
354
|
-
after do
|
355
|
-
Sequel::Model.require_valid_table = false
|
356
|
-
Sequel::Model.db = DB
|
357
|
-
if Object.const_defined?(:Bar)
|
358
|
-
Object.send(:remove_const, :Bar)
|
359
|
-
end
|
360
|
-
if Object.const_defined?(:Foo)
|
361
|
-
Object.send(:remove_const, :Foo)
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
it "should raise an exception when creating a model with an invalid implicit table" do
|
366
|
-
proc{class ::Foo < Sequel::Model; end}.must_raise Sequel::Error
|
367
|
-
end
|
368
|
-
|
369
|
-
it "should not raise an exception when creating a model with a valid implicit table" do
|
370
|
-
class ::Bar < Sequel::Model; end
|
371
|
-
Bar.columns.must_equal [:id]
|
372
|
-
end
|
373
|
-
|
374
|
-
it "should raise an exception when creating a model with an invalid explicit table" do
|
375
|
-
proc{Sequel::Model(@db[:foos])}.must_raise Sequel::Error
|
376
|
-
end
|
377
|
-
|
378
|
-
it "should not raise an exception when creating a model with a valid explicit table" do
|
379
|
-
c = Sequel::Model(@db[:bars])
|
380
|
-
c.columns.must_equal [:id]
|
381
|
-
end
|
382
|
-
|
383
|
-
it "should raise an exception when calling set_dataset with an invalid table" do
|
384
|
-
c = Class.new(Sequel::Model)
|
385
|
-
proc{c.set_dataset @db[:foos]}.must_raise Sequel::Error
|
386
|
-
end
|
387
|
-
|
388
|
-
it "should not raise an exception when calling set_dataset with an valid table" do
|
389
|
-
c = Class.new(Sequel::Model)
|
390
|
-
c.set_dataset @db[:bars]
|
391
|
-
c.columns.must_equal [:id]
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
describe Sequel::Model, "constructors" do
|
396
|
-
before do
|
397
|
-
@m = Class.new(Sequel::Model)
|
398
|
-
@m.columns :a, :b
|
399
|
-
end
|
400
|
-
|
401
|
-
it "should accept a hash" do
|
402
|
-
m = @m.new(:a => 1, :b => 2)
|
403
|
-
m.values.must_equal(:a => 1, :b => 2)
|
404
|
-
m.must_be :new?
|
405
|
-
end
|
406
|
-
|
407
|
-
it "should accept a block and yield itself to the block" do
|
408
|
-
block_called = false
|
409
|
-
m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
|
410
|
-
|
411
|
-
block_called.must_equal true
|
412
|
-
m.values[:a].must_equal 1
|
413
|
-
end
|
414
|
-
|
415
|
-
it "should have dataset row_proc create an existing object" do
|
416
|
-
@m.dataset = Sequel.mock.dataset
|
417
|
-
o = @m.dataset.row_proc.call(:a=>1)
|
418
|
-
o.must_be_kind_of(@m)
|
419
|
-
o.values.must_equal(:a=>1)
|
420
|
-
o.new?.must_equal false
|
421
|
-
end
|
422
|
-
|
423
|
-
it "should have .call create an existing object" do
|
424
|
-
o = @m.call(:a=>1)
|
425
|
-
o.must_be_kind_of(@m)
|
426
|
-
o.values.must_equal(:a=>1)
|
427
|
-
o.new?.must_equal false
|
428
|
-
end
|
429
|
-
|
430
|
-
it "should have .load create an existing object" do
|
431
|
-
o = @m.load(:a=>1)
|
432
|
-
o.must_be_kind_of(@m)
|
433
|
-
o.values.must_equal(:a=>1)
|
434
|
-
o.new?.must_equal false
|
435
|
-
end
|
436
|
-
end
|
437
|
-
|
438
|
-
describe Sequel::Model, "new" do
|
439
|
-
before do
|
440
|
-
@m = Class.new(Sequel::Model) do
|
441
|
-
set_dataset DB[:items]
|
442
|
-
columns :x, :id
|
443
|
-
end
|
444
|
-
end
|
445
|
-
|
446
|
-
it "should be marked as new?" do
|
447
|
-
o = @m.new
|
448
|
-
o.must_be :new?
|
449
|
-
end
|
450
|
-
|
451
|
-
it "should not be marked as new? once it is saved" do
|
452
|
-
o = @m.new(:x => 1)
|
453
|
-
o.must_be :new?
|
454
|
-
o.save
|
455
|
-
o.wont_be :new?
|
456
|
-
end
|
457
|
-
|
458
|
-
it "should use the last inserted id as primary key if not in values" do
|
459
|
-
@m.instance_dataset._fetch = @m.dataset._fetch = {:x => 1, :id => 1234}
|
460
|
-
@m.instance_dataset.autoid = @m.dataset.autoid = 1234
|
461
|
-
|
462
|
-
o = @m.new(:x => 1)
|
463
|
-
o.save
|
464
|
-
o.id.must_equal 1234
|
465
|
-
|
466
|
-
o = @m.load(:x => 1, :id => 333)
|
467
|
-
o.save
|
468
|
-
o.id.must_equal 333
|
469
|
-
end
|
470
|
-
end
|
471
|
-
|
472
|
-
describe Sequel::Model, ".subset" do
|
473
|
-
before do
|
474
|
-
@c = Class.new(Sequel::Model(:items))
|
475
|
-
DB.reset
|
476
|
-
end
|
477
|
-
|
478
|
-
it "should create a filter on the underlying dataset" do
|
479
|
-
proc {@c.new_only}.must_raise(NoMethodError)
|
480
|
-
|
481
|
-
@c.subset(:new_only){age < 'new'}
|
482
|
-
|
483
|
-
@c.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
|
484
|
-
@c.dataset.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
|
485
|
-
|
486
|
-
@c.subset(:pricey){price > 100}
|
487
|
-
|
488
|
-
@c.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
|
489
|
-
@c.dataset.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
|
490
|
-
|
491
|
-
@c.pricey.new_only.sql.must_equal "SELECT * FROM items WHERE ((price > 100) AND (age < 'new'))"
|
492
|
-
@c.new_only.pricey.sql.must_equal "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
|
493
|
-
end
|
494
|
-
|
495
|
-
it "should not override existing model methods" do
|
496
|
-
def @c.active() true end
|
497
|
-
@c.subset(:active, :active)
|
498
|
-
@c.active.must_equal true
|
499
|
-
end
|
500
|
-
end
|
501
|
-
|
502
|
-
describe Sequel::Model, ".find" do
|
503
|
-
before do
|
504
|
-
@c = Class.new(Sequel::Model(:items))
|
505
|
-
@c.dataset._fetch = {:name => 'sharon', :id => 1}
|
506
|
-
DB.reset
|
507
|
-
end
|
508
|
-
|
509
|
-
it "should return the first record matching the given filter" do
|
510
|
-
@c.find(:name => 'sharon').must_be_kind_of(@c)
|
511
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
|
512
|
-
|
513
|
-
@c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
|
514
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
|
515
|
-
end
|
516
|
-
|
517
|
-
it "should accept filter blocks" do
|
518
|
-
@c.find{id > 1}.must_be_kind_of(@c)
|
519
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
|
520
|
-
|
521
|
-
@c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
|
522
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
|
523
|
-
end
|
524
|
-
end
|
525
|
-
|
526
|
-
describe Sequel::Model, ".finder" do
|
527
|
-
before do
|
528
|
-
@h = {:id=>1}
|
529
|
-
@db = Sequel.mock(:fetch=>@h)
|
530
|
-
@c = Class.new(Sequel::Model(@db[:items]))
|
531
|
-
@c.instance_eval do
|
532
|
-
def foo(a, b)
|
533
|
-
where(:bar=>a).order(b)
|
534
|
-
end
|
535
|
-
end
|
536
|
-
@o = @c.load(@h)
|
537
|
-
@db.sqls
|
538
|
-
end
|
539
|
-
|
540
|
-
it "should create a method that calls the method given and returns the first instance" do
|
541
|
-
@c.finder :foo
|
542
|
-
@c.first_foo(1, 2).must_equal @o
|
543
|
-
@c.first_foo(3, 4).must_equal @o
|
544
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
|
545
|
-
end
|
546
|
-
|
547
|
-
it "should work correctly when subclassing" do
|
548
|
-
@c.finder(:foo)
|
549
|
-
@sc = Class.new(@c)
|
550
|
-
@sc.set_dataset :foos
|
551
|
-
@db.sqls
|
552
|
-
@sc.first_foo(1, 2).must_equal @sc.load(@h)
|
553
|
-
@sc.first_foo(3, 4).must_equal @sc.load(@h)
|
554
|
-
@db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
|
555
|
-
end
|
556
|
-
|
557
|
-
it "should work correctly when dataset is modified" do
|
558
|
-
@c.finder(:foo)
|
559
|
-
@c.first_foo(1, 2).must_equal @o
|
560
|
-
@c.set_dataset :foos
|
561
|
-
@c.first_foo(3, 4).must_equal @o
|
562
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
|
563
|
-
end
|
564
|
-
|
565
|
-
it "should create a method based on the given block if no method symbol provided" do
|
566
|
-
@c.finder(:name=>:first_foo){|pl, ds| ds.where(pl.arg).limit(1)}
|
567
|
-
@c.first_foo(:id=>1).must_equal @o
|
568
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1"]
|
569
|
-
end
|
570
|
-
|
571
|
-
it "should raise an error if both a block and method symbol given" do
|
572
|
-
proc{@c.finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
|
573
|
-
end
|
574
|
-
|
575
|
-
it "should raise an error if two option hashes are provided" do
|
576
|
-
proc{@c.finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
|
577
|
-
end
|
578
|
-
|
579
|
-
it "should support :type option" do
|
580
|
-
@c.finder :foo, :type=>:all
|
581
|
-
@c.finder :foo, :type=>:each
|
582
|
-
@c.finder :foo, :type=>:get
|
583
|
-
|
584
|
-
a = []
|
585
|
-
@c.all_foo(1, 2){|r| a << r}.must_equal [@o]
|
586
|
-
a.must_equal [@o]
|
587
|
-
|
588
|
-
a = []
|
589
|
-
@c.each_foo(3, 4){|r| a << r}
|
590
|
-
a.must_equal [@o]
|
591
|
-
|
592
|
-
@c.get_foo(5, 6).must_equal 1
|
593
|
-
|
594
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4", "SELECT * FROM items WHERE (bar = 5) ORDER BY 6 LIMIT 1"]
|
595
|
-
end
|
596
|
-
|
597
|
-
it "should support :name option" do
|
598
|
-
@c.finder :foo, :name=>:find_foo
|
599
|
-
@c.find_foo(1, 2).must_equal @o
|
600
|
-
@c.find_foo(3, 4).must_equal @o
|
601
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
|
602
|
-
end
|
603
|
-
|
604
|
-
it "should support :arity option" do
|
605
|
-
def @c.foobar(*b)
|
606
|
-
ds = dataset
|
607
|
-
b.each_with_index do |a, i|
|
608
|
-
ds = ds.where(i=>a)
|
609
|
-
end
|
610
|
-
ds
|
611
|
-
end
|
612
|
-
@c.finder :foobar, :arity=>1, :name=>:find_foobar_1
|
613
|
-
@c.finder :foobar, :arity=>2, :name=>:find_foobar_2
|
614
|
-
@c.find_foobar_1(:a)
|
615
|
-
@c.find_foobar_2(:a, :b)
|
616
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1"]
|
617
|
-
end
|
618
|
-
|
619
|
-
it "should support :mod option" do
|
620
|
-
m = Module.new
|
621
|
-
@c.finder :foo, :mod=>m
|
622
|
-
proc{@c.first_foo}.must_raise NoMethodError
|
623
|
-
@c.extend m
|
624
|
-
@c.first_foo(1, 2).must_equal @o
|
625
|
-
@c.first_foo(3, 4).must_equal @o
|
626
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
|
627
|
-
end
|
628
|
-
|
629
|
-
it "should raise error when calling with the wrong arity" do
|
630
|
-
@c.finder :foo
|
631
|
-
proc{@c.first_foo(1)}.must_raise Sequel::Error
|
632
|
-
proc{@c.first_foo(1,2,3)}.must_raise Sequel::Error
|
633
|
-
end
|
634
|
-
end
|
635
|
-
|
636
|
-
describe Sequel::Model, ".prepared_finder" do
|
637
|
-
before do
|
638
|
-
@h = {:id=>1}
|
639
|
-
@db = Sequel.mock(:fetch=>@h)
|
640
|
-
@db.extend_datasets do
|
641
|
-
def select_sql
|
642
|
-
sql = super
|
643
|
-
sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
|
644
|
-
sql
|
645
|
-
end
|
646
|
-
end
|
647
|
-
@c = Class.new(Sequel::Model(@db[:items]))
|
648
|
-
@c.instance_eval do
|
649
|
-
def foo(a, b)
|
650
|
-
where(:bar=>a).order(b)
|
651
|
-
end
|
652
|
-
end
|
653
|
-
@o = @c.load(@h)
|
654
|
-
@db.sqls
|
655
|
-
end
|
656
|
-
|
657
|
-
it "should create a method that calls the method given and returns the first instance" do
|
658
|
-
@c.prepared_finder :foo
|
659
|
-
@c.first_foo(1, 2).must_equal @o
|
660
|
-
@c.first_foo(3, 4).must_equal @o
|
661
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
|
662
|
-
end
|
663
|
-
|
664
|
-
it "should work correctly when subclassing" do
|
665
|
-
@c.prepared_finder(:foo)
|
666
|
-
@sc = Class.new(@c)
|
667
|
-
@sc.set_dataset :foos
|
668
|
-
@db.sqls
|
669
|
-
@sc.first_foo(1, 2).must_equal @sc.load(@h)
|
670
|
-
@sc.first_foo(3, 4).must_equal @sc.load(@h)
|
671
|
-
@db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
|
672
|
-
end
|
673
|
-
|
674
|
-
it "should work correctly when dataset is modified" do
|
675
|
-
@c.prepared_finder(:foo)
|
676
|
-
@c.first_foo(1, 2).must_equal @o
|
677
|
-
@c.set_dataset :foos
|
678
|
-
@c.first_foo(3, 4).must_equal @o
|
679
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
|
680
|
-
end
|
681
|
-
|
682
|
-
it "should create a method based on the given block if no method symbol provided" do
|
683
|
-
@c.prepared_finder(:name=>:first_foo){|a1| where(:id=>a1).limit(1)}
|
684
|
-
@c.first_foo(1).must_equal @o
|
685
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1 -- prepared"]
|
686
|
-
end
|
687
|
-
|
688
|
-
it "should raise an error if both a block and method symbol given" do
|
689
|
-
proc{@c.prepared_finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
|
690
|
-
end
|
691
|
-
|
692
|
-
it "should raise an error if two option hashes are provided" do
|
693
|
-
proc{@c.prepared_finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
|
694
|
-
end
|
695
|
-
|
696
|
-
it "should support :type option" do
|
697
|
-
@c.prepared_finder :foo, :type=>:all
|
698
|
-
@c.prepared_finder :foo, :type=>:each
|
699
|
-
|
700
|
-
a = []
|
701
|
-
@c.all_foo(1, 2){|r| a << r}.must_equal [@o]
|
702
|
-
a.must_equal [@o]
|
703
|
-
|
704
|
-
a = []
|
705
|
-
@c.each_foo(3, 4){|r| a << r}
|
706
|
-
a.must_equal [@o]
|
707
|
-
|
708
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 -- prepared"]
|
709
|
-
end
|
710
|
-
|
711
|
-
it "should support :name option" do
|
712
|
-
@c.prepared_finder :foo, :name=>:find_foo
|
713
|
-
@c.find_foo(1, 2).must_equal @o
|
714
|
-
@c.find_foo(3, 4).must_equal @o
|
715
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
|
716
|
-
end
|
717
|
-
|
718
|
-
it "should support :arity option" do
|
719
|
-
def @c.foobar(*b)
|
720
|
-
ds = dataset
|
721
|
-
b.each_with_index do |a, i|
|
722
|
-
ds = ds.where(i=>a)
|
723
|
-
end
|
724
|
-
ds
|
725
|
-
end
|
726
|
-
@c.prepared_finder :foobar, :arity=>1, :name=>:find_foobar_1
|
727
|
-
@c.prepared_finder :foobar, :arity=>2, :name=>:find_foobar_2
|
728
|
-
@c.find_foobar_1(:a)
|
729
|
-
@c.find_foobar_2(:a, :b)
|
730
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1 -- prepared", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1 -- prepared"]
|
731
|
-
end
|
732
|
-
|
733
|
-
it "should support :mod option" do
|
734
|
-
m = Module.new
|
735
|
-
@c.prepared_finder :foo, :mod=>m
|
736
|
-
proc{@c.first_foo}.must_raise NoMethodError
|
737
|
-
@c.extend m
|
738
|
-
@c.first_foo(1, 2).must_equal @o
|
739
|
-
@c.first_foo(3, 4).must_equal @o
|
740
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
|
741
|
-
end
|
742
|
-
|
743
|
-
it "should handle models with names" do
|
744
|
-
def @c.name; 'foobar' end
|
745
|
-
@c.prepared_finder :foo
|
746
|
-
@c.first_foo(1, 2).must_equal @o
|
747
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared"]
|
748
|
-
end
|
749
|
-
end
|
750
|
-
|
751
|
-
describe Sequel::Model, ".fetch" do
|
752
|
-
before do
|
753
|
-
DB.reset
|
754
|
-
@c = Class.new(Sequel::Model(:items))
|
755
|
-
end
|
756
|
-
|
757
|
-
it "should return instances of Model" do
|
758
|
-
@c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
|
759
|
-
end
|
760
|
-
|
761
|
-
it "should return true for .empty? and not raise an error on empty selection" do
|
762
|
-
rows = @c.fetch("SELECT * FROM items WHERE FALSE")
|
763
|
-
@c.send(:define_method, :fetch_rows){|sql| yield({:count => 0})}
|
764
|
-
rows.empty?
|
765
|
-
end
|
766
|
-
end
|
767
|
-
|
768
|
-
describe Sequel::Model, ".find_or_create" do
|
769
|
-
before do
|
770
|
-
@db = Sequel.mock
|
771
|
-
@c = Class.new(Sequel::Model(@db[:items])) do
|
772
|
-
set_primary_key :id
|
773
|
-
columns :x
|
774
|
-
end
|
775
|
-
@db.sqls
|
776
|
-
end
|
777
|
-
|
778
|
-
it "should find the record" do
|
779
|
-
@db.fetch = [{:x=>1, :id=>1}]
|
780
|
-
@db.autoid = 1
|
781
|
-
@c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
|
782
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
|
783
|
-
end
|
784
|
-
|
785
|
-
it "should create the record if not found" do
|
786
|
-
@db.fetch = [[], {:x=>1, :id=>1}]
|
787
|
-
@db.autoid = 1
|
788
|
-
@c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
|
789
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
|
790
|
-
"INSERT INTO items (x) VALUES (1)",
|
791
|
-
"SELECT * FROM items WHERE (id = 1) LIMIT 1"]
|
792
|
-
end
|
793
|
-
|
794
|
-
it "should pass the new record to be created to the block if no record is found" do
|
795
|
-
@db.fetch = [[], {:x=>1, :id=>1}]
|
796
|
-
@db.autoid = 1
|
797
|
-
@c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
|
798
|
-
sqls = @db.sqls
|
799
|
-
sqls.first.must_equal "SELECT * FROM items WHERE (x = 1) LIMIT 1"
|
800
|
-
["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].must_include(sqls[1])
|
801
|
-
sqls.last.must_equal "SELECT * FROM items WHERE (id = 1) LIMIT 1"
|
802
|
-
end
|
803
|
-
end
|
804
|
-
|
805
|
-
describe Sequel::Model, ".all" do
|
806
|
-
it "should return all records in the dataset" do
|
807
|
-
c = Class.new(Sequel::Model(:items))
|
808
|
-
c.all.must_equal [c.load(:x=>1, :id=>1)]
|
809
|
-
end
|
810
|
-
end
|
811
|
-
|
812
|
-
describe Sequel::Model, "A model class without a primary key" do
|
813
|
-
before do
|
814
|
-
@c = Class.new(Sequel::Model(:items)) do
|
815
|
-
columns :x
|
816
|
-
no_primary_key
|
817
|
-
end
|
818
|
-
DB.reset
|
819
|
-
end
|
820
|
-
|
821
|
-
it "should be able to insert records without selecting them back" do
|
822
|
-
i = nil
|
823
|
-
i = @c.create(:x => 1)
|
824
|
-
i.class.wont_be_nil
|
825
|
-
i.values.to_hash.must_equal(:x => 1)
|
826
|
-
|
827
|
-
DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
|
828
|
-
end
|
829
|
-
|
830
|
-
it "should raise when deleting" do
|
831
|
-
proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
|
832
|
-
end
|
833
|
-
|
834
|
-
it "should raise when updating" do
|
835
|
-
proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
|
836
|
-
end
|
837
|
-
|
838
|
-
it "should insert a record when saving" do
|
839
|
-
o = @c.new(:x => 2)
|
840
|
-
o.must_be :new?
|
841
|
-
o.save
|
842
|
-
DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
|
843
|
-
end
|
844
|
-
end
|
845
|
-
|
846
|
-
describe Sequel::Model, "attribute accessors" do
|
847
|
-
before do
|
848
|
-
db = Sequel.mock
|
849
|
-
def db.supports_schema_parsing?() true end
|
850
|
-
def db.schema(*)
|
851
|
-
[[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
|
852
|
-
end
|
853
|
-
@dataset = db[:items].columns(:x, :z)
|
854
|
-
@c = Class.new(Sequel::Model)
|
855
|
-
DB.reset
|
856
|
-
end
|
857
|
-
|
858
|
-
it "should be created on set_dataset" do
|
859
|
-
%w'x z x= z='.each do |x|
|
860
|
-
@c.instance_methods.collect{|z| z.to_s}.wont_include(x)
|
861
|
-
end
|
862
|
-
@c.set_dataset(@dataset)
|
863
|
-
%w'x z x= z='.each do |x|
|
864
|
-
@c.instance_methods.collect{|z| z.to_s}.must_include(x)
|
865
|
-
end
|
866
|
-
o = @c.new
|
867
|
-
%w'x z x= z='.each do |x|
|
868
|
-
o.methods.collect{|z| z.to_s}.must_include(x)
|
869
|
-
end
|
870
|
-
|
871
|
-
o.x.must_equal nil
|
872
|
-
o.x = 34
|
873
|
-
o.x.must_equal 34
|
874
|
-
end
|
875
|
-
|
876
|
-
it "should be only accept one argument for the write accessor" do
|
877
|
-
@c.set_dataset(@dataset)
|
878
|
-
o = @c.new
|
879
|
-
|
880
|
-
o.x = 34
|
881
|
-
o.x.must_equal 34
|
882
|
-
proc{o.send(:x=)}.must_raise ArgumentError
|
883
|
-
proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
|
884
|
-
end
|
885
|
-
|
886
|
-
it "should have a working typecasting setter even if the column is not selected" do
|
887
|
-
@c.set_dataset(@dataset.select(:z).columns(:z))
|
888
|
-
o = @c.new
|
889
|
-
|
890
|
-
o.x = '34'
|
891
|
-
o.x.must_equal 34
|
892
|
-
end
|
893
|
-
|
894
|
-
it "should typecast if the new value is the same as the existing but has a different class" do
|
895
|
-
@c.set_dataset(@dataset.select(:z).columns(:z))
|
896
|
-
o = @c.new
|
897
|
-
|
898
|
-
o.x = 34
|
899
|
-
o.x = 34.0
|
900
|
-
o.x.must_equal 34.0
|
901
|
-
o.x = 34
|
902
|
-
o.x.must_equal 34
|
903
|
-
end
|
904
|
-
end
|
905
|
-
|
906
|
-
describe Sequel::Model, ".[]" do
|
907
|
-
before do
|
908
|
-
@c = Class.new(Sequel::Model(:items))
|
909
|
-
@c.dataset._fetch = {:name => 'sharon', :id => 1}
|
910
|
-
DB.reset
|
911
|
-
end
|
912
|
-
|
913
|
-
it "should return the first record for the given pk" do
|
914
|
-
@c[1].must_equal @c.load(:name => 'sharon', :id => 1)
|
915
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
916
|
-
@c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
|
917
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
|
918
|
-
end
|
919
|
-
|
920
|
-
it "should have #[] return nil if no rows match" do
|
921
|
-
@c.dataset._fetch = []
|
922
|
-
@c[1].must_equal nil
|
923
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
924
|
-
end
|
925
|
-
|
926
|
-
it "should work correctly for custom primary key" do
|
927
|
-
@c.set_primary_key :name
|
928
|
-
@c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
|
929
|
-
DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
|
930
|
-
end
|
931
|
-
|
932
|
-
it "should use a qualified primary key if the dataset is joined" do
|
933
|
-
@c.dataset = @c.dataset.cross_join(:a)
|
934
|
-
@c[1].must_equal @c.load(:name => 'sharon', :id => 1)
|
935
|
-
DB.sqls.must_equal ["SELECT * FROM items CROSS JOIN a WHERE (items.id = 1) LIMIT 1"]
|
936
|
-
end
|
937
|
-
|
938
|
-
it "should work correctly for composite primary key specified as array" do
|
939
|
-
@c.set_primary_key [:node_id, :kind]
|
940
|
-
@c[3921, 201].must_be_kind_of(@c)
|
941
|
-
sqls = DB.sqls
|
942
|
-
sqls.length.must_equal 1
|
943
|
-
sqls.first.must_match(/^SELECT \* FROM items WHERE \((\(node_id = 3921\) AND \(kind = 201\))|(\(kind = 201\) AND \(node_id = 3921\))\) LIMIT 1$/)
|
944
|
-
end
|
945
|
-
end
|
946
|
-
|
947
|
-
describe "Model#inspect" do
|
948
|
-
it "should include the class name and the values" do
|
949
|
-
Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
|
950
|
-
end
|
951
|
-
end
|
952
|
-
|
953
|
-
describe "Model.db_schema" do
|
954
|
-
before do
|
955
|
-
@c = Class.new(Sequel::Model(:items)) do
|
956
|
-
def self.columns; orig_columns; end
|
957
|
-
end
|
958
|
-
@db = Sequel.mock
|
959
|
-
def @db.supports_schema_parsing?() true end
|
960
|
-
@dataset = @db[:items]
|
961
|
-
end
|
962
|
-
|
963
|
-
it "should not call database's schema if it isn't supported" do
|
964
|
-
def @db.supports_schema_parsing?() false end
|
965
|
-
def @db.schema(table, opts = {})
|
966
|
-
raise Sequel::Error
|
967
|
-
end
|
968
|
-
@dataset.instance_variable_set(:@columns, [:x, :y])
|
969
|
-
|
970
|
-
@c.dataset = @dataset
|
971
|
-
@c.db_schema.must_equal(:x=>{}, :y=>{})
|
972
|
-
@c.columns.must_equal [:x, :y]
|
973
|
-
@c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
|
974
|
-
end
|
975
|
-
|
976
|
-
it "should use the database's schema and set the columns and dataset columns" do
|
977
|
-
def @db.schema(table, opts = {})
|
978
|
-
[[:x, {:type=>:integer}], [:y, {:type=>:string}]]
|
979
|
-
end
|
980
|
-
@c.dataset = @dataset
|
981
|
-
@c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
|
982
|
-
@c.columns.must_equal [:x, :y]
|
983
|
-
@c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
|
984
|
-
end
|
985
|
-
|
986
|
-
it "should not restrict the schema for datasets with a :select option" do
|
987
|
-
def @c.columns; [:x, :z]; end
|
988
|
-
def @db.schema(table, opts = {})
|
989
|
-
[[:x, {:type=>:integer}], [:y, {:type=>:string}]]
|
990
|
-
end
|
991
|
-
@c.dataset = @dataset.select(:x, :y___z)
|
992
|
-
@c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
|
993
|
-
end
|
994
|
-
|
995
|
-
it "should fallback to fetching records if schema raises an error" do
|
996
|
-
def @db.schema(table, opts={})
|
997
|
-
raise Sequel::Error
|
998
|
-
end
|
999
|
-
@c.dataset = @dataset.join(:x, :id).columns(:id, :x)
|
1000
|
-
@c.db_schema.must_equal(:x=>{}, :id=>{})
|
1001
|
-
end
|
1002
|
-
|
1003
|
-
it "should automatically set a singular primary key based on the schema" do
|
1004
|
-
ds = @dataset
|
1005
|
-
d = ds.db
|
1006
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
|
1007
|
-
@c.primary_key.must_equal :id
|
1008
|
-
@c.dataset = ds
|
1009
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true})
|
1010
|
-
@c.primary_key.must_equal :x
|
1011
|
-
end
|
1012
|
-
|
1013
|
-
it "should automatically set a singular primary key even if there are specific columns selected" do
|
1014
|
-
ds = @dataset.select(:a, :b, :x)
|
1015
|
-
d = ds.db
|
1016
|
-
def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
|
1017
|
-
@c.primary_key.must_equal :id
|
1018
|
-
@c.dataset = ds
|
1019
|
-
@c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
|
1020
|
-
@c.primary_key.must_equal :x
|
1021
|
-
end
|
1022
|
-
|
1023
|
-
it "should automatically set the composite primary key based on the schema" do
|
1024
|
-
ds = @dataset
|
1025
|
-
d = ds.db
|
1026
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
|
1027
|
-
@c.primary_key.must_equal :id
|
1028
|
-
@c.dataset = ds
|
1029
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
|
1030
|
-
@c.primary_key.must_equal [:x, :y]
|
1031
|
-
end
|
1032
|
-
|
1033
|
-
it "should set an immutable composite primary key based on the schema" do
|
1034
|
-
ds = @dataset
|
1035
|
-
d = ds.db
|
1036
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
|
1037
|
-
@c.dataset = ds
|
1038
|
-
@c.primary_key.must_equal [:x, :y]
|
1039
|
-
proc{@c.primary_key.pop}.must_raise
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
it "should automatically set no primary key based on the schema" do
|
1043
|
-
ds = @dataset
|
1044
|
-
d = ds.db
|
1045
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
|
1046
|
-
@c.primary_key.must_equal :id
|
1047
|
-
@c.dataset = ds
|
1048
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
|
1049
|
-
@c.primary_key.must_equal nil
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
it "should automatically set primary key for dataset selecting table.*" do
|
1053
|
-
ds = @dataset.select_all(:items)
|
1054
|
-
d = ds.db
|
1055
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
|
1056
|
-
@c.primary_key.must_equal :id
|
1057
|
-
@c.dataset = ds
|
1058
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>true})
|
1059
|
-
@c.primary_key.must_equal :x
|
1060
|
-
end
|
1061
|
-
|
1062
|
-
it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
|
1063
|
-
ds = @dataset
|
1064
|
-
d = ds.db
|
1065
|
-
def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
|
1066
|
-
@c.primary_key.must_equal :id
|
1067
|
-
@c.dataset = ds
|
1068
|
-
@c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
|
1069
|
-
@c.primary_key.must_equal :id
|
1070
|
-
end
|
1071
|
-
end
|
1072
|
-
|
1073
|
-
describe "Model#use_transactions" do
|
1074
|
-
before do
|
1075
|
-
@c = Class.new(Sequel::Model(:items))
|
1076
|
-
end
|
1077
|
-
|
1078
|
-
it "should return class value by default" do
|
1079
|
-
@c.use_transactions = true
|
1080
|
-
@c.new.use_transactions.must_equal true
|
1081
|
-
@c.use_transactions = false
|
1082
|
-
@c.new.use_transactions.must_equal false
|
1083
|
-
end
|
1084
|
-
|
1085
|
-
it "should return set value if manually set" do
|
1086
|
-
instance = @c.new
|
1087
|
-
instance.use_transactions = false
|
1088
|
-
instance.use_transactions.must_equal false
|
1089
|
-
@c.use_transactions = true
|
1090
|
-
instance.use_transactions.must_equal false
|
1091
|
-
|
1092
|
-
instance.use_transactions = true
|
1093
|
-
instance.use_transactions.must_equal true
|
1094
|
-
@c.use_transactions = false
|
1095
|
-
instance.use_transactions.must_equal true
|
1096
|
-
end
|
1097
|
-
end
|