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
|
@@ -59,7 +59,14 @@ module Sequel
|
|
|
59
59
|
|
|
60
60
|
# Yield every block related to the given hook.
|
|
61
61
|
def hook_blocks(hook)
|
|
62
|
-
|
|
62
|
+
# SEQUEL6: Remove
|
|
63
|
+
Sequel::Deprecation.deprecate("The hook_blocks class method in the hook_class_methods plugin is deprecated and will be removed in Sequel 6.")
|
|
64
|
+
@hooks[hook].each{|_,v,_| yield v}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Yield every method related to the given hook.
|
|
68
|
+
def hook_methods_for(hook)
|
|
69
|
+
@hooks[hook].each{|_,_,m| yield m}
|
|
63
70
|
end
|
|
64
71
|
|
|
65
72
|
Plugins.inherited_instance_variables(self, :@hooks=>:hash_dup)
|
|
@@ -75,23 +82,28 @@ module Sequel
|
|
|
75
82
|
# Allow calling private hook methods
|
|
76
83
|
block = proc {send(tag)}
|
|
77
84
|
end
|
|
85
|
+
|
|
78
86
|
h = @hooks[hook]
|
|
87
|
+
|
|
79
88
|
if tag && (old = h.find{|x| x[0] == tag})
|
|
80
89
|
old[1] = block
|
|
90
|
+
Plugins.def_sequel_method(self, old[2], 0, &block)
|
|
81
91
|
else
|
|
92
|
+
meth = Plugins.def_sequel_method(self, "validation_class_methods_#{hook}", 0, &block)
|
|
82
93
|
if hook.to_s =~ /^before/
|
|
83
|
-
h.unshift([tag,block])
|
|
94
|
+
h.unshift([tag, block, meth])
|
|
84
95
|
else
|
|
85
|
-
h << [tag, block]
|
|
96
|
+
h << [tag, block, meth]
|
|
86
97
|
end
|
|
87
98
|
end
|
|
88
99
|
end
|
|
89
100
|
end
|
|
90
101
|
|
|
91
102
|
module InstanceMethods
|
|
92
|
-
|
|
103
|
+
# hook methods are private
|
|
104
|
+
[:before_create, :before_update, :before_validation, :before_save, :before_destroy].each{|h| class_eval("def #{h}; model.hook_methods_for(:#{h}){|m| send(m)}; super end", __FILE__, __LINE__)}
|
|
93
105
|
|
|
94
|
-
[:after_create, :after_update, :after_validation, :after_save, :after_destroy].each{|h| class_eval("def #{h}; super; model.
|
|
106
|
+
[:after_create, :after_update, :after_validation, :after_save, :after_destroy].each{|h| class_eval("def #{h}; super; model.hook_methods_for(:#{h}){|m| send(m)}; end", __FILE__, __LINE__)}
|
|
95
107
|
end
|
|
96
108
|
end
|
|
97
109
|
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The insert_conflict plugin allows handling conflicts due to unique
|
|
6
|
+
# constraints when saving new model instance, using the INSERT ON CONFLICT
|
|
7
|
+
# support in PostgreSQL 9.5+ and SQLite 3.24.0+. Example:
|
|
8
|
+
#
|
|
9
|
+
# class Album < Sequel::Model
|
|
10
|
+
# plugin :insert_conflict
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# Album.new(name: 'Foo', copies_sold: 1000).
|
|
14
|
+
# insert_conflict(
|
|
15
|
+
# target: :name,
|
|
16
|
+
# update: {copies_sold: Sequel[:excluded][:b]}
|
|
17
|
+
# ).
|
|
18
|
+
# save
|
|
19
|
+
#
|
|
20
|
+
# This example will try to insert the album, but if there is an existing
|
|
21
|
+
# album with the name 'Foo', this will update the copies_sold attribute
|
|
22
|
+
# for that album. See the PostgreSQL and SQLite adapter documention for
|
|
23
|
+
# the options you can pass to the insert_conflict method.
|
|
24
|
+
#
|
|
25
|
+
# Usage:
|
|
26
|
+
#
|
|
27
|
+
# # Make all model subclasses support insert_conflict
|
|
28
|
+
# Sequel::Model.plugin :insert_conflict
|
|
29
|
+
#
|
|
30
|
+
# # Make the Album class support insert_conflict
|
|
31
|
+
# Album.plugin :insert_conflict
|
|
32
|
+
module InsertConflict
|
|
33
|
+
def self.configure(model)
|
|
34
|
+
model.instance_exec do
|
|
35
|
+
if @dataset && !@dataset.respond_to?(:insert_conflict)
|
|
36
|
+
raise Error, "#{self}'s dataset does not support insert_conflict"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module InstanceMethods
|
|
42
|
+
# Set the insert_conflict options to pass to the dataset when inserting.
|
|
43
|
+
def insert_conflict(opts=OPTS)
|
|
44
|
+
raise Error, "Model#insert_conflict is only supported on new model instances" unless new?
|
|
45
|
+
@insert_conflict_opts = opts
|
|
46
|
+
self
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Set the dataset used for inserting to use INSERT ON CONFLICT
|
|
52
|
+
# Model#insert_conflict has been called on the instance previously.
|
|
53
|
+
def _insert_dataset
|
|
54
|
+
ds = super
|
|
55
|
+
|
|
56
|
+
if @insert_conflict_opts
|
|
57
|
+
ds = ds.insert_conflict(@insert_conflict_opts)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
ds
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Disable the use of prepared insert statements, as they are not compatible
|
|
64
|
+
# with this plugin.
|
|
65
|
+
def use_prepared_statements_for?(type)
|
|
66
|
+
return false if type == :insert || type == :insert_select
|
|
67
|
+
super if defined?(super)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The instance_specific_default plugin exists to make it easier to use a
|
|
6
|
+
# global :instance_specific association option, or to warn or raise when Sequel
|
|
7
|
+
# has to guess which value to use :instance_specific option (Sequel defaults to
|
|
8
|
+
# guessing true as that is the conservative setting). It is helpful to
|
|
9
|
+
# use this plugin, particularly with the :warn or :raise settings, to determine
|
|
10
|
+
# which associations should have :instance_specific set. Setting the
|
|
11
|
+
# :instance_specific to false for associations that are not instance specific
|
|
12
|
+
# can improve performance.
|
|
13
|
+
#
|
|
14
|
+
# Associations are instance-specific if their block calls
|
|
15
|
+
# a model instance method, or where the value of the block varies
|
|
16
|
+
# based on runtime state, and the variance is outside of a delayed evaluation.
|
|
17
|
+
# For example, with the following three associations:
|
|
18
|
+
#
|
|
19
|
+
# Album.one_to_one :first_track, class: :Track do |ds|
|
|
20
|
+
# ds.where(number: 1)
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# Album.one_to_one :last_track, class: :Track do |ds|
|
|
24
|
+
# ds.where(number: num_tracks)
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# Album.one_to_many :recent_tracks, class: :Track do |ds|
|
|
28
|
+
# ds.where{date_updated > Date.today - 10}
|
|
29
|
+
# end
|
|
30
|
+
#
|
|
31
|
+
# +first_track+ is not instance specific, but +last_track+ and +recent_tracks+ are.
|
|
32
|
+
# +last_trac+ is because the +num_tracks+ call in the block is calling
|
|
33
|
+
# <tt>Album#num_tracks</tt>. +recent_tracks+ is because the value will change over
|
|
34
|
+
# time. This plugin allows you to find these cases, and set the :instance_specific
|
|
35
|
+
# option appropriately for them:
|
|
36
|
+
#
|
|
37
|
+
# Album.one_to_one :first_track, class: :Track, instance_specific: false do |ds|
|
|
38
|
+
# ds.where(number: 1)
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# Album.one_to_one :last_track, class: :Track, instance_specific: true do |ds|
|
|
42
|
+
# ds.where(number: num_tracks)
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# Album.one_to_many :recent_tracks, class: :Track, instance_specific: true do |ds|
|
|
46
|
+
# ds.where{date_updated > Date.today - 10}
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# For the +recent_tracks+ association, instead of marking it instance_specific, you
|
|
50
|
+
# could also use a delayed evaluation, since it doesn't actually contain
|
|
51
|
+
# instance-specific code:
|
|
52
|
+
#
|
|
53
|
+
# Album.one_to_many :recent_tracks, class: :Track, instance_specific: false do |ds|
|
|
54
|
+
# ds.where{date_updated > Sequel.delay{Date.today - 10}}
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# Possible arguments to provide when loading the plugin:
|
|
58
|
+
#
|
|
59
|
+
# true :: Set the :instance_specific option to true
|
|
60
|
+
# false :: Set the :instance_specific option to false
|
|
61
|
+
# :default :: Call super to set the :instance_specific option
|
|
62
|
+
# :warn :: Emit a warning before calling super to set the :instance_specific option
|
|
63
|
+
# :raise :: Raise a Sequel::Error if an :instance_specific option is not provided and
|
|
64
|
+
# an association could be instance-specific.
|
|
65
|
+
#
|
|
66
|
+
# Note that this plugin only affects associations which could be instance
|
|
67
|
+
# specific (those with blocks), where the :instance_specific option was not
|
|
68
|
+
# specified when the association was created.
|
|
69
|
+
#
|
|
70
|
+
# Usage:
|
|
71
|
+
#
|
|
72
|
+
# # Set how to handle associations that could be instance specific
|
|
73
|
+
# # but did not specify an :instance_specific option, for all subclasses
|
|
74
|
+
# # (set before creating subclasses).
|
|
75
|
+
# Sequel::Model.plugin :instance_specific_default, :warn
|
|
76
|
+
#
|
|
77
|
+
# # Set how to handle associations that could be instance specific
|
|
78
|
+
# # but did not specify an :instance_specific option, for the Album class
|
|
79
|
+
# Album.plugin :instance_specific_default, :warn
|
|
80
|
+
module InstanceSpecificDefault
|
|
81
|
+
# Set how to handle associations that could be instance specific but did
|
|
82
|
+
# not specify an :instance_specific value.
|
|
83
|
+
def self.configure(model, default)
|
|
84
|
+
model.instance_variable_set(:@instance_specific_default, default)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
module ClassMethods
|
|
88
|
+
Plugins.inherited_instance_variables(self, :@instance_specific_default=>nil)
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# Return the appropriate :instance_specific value, or warn or raise if
|
|
93
|
+
# configured.
|
|
94
|
+
def _association_instance_specific_default(name)
|
|
95
|
+
case @instance_specific_default
|
|
96
|
+
when true, false
|
|
97
|
+
return @instance_specific_default
|
|
98
|
+
when :default
|
|
99
|
+
# nothing
|
|
100
|
+
when :warn
|
|
101
|
+
warn("possibly instance-specific association without :instance_specific option (class: #{self}, association: #{name})", :uplevel => 3)
|
|
102
|
+
when :raise
|
|
103
|
+
raise Sequel::Error, "possibly instance-specific association without :instance_specific option (class: #{self}, association: #{name})"
|
|
104
|
+
else
|
|
105
|
+
raise Sequel::Error, "invalid value passed to instance_specific_default plugin: #{@instance_specific_default.inspect}"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
super
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -29,8 +29,8 @@ module Sequel
|
|
|
29
29
|
# # SELECT * FROM albums WHERE (published IS NOT TRUE)
|
|
30
30
|
#
|
|
31
31
|
module InvertedSubsets
|
|
32
|
-
def self.apply(
|
|
33
|
-
|
|
32
|
+
def self.apply(model, &block)
|
|
33
|
+
model.instance_exec do
|
|
34
34
|
@dataset_module_class = Class.new(@dataset_module_class) do
|
|
35
35
|
include DatasetModuleMethods
|
|
36
36
|
if block
|
|
@@ -106,17 +106,13 @@ module Sequel
|
|
|
106
106
|
# and breaks some aspects of the json_serializer plugin. You can undo the damage
|
|
107
107
|
# done by active_support/json by doing:
|
|
108
108
|
#
|
|
109
|
-
#
|
|
110
|
-
# def to_json(options = {})
|
|
111
|
-
# JSON.generate(self)
|
|
112
|
-
# end
|
|
113
|
-
# end
|
|
114
|
-
#
|
|
115
|
-
# class Hash
|
|
109
|
+
# module ActiveSupportBrokenJSONFix
|
|
116
110
|
# def to_json(options = {})
|
|
117
111
|
# JSON.generate(self)
|
|
118
112
|
# end
|
|
119
113
|
# end
|
|
114
|
+
# Array.send(:prepend, ActiveSupportBrokenJSONFix)
|
|
115
|
+
# Hash.send(:prepend, ActiveSupportBrokenJSONFix)
|
|
120
116
|
#
|
|
121
117
|
# Note that this will probably cause active_support/json to no longer work
|
|
122
118
|
# correctly in some cases.
|
|
@@ -279,7 +275,7 @@ module Sequel
|
|
|
279
275
|
# obj.json_serializer_opts(only: :name)
|
|
280
276
|
# [obj].to_json # => '[{"name":"..."}]'
|
|
281
277
|
def json_serializer_opts(opts=OPTS)
|
|
282
|
-
@json_serializer_opts =
|
|
278
|
+
@json_serializer_opts = (@json_serializer_opts||OPTS).merge(opts)
|
|
283
279
|
end
|
|
284
280
|
|
|
285
281
|
# Return a string in JSON format. Accepts the following
|
|
@@ -301,9 +297,9 @@ module Sequel
|
|
|
301
297
|
# use an underscored version of the model's name.
|
|
302
298
|
def to_json(*a)
|
|
303
299
|
opts = model.json_serializer_opts
|
|
304
|
-
opts =
|
|
300
|
+
opts = opts.merge(@json_serializer_opts) if @json_serializer_opts
|
|
305
301
|
if (arg_opts = a.first).is_a?(Hash)
|
|
306
|
-
opts =
|
|
302
|
+
opts = opts.merge(arg_opts)
|
|
307
303
|
a = []
|
|
308
304
|
end
|
|
309
305
|
|
|
@@ -369,6 +365,13 @@ module Sequel
|
|
|
369
365
|
end
|
|
370
366
|
|
|
371
367
|
module DatasetMethods
|
|
368
|
+
# Store default options used when calling to_json on this dataset.
|
|
369
|
+
# These options take precedence over the class level options,
|
|
370
|
+
# and can be overridden by passing options directly to to_json.
|
|
371
|
+
def json_serializer_opts(opts=OPTS)
|
|
372
|
+
clone(:json_serializer_opts=>opts)
|
|
373
|
+
end
|
|
374
|
+
|
|
372
375
|
# Return a JSON string representing an array of all objects in
|
|
373
376
|
# this dataset. Takes the same options as the instance
|
|
374
377
|
# method, and passes them to every instance. Additionally,
|
|
@@ -386,11 +389,15 @@ module Sequel
|
|
|
386
389
|
# object. If set to a string, wraps the collection in
|
|
387
390
|
# a root object using the string as the key.
|
|
388
391
|
def to_json(*a)
|
|
389
|
-
|
|
390
|
-
|
|
392
|
+
opts = model.json_serializer_opts
|
|
393
|
+
|
|
394
|
+
if ds_opts = @opts[:json_serializer_opts]
|
|
395
|
+
opts = opts.merge(ds_opts)
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
if (arg = a.first).is_a?(Hash)
|
|
399
|
+
opts = opts.merge(arg)
|
|
391
400
|
a = []
|
|
392
|
-
else
|
|
393
|
-
opts = model.json_serializer_opts
|
|
394
401
|
end
|
|
395
402
|
|
|
396
403
|
case collection_root = opts[:root]
|
|
@@ -98,7 +98,7 @@ module Sequel
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
if retrieved_with
|
|
101
|
-
|
|
101
|
+
primary_key = model.primary_key
|
|
102
102
|
composite_pk = true if primary_key.is_a?(Array)
|
|
103
103
|
id_map = {}
|
|
104
104
|
retrieved_with.each{|o| id_map[o.pk] = o unless o.values.has_key?(a) || o.frozen?}
|
data/lib/sequel/plugins/list.rb
CHANGED
|
@@ -45,19 +45,26 @@ module Sequel
|
|
|
45
45
|
# race conditions, and is not safe when concurrent modifications are made
|
|
46
46
|
# to the same list.
|
|
47
47
|
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
48
|
+
# Note that by default, unlike ruby arrays, the list plugin assumes the first
|
|
49
|
+
# entry in the list has position 1, not position 0.
|
|
50
|
+
#
|
|
51
|
+
# You can change this by providing an integer <tt>:top</tt> option:
|
|
52
|
+
#
|
|
53
|
+
# Item.plugin :list, top: 0
|
|
50
54
|
#
|
|
51
55
|
# Copyright (c) 2007-2010 Sharon Rosner, Wayne E. Seguin, Aman Gupta, Adrian Madrid, Jeremy Evans
|
|
52
56
|
module List
|
|
53
|
-
# Set the +position_field+ and +
|
|
54
|
-
# using the <tt>:field</tt
|
|
57
|
+
# Set the +position_field+, +scope_proc+ and +top_of_list+ attributes for the model,
|
|
58
|
+
# using the <tt>:field</tt>, <tt>:scope</tt>, and <tt>:top</tt> options, respectively.
|
|
55
59
|
# The <tt>:scope</tt> option can be a symbol, array of symbols, or a proc that
|
|
56
60
|
# accepts a model instance and returns a dataset representing the list.
|
|
57
61
|
# Also, modify the model dataset's order to order by the position and scope fields.
|
|
58
62
|
def self.configure(model, opts = OPTS)
|
|
59
63
|
model.position_field = opts[:field] || :position
|
|
60
64
|
model.dataset = model.dataset.order_prepend(model.position_field)
|
|
65
|
+
model.instance_exec do
|
|
66
|
+
@top_of_list = opts[:top] || 1
|
|
67
|
+
end
|
|
61
68
|
|
|
62
69
|
model.scope_proc = case scope = opts[:scope]
|
|
63
70
|
when Symbol
|
|
@@ -80,7 +87,10 @@ module Sequel
|
|
|
80
87
|
# proc should accept an instance and return a dataset representing the list.
|
|
81
88
|
attr_accessor :scope_proc
|
|
82
89
|
|
|
83
|
-
|
|
90
|
+
# An Integer to use as the position of the top of the list. Defaults to 1.
|
|
91
|
+
attr_reader :top_of_list
|
|
92
|
+
|
|
93
|
+
Plugins.inherited_instance_variables(self, :@position_field=>nil, :@scope_proc=>nil, :@top_of_list=>nil)
|
|
84
94
|
end
|
|
85
95
|
|
|
86
96
|
module InstanceMethods
|
|
@@ -114,15 +124,17 @@ module Sequel
|
|
|
114
124
|
move_to(position_value + n)
|
|
115
125
|
end
|
|
116
126
|
|
|
117
|
-
# Move this instance to the given place in the list.
|
|
118
|
-
#
|
|
127
|
+
# Move this instance to the given place in the list. If lp is not
|
|
128
|
+
# given or greater than the last list position, uses the last list
|
|
129
|
+
# position. If lp is less than the top list position, uses the
|
|
130
|
+
# top list position.
|
|
119
131
|
def move_to(target, lp = nil)
|
|
120
132
|
current = position_value
|
|
121
133
|
if target != current
|
|
122
134
|
checked_transaction do
|
|
123
135
|
ds = list_dataset
|
|
124
136
|
op, ds = if target < current
|
|
125
|
-
target =
|
|
137
|
+
target = model.top_of_list if target < model.top_of_list
|
|
126
138
|
[:+, ds.where(position_field=>target...current)]
|
|
127
139
|
else
|
|
128
140
|
lp ||= last_position
|
|
@@ -142,9 +154,9 @@ module Sequel
|
|
|
142
154
|
move_to(lp, lp)
|
|
143
155
|
end
|
|
144
156
|
|
|
145
|
-
# Move this instance to the top (first position, position 1) of the list.
|
|
157
|
+
# Move this instance to the top (first position, usually position 1) of the list.
|
|
146
158
|
def move_to_top
|
|
147
|
-
move_to(
|
|
159
|
+
move_to(model.top_of_list)
|
|
148
160
|
end
|
|
149
161
|
|
|
150
162
|
# Move this instance the given number of places up in the list, or 1 place
|
|
@@ -70,10 +70,21 @@ module Sequel
|
|
|
70
70
|
#
|
|
71
71
|
# Then you can do:
|
|
72
72
|
#
|
|
73
|
-
# artist.update_fields(params['artist'], %w'name
|
|
73
|
+
# artist.update_fields(params['artist'], %w'name albums_attributes')
|
|
74
|
+
#
|
|
75
|
+
# Note that Rails 5+ does not use a Hash for submitted parameters, and therefore
|
|
76
|
+
# the above will not work. With Rails 5+, you have to use:
|
|
77
|
+
#
|
|
78
|
+
# artist.update_fields(params.to_unsafe_h['artist'], %w'name albums_attributes')
|
|
74
79
|
#
|
|
75
80
|
# To save changes to the artist, create the first album and associate it to the artist,
|
|
76
81
|
# and update the other existing associated album.
|
|
82
|
+
#
|
|
83
|
+
# You can pass options for individual nested attributes, which will override the default
|
|
84
|
+
# nested attributes options for that association. This is useful for per-call filtering
|
|
85
|
+
# of the allowed fields:
|
|
86
|
+
#
|
|
87
|
+
# a.set_nested_attributes(:albums, params['artist'], :fields=>%w'name')
|
|
77
88
|
module NestedAttributes
|
|
78
89
|
# Depend on the validate_associated plugin.
|
|
79
90
|
def self.apply(model)
|
|
@@ -102,6 +113,10 @@ module Sequel
|
|
|
102
113
|
# value, the attribute hash is ignored.
|
|
103
114
|
# :remove :: Allow disassociation of nested records (can remove the associated
|
|
104
115
|
# object from the parent object, but not destroy the associated object).
|
|
116
|
+
# :require_modification :: Whether to require modification of nested objects when
|
|
117
|
+
# updating or deleting them (checking that a single row was
|
|
118
|
+
# updated). By default, uses the default require_modification
|
|
119
|
+
# setting for the nested object.
|
|
105
120
|
# :transform :: A proc to transform attribute hashes before they are
|
|
106
121
|
# passed to associated object. Takes two arguments, the parent object and
|
|
107
122
|
# the attribute hash. Uses the return value as the new attribute hash.
|
|
@@ -114,10 +129,10 @@ module Sequel
|
|
|
114
129
|
# If a block is provided, it is used to set the :reject_if option.
|
|
115
130
|
def nested_attributes(*associations, &block)
|
|
116
131
|
include(@nested_attributes_module ||= Module.new) unless @nested_attributes_module
|
|
117
|
-
opts = associations.last.is_a?(Hash) ? associations.pop :
|
|
132
|
+
opts = associations.last.is_a?(Hash) ? associations.pop : OPTS
|
|
118
133
|
reflections = associations.map{|a| association_reflection(a) || raise(Error, "no association named #{a} for #{self}")}
|
|
119
134
|
reflections.each do |r|
|
|
120
|
-
r[:nested_attributes] = opts
|
|
135
|
+
r[:nested_attributes] = opts.dup
|
|
121
136
|
r[:nested_attributes][:unmatched_pk] ||= :raise
|
|
122
137
|
r[:nested_attributes][:reject_if] ||= block
|
|
123
138
|
def_nested_attribute_method(r)
|
|
@@ -144,7 +159,7 @@ module Sequel
|
|
|
144
159
|
def set_nested_attributes(assoc, obj, opts=OPTS)
|
|
145
160
|
raise(Error, "no association named #{assoc} for #{model.inspect}") unless ref = model.association_reflection(assoc)
|
|
146
161
|
raise(Error, "nested attributes are not enabled for association #{assoc} for #{model.inspect}") unless meta = ref[:nested_attributes]
|
|
147
|
-
meta =
|
|
162
|
+
meta = meta.merge(opts)
|
|
148
163
|
meta[:reflection] = ref
|
|
149
164
|
if ref.returns_array?
|
|
150
165
|
nested_attributes_list_setter(meta, obj)
|
|
@@ -176,6 +191,7 @@ module Sequel
|
|
|
176
191
|
delay_validate_associated_object(reflection, obj)
|
|
177
192
|
if reflection.returns_array?
|
|
178
193
|
public_send(reflection[:name]) << obj
|
|
194
|
+
obj.skip_validation_on_next_save!
|
|
179
195
|
after_save_hook{public_send(reflection[:add_method], obj)}
|
|
180
196
|
else
|
|
181
197
|
associations[reflection[:name]] = obj
|
|
@@ -190,7 +206,10 @@ module Sequel
|
|
|
190
206
|
if reflection[:type] == :many_to_one
|
|
191
207
|
before_save_hook{public_send(reflection[:setter_method], obj.save(:validate=>false))}
|
|
192
208
|
else
|
|
193
|
-
after_save_hook
|
|
209
|
+
after_save_hook do
|
|
210
|
+
obj.skip_validation_on_next_save!
|
|
211
|
+
public_send(reflection[:setter_method], obj)
|
|
212
|
+
end
|
|
194
213
|
end
|
|
195
214
|
end
|
|
196
215
|
add_reciprocal_object(reflection, obj)
|
|
@@ -267,6 +286,9 @@ module Sequel
|
|
|
267
286
|
obj = Array(public_send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
|
|
268
287
|
end
|
|
269
288
|
if obj
|
|
289
|
+
unless (require_modification = meta[:require_modification]).nil?
|
|
290
|
+
obj.require_modification = require_modification
|
|
291
|
+
end
|
|
270
292
|
attributes = attributes.dup.delete_if{|k,v| str_keys.include? k.to_s}
|
|
271
293
|
if meta[:destroy] && klass.db.send(:typecast_value_boolean, attributes.delete(:_delete) || attributes.delete('_delete'))
|
|
272
294
|
nested_attributes_remove(meta, obj, :destroy=>true)
|