sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
|
@@ -28,31 +28,16 @@ module Sequel
|
|
|
28
28
|
# # Add the instance hook methods just to Album instances
|
|
29
29
|
# Album.plugin :instance_hooks
|
|
30
30
|
module InstanceHooks
|
|
31
|
-
BEFORE_HOOKS, AFTER_HOOKS = Sequel::Model::HOOKS.partition{|l| l.to_s.start_with?('before')}
|
|
32
|
-
Sequel::Deprecation.deprecate_constant(self, :BEFORE_HOOKS)
|
|
33
|
-
Sequel::Deprecation.deprecate_constant(self, :AFTER_HOOKS)
|
|
34
|
-
HOOKS = Sequel::Model::HOOKS
|
|
35
|
-
Sequel::Deprecation.deprecate_constant(self, :HOOKS)
|
|
36
|
-
|
|
37
|
-
# SEQUEL5: Remove
|
|
38
|
-
DEPRECATION_REPLACEMENTS = {
|
|
39
|
-
:after_commit=>"Use obj.after_save_hook{obj.db.after_commit{}} instead",
|
|
40
|
-
:after_destroy_commit=>"Use obj.after_destroy_hook{obj.db.after_commit{}} instead",
|
|
41
|
-
:after_destroy_rollback=>"Use obj.before_destroy_hook{obj.db.after_rollback{}} instead",
|
|
42
|
-
:after_rollback=>"Use obj.before_save_hook{obj.db.after_rollback{}} instead"
|
|
43
|
-
}.freeze
|
|
44
|
-
|
|
45
31
|
module InstanceMethods
|
|
46
32
|
Sequel::Model::HOOKS.each{|h| class_eval(<<-END , __FILE__, __LINE__+1)}
|
|
47
33
|
def #{h}_hook(&block)
|
|
48
|
-
#{"Sequel::Deprecation.deprecate('Sequel::Model##{h}_hook in the instance_hooks plugin', #{DEPRECATION_REPLACEMENTS[h].inspect})" if DEPRECATION_REPLACEMENTS[h]}
|
|
49
34
|
raise Sequel::Error, "can't add hooks to frozen object" if frozen?
|
|
50
35
|
add_instance_hook(:#{h}, &block)
|
|
51
36
|
self
|
|
52
37
|
end
|
|
53
38
|
END
|
|
54
39
|
|
|
55
|
-
[:before_create, :before_update, :before_validation].each{|h| class_eval("def #{h};
|
|
40
|
+
[:before_create, :before_update, :before_validation].each{|h| class_eval("def #{h}; run_before_instance_hooks(:#{h}) if @instance_hooks; super end", __FILE__, __LINE__)}
|
|
56
41
|
[:after_create, :after_update].each{|h| class_eval(<<-END, __FILE__, __LINE__ + 1)}
|
|
57
42
|
def #{h}
|
|
58
43
|
super
|
|
@@ -67,15 +52,9 @@ module Sequel
|
|
|
67
52
|
def after_destroy
|
|
68
53
|
super
|
|
69
54
|
return unless @instance_hooks
|
|
70
|
-
# SEQUEL5: Remove commit/rollback
|
|
71
|
-
if ad = @instance_hooks[:after_destroy_commit]
|
|
72
|
-
db.after_commit{ad.each(&:call)}
|
|
73
|
-
end
|
|
74
55
|
run_after_instance_hooks(:after_destroy)
|
|
75
56
|
@instance_hooks.delete(:after_destroy)
|
|
76
57
|
@instance_hooks.delete(:before_destroy)
|
|
77
|
-
@instance_hooks.delete(:after_destroy_commit)
|
|
78
|
-
@instance_hooks.delete(:after_destroy_rollback)
|
|
79
58
|
end
|
|
80
59
|
|
|
81
60
|
# Run after validation instance hooks.
|
|
@@ -89,39 +68,25 @@ module Sequel
|
|
|
89
68
|
def after_save
|
|
90
69
|
super
|
|
91
70
|
return unless @instance_hooks
|
|
92
|
-
# SEQUEL5: Remove commit/rollback
|
|
93
|
-
if (ac = @instance_hooks[:after_commit])
|
|
94
|
-
db.after_commit{ac.each(&:call)}
|
|
95
|
-
end
|
|
96
71
|
run_after_instance_hooks(:after_save)
|
|
97
72
|
@instance_hooks.delete(:after_save)
|
|
98
73
|
@instance_hooks.delete(:before_save)
|
|
99
74
|
@instance_hooks.delete(:after_validation)
|
|
100
75
|
@instance_hooks.delete(:before_validation)
|
|
101
|
-
@instance_hooks.delete(:after_commit)
|
|
102
|
-
@instance_hooks.delete(:after_rollback)
|
|
103
76
|
end
|
|
104
77
|
|
|
105
78
|
# Run before_destroy instance hooks.
|
|
106
79
|
def before_destroy
|
|
107
80
|
return super unless @instance_hooks
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
db.after_rollback{adr.each(&:call)}
|
|
111
|
-
end
|
|
112
|
-
# SEQUEL5: No false checking
|
|
113
|
-
run_before_instance_hooks(:before_destroy) == false ? false : super
|
|
81
|
+
run_before_instance_hooks(:before_destroy)
|
|
82
|
+
super
|
|
114
83
|
end
|
|
115
84
|
|
|
116
85
|
# Run before_save instance hooks.
|
|
117
86
|
def before_save
|
|
118
87
|
return super unless @instance_hooks
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
db.after_rollback{ar.each(&:call)}
|
|
122
|
-
end
|
|
123
|
-
# SEQUEL5: No false checking
|
|
124
|
-
run_before_instance_hooks(:before_save) == false ? false : super
|
|
88
|
+
run_before_instance_hooks(:before_save)
|
|
89
|
+
super
|
|
125
90
|
end
|
|
126
91
|
|
|
127
92
|
private
|
|
@@ -130,7 +95,7 @@ module Sequel
|
|
|
130
95
|
# the beginning of the instance hook's array. For after hooks, add it
|
|
131
96
|
# to the end.
|
|
132
97
|
def add_instance_hook(hook, &block)
|
|
133
|
-
instance_hooks(hook).
|
|
98
|
+
instance_hooks(hook).public_send(hook.to_s.start_with?('before') ? :unshift : :push, block)
|
|
134
99
|
end
|
|
135
100
|
|
|
136
101
|
# An array of instance level hook blocks for the given hook type.
|
|
@@ -143,17 +108,7 @@ module Sequel
|
|
|
143
108
|
def run_after_instance_hooks(hook)
|
|
144
109
|
instance_hooks(hook).each(&:call)
|
|
145
110
|
end
|
|
146
|
-
|
|
147
|
-
# Run all hook blocks of the given hook type. If a hook block returns false,
|
|
148
|
-
# immediately return false without running the remaining blocks.
|
|
149
|
-
def run_before_instance_hooks(hook)
|
|
150
|
-
instance_hooks(hook).each do |b|
|
|
151
|
-
if b.call == false
|
|
152
|
-
Sequel::Deprecation.deprecate("Having #{hook} instance hook block return false to stop evaluation of further #{hook} instance hook blocks", "Instead, call cancel_action inside #{hook} instance hook block")
|
|
153
|
-
return false
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
111
|
+
alias run_before_instance_hooks run_after_instance_hooks
|
|
157
112
|
end
|
|
158
113
|
end
|
|
159
114
|
end
|
|
@@ -18,7 +18,9 @@ module Sequel
|
|
|
18
18
|
# Album.plugin :inverted_subsets
|
|
19
19
|
#
|
|
20
20
|
# # This will now create two methods, published and not_published
|
|
21
|
-
# Album.
|
|
21
|
+
# Album.dataset_module do
|
|
22
|
+
# where :published, published: true
|
|
23
|
+
# end
|
|
22
24
|
#
|
|
23
25
|
# Album.published.sql
|
|
24
26
|
# # SELECT * FROM albums WHERE (published IS TRUE)
|
|
@@ -17,37 +17,37 @@ module Sequel
|
|
|
17
17
|
#
|
|
18
18
|
# In addition, you can provide options to control the JSON output:
|
|
19
19
|
#
|
|
20
|
-
# album.to_json(:
|
|
21
|
-
# album.to_json(:
|
|
20
|
+
# album.to_json(only: :name)
|
|
21
|
+
# album.to_json(except: [:id, :artist_id])
|
|
22
22
|
# # => '{"json_class"="Album","name"=>"RF"}'
|
|
23
23
|
#
|
|
24
|
-
# album.to_json(:
|
|
24
|
+
# album.to_json(include: :artist)
|
|
25
25
|
# # => '{"id":1,"name":"RF","artist_id":2,
|
|
26
26
|
# # "artist":{"id":2,"name":"YJM"}}'
|
|
27
27
|
#
|
|
28
28
|
# You can use a hash value with <tt>:include</tt> to pass options
|
|
29
29
|
# to associations:
|
|
30
30
|
#
|
|
31
|
-
# album.to_json(:
|
|
31
|
+
# album.to_json(include: {artist: {only: :name}})
|
|
32
32
|
# # => '{"id":1,"name":"RF","artist_id":2,
|
|
33
33
|
# # "artist":{"name":"YJM"}}'
|
|
34
34
|
#
|
|
35
|
-
# You can specify a name for a given association by
|
|
36
|
-
#
|
|
35
|
+
# You can specify a name for a given association by using an aliased
|
|
36
|
+
# expression as the key in the <tt>:include</tt> hash
|
|
37
37
|
#
|
|
38
|
-
# album.to_json(:
|
|
38
|
+
# album.to_json(include: {Sequel.as(:artist, :singer)=>{only: :name}})
|
|
39
39
|
# # => '{"id":1,"name":"RF","artist_id":2,
|
|
40
40
|
# # "singer":{"name":"YJM"}}'
|
|
41
41
|
#
|
|
42
42
|
# You can specify the <tt>:root</tt> option to nest the JSON under the
|
|
43
43
|
# name of the model:
|
|
44
44
|
#
|
|
45
|
-
# album.to_json(:
|
|
45
|
+
# album.to_json(root: true)
|
|
46
46
|
# # => '{"album":{"id":1,"name":"RF","artist_id":2}}'
|
|
47
47
|
#
|
|
48
48
|
# You can specify JSON serialization options to use later:
|
|
49
49
|
#
|
|
50
|
-
# album.json_serializer_opts(:
|
|
50
|
+
# album.json_serializer_opts(root: true)
|
|
51
51
|
# [album].to_json
|
|
52
52
|
# # => '[{"album":{"id":1,"name":"RF","artist_id":2}}]'
|
|
53
53
|
#
|
|
@@ -55,12 +55,12 @@ module Sequel
|
|
|
55
55
|
# of which return all objects in the dataset:
|
|
56
56
|
#
|
|
57
57
|
# Album.to_json
|
|
58
|
-
# Album.where(:
|
|
58
|
+
# Album.where(artist_id: 1).to_json(include: :tags)
|
|
59
59
|
#
|
|
60
60
|
# If you have an existing array of model instances you want to convert to
|
|
61
61
|
# JSON, you can call the class to_json method with the :array option:
|
|
62
62
|
#
|
|
63
|
-
# Album.to_json(:
|
|
63
|
+
# Album.to_json(array: [Album[1], Album[2]])
|
|
64
64
|
#
|
|
65
65
|
# All to_json methods take blocks, and if a block is given, it will yield
|
|
66
66
|
# the array or hash before serialization, and will serialize the value
|
|
@@ -77,7 +77,7 @@ module Sequel
|
|
|
77
77
|
# The array_from_json class method exists to parse arrays of model instances
|
|
78
78
|
# from json:
|
|
79
79
|
#
|
|
80
|
-
# json = Album.where(:
|
|
80
|
+
# json = Album.where(artist_id: 1).to_json
|
|
81
81
|
# albums = Album.array_from_json(json)
|
|
82
82
|
#
|
|
83
83
|
# These does not necessarily round trip, since doing so would let users
|
|
@@ -86,7 +86,7 @@ module Sequel
|
|
|
86
86
|
# fields, you can use the :fields option, which will call set_fields with
|
|
87
87
|
# the given fields:
|
|
88
88
|
#
|
|
89
|
-
# Album.from_json(album.to_json, :
|
|
89
|
+
# Album.from_json(album.to_json, fields: %w'id name')
|
|
90
90
|
#
|
|
91
91
|
# If you want to update an existing instance, you can use the from_json
|
|
92
92
|
# instance method:
|
|
@@ -96,11 +96,11 @@ module Sequel
|
|
|
96
96
|
# Both of these allow creation of cached associated objects, if you provide
|
|
97
97
|
# the :associations option:
|
|
98
98
|
#
|
|
99
|
-
# album.from_json(json, :
|
|
99
|
+
# album.from_json(json, associations: :artist)
|
|
100
100
|
#
|
|
101
101
|
# You can even provide options when setting up the associated objects:
|
|
102
102
|
#
|
|
103
|
-
# album.from_json(json, :
|
|
103
|
+
# album.from_json(json, associations: {artist: {fields: %w'id name', associations: :tags}})
|
|
104
104
|
#
|
|
105
105
|
# Note that active_support/json makes incompatible changes to the to_json API,
|
|
106
106
|
# and breaks some aspects of the json_serializer plugin. You can undo the damage
|
|
@@ -132,7 +132,7 @@ module Sequel
|
|
|
132
132
|
# Set up the column readers to do deserialization and the column writers
|
|
133
133
|
# to save the value in deserialized_values.
|
|
134
134
|
def self.configure(model, opts=OPTS)
|
|
135
|
-
model.
|
|
135
|
+
model.instance_exec do
|
|
136
136
|
@json_serializer_opts = (@json_serializer_opts || OPTS).merge(opts)
|
|
137
137
|
end
|
|
138
138
|
end
|
|
@@ -276,7 +276,7 @@ module Sequel
|
|
|
276
276
|
#
|
|
277
277
|
# Example:
|
|
278
278
|
#
|
|
279
|
-
# obj.json_serializer_opts(:
|
|
279
|
+
# obj.json_serializer_opts(only: :name)
|
|
280
280
|
# [obj].to_json # => '[{"name":"..."}]'
|
|
281
281
|
def json_serializer_opts(opts=OPTS)
|
|
282
282
|
@json_serializer_opts = Hash[@json_serializer_opts||OPTS].merge!(opts)
|
|
@@ -329,7 +329,7 @@ module Sequel
|
|
|
329
329
|
|
|
330
330
|
v = v.empty? ? [] : [v]
|
|
331
331
|
|
|
332
|
-
objs =
|
|
332
|
+
objs = public_send(k)
|
|
333
333
|
|
|
334
334
|
is_array = if r = model.association_reflection(k)
|
|
335
335
|
r.returns_array?
|
|
@@ -351,7 +351,7 @@ module Sequel
|
|
|
351
351
|
else
|
|
352
352
|
key_name = c.to_s
|
|
353
353
|
end
|
|
354
|
-
h[key_name] =
|
|
354
|
+
h[key_name] = public_send(c)
|
|
355
355
|
end
|
|
356
356
|
end
|
|
357
357
|
end
|
|
@@ -13,7 +13,7 @@ module Sequel
|
|
|
13
13
|
# get the reviews for all of those albums:
|
|
14
14
|
#
|
|
15
15
|
# Album.plugin :lazy_attributes, :review
|
|
16
|
-
# Album.where{id<100}.all do |a|
|
|
16
|
+
# Album.where{id < 100}.all do |a|
|
|
17
17
|
# a.review
|
|
18
18
|
# end
|
|
19
19
|
#
|
|
@@ -38,15 +38,6 @@ module Sequel
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
module ClassMethods
|
|
41
|
-
def lazy_attributes_module
|
|
42
|
-
Sequel::Deprecation.deprecate('Sequel::Model.lazy_attributes_module', 'There is no replacement')
|
|
43
|
-
@lazy_attributes_module
|
|
44
|
-
end
|
|
45
|
-
def lazy_attributes_module=(v)
|
|
46
|
-
Sequel::Deprecation.deprecate('Sequel::Model.lazy_attributes_module=', 'There is no replacement')
|
|
47
|
-
@lazy_attributes_module= v
|
|
48
|
-
end
|
|
49
|
-
|
|
50
41
|
# Freeze lazy attributes module when freezing model class.
|
|
51
42
|
def freeze
|
|
52
43
|
@lazy_attributes_module.freeze if @lazy_attributes_module
|
data/lib/sequel/plugins/list.rb
CHANGED
|
@@ -11,7 +11,7 @@ module Sequel
|
|
|
11
11
|
#
|
|
12
12
|
# class Item < Sequel::Model(:items)
|
|
13
13
|
# plugin :list # will use :position field for position
|
|
14
|
-
# plugin :list, :
|
|
14
|
+
# plugin :list, field: :pos # will use :pos field for position
|
|
15
15
|
# end
|
|
16
16
|
#
|
|
17
17
|
# item = Item[1]
|
|
@@ -38,7 +38,7 @@ module Sequel
|
|
|
38
38
|
# For example, if each item has a +user_id+ field, and you want every user
|
|
39
39
|
# to have their own list:
|
|
40
40
|
#
|
|
41
|
-
# Item.plugin :list, :
|
|
41
|
+
# Item.plugin :list, scope: :user_id
|
|
42
42
|
#
|
|
43
43
|
# Note that using this plugin modifies the order of the model's dataset to
|
|
44
44
|
# sort by the position and scope fields. Also note that this plugin is subject to
|
|
@@ -62,7 +62,7 @@ module Sequel
|
|
|
62
62
|
model.scope_proc = case scope = opts[:scope]
|
|
63
63
|
when Symbol
|
|
64
64
|
model.dataset = model.dataset.order_prepend(scope)
|
|
65
|
-
proc{|obj| obj.model.where(scope=>obj.
|
|
65
|
+
proc{|obj| obj.model.where(scope=>obj.public_send(scope))}
|
|
66
66
|
when Array
|
|
67
67
|
model.dataset = model.dataset.order_prepend(*scope)
|
|
68
68
|
proc{|obj| obj.model.where(scope.map{|s| [s, obj.get_column_value(s)]})}
|
|
@@ -170,17 +170,17 @@ module Sequel
|
|
|
170
170
|
self.next(n * -1)
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
-
private
|
|
174
|
-
|
|
175
173
|
# Set the value of the position_field to the maximum value plus 1 unless the
|
|
176
174
|
# position field already has a value.
|
|
177
|
-
def
|
|
175
|
+
def before_validation
|
|
178
176
|
unless get_column_value(position_field)
|
|
179
177
|
set_column_value("#{position_field}=", list_dataset.max(position_field).to_i+1)
|
|
180
178
|
end
|
|
181
179
|
super
|
|
182
180
|
end
|
|
183
181
|
|
|
182
|
+
private
|
|
183
|
+
|
|
184
184
|
# The model's position field, an instance method for ease of use.
|
|
185
185
|
def position_field
|
|
186
186
|
model.position_field
|
|
@@ -46,18 +46,18 @@ module Sequel
|
|
|
46
46
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]]
|
|
47
47
|
#
|
|
48
48
|
# # All albums by artists that are associated to any album that this artist is associated to
|
|
49
|
-
# Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id],
|
|
50
|
-
# [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]],
|
|
51
|
-
# :
|
|
49
|
+
# Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id],
|
|
50
|
+
# [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]],
|
|
51
|
+
# class: :Album
|
|
52
52
|
#
|
|
53
53
|
# # All tracks on albums by this artist (also could be a many_to_many)
|
|
54
|
-
# Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]],
|
|
55
|
-
# :
|
|
54
|
+
# Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]],
|
|
55
|
+
# right_primary_key: :album_id
|
|
56
56
|
#
|
|
57
57
|
# Often you don't want the current object to appear in the array of associated objects. This is easiest to handle via an :after_load hook:
|
|
58
58
|
#
|
|
59
59
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]],
|
|
60
|
-
# :
|
|
60
|
+
# after_load: lambda{|artist, associated_artists| associated_artists.delete(artist)}
|
|
61
61
|
#
|
|
62
62
|
# You can also handle it by adding a dataset block that excludes the current record (so it won't be retrieved at all), but
|
|
63
63
|
# that won't work when eagerly loading, which is why the :after_load proc is recommended instead.
|
|
@@ -65,7 +65,7 @@ module Sequel
|
|
|
65
65
|
# It's also common to not want duplicate records, in which case the :distinct option can be used:
|
|
66
66
|
#
|
|
67
67
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]],
|
|
68
|
-
# :
|
|
68
|
+
# distinct: true
|
|
69
69
|
#
|
|
70
70
|
# In addition to many_through_many, this plugin also adds one_through_many, for an association to a single object through multiple join tables.
|
|
71
71
|
# This is useful if there are unique constraints on the foreign keys in the join tables that reference back to the current table, or if you want
|
|
@@ -228,7 +228,10 @@ module Sequel
|
|
|
228
228
|
def def_many_through_many(opts)
|
|
229
229
|
one_through_many = opts[:type] == :one_through_many
|
|
230
230
|
opts[:read_only] = true
|
|
231
|
-
|
|
231
|
+
if opts[:uniq]
|
|
232
|
+
opts[:after_load] ||= []
|
|
233
|
+
opts[:after_load].unshift(:array_uniq!)
|
|
234
|
+
end
|
|
232
235
|
opts[:cartesian_product_number] ||= one_through_many ? 0 : 2
|
|
233
236
|
opts[:through] = opts[:through].map do |e|
|
|
234
237
|
case e
|
|
@@ -12,15 +12,15 @@ module Sequel
|
|
|
12
12
|
# end
|
|
13
13
|
# p1 = Person[1]
|
|
14
14
|
# p2 = Person[1]
|
|
15
|
-
# p1.update(:
|
|
16
|
-
# p2.update(:
|
|
15
|
+
# p1.update(name: 'Jim') # works
|
|
16
|
+
# p2.update(name: 'Bob') # raises Sequel::NoExistingObject
|
|
17
17
|
#
|
|
18
18
|
# In order for this plugin to work, you need to make sure that the database
|
|
19
19
|
# table has a column of timestamp or rowversion. The plugin uses a default
|
|
20
20
|
# name of timestamp for this columns, but you can override that using the
|
|
21
21
|
# :lock_column option:
|
|
22
22
|
#
|
|
23
|
-
# plugin :mssql_optimistic_locking, :
|
|
23
|
+
# plugin :mssql_optimistic_locking, lock_column: :column_name
|
|
24
24
|
#
|
|
25
25
|
# This plugin relies on the instance_filters plugin.
|
|
26
26
|
module MssqlOptimisticLocking
|
|
@@ -13,11 +13,11 @@ module Sequel
|
|
|
13
13
|
# The nested_attributes call defines a single method, <tt><i>association</i>_attributes=</tt>,
|
|
14
14
|
# (e.g. <tt>albums_attributes=</tt>). So if you have an Artist instance:
|
|
15
15
|
#
|
|
16
|
-
# a = Artist.new(:
|
|
16
|
+
# a = Artist.new(name: 'YJM')
|
|
17
17
|
#
|
|
18
18
|
# You can create new album instances related to this artist:
|
|
19
19
|
#
|
|
20
|
-
# a.albums_attributes = [{:
|
|
20
|
+
# a.albums_attributes = [{name: 'RF'}, {name: 'MO'}]
|
|
21
21
|
#
|
|
22
22
|
# Note that this doesn't send any queries to the database yet. That doesn't happen till
|
|
23
23
|
# you save the object:
|
|
@@ -33,7 +33,7 @@ module Sequel
|
|
|
33
33
|
# objects. You just need to make sure that the primary key field is filled in for the
|
|
34
34
|
# associated object:
|
|
35
35
|
#
|
|
36
|
-
# a.update(:albums_attributes => [{:
|
|
36
|
+
# a.update(:albums_attributes => [{id: 1, name: 'T'}])
|
|
37
37
|
#
|
|
38
38
|
# Since the primary key field is filled in, the plugin will update the album with id 1 instead
|
|
39
39
|
# of creating a new album.
|
|
@@ -41,15 +41,15 @@ module Sequel
|
|
|
41
41
|
# If you would like to delete the associated object instead of updating it, you add a _delete
|
|
42
42
|
# entry to the hash, and also pass the :destroy option when calling +nested_attributes+:
|
|
43
43
|
#
|
|
44
|
-
# Artist.nested_attributes :albums, :
|
|
45
|
-
# a.update(:albums_attributes => [{:
|
|
44
|
+
# Artist.nested_attributes :albums, destroy: true
|
|
45
|
+
# a.update(:albums_attributes => [{id: 1, _delete: true}])
|
|
46
46
|
#
|
|
47
47
|
# This will delete the related associated object from the database. If you want to leave the
|
|
48
48
|
# associated object in the database, but just remove it from the association, add a _remove
|
|
49
49
|
# entry in the hash, and also pass the :remove option when calling +nested_attributes+:
|
|
50
50
|
#
|
|
51
|
-
# Artist.nested_attributes :albums, :
|
|
52
|
-
# a.update(:albums_attributes => [{:
|
|
51
|
+
# Artist.nested_attributes :albums, remove: true
|
|
52
|
+
# a.update(:albums_attributes => [{id: 1, _remove: true}])
|
|
53
53
|
#
|
|
54
54
|
# The above example was for a one_to_many association, but the plugin also works similarly
|
|
55
55
|
# for other association types. For one_to_one and many_to_one associations, you need to
|
|
@@ -66,11 +66,11 @@ module Sequel
|
|
|
66
66
|
#
|
|
67
67
|
# Your web stack will probably parse that into a nested hash similar to:
|
|
68
68
|
#
|
|
69
|
-
# {
|
|
69
|
+
# {'artist'=>{'name'=>'Y', 'albums_attributes'=>{'0'=>{'name'=>'X'}, '1'=>{'id'=>'2', 'name'=>'Z'}}}}
|
|
70
70
|
#
|
|
71
71
|
# Then you can do:
|
|
72
72
|
#
|
|
73
|
-
# artist.update_fields(params[
|
|
73
|
+
# artist.update_fields(params['artist'], %w'name albums_artists')
|
|
74
74
|
#
|
|
75
75
|
# To save changes to the artist, create the first album and associate it to the artist,
|
|
76
76
|
# and update the other existing associated album.
|
|
@@ -81,15 +81,6 @@ module Sequel
|
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
module ClassMethods
|
|
84
|
-
def nested_attributes_module
|
|
85
|
-
Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module', 'There is no replacement')
|
|
86
|
-
@nested_attributes_module
|
|
87
|
-
end
|
|
88
|
-
def nested_attributes_module=(v)
|
|
89
|
-
Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module=', 'There is no replacement')
|
|
90
|
-
@nested_attributes_module = v
|
|
91
|
-
end
|
|
92
|
-
|
|
93
84
|
# Freeze nested_attributes_module when freezing model class.
|
|
94
85
|
def freeze
|
|
95
86
|
@nested_attributes_module.freeze if @nested_attributes_module
|
|
@@ -127,11 +118,7 @@ module Sequel
|
|
|
127
118
|
reflections = associations.map{|a| association_reflection(a) || raise(Error, "no association named #{a} for #{self}")}
|
|
128
119
|
reflections.each do |r|
|
|
129
120
|
r[:nested_attributes] = opts
|
|
130
|
-
r[:nested_attributes][:unmatched_pk] ||=
|
|
131
|
-
if opts.has_key?(:strict)
|
|
132
|
-
Sequel::Deprecation.deprecate("The nested_attributes :strict option", "Use the :unmatched_pk option instead")
|
|
133
|
-
end
|
|
134
|
-
opts.delete(:strict) == false ? :ignore : :raise)
|
|
121
|
+
r[:nested_attributes][:unmatched_pk] ||= :raise
|
|
135
122
|
r[:nested_attributes][:reject_if] ||= block
|
|
136
123
|
def_nested_attribute_method(r)
|
|
137
124
|
end
|
|
@@ -188,8 +175,8 @@ module Sequel
|
|
|
188
175
|
nested_attributes_set_attributes(meta, obj, attributes)
|
|
189
176
|
delay_validate_associated_object(reflection, obj)
|
|
190
177
|
if reflection.returns_array?
|
|
191
|
-
|
|
192
|
-
after_save_hook{
|
|
178
|
+
public_send(reflection[:name]) << obj
|
|
179
|
+
after_save_hook{public_send(reflection[:add_method], obj)}
|
|
193
180
|
else
|
|
194
181
|
associations[reflection[:name]] = obj
|
|
195
182
|
|
|
@@ -201,9 +188,9 @@ module Sequel
|
|
|
201
188
|
# Don't need to validate the object twice if :validate association option is not false
|
|
202
189
|
# and don't want to validate it at all if it is false.
|
|
203
190
|
if reflection[:type] == :many_to_one
|
|
204
|
-
before_save_hook{
|
|
191
|
+
before_save_hook{public_send(reflection[:setter_method], obj.save(:validate=>false))}
|
|
205
192
|
else
|
|
206
|
-
after_save_hook{
|
|
193
|
+
after_save_hook{public_send(reflection[:setter_method], obj)}
|
|
207
194
|
end
|
|
208
195
|
end
|
|
209
196
|
add_reciprocal_object(reflection, obj)
|
|
@@ -215,7 +202,7 @@ module Sequel
|
|
|
215
202
|
# If there is a limit on the nested attributes for this association,
|
|
216
203
|
# make sure the length of the attributes_list is not greater than the limit.
|
|
217
204
|
def nested_attributes_list_setter(meta, attributes_list)
|
|
218
|
-
attributes_list = attributes_list.
|
|
205
|
+
attributes_list = attributes_list.sort.map{|k,v| v} if attributes_list.is_a?(Hash)
|
|
219
206
|
if (limit = meta[:limit]) && attributes_list.length > limit
|
|
220
207
|
raise(Error, "number of nested attributes (#{attributes_list.length}) exceeds the limit (#{limit})")
|
|
221
208
|
end
|
|
@@ -231,9 +218,9 @@ module Sequel
|
|
|
231
218
|
if !opts[:destroy] || reflection.remove_before_destroy?
|
|
232
219
|
before_save_hook do
|
|
233
220
|
if reflection.returns_array?
|
|
234
|
-
|
|
221
|
+
public_send(reflection[:remove_method], obj)
|
|
235
222
|
else
|
|
236
|
-
|
|
223
|
+
public_send(reflection[:setter_method], nil)
|
|
237
224
|
end
|
|
238
225
|
end
|
|
239
226
|
end
|
|
@@ -277,7 +264,7 @@ module Sequel
|
|
|
277
264
|
str_keys = sym_keys.map(&:to_s)
|
|
278
265
|
if (pk = attributes.values_at(*sym_keys)).all? || (pk = attributes.values_at(*str_keys)).all?
|
|
279
266
|
pk = pk.map(&:to_s)
|
|
280
|
-
obj = Array(
|
|
267
|
+
obj = Array(public_send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
|
|
281
268
|
end
|
|
282
269
|
if obj
|
|
283
270
|
attributes = attributes.dup.delete_if{|k,v| str_keys.include? k.to_s}
|
|
@@ -11,11 +11,11 @@ module Sequel
|
|
|
11
11
|
# end
|
|
12
12
|
# p1 = Person[1]
|
|
13
13
|
# p2 = Person[1]
|
|
14
|
-
# p1.update(:
|
|
15
|
-
# p2.update(:
|
|
14
|
+
# p1.update(name: 'Jim') # works
|
|
15
|
+
# p2.update(name: 'Bob') # raises Sequel::Plugins::OptimisticLocking::Error
|
|
16
16
|
#
|
|
17
17
|
# In order for this plugin to work, you need to make sure that the database
|
|
18
|
-
# table has a lock_version column (or other column you name via the lock_column
|
|
18
|
+
# table has a +lock_version+ column (or other column you name via the lock_column
|
|
19
19
|
# class level accessor) that defaults to 0.
|
|
20
20
|
#
|
|
21
21
|
# This plugin relies on the instance_filters plugin.
|
|
@@ -328,7 +328,10 @@ module Sequel
|
|
|
328
328
|
opts[:key] = opts.default_key unless opts.has_key?(:key)
|
|
329
329
|
key = opts[:key]
|
|
330
330
|
key_column = opts[:key_column] ||= opts[:key]
|
|
331
|
-
|
|
331
|
+
if opts[:uniq]
|
|
332
|
+
opts[:after_load] ||= []
|
|
333
|
+
opts[:after_load].unshift(:array_uniq!)
|
|
334
|
+
end
|
|
332
335
|
opts[:dataset] ||= lambda do
|
|
333
336
|
opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([get_column_value(pk)], opts.array_type)))
|
|
334
337
|
end
|
|
@@ -408,7 +411,10 @@ module Sequel
|
|
|
408
411
|
key = opts[:key]
|
|
409
412
|
key_column = opts[:key_column] ||= key
|
|
410
413
|
opts[:eager_loader_key] = nil
|
|
411
|
-
|
|
414
|
+
if opts[:uniq]
|
|
415
|
+
opts[:after_load] ||= []
|
|
416
|
+
opts[:after_load].unshift(:array_uniq!)
|
|
417
|
+
end
|
|
412
418
|
opts[:dataset] ||= lambda do
|
|
413
419
|
opts.associated_dataset.where(opts.predicate_key=>get_column_value(key).to_a)
|
|
414
420
|
end
|
|
@@ -41,22 +41,13 @@ module Sequel
|
|
|
41
41
|
#
|
|
42
42
|
# Address.register_row_type
|
|
43
43
|
#
|
|
44
|
-
# Note that automatic conversion only works with the native postgres adapter.
|
|
45
|
-
# For other adapters that connect to PostgreSQL, you need to call the conversion
|
|
46
|
-
# proc manually.
|
|
47
|
-
#
|
|
48
44
|
# In addition to returning row-valued/composite types as instances of Sequel::Model,
|
|
49
45
|
# this also lets you use model instances in datasets when inserting, updating, and
|
|
50
46
|
# filtering:
|
|
51
47
|
#
|
|
52
|
-
# DB[:company].insert(:
|
|
53
|
-
# Address.load(:
|
|
48
|
+
# DB[:company].insert(name: 'MS', address:
|
|
49
|
+
# Address.load(street: '123 Foo St', city: 'Bar Town', zip: '12345'))
|
|
54
50
|
module PgRow
|
|
55
|
-
ROW = 'ROW'.freeze
|
|
56
|
-
Sequel::Deprecation.deprecate_constant(self, :ROW)
|
|
57
|
-
CAST = '::'.freeze
|
|
58
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST)
|
|
59
|
-
|
|
60
51
|
# When loading the extension, make sure the database has the pg_row extension
|
|
61
52
|
# loaded, load the custom database extensions, and automatically register the
|
|
62
53
|
# row type if the model has a dataset.
|