sequel 4.26.0 → 5.37.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 +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- 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/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- 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 +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- 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.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -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 +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- 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 +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -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 +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -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 +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- 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 +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -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/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -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 +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -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/error_splitter.rb +19 -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 +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- 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.3.0.txt +0 -40
- 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 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- 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 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- 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 -179
- data/spec/core/schema_spec.rb +0 -1659
- 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/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- 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 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- 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/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- 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_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- 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 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- 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 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- 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 -712
- 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/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 -395
- 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 -229
- 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 -404
- 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 -789
- 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/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_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- 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/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- 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/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- 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/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/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/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 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
-
|
|
3
|
-
describe Sequel::Model, "caching" do
|
|
4
|
-
before do
|
|
5
|
-
@cache_class = Class.new(Hash) do
|
|
6
|
-
attr_accessor :ttl
|
|
7
|
-
def set(k, v, ttl); self[k] = v; @ttl = ttl; end
|
|
8
|
-
def get(k); self[k]; end
|
|
9
|
-
end
|
|
10
|
-
cache = @cache_class.new
|
|
11
|
-
@cache = cache
|
|
12
|
-
|
|
13
|
-
@memcached_class = Class.new(Hash) do
|
|
14
|
-
attr_accessor :ttl
|
|
15
|
-
def set(k, v, ttl); self[k] = v; @ttl = ttl; end
|
|
16
|
-
def get(k); if self[k] then return self[k]; else raise ArgumentError; end end
|
|
17
|
-
def delete(k); if self[k] then super; else raise ArgumentError; end end
|
|
18
|
-
end
|
|
19
|
-
cache2 = @memcached_class.new
|
|
20
|
-
@memcached = cache2
|
|
21
|
-
|
|
22
|
-
@c = Class.new(Sequel::Model(:items))
|
|
23
|
-
@c.class_eval do
|
|
24
|
-
plugin :caching, cache
|
|
25
|
-
def self.name; 'Item' end
|
|
26
|
-
|
|
27
|
-
columns :name, :id
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
@c3 = Class.new(Sequel::Model(:items))
|
|
31
|
-
@c3.class_eval do
|
|
32
|
-
plugin :caching, cache2
|
|
33
|
-
def self.name; 'Item' end
|
|
34
|
-
|
|
35
|
-
columns :name, :id
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
@c4 = Class.new(Sequel::Model(:items))
|
|
39
|
-
@c4.class_eval do
|
|
40
|
-
plugin :caching, cache2, :ignore_exceptions => true
|
|
41
|
-
def self.name; 'Item' end
|
|
42
|
-
|
|
43
|
-
columns :name, :id
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
@dataset = @c.dataset = @c3.dataset = @c4.dataset
|
|
47
|
-
@dataset._fetch = {:name => 'sharon', :id => 1}
|
|
48
|
-
@dataset.numrows = 1
|
|
49
|
-
|
|
50
|
-
@c2 = Class.new(@c) do
|
|
51
|
-
def self.name; 'SubItem' end
|
|
52
|
-
end
|
|
53
|
-
@c.db.reset
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "should set the model's cache store" do
|
|
57
|
-
@c.cache_store.wont_be_nil
|
|
58
|
-
@c2.cache_store.wont_be_nil
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "should have a default ttl of 3600" do
|
|
62
|
-
@c.cache_ttl.must_equal 3600
|
|
63
|
-
@c2.cache_ttl.must_equal 3600
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "should take a ttl option" do
|
|
67
|
-
c = Class.new(Sequel::Model(:items))
|
|
68
|
-
c.plugin :caching, @cache, :ttl => 1234
|
|
69
|
-
c.cache_ttl.must_equal 1234
|
|
70
|
-
Class.new(c).cache_ttl.must_equal 1234
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should allow overriding the ttl option via a plugin :caching call" do
|
|
74
|
-
@c.plugin :caching, @cache, :ttl => 1234
|
|
75
|
-
@c.cache_ttl.must_equal 1234
|
|
76
|
-
Class.new(@c).cache_ttl.must_equal 1234
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should offer a set_cache_ttl method for setting the ttl" do
|
|
80
|
-
@c.cache_ttl.must_equal 3600
|
|
81
|
-
@c.set_cache_ttl 1234
|
|
82
|
-
@c.cache_ttl.must_equal 1234
|
|
83
|
-
Class.new(@c).cache_ttl.must_equal 1234
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "should generate a cache key appropriate to the class via the Model#cache_key" do
|
|
87
|
-
m = @c.new
|
|
88
|
-
m.values[:id] = 1
|
|
89
|
-
m.cache_key.must_equal "#{m.class}:1"
|
|
90
|
-
m = @c2.new
|
|
91
|
-
m.values[:id] = 1
|
|
92
|
-
m.cache_key.must_equal "#{m.class}:1"
|
|
93
|
-
|
|
94
|
-
# custom primary key
|
|
95
|
-
@c.set_primary_key :ttt
|
|
96
|
-
m = @c.new
|
|
97
|
-
m.values[:ttt] = 333
|
|
98
|
-
m.cache_key.must_equal "#{m.class}:333"
|
|
99
|
-
c = Class.new(@c)
|
|
100
|
-
m = c.new
|
|
101
|
-
m.values[:ttt] = 333
|
|
102
|
-
m.cache_key.must_equal "#{m.class}:333"
|
|
103
|
-
|
|
104
|
-
# composite primary key
|
|
105
|
-
@c.set_primary_key [:a, :b, :c]
|
|
106
|
-
m = @c.new
|
|
107
|
-
m.values[:a] = 123
|
|
108
|
-
m.values[:c] = 456
|
|
109
|
-
m.values[:b] = 789
|
|
110
|
-
m.cache_key.must_equal "#{m.class}:123,789,456"
|
|
111
|
-
c = Class.new(@c)
|
|
112
|
-
m = c.new
|
|
113
|
-
m.values[:a] = 123
|
|
114
|
-
m.values[:c] = 456
|
|
115
|
-
m.values[:b] = 789
|
|
116
|
-
m.cache_key.must_equal "#{m.class}:123,789,456"
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "should generate a cache key via the Model.cache_key method" do
|
|
120
|
-
@c.cache_key(1).must_equal "#{@c}:1"
|
|
121
|
-
@c.cache_key([1, 2]).must_equal "#{@c}:1,2"
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "should raise error if attempting to generate cache_key and primary key value is null" do
|
|
125
|
-
m = @c.new
|
|
126
|
-
proc {m.cache_key}.must_raise(Sequel::Error)
|
|
127
|
-
m.values[:id] = 1
|
|
128
|
-
m.cache_key
|
|
129
|
-
|
|
130
|
-
m = @c2.new
|
|
131
|
-
proc {m.cache_key}.must_raise(Sequel::Error)
|
|
132
|
-
m.values[:id] = 1
|
|
133
|
-
m.cache_key
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should not raise error if trying to save a new record" do
|
|
137
|
-
@c.new(:name=>'blah').save
|
|
138
|
-
@c.create(:name=>'blah')
|
|
139
|
-
@c2.new(:name=>'blah').save
|
|
140
|
-
@c2.create(:name=>'blah')
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should set the cache when reading from the database" do
|
|
144
|
-
@c.db.sqls.must_equal []
|
|
145
|
-
@cache.must_be :empty?
|
|
146
|
-
|
|
147
|
-
m = @c[1]
|
|
148
|
-
@c.db.sqls.must_equal ['SELECT * FROM items WHERE id = 1']
|
|
149
|
-
m.values.must_equal(:name=>"sharon", :id=>1)
|
|
150
|
-
@cache[m.cache_key].must_equal m
|
|
151
|
-
m2 = @c[1]
|
|
152
|
-
@c.db.sqls.must_equal []
|
|
153
|
-
m2.must_equal m
|
|
154
|
-
m2.values.must_equal(:name=>"sharon", :id=>1)
|
|
155
|
-
|
|
156
|
-
m = @c2[1]
|
|
157
|
-
@c.db.sqls.must_equal ['SELECT * FROM items WHERE id = 1']
|
|
158
|
-
m.values.must_equal(:name=>"sharon", :id=>1)
|
|
159
|
-
@cache[m.cache_key].must_equal m
|
|
160
|
-
m2 = @c2[1]
|
|
161
|
-
@c.db.sqls.must_equal []
|
|
162
|
-
m2.must_equal m
|
|
163
|
-
m2.values.must_equal(:name=>"sharon", :id=>1)
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
it "should handle lookups by nil primary keys" do
|
|
167
|
-
@c[nil].must_equal nil
|
|
168
|
-
@c.db.sqls.must_equal []
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
it "should delete the cache when writing to the database" do
|
|
172
|
-
m = @c[1]
|
|
173
|
-
@cache[m.cache_key].must_equal m
|
|
174
|
-
m.name = 'hey'
|
|
175
|
-
m.save
|
|
176
|
-
@cache.has_key?(m.cache_key).must_equal false
|
|
177
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
|
|
178
|
-
|
|
179
|
-
m = @c2[1]
|
|
180
|
-
@cache[m.cache_key].must_equal m
|
|
181
|
-
m.name = 'hey'
|
|
182
|
-
m.save
|
|
183
|
-
@cache.has_key?(m.cache_key).must_equal false
|
|
184
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
it "should delete the cache when deleting the record" do
|
|
188
|
-
m = @c[1]
|
|
189
|
-
@cache[m.cache_key].must_equal m
|
|
190
|
-
m.delete
|
|
191
|
-
@cache.has_key?(m.cache_key).must_equal false
|
|
192
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
|
|
193
|
-
|
|
194
|
-
m = @c2[1]
|
|
195
|
-
@cache[m.cache_key].must_equal m
|
|
196
|
-
m.delete
|
|
197
|
-
@cache.has_key?(m.cache_key).must_equal false
|
|
198
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
it "should support #[] as a shortcut to #find with hash" do
|
|
202
|
-
m = @c[:id => 3]
|
|
203
|
-
@cache[m.cache_key].must_equal nil
|
|
204
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
|
205
|
-
m = @c[1]
|
|
206
|
-
@cache[m.cache_key].must_equal m
|
|
207
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
|
208
|
-
@c[:id => 4]
|
|
209
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
210
|
-
|
|
211
|
-
m = @c2[:id => 3]
|
|
212
|
-
@cache[m.cache_key].must_equal nil
|
|
213
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
|
214
|
-
m = @c2[1]
|
|
215
|
-
@cache[m.cache_key].must_equal m
|
|
216
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
|
217
|
-
@c2[:id => 4]
|
|
218
|
-
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
it "should support ignore_exception option" do
|
|
222
|
-
c = Class.new(Sequel::Model(:items))
|
|
223
|
-
c.plugin :caching, @cache, :ignore_exceptions => true
|
|
224
|
-
Class.new(c).cache_ignore_exceptions.must_equal true
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it "should raise an exception if cache_store is memcached and ignore_exception is not enabled" do
|
|
228
|
-
proc{@c3[1]}.must_raise ArgumentError
|
|
229
|
-
m = @c3.new.save
|
|
230
|
-
proc{m.update({:name=>'blah'})}.must_raise ArgumentError
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
it "should rescue an exception if cache_store is memcached and ignore_exception is enabled" do
|
|
234
|
-
@c4[1].values.must_equal(:name => 'sharon', :id => 1)
|
|
235
|
-
m = @c4.new.save
|
|
236
|
-
m.update({:name=>'blah'})
|
|
237
|
-
m.values.must_equal(:name => 'blah', :id => 1, :x => 1)
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
it "should support Model.cache_get_pk for getting a value from the cache by primary key" do
|
|
241
|
-
@c.cache_get_pk(1).must_equal nil
|
|
242
|
-
m = @c[1]
|
|
243
|
-
@c.cache_get_pk(1).must_equal m
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
it "should support Model.cache_delete_pk for removing a value from the cache by primary key" do
|
|
247
|
-
@c[1]
|
|
248
|
-
@c.cache_get_pk(1).wont_equal nil
|
|
249
|
-
@c.cache_delete_pk(1).must_equal nil
|
|
250
|
-
@c.cache_get_pk(1).must_equal nil
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "should support overriding the cache key prefix" do
|
|
254
|
-
c2 = Class.new(@c)
|
|
255
|
-
def c2.cache_key_prefix; "ceetwo" end
|
|
256
|
-
c3 = Class.new(c2)
|
|
257
|
-
@c.cache_key(:id).wont_equal c2.cache_key(:id)
|
|
258
|
-
c2.cache_key(:id).must_equal c3.cache_key(:id)
|
|
259
|
-
|
|
260
|
-
@c[1]
|
|
261
|
-
c2.cache_get_pk(1).must_equal nil
|
|
262
|
-
m = c2[1]
|
|
263
|
-
c2.cache_get_pk(1).values.must_equal @c[1].values
|
|
264
|
-
c3.cache_get_pk(1).values.must_equal m.values
|
|
265
|
-
|
|
266
|
-
m.name << m.name
|
|
267
|
-
m.save
|
|
268
|
-
c2[1].values.must_equal c3[1].values
|
|
269
|
-
end
|
|
270
|
-
end
|
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
-
|
|
3
|
-
describe "class_table_inheritance plugin" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock(:autoid=>proc{|sql| 1})
|
|
6
|
-
def @db.supports_schema_parsing?() true end
|
|
7
|
-
def @db.schema(table, opts={})
|
|
8
|
-
{:employees=>[[:id, {:primary_key=>true, :type=>:integer}], [:name, {:type=>:string}], [:kind, {:type=>:string}]],
|
|
9
|
-
:managers=>[[:id, {:type=>:integer}], [:num_staff, {:type=>:integer}]],
|
|
10
|
-
:executives=>[[:id, {:type=>:integer}], [:num_managers, {:type=>:integer}]],
|
|
11
|
-
:staff=>[[:id, {:type=>:integer}], [:manager_id, {:type=>:integer}]],
|
|
12
|
-
}[table.is_a?(Sequel::Dataset) ? table.first_source_table : table]
|
|
13
|
-
end
|
|
14
|
-
@db.extend_datasets do
|
|
15
|
-
def columns
|
|
16
|
-
{[:employees]=>[:id, :name, :kind],
|
|
17
|
-
[:managers]=>[:id, :num_staff],
|
|
18
|
-
[:executives]=>[:id, :num_managers],
|
|
19
|
-
[:staff]=>[:id, :manager_id],
|
|
20
|
-
[:employees, :managers]=>[:id, :name, :kind, :num_staff],
|
|
21
|
-
[:employees, :managers, :executives]=>[:id, :name, :kind, :num_staff, :num_managers],
|
|
22
|
-
[:employees, :staff]=>[:id, :name, :kind, :manager_id],
|
|
23
|
-
}[opts[:from] + (opts[:join] || []).map{|x| x.table}]
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
class ::Employee < Sequel::Model(@db)
|
|
27
|
-
def _save_refresh; @values[:id] = 1 end
|
|
28
|
-
def self.columns
|
|
29
|
-
dataset.columns
|
|
30
|
-
end
|
|
31
|
-
plugin :class_table_inheritance, :key=>:kind, :table_map=>{:Staff=>:staff}
|
|
32
|
-
end
|
|
33
|
-
class ::Manager < Employee
|
|
34
|
-
one_to_many :staff_members, :class=>:Staff
|
|
35
|
-
end
|
|
36
|
-
class ::Executive < Manager
|
|
37
|
-
end
|
|
38
|
-
class ::Ceo < Executive
|
|
39
|
-
end
|
|
40
|
-
class ::Staff < Employee
|
|
41
|
-
many_to_one :manager
|
|
42
|
-
end
|
|
43
|
-
@ds = Employee.dataset
|
|
44
|
-
@db.sqls
|
|
45
|
-
end
|
|
46
|
-
after do
|
|
47
|
-
Object.send(:remove_const, :Ceo)
|
|
48
|
-
Object.send(:remove_const, :Executive)
|
|
49
|
-
Object.send(:remove_const, :Manager)
|
|
50
|
-
Object.send(:remove_const, :Staff)
|
|
51
|
-
Object.send(:remove_const, :Employee)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it "should have simple_table = nil for all subclasses" do
|
|
55
|
-
Manager.simple_table.must_equal nil
|
|
56
|
-
Executive.simple_table.must_equal nil
|
|
57
|
-
Ceo.simple_table.must_equal nil
|
|
58
|
-
Staff.simple_table.must_equal nil
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "should have working row_proc if using set_dataset in subclass to remove columns" do
|
|
62
|
-
Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
|
|
63
|
-
Manager.dataset._fetch = {:id=>1, :kind=>'Ceo'}
|
|
64
|
-
Manager[1].must_equal Ceo.load(:id=>1, :kind=>'Ceo')
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "should use a joined dataset in subclasses" do
|
|
68
|
-
Employee.dataset.sql.must_equal 'SELECT * FROM employees'
|
|
69
|
-
Manager.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id)'
|
|
70
|
-
Executive.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, managers.num_staff, executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id)'
|
|
71
|
-
Ceo.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, managers.num_staff, executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id) WHERE (employees.kind IN (\'Ceo\'))'
|
|
72
|
-
Staff.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id)'
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "should return rows with the correct class based on the polymorphic_key value" do
|
|
76
|
-
@ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]
|
|
77
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Executive, Ceo, Staff]
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should return rows with the correct class based on the polymorphic_key value for subclasses" do
|
|
81
|
-
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}]
|
|
82
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo]
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "should have refresh return all columns in subclass after loading from superclass" do
|
|
86
|
-
Employee.dataset._fetch = [{:id=>1, :name=>'A', :kind=>'Ceo'}]
|
|
87
|
-
Ceo.instance_dataset._fetch = [{:id=>1, :name=>'A', :kind=>'Ceo', :num_staff=>3, :num_managers=>2}]
|
|
88
|
-
a = Employee.first
|
|
89
|
-
a.class.must_equal Ceo
|
|
90
|
-
a.values.must_equal(:id=>1, :name=>'A', :kind=>'Ceo')
|
|
91
|
-
a.refresh.values.must_equal(:id=>1, :name=>'A', :kind=>'Ceo', :num_staff=>3, :num_managers=>2)
|
|
92
|
-
@db.sqls.must_equal ["SELECT * FROM employees LIMIT 1",
|
|
93
|
-
"SELECT employees.id, employees.name, employees.kind, managers.num_staff, executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id) WHERE ((employees.kind IN ('Ceo')) AND (executives.id = 1)) LIMIT 1"]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should return rows with the current class if cti_key is nil" do
|
|
97
|
-
Employee.plugin(:class_table_inheritance)
|
|
98
|
-
Employee.dataset._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]
|
|
99
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Employee, Employee, Employee]
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it "should return rows with the current class if cti_key is nil in subclasses" do
|
|
103
|
-
Employee.plugin(:class_table_inheritance)
|
|
104
|
-
Object.send(:remove_const, :Executive)
|
|
105
|
-
Object.send(:remove_const, :Manager)
|
|
106
|
-
class ::Manager < Employee; end
|
|
107
|
-
class ::Executive < Manager; end
|
|
108
|
-
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
|
|
109
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Manager]
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should handle a model map with integer values" do
|
|
113
|
-
Employee.plugin(:class_table_inheritance, :key=>:kind, :model_map=>{0=>:Employee, 1=>:Manager, 2=>:Executive, 3=>:Ceo})
|
|
114
|
-
Object.send(:remove_const, :Ceo)
|
|
115
|
-
Object.send(:remove_const, :Executive)
|
|
116
|
-
Object.send(:remove_const, :Manager)
|
|
117
|
-
class ::Manager < Employee; end
|
|
118
|
-
class ::Executive < Manager; end
|
|
119
|
-
class ::Ceo < Executive; end
|
|
120
|
-
Employee.dataset._fetch = [{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}]
|
|
121
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Manager, Executive, Ceo]
|
|
122
|
-
Manager.dataset._fetch = [{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}]
|
|
123
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Employee, Manager, Executive, Ceo]
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
it "should fallback to the main class if the given class does not exist" do
|
|
127
|
-
@ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]
|
|
128
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Employee, Staff]
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should fallback to the main class if the given class does not exist in subclasses" do
|
|
132
|
-
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Blah'}]
|
|
133
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo, Manager]
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should sets the model class name for the key when creating new parent class records" do
|
|
137
|
-
Employee.create
|
|
138
|
-
@db.sqls.must_equal ["INSERT INTO employees (kind) VALUES ('Employee')"]
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
it "should sets the model class name for the key when creating new subclass records" do
|
|
142
|
-
Ceo.create
|
|
143
|
-
@db.sqls.must_equal ["INSERT INTO employees (kind) VALUES ('Ceo')",
|
|
144
|
-
"INSERT INTO managers (id) VALUES (1)",
|
|
145
|
-
"INSERT INTO executives (id) VALUES (1)"]
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
it "should ignore existing cti_key value when creating new records" do
|
|
149
|
-
Employee.create(:kind=>'Manager')
|
|
150
|
-
@db.sqls.must_equal ["INSERT INTO employees (kind) VALUES ('Employee')"]
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "should ignore existing cti_key value in subclasses" do
|
|
154
|
-
Manager.create(:kind=>'Executive')
|
|
155
|
-
@db.sqls.must_equal ["INSERT INTO employees (kind) VALUES ('Manager')",
|
|
156
|
-
"INSERT INTO managers (id) VALUES (1)"]
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it "should handle validations on the type column field" do
|
|
160
|
-
o = Employee.new
|
|
161
|
-
def o.validate
|
|
162
|
-
errors.add(:kind, 'not present') unless kind
|
|
163
|
-
end
|
|
164
|
-
o.valid?.must_equal true
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
it "should set the type column field even when not validating" do
|
|
168
|
-
Employee.new.save(:validate=>false)
|
|
169
|
-
@db.sqls.must_equal ["INSERT INTO employees (kind) VALUES ('Employee')"]
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
it "should allow specifying a map of names to tables to override implicit mapping" do
|
|
173
|
-
Manager.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id)'
|
|
174
|
-
Staff.dataset.sql.must_equal 'SELECT employees.id, employees.name, employees.kind, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id)'
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
it "should lazily load attributes for columns in subclass tables" do
|
|
178
|
-
Manager.instance_dataset._fetch = Manager.dataset._fetch = {:id=>1, :name=>'J', :kind=>'Ceo', :num_staff=>2}
|
|
179
|
-
m = Manager[1]
|
|
180
|
-
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 1) LIMIT 1']
|
|
181
|
-
@db.fetch = {:num_managers=>3}
|
|
182
|
-
m.must_be_kind_of Ceo
|
|
183
|
-
m.num_managers.must_equal 3
|
|
184
|
-
@db.sqls.must_equal ['SELECT executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id) WHERE (executives.id = 1) LIMIT 1']
|
|
185
|
-
m.values.must_equal(:id=>1, :name=>'J', :kind=>'Ceo', :num_staff=>2, :num_managers=>3)
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
it "should lazily load columns in middle classes correctly when loaded from parent class" do
|
|
189
|
-
Employee.dataset._fetch = {:id=>1, :kind=>'Ceo'}
|
|
190
|
-
Manager.dataset._fetch = {:num_staff=>2}
|
|
191
|
-
e = Employee[1]
|
|
192
|
-
e.must_be_kind_of(Ceo)
|
|
193
|
-
@db.sqls.must_equal ["SELECT * FROM employees WHERE (id = 1) LIMIT 1"]
|
|
194
|
-
e.num_staff.must_equal 2
|
|
195
|
-
@db.sqls.must_equal ["SELECT managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 1) LIMIT 1"]
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it "should eagerly load lazily columns in subclasses when loaded from parent class" do
|
|
199
|
-
Employee.dataset._fetch = {:id=>1, :kind=>'Ceo'}
|
|
200
|
-
Manager.dataset._fetch = {:id=>1, :num_staff=>2}
|
|
201
|
-
@db.fetch = {:id=>1, :num_managers=>3}
|
|
202
|
-
e = Employee.all.first
|
|
203
|
-
e.must_be_kind_of(Ceo)
|
|
204
|
-
@db.sqls.must_equal ["SELECT * FROM employees"]
|
|
205
|
-
e.num_staff.must_equal 2
|
|
206
|
-
@db.sqls.must_equal ["SELECT managers.id, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id IN (1))"]
|
|
207
|
-
e.num_managers.must_equal 3
|
|
208
|
-
@db.sqls.must_equal ['SELECT executives.id, executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id) WHERE (executives.id IN (1))']
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
it "should include schema for columns for tables for ancestor classes" do
|
|
212
|
-
Employee.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :kind=>{:type=>:string})
|
|
213
|
-
Manager.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :kind=>{:type=>:string}, :num_staff=>{:type=>:integer})
|
|
214
|
-
Executive.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :kind=>{:type=>:string}, :num_staff=>{:type=>:integer}, :num_managers=>{:type=>:integer})
|
|
215
|
-
Staff.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :kind=>{:type=>:string}, :manager_id=>{:type=>:integer})
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
it "should use the correct primary key (which should have the same name in all subclasses)" do
|
|
219
|
-
[Employee, Manager, Executive, Ceo, Staff].each{|c| c.primary_key.must_equal :id}
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
it "should have table_name return the table name of the most specific table" do
|
|
223
|
-
Employee.table_name.must_equal :employees
|
|
224
|
-
Manager.table_name.must_equal :managers
|
|
225
|
-
Executive.table_name.must_equal :executives
|
|
226
|
-
Ceo.table_name.must_equal :executives
|
|
227
|
-
Staff.table_name.must_equal :staff
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
it "should delete the correct rows from all tables when deleting" do
|
|
231
|
-
Ceo.load(:id=>1).delete
|
|
232
|
-
@db.sqls.must_equal ["DELETE FROM executives WHERE (id = 1)", "DELETE FROM managers WHERE (id = 1)", "DELETE FROM employees WHERE (id = 1)"]
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
it "should not allow deletion of frozen object" do
|
|
236
|
-
o = Ceo.load(:id=>1)
|
|
237
|
-
o.freeze
|
|
238
|
-
proc{o.delete}.must_raise(Sequel::Error)
|
|
239
|
-
@db.sqls.must_equal []
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
it "should insert the correct rows into all tables when inserting" do
|
|
243
|
-
Ceo.create(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
244
|
-
sqls = @db.sqls
|
|
245
|
-
sqls.length.must_equal 3
|
|
246
|
-
sqls[0].must_match(/INSERT INTO employees \((name|kind), (name|kind)\) VALUES \('(E|Ceo)', '(E|Ceo)'\)/)
|
|
247
|
-
sqls[1].must_match(/INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \([12], [12]\)/)
|
|
248
|
-
sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/)
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
it "should insert the correct rows into all tables with a given primary key" do
|
|
252
|
-
e = Ceo.new(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
253
|
-
e.id = 2
|
|
254
|
-
e.save
|
|
255
|
-
sqls = @db.sqls
|
|
256
|
-
sqls.length.must_equal 3
|
|
257
|
-
sqls[0].must_match(/INSERT INTO employees \((name|kind|id), (name|kind|id), (name|kind|id)\) VALUES \(('E'|'Ceo'|2), ('E'|'Ceo'|2), ('E'|'Ceo'|2)\)/)
|
|
258
|
-
sqls[1].must_match(/INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \(2, 2\)/)
|
|
259
|
-
sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([23], [23]\)/)
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
it "should update the correct rows in all tables when updating" do
|
|
263
|
-
Ceo.load(:id=>2).update(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
264
|
-
@db.sqls.must_equal ["UPDATE employees SET name = 'E' WHERE (id = 2)", "UPDATE managers SET num_staff = 2 WHERE (id = 2)", "UPDATE executives SET num_managers = 3 WHERE (id = 2)"]
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
it "should handle many_to_one relationships correctly" do
|
|
268
|
-
Manager.dataset._fetch = {:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3}
|
|
269
|
-
Staff.load(:manager_id=>3).manager.must_equal Ceo.load(:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3)
|
|
270
|
-
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
it "should handle one_to_many relationships correctly" do
|
|
274
|
-
Staff.dataset._fetch = {:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3}
|
|
275
|
-
Ceo.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)]
|
|
276
|
-
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
|
|
277
|
-
end
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
describe "class_table_inheritance plugin without sti_key" do
|
|
281
|
-
before do
|
|
282
|
-
@db = Sequel.mock(:autoid=>proc{|sql| 1})
|
|
283
|
-
def @db.supports_schema_parsing?() true end
|
|
284
|
-
def @db.schema(table, opts={})
|
|
285
|
-
{:employees=>[[:id, {:primary_key=>true, :type=>:integer}], [:name, {:type=>:string}]],
|
|
286
|
-
:managers=>[[:id, {:type=>:integer}], [:num_staff, {:type=>:integer}]],
|
|
287
|
-
:executives=>[[:id, {:type=>:integer}], [:num_managers, {:type=>:integer}]],
|
|
288
|
-
:staff=>[[:id, {:type=>:integer}], [:manager_id, {:type=>:integer}]],
|
|
289
|
-
}[table.is_a?(Sequel::Dataset) ? table.first_source_table : table]
|
|
290
|
-
end
|
|
291
|
-
@db.extend_datasets do
|
|
292
|
-
def columns
|
|
293
|
-
{[:employees]=>[:id, :name],
|
|
294
|
-
[:managers]=>[:id, :num_staff],
|
|
295
|
-
[:executives]=>[:id, :num_managers],
|
|
296
|
-
[:staff]=>[:id, :manager_id],
|
|
297
|
-
[:employees, :managers]=>[:id, :name, :num_staff],
|
|
298
|
-
[:employees, :managers, :executives]=>[:id, :name, :num_staff, :num_managers],
|
|
299
|
-
[:employees, :staff]=>[:id, :name, :manager_id],
|
|
300
|
-
}[opts[:from] + (opts[:join] || []).map{|x| x.table}]
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
class ::Employee < Sequel::Model(@db)
|
|
304
|
-
def _save_refresh; @values[:id] = 1 end
|
|
305
|
-
def self.columns
|
|
306
|
-
dataset.columns
|
|
307
|
-
end
|
|
308
|
-
plugin :class_table_inheritance, :table_map=>{:Staff=>:staff}
|
|
309
|
-
end
|
|
310
|
-
class ::Manager < Employee
|
|
311
|
-
one_to_many :staff_members, :class=>:Staff
|
|
312
|
-
end
|
|
313
|
-
class ::Executive < Manager
|
|
314
|
-
end
|
|
315
|
-
class ::Staff < Employee
|
|
316
|
-
many_to_one :manager
|
|
317
|
-
end
|
|
318
|
-
@ds = Employee.dataset
|
|
319
|
-
@db.sqls
|
|
320
|
-
end
|
|
321
|
-
after do
|
|
322
|
-
Object.send(:remove_const, :Executive)
|
|
323
|
-
Object.send(:remove_const, :Manager)
|
|
324
|
-
Object.send(:remove_const, :Staff)
|
|
325
|
-
Object.send(:remove_const, :Employee)
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
it "should have simple_table = nil for all subclasses" do
|
|
329
|
-
Manager.simple_table.must_equal nil
|
|
330
|
-
Executive.simple_table.must_equal nil
|
|
331
|
-
Staff.simple_table.must_equal nil
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
it "should have working row_proc if using set_dataset in subclass to remove columns" do
|
|
335
|
-
Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
|
|
336
|
-
Manager.dataset._fetch = {:id=>1}
|
|
337
|
-
Manager[1].must_equal Manager.load(:id=>1)
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
it "should use a joined dataset in subclasses" do
|
|
341
|
-
Employee.dataset.sql.must_equal 'SELECT * FROM employees'
|
|
342
|
-
Manager.dataset.sql.must_equal 'SELECT employees.id, employees.name, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id)'
|
|
343
|
-
Executive.dataset.sql.must_equal 'SELECT employees.id, employees.name, managers.num_staff, executives.num_managers FROM employees INNER JOIN managers ON (managers.id = employees.id) INNER JOIN executives ON (executives.id = managers.id)'
|
|
344
|
-
Staff.dataset.sql.must_equal 'SELECT employees.id, employees.name, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id)'
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
it "should return rows with the current class if cti_key is nil" do
|
|
348
|
-
Employee.plugin(:class_table_inheritance)
|
|
349
|
-
Employee.dataset._fetch = [{}]
|
|
350
|
-
Employee.first.class.must_equal Employee
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
it "should include schema for columns for tables for ancestor classes" do
|
|
355
|
-
Employee.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string})
|
|
356
|
-
Manager.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :num_staff=>{:type=>:integer})
|
|
357
|
-
Executive.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :num_staff=>{:type=>:integer}, :num_managers=>{:type=>:integer})
|
|
358
|
-
Staff.db_schema.must_equal(:id=>{:primary_key=>true, :type=>:integer}, :name=>{:type=>:string}, :manager_id=>{:type=>:integer})
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
it "should use the correct primary key (which should have the same name in all subclasses)" do
|
|
362
|
-
[Employee, Manager, Executive, Staff].each{|c| c.primary_key.must_equal :id}
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
it "should have table_name return the table name of the most specific table" do
|
|
366
|
-
Employee.table_name.must_equal :employees
|
|
367
|
-
Manager.table_name.must_equal :managers
|
|
368
|
-
Executive.table_name.must_equal :executives
|
|
369
|
-
Staff.table_name.must_equal :staff
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
it "should delete the correct rows from all tables when deleting" do
|
|
373
|
-
Executive.load(:id=>1).delete
|
|
374
|
-
@db.sqls.must_equal ["DELETE FROM executives WHERE (id = 1)", "DELETE FROM managers WHERE (id = 1)", "DELETE FROM employees WHERE (id = 1)"]
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
it "should not allow deletion of frozen object" do
|
|
378
|
-
o = Executive.load(:id=>1)
|
|
379
|
-
o.freeze
|
|
380
|
-
proc{o.delete}.must_raise(Sequel::Error)
|
|
381
|
-
@db.sqls.must_equal []
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
it "should insert the correct rows into all tables when inserting" do
|
|
385
|
-
Executive.create(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
386
|
-
sqls = @db.sqls
|
|
387
|
-
sqls.length.must_equal 3
|
|
388
|
-
sqls[0].must_match(/INSERT INTO employees \(name\) VALUES \('E'\)/)
|
|
389
|
-
sqls[1].must_match(/INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \([12], [12]\)/)
|
|
390
|
-
sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/)
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
it "should insert the correct rows into all tables with a given primary key" do
|
|
394
|
-
e = Executive.new(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
395
|
-
e.id = 2
|
|
396
|
-
e.save
|
|
397
|
-
sqls = @db.sqls
|
|
398
|
-
sqls.length.must_equal 3
|
|
399
|
-
sqls[0].must_match(/INSERT INTO employees \((name|id), (name|id)\) VALUES \(('E'|2), ('E'|2)\)/)
|
|
400
|
-
sqls[1].must_match(/INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \(2, 2\)/)
|
|
401
|
-
sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([23], [23]\)/)
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
it "should update the correct rows in all tables when updating" do
|
|
405
|
-
Executive.load(:id=>2).update(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
406
|
-
@db.sqls.must_equal ["UPDATE employees SET name = 'E' WHERE (id = 2)", "UPDATE managers SET num_staff = 2 WHERE (id = 2)", "UPDATE executives SET num_managers = 3 WHERE (id = 2)"]
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
it "should handle many_to_one relationships correctly" do
|
|
410
|
-
Manager.dataset._fetch = {:id=>3, :name=>'E', :num_staff=>3}
|
|
411
|
-
Staff.load(:manager_id=>3).manager.must_equal Manager.load(:id=>3, :name=>'E', :num_staff=>3)
|
|
412
|
-
@db.sqls.must_equal ['SELECT employees.id, employees.name, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
|
|
413
|
-
end
|
|
414
|
-
|
|
415
|
-
it "should handle one_to_many relationships correctly" do
|
|
416
|
-
Staff.dataset._fetch = {:id=>1, :name=>'S', :manager_id=>3}
|
|
417
|
-
Executive.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :manager_id=>3)]
|
|
418
|
-
@db.sqls.must_equal ['SELECT employees.id, employees.name, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
|
|
419
|
-
end
|
|
420
|
-
end
|