sequel 5.8.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- 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.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.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.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- 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 +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/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 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- 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/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -64,6 +64,8 @@ module Sequel
|
|
|
64
64
|
array = [].freeze
|
|
65
65
|
|
|
66
66
|
if RUBY_VERSION < '2.6'
|
|
67
|
+
# :nocov:
|
|
68
|
+
|
|
67
69
|
# Default proc used to determine whether to send the method to the dataset.
|
|
68
70
|
# If the array would respond to it, sends it to the array instead of the dataset.
|
|
69
71
|
DEFAULT_PROXY_TO_DATASET = proc do |opts|
|
|
@@ -73,10 +75,9 @@ module Sequel
|
|
|
73
75
|
end
|
|
74
76
|
!array_method
|
|
75
77
|
end
|
|
76
|
-
else
|
|
77
78
|
# :nocov:
|
|
79
|
+
else
|
|
78
80
|
DEFAULT_PROXY_TO_DATASET = proc{|opts| !array.respond_to?(opts[:method])}
|
|
79
|
-
# :nocov:
|
|
80
81
|
end
|
|
81
82
|
|
|
82
83
|
# Set the association reflection to use, and whether the association should be
|
|
@@ -98,6 +99,7 @@ module Sequel
|
|
|
98
99
|
end
|
|
99
100
|
v.public_send(meth, *args, &block)
|
|
100
101
|
end
|
|
102
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
module ClassMethods
|
|
@@ -108,6 +110,8 @@ module Sequel
|
|
|
108
110
|
|
|
109
111
|
Plugins.inherited_instance_variables(self, :@association_proxy_to_dataset=>nil)
|
|
110
112
|
|
|
113
|
+
private
|
|
114
|
+
|
|
111
115
|
# Changes the association method to return a proxy instead of the associated objects
|
|
112
116
|
# directly.
|
|
113
117
|
def def_association_method(opts)
|
|
@@ -30,6 +30,12 @@ module Sequel
|
|
|
30
30
|
#
|
|
31
31
|
# Model.skip_auto_validations(:all)
|
|
32
32
|
#
|
|
33
|
+
# It is possible to skip auto validations on a per-model-instance basis via:
|
|
34
|
+
#
|
|
35
|
+
# instance.skip_auto_validations(:unique, :not_null) do
|
|
36
|
+
# puts instance.valid?
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
33
39
|
# By default, the plugin uses a not_null validation for NOT NULL columns, but that
|
|
34
40
|
# can be changed to a presence validation using an option:
|
|
35
41
|
#
|
|
@@ -58,6 +64,7 @@ module Sequel
|
|
|
58
64
|
MAX_LENGTH_OPTIONS = {:from=>:values, :allow_nil=>true}.freeze
|
|
59
65
|
SCHEMA_TYPES_OPTIONS = NOT_NULL_OPTIONS
|
|
60
66
|
UNIQUE_OPTIONS = NOT_NULL_OPTIONS
|
|
67
|
+
EMPTY_ARRAY = [].freeze
|
|
61
68
|
|
|
62
69
|
def self.apply(model, opts=OPTS)
|
|
63
70
|
model.instance_exec do
|
|
@@ -172,38 +179,50 @@ module Sequel
|
|
|
172
179
|
end
|
|
173
180
|
|
|
174
181
|
module InstanceMethods
|
|
182
|
+
# Skip the given types of auto validations on this instance inside the block.
|
|
183
|
+
def skip_auto_validations(*types)
|
|
184
|
+
types << :all if types.empty?
|
|
185
|
+
@_skip_auto_validations = types
|
|
186
|
+
yield
|
|
187
|
+
ensure
|
|
188
|
+
@_skip_auto_validations = nil
|
|
189
|
+
end
|
|
190
|
+
|
|
175
191
|
# Validate the model's auto validations columns
|
|
176
192
|
def validate
|
|
177
193
|
super
|
|
194
|
+
skip = @_skip_auto_validations || EMPTY_ARRAY
|
|
195
|
+
return if skip.include?(:all)
|
|
178
196
|
opts = model.auto_validate_options
|
|
179
197
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
198
|
+
|
|
199
|
+
unless skip.include?(:not_null)
|
|
200
|
+
not_null_method = model.auto_validate_presence? ? :validates_presence : :validates_not_null
|
|
201
|
+
unless (not_null_columns = model.auto_validate_not_null_columns).empty?
|
|
202
|
+
public_send(not_null_method, not_null_columns, opts[:not_null])
|
|
185
203
|
end
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if model.auto_validate_presence?
|
|
189
|
-
validates_presence(not_null_columns, opts[:explicit_not_null])
|
|
190
|
-
else
|
|
191
|
-
validates_not_null(not_null_columns, opts[:explicit_not_null])
|
|
204
|
+
unless (not_null_columns = model.auto_validate_explicit_not_null_columns).empty?
|
|
205
|
+
public_send(not_null_method, not_null_columns, opts[:explicit_not_null])
|
|
192
206
|
end
|
|
193
207
|
end
|
|
194
|
-
|
|
208
|
+
|
|
209
|
+
unless skip.include?(:max_length) || (max_length_columns = model.auto_validate_max_length_columns).empty?
|
|
195
210
|
max_length_columns.each do |col, len|
|
|
196
211
|
validates_max_length(len, col, opts[:max_length])
|
|
197
212
|
end
|
|
198
213
|
end
|
|
199
214
|
|
|
200
|
-
|
|
215
|
+
unless skip.include?(:types) || !model.auto_validate_types?
|
|
216
|
+
validates_schema_types(keys, opts[:schema_types])
|
|
217
|
+
end
|
|
201
218
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
219
|
+
unless skip.include?(:unique)
|
|
220
|
+
unique_opts = Hash[opts[:unique]]
|
|
221
|
+
if model.respond_to?(:sti_dataset)
|
|
222
|
+
unique_opts[:dataset] = model.sti_dataset
|
|
223
|
+
end
|
|
224
|
+
model.auto_validate_unique_columns.each{|cols| validates_unique(cols, unique_opts)}
|
|
205
225
|
end
|
|
206
|
-
model.auto_validate_unique_columns.each{|cols| validates_unique(cols, unique_opts)}
|
|
207
226
|
end
|
|
208
227
|
end
|
|
209
228
|
end
|
|
@@ -58,8 +58,7 @@ module Sequel
|
|
|
58
58
|
# restricted_columns.
|
|
59
59
|
def get_setter_methods
|
|
60
60
|
meths = super
|
|
61
|
-
|
|
62
|
-
if (!defined?(::Sequel::Plugins::WhitelistSecurity) || !plugins.include?(::Sequel::Plugins::WhitelistSecurity) || !allowed_columns) && restricted_columns
|
|
61
|
+
if (!defined?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !is_a?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !allowed_columns) && restricted_columns
|
|
63
62
|
meths -= restricted_columns.map{|x| "#{x}="}
|
|
64
63
|
end
|
|
65
64
|
meths
|
|
@@ -31,7 +31,10 @@ module Sequel
|
|
|
31
31
|
# Create boolean subset methods for each boolean column.
|
|
32
32
|
def self.configure(model, &block)
|
|
33
33
|
model.instance_exec do
|
|
34
|
-
|
|
34
|
+
if block
|
|
35
|
+
define_singleton_method(:boolean_subset_args, &block)
|
|
36
|
+
singleton_class.send(:private, :boolean_subset_args)
|
|
37
|
+
end
|
|
35
38
|
create_boolean_subsets if @dataset
|
|
36
39
|
end
|
|
37
40
|
end
|
|
@@ -26,6 +26,9 @@ module Sequel
|
|
|
26
26
|
# * Model.with_pk!
|
|
27
27
|
# * Model.[] # when argument is not hash or nil
|
|
28
28
|
# * many_to_one association method # without dynamic callback, when primary key matches
|
|
29
|
+
#
|
|
30
|
+
# You should not use this plugin if you are using sharding and there are different
|
|
31
|
+
# rows for the same primary key on different shards.
|
|
29
32
|
#
|
|
30
33
|
# Usage:
|
|
31
34
|
#
|
|
@@ -98,7 +98,7 @@ module Sequel
|
|
|
98
98
|
#
|
|
99
99
|
# a = Executive.first
|
|
100
100
|
# a.values # {:id=>1, name=>'S', :kind=>'Executive', :num_staff=>4, :num_managers=>2}
|
|
101
|
-
#
|
|
101
|
+
#
|
|
102
102
|
# Note that when loading from a subclass, because the subclass dataset uses a subquery
|
|
103
103
|
# that by default uses the same alias at the primary table, any qualified identifiers
|
|
104
104
|
# should reference the subquery alias (and qualified identifiers should not be needed
|
|
@@ -108,6 +108,16 @@ module Sequel
|
|
|
108
108
|
# a = Executive.where{{employees[:id]=>1}}.first # works
|
|
109
109
|
# a = Executive.where{{executives[:id]=>1}}.first # doesn't work
|
|
110
110
|
#
|
|
111
|
+
# Note that because subclass datasets select from a subquery, you cannot update,
|
|
112
|
+
# delete, or insert into them directly. To delete related rows, you need to go
|
|
113
|
+
# through the related tables and remove the related rows. Code that does this would
|
|
114
|
+
# be similar to:
|
|
115
|
+
#
|
|
116
|
+
# pks = Executive.where{num_staff < 10}.select_map(:id)
|
|
117
|
+
# Executive.cti_tables.reverse_each do |table|
|
|
118
|
+
# DB.from(table).where(:id=>pks).delete
|
|
119
|
+
# end
|
|
120
|
+
#
|
|
111
121
|
# = Usage
|
|
112
122
|
#
|
|
113
123
|
# # Use the default of storing the class name in the sti_key
|
|
@@ -198,6 +208,9 @@ module Sequel
|
|
|
198
208
|
# Overrides implicit table names.
|
|
199
209
|
# :ignore_subclass_columns :: Array with column names as symbols that are ignored
|
|
200
210
|
# on all sub-classes.
|
|
211
|
+
# :qualify_tables :: Boolean true to qualify automatically determined
|
|
212
|
+
# subclass tables with the same qualifier as their
|
|
213
|
+
# superclass.
|
|
201
214
|
def self.configure(model, opts = OPTS)
|
|
202
215
|
SingleTableInheritance.configure model, opts[:key], opts
|
|
203
216
|
|
|
@@ -207,8 +220,14 @@ module Sequel
|
|
|
207
220
|
@cti_instance_dataset = @instance_dataset
|
|
208
221
|
@cti_table_columns = columns
|
|
209
222
|
@cti_table_map = opts[:table_map] || {}
|
|
210
|
-
@cti_alias = opts[:alias] || @dataset.first_source
|
|
223
|
+
@cti_alias = opts[:alias] || case source = @dataset.first_source
|
|
224
|
+
when SQL::QualifiedIdentifier
|
|
225
|
+
@dataset.unqualified_column_for(source)
|
|
226
|
+
else
|
|
227
|
+
source
|
|
228
|
+
end
|
|
211
229
|
@cti_ignore_subclass_columns = opts[:ignore_subclass_columns] || []
|
|
230
|
+
@cti_qualify_tables = !!opts[:qualify_tables]
|
|
212
231
|
end
|
|
213
232
|
end
|
|
214
233
|
|
|
@@ -239,6 +258,13 @@ module Sequel
|
|
|
239
258
|
# primary key column is always allowed to be duplicated
|
|
240
259
|
attr_reader :cti_ignore_subclass_columns
|
|
241
260
|
|
|
261
|
+
# A boolean indicating whether or not to automatically qualify tables
|
|
262
|
+
# backing subclasses with the same qualifier as their superclass, if
|
|
263
|
+
# the superclass is qualified. Specified with the :qualify_tables
|
|
264
|
+
# option to the plugin and only applied to automatically determined
|
|
265
|
+
# table names (not to the :table_map option).
|
|
266
|
+
attr_reader :cti_qualify_tables
|
|
267
|
+
|
|
242
268
|
# Freeze CTI information when freezing model class.
|
|
243
269
|
def freeze
|
|
244
270
|
@cti_models.freeze
|
|
@@ -250,7 +276,28 @@ module Sequel
|
|
|
250
276
|
super
|
|
251
277
|
end
|
|
252
278
|
|
|
253
|
-
Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil, :@cti_alias=>nil, :@cti_ignore_subclass_columns=>nil)
|
|
279
|
+
Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil, :@cti_alias=>nil, :@cti_ignore_subclass_columns=>nil, :@cti_qualify_tables=>nil)
|
|
280
|
+
|
|
281
|
+
# The table name for the current model class's main table.
|
|
282
|
+
def table_name
|
|
283
|
+
if cti_tables && cti_tables.length > 1
|
|
284
|
+
@cti_alias
|
|
285
|
+
else
|
|
286
|
+
super
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# The name of the most recently joined table.
|
|
291
|
+
def cti_table_name
|
|
292
|
+
cti_tables.last
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# The model class for the given key value.
|
|
296
|
+
def sti_class_from_key(key)
|
|
297
|
+
sti_class(sti_model_map[key])
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
private
|
|
254
301
|
|
|
255
302
|
def inherited(subclass)
|
|
256
303
|
ds = sti_dataset
|
|
@@ -263,12 +310,16 @@ module Sequel
|
|
|
263
310
|
# Set table if this is a class table inheritance
|
|
264
311
|
table = nil
|
|
265
312
|
columns = nil
|
|
266
|
-
if
|
|
313
|
+
if n = subclass.name
|
|
267
314
|
if table = cti_table_map[n.to_sym]
|
|
268
|
-
columns = db.
|
|
315
|
+
columns = db.schema(table).map(&:first)
|
|
269
316
|
else
|
|
270
|
-
table =
|
|
271
|
-
|
|
317
|
+
table = if cti_qualify_tables && (schema = dataset.schema_and_table(cti_table_name).first)
|
|
318
|
+
SQL::QualifiedIdentifier.new(schema, subclass.implicit_table_name)
|
|
319
|
+
else
|
|
320
|
+
subclass.implicit_table_name
|
|
321
|
+
end
|
|
322
|
+
columns = check_non_connection_error(false){db.schema(table) && db.schema(table).map(&:first)}
|
|
272
323
|
table = nil if !columns || columns.empty?
|
|
273
324
|
end
|
|
274
325
|
end
|
|
@@ -281,6 +332,7 @@ module Sequel
|
|
|
281
332
|
if cti_tables.length == 1
|
|
282
333
|
ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))})
|
|
283
334
|
end
|
|
335
|
+
ds.send(:columns=, self.columns)
|
|
284
336
|
cols = (columns - [pk]) - cti_ignore_subclass_columns
|
|
285
337
|
dup_cols = cols & ds.columns
|
|
286
338
|
unless dup_cols.empty?
|
|
@@ -290,6 +342,7 @@ module Sequel
|
|
|
290
342
|
@sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app)
|
|
291
343
|
|
|
292
344
|
ds = ds.from_self(:alias=>@cti_alias)
|
|
345
|
+
ds.send(:columns=, self.columns + cols)
|
|
293
346
|
|
|
294
347
|
set_dataset(ds)
|
|
295
348
|
set_columns(self.columns)
|
|
@@ -304,30 +357,10 @@ module Sequel
|
|
|
304
357
|
cti_tables.reverse_each do |ct|
|
|
305
358
|
db.schema(ct).each{|sk,v| db_schema[sk] = v}
|
|
306
359
|
end
|
|
360
|
+
setup_auto_validations if respond_to?(:setup_auto_validations, true)
|
|
307
361
|
end
|
|
308
362
|
end
|
|
309
363
|
|
|
310
|
-
# The table name for the current model class's main table.
|
|
311
|
-
def table_name
|
|
312
|
-
if cti_tables && cti_tables.length > 1
|
|
313
|
-
@cti_alias
|
|
314
|
-
else
|
|
315
|
-
super
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
# The name of the most recently joined table.
|
|
320
|
-
def cti_table_name
|
|
321
|
-
cti_tables ? cti_tables.last : dataset.first_source_alias
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
# The model class for the given key value.
|
|
325
|
-
def sti_class_from_key(key)
|
|
326
|
-
sti_class(sti_model_map[key])
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
private
|
|
330
|
-
|
|
331
364
|
# If using a subquery for class table inheritance, also use a subquery
|
|
332
365
|
# when setting subclass dataset.
|
|
333
366
|
def sti_subclass_dataset(key)
|
|
@@ -350,11 +383,6 @@ module Sequel
|
|
|
350
383
|
self
|
|
351
384
|
end
|
|
352
385
|
|
|
353
|
-
# Don't allow use of prepared statements.
|
|
354
|
-
def use_prepared_statements_for?(type)
|
|
355
|
-
false
|
|
356
|
-
end
|
|
357
|
-
|
|
358
386
|
# Set the sti_key column based on the sti_key_map.
|
|
359
387
|
def before_validation
|
|
360
388
|
if new? && (set = self[model.sti_key])
|
|
@@ -389,7 +417,7 @@ module Sequel
|
|
|
389
417
|
@values[primary_key] ||= nid
|
|
390
418
|
end
|
|
391
419
|
end
|
|
392
|
-
|
|
420
|
+
@values[primary_key]
|
|
393
421
|
end
|
|
394
422
|
|
|
395
423
|
# Update rows in all backing tables, using the columns in each table.
|
|
@@ -32,9 +32,10 @@ module Sequel
|
|
|
32
32
|
#
|
|
33
33
|
# The :mapping option is just a shortcut that works in particular
|
|
34
34
|
# cases. To handle any case, you can define a custom :composer
|
|
35
|
-
# and :decomposer procs. The :composer
|
|
36
|
-
#
|
|
37
|
-
#
|
|
35
|
+
# and :decomposer procs. The :composer and :decomposer procs will
|
|
36
|
+
# be used to define instance methods. The :composer will be called
|
|
37
|
+
# the first time the getter is called, and the :decomposer
|
|
38
|
+
# will be called before saving. The above example could
|
|
38
39
|
# also be implemented as:
|
|
39
40
|
#
|
|
40
41
|
# Album.composition :date,
|
|
@@ -74,9 +75,9 @@ module Sequel
|
|
|
74
75
|
#
|
|
75
76
|
# Options:
|
|
76
77
|
# :class :: if using the :mapping option, the class to use, as a Class, String or Symbol.
|
|
77
|
-
# :composer :: A proc
|
|
78
|
+
# :composer :: A proc used to define the method that the composition getter method will call
|
|
78
79
|
# to create the composition.
|
|
79
|
-
# :decomposer :: A proc
|
|
80
|
+
# :decomposer :: A proc used to define the method called before saving the model object,
|
|
80
81
|
# if the composition object exists, which sets the columns in the model object
|
|
81
82
|
# based on the value of the composition object.
|
|
82
83
|
# :mapping :: An array where each element is either a symbol or an array of two symbols.
|
|
@@ -129,15 +130,17 @@ module Sequel
|
|
|
129
130
|
|
|
130
131
|
# Define getter and setter methods for the composition object.
|
|
131
132
|
def define_composition_accessor(name, opts=OPTS)
|
|
132
|
-
|
|
133
|
+
composer_meth = opts[:composer_method] = Plugins.def_sequel_method(@composition_module, "#{name}_composer", 0, &opts[:composer])
|
|
134
|
+
opts[:decomposer_method] = Plugins.def_sequel_method(@composition_module, "#{name}_decomposer", 0, &opts[:decomposer])
|
|
133
135
|
@composition_module.class_eval do
|
|
134
136
|
define_method(name) do
|
|
135
137
|
if compositions.has_key?(name)
|
|
136
138
|
compositions[name]
|
|
137
139
|
elsif frozen?
|
|
138
|
-
|
|
140
|
+
# composer_meth is private
|
|
141
|
+
send(composer_meth)
|
|
139
142
|
else
|
|
140
|
-
compositions[name] =
|
|
143
|
+
compositions[name] = send(composer_meth)
|
|
141
144
|
end
|
|
142
145
|
end
|
|
143
146
|
define_method("#{name}=") do |v|
|
|
@@ -171,7 +174,8 @@ module Sequel
|
|
|
171
174
|
# For each composition, set the columns in the model class based
|
|
172
175
|
# on the composition object.
|
|
173
176
|
def before_validation
|
|
174
|
-
|
|
177
|
+
# decomposer_method is private
|
|
178
|
+
@compositions.keys.each{|n| send(model.compositions[n][:decomposer_method])} if @compositions
|
|
175
179
|
super
|
|
176
180
|
end
|
|
177
181
|
|
|
@@ -65,8 +65,6 @@ module Sequel
|
|
|
65
65
|
# # Add CSV output capability to Album class instances
|
|
66
66
|
# Album.plugin :csv_serializer
|
|
67
67
|
module CsvSerializer
|
|
68
|
-
CSV = Object.const_defined?(:CSV) ? ::CSV : ::FasterCSV
|
|
69
|
-
|
|
70
68
|
# Set up the column readers to do deserialization and the column writers
|
|
71
69
|
# to save the value in deserialized_values
|
|
72
70
|
def self.configure(model, opts = OPTS)
|
|
@@ -75,13 +73,31 @@ module Sequel
|
|
|
75
73
|
end
|
|
76
74
|
end
|
|
77
75
|
|
|
76
|
+
# Avoid keyword argument separation warnings on Ruby 2.7, while still
|
|
77
|
+
# being compatible with 1.9.
|
|
78
|
+
if RUBY_VERSION >= "2.0"
|
|
79
|
+
instance_eval(<<-END, __FILE__, __LINE__+1)
|
|
80
|
+
def self.csv_call(*args, opts, &block)
|
|
81
|
+
CSV.send(*args, **opts, &block)
|
|
82
|
+
end
|
|
83
|
+
END
|
|
84
|
+
else
|
|
85
|
+
# :nocov:
|
|
86
|
+
# :nodoc:
|
|
87
|
+
def self.csv_call(*args, opts, &block)
|
|
88
|
+
CSV.send(*args, opts, &block)
|
|
89
|
+
end
|
|
90
|
+
# :nodoc:
|
|
91
|
+
# :nocov:
|
|
92
|
+
end
|
|
93
|
+
|
|
78
94
|
module ClassMethods
|
|
79
95
|
# The default opts to use when serializing model objects to CSV
|
|
80
96
|
attr_reader :csv_serializer_opts
|
|
81
97
|
|
|
82
98
|
# Attempt to parse an array of instances from the given CSV string
|
|
83
99
|
def array_from_csv(csv, opts = OPTS)
|
|
84
|
-
|
|
100
|
+
CsvSerializer.csv_call(:parse, csv, process_csv_serializer_opts(opts)).map do |row|
|
|
85
101
|
row = row.to_hash
|
|
86
102
|
row.delete(nil)
|
|
87
103
|
new(row)
|
|
@@ -108,7 +124,8 @@ module Sequel
|
|
|
108
124
|
opts_cols = opts.delete(:columns)
|
|
109
125
|
opts_include = opts.delete(:include)
|
|
110
126
|
opts_except = opts.delete(:except)
|
|
111
|
-
|
|
127
|
+
only = opts.delete(:only)
|
|
128
|
+
opts[:headers] ||= Array(only || opts_cols || columns) + Array(opts_include) - Array(opts_except)
|
|
112
129
|
opts
|
|
113
130
|
end
|
|
114
131
|
|
|
@@ -130,7 +147,7 @@ module Sequel
|
|
|
130
147
|
# :headers :: The headers to use for the CSV line. Use nil for a header
|
|
131
148
|
# to specify the column should be ignored.
|
|
132
149
|
def from_csv(csv, opts = OPTS)
|
|
133
|
-
row =
|
|
150
|
+
row = CsvSerializer.csv_call(:parse_line, csv, model.process_csv_serializer_opts(opts)).to_hash
|
|
134
151
|
row.delete(nil)
|
|
135
152
|
set(row)
|
|
136
153
|
end
|
|
@@ -146,9 +163,10 @@ module Sequel
|
|
|
146
163
|
# attributes to include in the CSV output.
|
|
147
164
|
def to_csv(opts = OPTS)
|
|
148
165
|
opts = model.process_csv_serializer_opts(opts)
|
|
166
|
+
headers = opts[:headers]
|
|
149
167
|
|
|
150
|
-
|
|
151
|
-
csv <<
|
|
168
|
+
CsvSerializer.csv_call(:generate, model.process_csv_serializer_opts(opts)) do |csv|
|
|
169
|
+
csv << headers.map{|k| public_send(k)}
|
|
152
170
|
end
|
|
153
171
|
end
|
|
154
172
|
end
|
|
@@ -164,10 +182,11 @@ module Sequel
|
|
|
164
182
|
def to_csv(opts = OPTS)
|
|
165
183
|
opts = model.process_csv_serializer_opts({:columns=>columns}.merge!(opts))
|
|
166
184
|
items = opts.delete(:array) || self
|
|
185
|
+
headers = opts[:headers]
|
|
167
186
|
|
|
168
|
-
|
|
187
|
+
CsvSerializer.csv_call(:generate, opts) do |csv|
|
|
169
188
|
items.each do |object|
|
|
170
|
-
csv <<
|
|
189
|
+
csv << headers.map{|header| object.public_send(header)}
|
|
171
190
|
end
|
|
172
191
|
end
|
|
173
192
|
end
|