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
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
# generally want to create it first, before creating any other application
|
|
23
23
|
# tables.
|
|
24
24
|
#
|
|
25
|
-
# Because migrations
|
|
25
|
+
# Because migrations instance_exec the up and down blocks on a database,
|
|
26
26
|
# using this extension in a migration can be done via:
|
|
27
27
|
#
|
|
28
28
|
# Sequel.migration do
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
# similar to the validation_helpers model plugin API. However,
|
|
44
44
|
# instead of having separate validates_* methods, it just adds a validate
|
|
45
45
|
# method that accepts a block to the schema generators. Like the
|
|
46
|
-
# create_table and alter_table blocks, this block is
|
|
46
|
+
# create_table and alter_table blocks, this block is instance_execed and
|
|
47
47
|
# offers its own DSL. Example:
|
|
48
48
|
#
|
|
49
49
|
# DB.create_table(:table) do
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
# end
|
|
57
57
|
# end
|
|
58
58
|
#
|
|
59
|
-
#
|
|
60
|
-
# already use
|
|
59
|
+
# instance_exec is used in this case because create_table and alter_table
|
|
60
|
+
# already use instance_exec, so losing access to the surrounding receiver
|
|
61
61
|
# is not an issue.
|
|
62
62
|
#
|
|
63
63
|
# Here's a breakdown of the constraints created for each constraint validation
|
|
@@ -196,9 +196,9 @@ module Sequel
|
|
|
196
196
|
@generator.validation({:type=>:drop, :name=>constraint})
|
|
197
197
|
end
|
|
198
198
|
|
|
199
|
-
# Alias of
|
|
199
|
+
# Alias of instance_exec for a nicer API.
|
|
200
200
|
def process(&block)
|
|
201
|
-
|
|
201
|
+
instance_exec(&block)
|
|
202
202
|
end
|
|
203
203
|
end
|
|
204
204
|
|
|
@@ -260,7 +260,7 @@ module Sequel
|
|
|
260
260
|
super do
|
|
261
261
|
extend CreateTableGeneratorMethods
|
|
262
262
|
@validations = []
|
|
263
|
-
|
|
263
|
+
instance_exec(&block) if block
|
|
264
264
|
end
|
|
265
265
|
end
|
|
266
266
|
|
|
@@ -308,7 +308,7 @@ module Sequel
|
|
|
308
308
|
super do
|
|
309
309
|
extend AlterTableGeneratorMethods
|
|
310
310
|
@validations = []
|
|
311
|
-
|
|
311
|
+
instance_exec(&block) if block
|
|
312
312
|
end
|
|
313
313
|
end
|
|
314
314
|
|
|
@@ -374,10 +374,10 @@ module Sequel
|
|
|
374
374
|
when :max_length
|
|
375
375
|
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.char_length(c) <= arg}))
|
|
376
376
|
when *REVERSE_OPERATOR_MAP.keys
|
|
377
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).
|
|
377
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).public_send(REVERSE_OPERATOR_MAP[validation_type], arg)}))
|
|
378
378
|
when :length_range
|
|
379
379
|
op = arg.exclude_end? ? :< : :<=
|
|
380
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).
|
|
380
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).public_send(op, arg.end)}))
|
|
381
381
|
arg = "#{arg.begin}..#{'.' if arg.exclude_end?}#{arg.end}"
|
|
382
382
|
when :format
|
|
383
383
|
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| {c => arg}}))
|
|
@@ -407,7 +407,7 @@ module Sequel
|
|
|
407
407
|
raise Error, "validates includes only supports arrays and ranges currently, cannot handle: #{arg.inspect}"
|
|
408
408
|
end
|
|
409
409
|
when :like, :ilike
|
|
410
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.
|
|
410
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.public_send(validation_type, c, arg)}))
|
|
411
411
|
when :unique
|
|
412
412
|
generator.unique(columns, :name=>constraint)
|
|
413
413
|
columns = [columns.join(',')]
|
|
@@ -21,8 +21,8 @@ class Array
|
|
|
21
21
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
|
|
22
22
|
# conditions.
|
|
23
23
|
#
|
|
24
|
-
# ~[[:a, true]] # SQL: a IS NOT TRUE
|
|
25
|
-
# ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
|
|
24
|
+
# ~[[:a, true]] # SQL: (a IS NOT TRUE)
|
|
25
|
+
# ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
|
26
26
|
def ~
|
|
27
27
|
Sequel.~(self)
|
|
28
28
|
end
|
|
@@ -30,7 +30,7 @@ class Array
|
|
|
30
30
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
|
|
31
31
|
# default value and expression.
|
|
32
32
|
#
|
|
33
|
-
# [[{:
|
|
33
|
+
# [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
|
34
34
|
# [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
|
35
35
|
def case(*args)
|
|
36
36
|
::Sequel::SQL::CaseExpression.new(self, *args)
|
|
@@ -42,16 +42,12 @@ class Array
|
|
|
42
42
|
# this array as a value in a filter, but may be necessary if you are using it as a
|
|
43
43
|
# value with placeholder SQL:
|
|
44
44
|
#
|
|
45
|
-
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
|
|
46
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
|
|
47
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
|
|
45
|
+
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
|
46
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
|
|
47
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
|
48
48
|
def sql_value_list
|
|
49
49
|
::Sequel::SQL::ValueList.new(self)
|
|
50
50
|
end
|
|
51
|
-
def sql_array
|
|
52
|
-
Sequel::Deprecation.deprecate("Array#sql_array in the core_extensions extension", "Use Array#sql_value_list instead")
|
|
53
|
-
sql_value_list
|
|
54
|
-
end
|
|
55
51
|
|
|
56
52
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching all of the
|
|
57
53
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
|
@@ -60,8 +56,8 @@ class Array
|
|
|
60
56
|
# and want to use the = operator instead of the IN operator (which is used by default for
|
|
61
57
|
# arrays of two element arrays).
|
|
62
58
|
#
|
|
63
|
-
# [[:a, true]].sql_expr # SQL: a IS TRUE
|
|
64
|
-
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
|
|
59
|
+
# [[:a, true]].sql_expr # SQL: (a IS TRUE)
|
|
60
|
+
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
|
65
61
|
def sql_expr
|
|
66
62
|
Sequel[self]
|
|
67
63
|
end
|
|
@@ -69,8 +65,8 @@ class Array
|
|
|
69
65
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
|
|
70
66
|
# of the conditions.
|
|
71
67
|
#
|
|
72
|
-
# [[:a, true]].sql_negate # SQL: a IS NOT TRUE
|
|
73
|
-
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
|
68
|
+
# [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
|
|
69
|
+
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
|
74
70
|
def sql_negate
|
|
75
71
|
Sequel.negate(self)
|
|
76
72
|
end
|
|
@@ -78,8 +74,8 @@ class Array
|
|
|
78
74
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
|
|
79
75
|
# conditions.
|
|
80
76
|
#
|
|
81
|
-
# [[:a, true]].sql_or # SQL: a IS TRUE
|
|
82
|
-
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
|
|
77
|
+
# [[:a, true]].sql_or # SQL: (a IS TRUE)
|
|
78
|
+
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
|
83
79
|
def sql_or
|
|
84
80
|
Sequel.or(self)
|
|
85
81
|
end
|
|
@@ -90,9 +86,9 @@ class Array
|
|
|
90
86
|
# concatenation.
|
|
91
87
|
#
|
|
92
88
|
# [:a].sql_string_join # SQL: a
|
|
93
|
-
# [:a, :b].sql_string_join # SQL: a || b
|
|
94
|
-
# [:a, 'b'].sql_string_join # SQL: a || 'b'
|
|
95
|
-
# ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
|
|
89
|
+
# [:a, :b].sql_string_join # SQL: (a || b)
|
|
90
|
+
# [:a, 'b'].sql_string_join # SQL: (a || 'b')
|
|
91
|
+
# ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
|
|
96
92
|
def sql_string_join(joiner=nil)
|
|
97
93
|
Sequel.join(self, joiner)
|
|
98
94
|
end
|
|
@@ -104,8 +100,8 @@ class Hash
|
|
|
104
100
|
# all of the conditions in this hash and the condition specified by
|
|
105
101
|
# the given argument.
|
|
106
102
|
#
|
|
107
|
-
# {:
|
|
108
|
-
# {:
|
|
103
|
+
# {a: 1} & :b # SQL: ((a = 1) AND b)
|
|
104
|
+
# {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
|
|
109
105
|
def &(ce)
|
|
110
106
|
::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
|
|
111
107
|
end
|
|
@@ -114,8 +110,8 @@ class Hash
|
|
|
114
110
|
# all of the conditions in this hash or the condition specified by
|
|
115
111
|
# the given argument.
|
|
116
112
|
#
|
|
117
|
-
# {:
|
|
118
|
-
# {:
|
|
113
|
+
# {a: 1} | :b # SQL: ((a = 1) OR b)
|
|
114
|
+
# {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
|
|
119
115
|
def |(ce)
|
|
120
116
|
::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
|
|
121
117
|
end
|
|
@@ -123,19 +119,17 @@ class Hash
|
|
|
123
119
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
|
|
124
120
|
# conditions.
|
|
125
121
|
#
|
|
126
|
-
# ~{:
|
|
127
|
-
# ~{:
|
|
122
|
+
# ~{a: true} # SQL: (a IS NOT TRUE)
|
|
123
|
+
# ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
|
128
124
|
def ~
|
|
129
125
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
|
|
130
126
|
end
|
|
131
127
|
|
|
132
128
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
|
|
133
|
-
# default value.
|
|
134
|
-
# conditions should be orthogonal.
|
|
129
|
+
# default value.
|
|
135
130
|
#
|
|
136
|
-
# {{:
|
|
137
|
-
# {:
|
|
138
|
-
# # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
|
|
131
|
+
# {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
|
132
|
+
# {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
|
139
133
|
def case(*args)
|
|
140
134
|
::Sequel::SQL::CaseExpression.new(to_a, *args)
|
|
141
135
|
end
|
|
@@ -144,8 +138,8 @@ class Hash
|
|
|
144
138
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
|
145
139
|
# assumes that hashes specify this type of condition.
|
|
146
140
|
#
|
|
147
|
-
# {:
|
|
148
|
-
# {:
|
|
141
|
+
# {a: true}.sql_expr # SQL: (a IS TRUE)
|
|
142
|
+
# {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
|
149
143
|
def sql_expr
|
|
150
144
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self)
|
|
151
145
|
end
|
|
@@ -153,8 +147,8 @@ class Hash
|
|
|
153
147
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
|
|
154
148
|
# of the conditions.
|
|
155
149
|
#
|
|
156
|
-
# {:
|
|
157
|
-
# {:
|
|
150
|
+
# {a: true}.sql_negate # SQL: (a IS NOT TRUE)
|
|
151
|
+
# {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
|
158
152
|
def sql_negate
|
|
159
153
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
|
|
160
154
|
end
|
|
@@ -162,8 +156,8 @@ class Hash
|
|
|
162
156
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
|
|
163
157
|
# conditions.
|
|
164
158
|
#
|
|
165
|
-
# {:
|
|
166
|
-
# {:
|
|
159
|
+
# {a: true}.sql_or # SQL: (a IS TRUE)
|
|
160
|
+
# {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
|
167
161
|
def sql_or
|
|
168
162
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
|
|
169
163
|
end
|
|
@@ -177,16 +171,16 @@ class String
|
|
|
177
171
|
# Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
|
|
178
172
|
# literalization, e.g.:
|
|
179
173
|
#
|
|
180
|
-
# DB[:items].where(:
|
|
181
|
-
#
|
|
174
|
+
# DB[:items].where(abc: 'def')
|
|
175
|
+
# # "SELECT * FROM items WHERE (abc = 'def')"
|
|
182
176
|
#
|
|
183
|
-
# DB[:items].where(:
|
|
184
|
-
#
|
|
177
|
+
# DB[:items].where(abc: 'def'.lit)
|
|
178
|
+
# # "SELECT * FROM items WHERE (abc = def)"
|
|
185
179
|
#
|
|
186
180
|
# You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
|
|
187
181
|
#
|
|
188
|
-
#
|
|
189
|
-
#
|
|
182
|
+
# DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
|
|
183
|
+
# # "SELECT count(DISTINCT a) FROM items"
|
|
190
184
|
def lit(*args)
|
|
191
185
|
args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
|
|
192
186
|
end
|
|
@@ -209,19 +203,15 @@ class Symbol
|
|
|
209
203
|
include Sequel::SQL::SubscriptMethods
|
|
210
204
|
include Sequel::SQL::ComplexExpressionMethods
|
|
211
205
|
|
|
212
|
-
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
|
213
|
-
# prevent splitting the symbol.
|
|
206
|
+
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
|
214
207
|
#
|
|
215
|
-
# :
|
|
216
|
-
# :a__b.identifier # SQL: "a__b"
|
|
208
|
+
# :a.identifier # SQL: "a"
|
|
217
209
|
def identifier
|
|
218
210
|
Sequel::SQL::Identifier.new(self)
|
|
219
211
|
end
|
|
220
212
|
|
|
221
213
|
# Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
|
|
222
|
-
# and the given arguments.
|
|
223
|
-
# is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
|
|
224
|
-
# doesn't override methods defined by ruby itself.
|
|
214
|
+
# and the given arguments.
|
|
225
215
|
#
|
|
226
216
|
# :now.sql_function # SQL: now()
|
|
227
217
|
# :sum.sql_function(:a) # SQL: sum(a)
|
|
@@ -17,8 +17,8 @@ module Sequel::CoreRefinements
|
|
|
17
17
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
|
|
18
18
|
# conditions.
|
|
19
19
|
#
|
|
20
|
-
# ~[[:a, true]] # SQL: a IS NOT TRUE
|
|
21
|
-
# ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
|
|
20
|
+
# ~[[:a, true]] # SQL: (a IS NOT TRUE)
|
|
21
|
+
# ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
|
22
22
|
def ~
|
|
23
23
|
Sequel.~(self)
|
|
24
24
|
end
|
|
@@ -26,7 +26,7 @@ module Sequel::CoreRefinements
|
|
|
26
26
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
|
|
27
27
|
# default value and expression.
|
|
28
28
|
#
|
|
29
|
-
# [[{:
|
|
29
|
+
# [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
|
30
30
|
# [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
|
31
31
|
def case(*args)
|
|
32
32
|
::Sequel::SQL::CaseExpression.new(self, *args)
|
|
@@ -38,9 +38,9 @@ module Sequel::CoreRefinements
|
|
|
38
38
|
# this array as a value in a filter, but may be necessary if you are using it as a
|
|
39
39
|
# value with placeholder SQL:
|
|
40
40
|
#
|
|
41
|
-
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
|
|
42
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
|
|
43
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
|
|
41
|
+
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
|
42
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
|
|
43
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
|
44
44
|
def sql_value_list
|
|
45
45
|
::Sequel::SQL::ValueList.new(self)
|
|
46
46
|
end
|
|
@@ -52,8 +52,8 @@ module Sequel::CoreRefinements
|
|
|
52
52
|
# and want to use the = operator instead of the IN operator (which is used by default for
|
|
53
53
|
# arrays of two element arrays).
|
|
54
54
|
#
|
|
55
|
-
# [[:a, true]].sql_expr # SQL: a IS TRUE
|
|
56
|
-
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
|
|
55
|
+
# [[:a, true]].sql_expr # SQL: (a IS TRUE)
|
|
56
|
+
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
|
57
57
|
def sql_expr
|
|
58
58
|
Sequel[self]
|
|
59
59
|
end
|
|
@@ -61,8 +61,8 @@ module Sequel::CoreRefinements
|
|
|
61
61
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
|
|
62
62
|
# of the conditions.
|
|
63
63
|
#
|
|
64
|
-
# [[:a, true]].sql_negate # SQL: a IS NOT TRUE
|
|
65
|
-
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
|
64
|
+
# [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
|
|
65
|
+
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
|
66
66
|
def sql_negate
|
|
67
67
|
Sequel.negate(self)
|
|
68
68
|
end
|
|
@@ -70,8 +70,8 @@ module Sequel::CoreRefinements
|
|
|
70
70
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
|
|
71
71
|
# conditions.
|
|
72
72
|
#
|
|
73
|
-
# [[:a, true]].sql_or # SQL: a IS TRUE
|
|
74
|
-
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
|
|
73
|
+
# [[:a, true]].sql_or # SQL: (a IS TRUE)
|
|
74
|
+
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
|
75
75
|
def sql_or
|
|
76
76
|
Sequel.or(self)
|
|
77
77
|
end
|
|
@@ -82,9 +82,9 @@ module Sequel::CoreRefinements
|
|
|
82
82
|
# concatenation.
|
|
83
83
|
#
|
|
84
84
|
# [:a].sql_string_join # SQL: a
|
|
85
|
-
# [:a, :b].sql_string_join # SQL: a || b
|
|
86
|
-
# [:a, 'b'].sql_string_join # SQL: a || 'b'
|
|
87
|
-
# ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
|
|
85
|
+
# [:a, :b].sql_string_join # SQL: (a || b)
|
|
86
|
+
# [:a, 'b'].sql_string_join # SQL: (a || 'b')
|
|
87
|
+
# ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
|
|
88
88
|
def sql_string_join(joiner=nil)
|
|
89
89
|
Sequel.join(self, joiner)
|
|
90
90
|
end
|
|
@@ -95,8 +95,8 @@ module Sequel::CoreRefinements
|
|
|
95
95
|
# all of the conditions in this hash and the condition specified by
|
|
96
96
|
# the given argument.
|
|
97
97
|
#
|
|
98
|
-
# {:
|
|
99
|
-
# {:
|
|
98
|
+
# {a: 1} & :b # SQL: ((a = 1) AND b)
|
|
99
|
+
# {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
|
|
100
100
|
def &(ce)
|
|
101
101
|
::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
|
|
102
102
|
end
|
|
@@ -105,8 +105,8 @@ module Sequel::CoreRefinements
|
|
|
105
105
|
# all of the conditions in this hash or the condition specified by
|
|
106
106
|
# the given argument.
|
|
107
107
|
#
|
|
108
|
-
# {:
|
|
109
|
-
# {:
|
|
108
|
+
# {a: 1} | :b # SQL: ((a = 1) OR b)
|
|
109
|
+
# {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
|
|
110
110
|
def |(ce)
|
|
111
111
|
::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
|
|
112
112
|
end
|
|
@@ -114,19 +114,17 @@ module Sequel::CoreRefinements
|
|
|
114
114
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
|
|
115
115
|
# conditions.
|
|
116
116
|
#
|
|
117
|
-
# ~{:
|
|
118
|
-
# ~{:
|
|
117
|
+
# ~{a: true} # SQL: (a IS NOT TRUE)
|
|
118
|
+
# ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
|
119
119
|
def ~
|
|
120
120
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
|
|
124
|
-
# default value.
|
|
125
|
-
# conditions should be orthogonal.
|
|
124
|
+
# default value.
|
|
126
125
|
#
|
|
127
|
-
# {{:
|
|
128
|
-
# {:
|
|
129
|
-
# # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
|
|
126
|
+
# {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
|
127
|
+
# {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
|
130
128
|
def case(*args)
|
|
131
129
|
::Sequel::SQL::CaseExpression.new(to_a, *args)
|
|
132
130
|
end
|
|
@@ -135,8 +133,8 @@ module Sequel::CoreRefinements
|
|
|
135
133
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
|
136
134
|
# assumes that hashes specify this type of condition.
|
|
137
135
|
#
|
|
138
|
-
# {:
|
|
139
|
-
# {:
|
|
136
|
+
# {a: true}.sql_expr # SQL: (a IS TRUE)
|
|
137
|
+
# {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
|
140
138
|
def sql_expr
|
|
141
139
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self)
|
|
142
140
|
end
|
|
@@ -144,8 +142,8 @@ module Sequel::CoreRefinements
|
|
|
144
142
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
|
|
145
143
|
# of the conditions.
|
|
146
144
|
#
|
|
147
|
-
# {:
|
|
148
|
-
# {:
|
|
145
|
+
# {a: true}.sql_negate # SQL: (a IS NOT TRUE)
|
|
146
|
+
# {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
|
149
147
|
def sql_negate
|
|
150
148
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
|
|
151
149
|
end
|
|
@@ -153,8 +151,8 @@ module Sequel::CoreRefinements
|
|
|
153
151
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
|
|
154
152
|
# conditions.
|
|
155
153
|
#
|
|
156
|
-
# {:
|
|
157
|
-
# {:
|
|
154
|
+
# {a: true}.sql_or # SQL: (a IS TRUE)
|
|
155
|
+
# {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
|
158
156
|
def sql_or
|
|
159
157
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
|
|
160
158
|
end
|
|
@@ -167,16 +165,16 @@ module Sequel::CoreRefinements
|
|
|
167
165
|
# Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
|
|
168
166
|
# literalization, e.g.:
|
|
169
167
|
#
|
|
170
|
-
# DB[:items].where(:
|
|
171
|
-
#
|
|
168
|
+
# DB[:items].where(abc: 'def')
|
|
169
|
+
# # "SELECT * FROM items WHERE (abc = 'def')"
|
|
172
170
|
#
|
|
173
|
-
# DB[:items].where(:
|
|
174
|
-
#
|
|
171
|
+
# DB[:items].where(abc: 'def'.lit)
|
|
172
|
+
# # "SELECT * FROM items WHERE (abc = def)"
|
|
175
173
|
#
|
|
176
174
|
# You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
|
|
177
175
|
#
|
|
178
|
-
#
|
|
179
|
-
#
|
|
176
|
+
# DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
|
|
177
|
+
# # "SELECT count(DISTINCT a) FROM items"
|
|
180
178
|
def lit(*args)
|
|
181
179
|
args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
|
|
182
180
|
end
|
|
@@ -199,19 +197,15 @@ module Sequel::CoreRefinements
|
|
|
199
197
|
include Sequel::SQL::SubscriptMethods
|
|
200
198
|
include Sequel::SQL::ComplexExpressionMethods
|
|
201
199
|
|
|
202
|
-
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
|
203
|
-
# prevent splitting the symbol.
|
|
200
|
+
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
|
204
201
|
#
|
|
205
|
-
# :
|
|
206
|
-
# :a__b.identifier # SQL: "a__b"
|
|
202
|
+
# :ab.identifier # SQL: "a"
|
|
207
203
|
def identifier
|
|
208
204
|
Sequel::SQL::Identifier.new(self)
|
|
209
205
|
end
|
|
210
206
|
|
|
211
207
|
# Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
|
|
212
|
-
# and the given arguments.
|
|
213
|
-
# is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
|
|
214
|
-
# doesn't override methods defined by ruby itself.
|
|
208
|
+
# and the given arguments.
|
|
215
209
|
#
|
|
216
210
|
# :now.sql_function # SQL: now()
|
|
217
211
|
# :sum.sql_function(:a) # SQL: sum(a)
|
|
@@ -53,10 +53,6 @@ module Sequel
|
|
|
53
53
|
|
|
54
54
|
# DateTime subclass literalized as CURRENT_TIMESTAMP
|
|
55
55
|
class DateTime < ::DateTime; end
|
|
56
|
-
|
|
57
|
-
# Mapping of Time/DateTime classes to subclasses literalized as CURRENT_TIMESTAMP
|
|
58
|
-
MAP = {::Time=>Time, ::DateTime=>DateTime}
|
|
59
|
-
Sequel::Deprecation.deprecate_constant(self, :MAP)
|
|
60
56
|
end
|
|
61
57
|
|
|
62
58
|
Dataset.register_extension(:current_datetime_timestamp, CurrentDateTimeTimestamp::DatasetMethods)
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
# Then you can use the Sequel.date_add and Sequel.date_sub methods
|
|
11
11
|
# to return Sequel expressions:
|
|
12
12
|
#
|
|
13
|
-
# add = Sequel.date_add(:date_column, :
|
|
14
|
-
# sub = Sequel.date_sub(:date_column, :
|
|
13
|
+
# add = Sequel.date_add(:date_column, years: 1, months: 2, days: 3)
|
|
14
|
+
# sub = Sequel.date_sub(:date_column, hours: 1, minutes: 2, seconds: 3)
|
|
15
15
|
#
|
|
16
16
|
# In addition to specifying the interval as a hash, there is also
|
|
17
17
|
# support for specifying the interval as an ActiveSupport::Duration
|
|
@@ -66,8 +66,6 @@ module Sequel
|
|
|
66
66
|
DERBY_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit("SQL_TSI_#{s.to_s.upcase[0...-1]}").freeze}).freeze
|
|
67
67
|
ACCESS_DURATION_UNITS = DURATION_UNITS.zip(%w'yyyy m d h n s'.map(&:freeze)).freeze
|
|
68
68
|
DB2_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s).freeze}).freeze
|
|
69
|
-
FDBSQL_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s.chop).freeze}).freeze
|
|
70
|
-
Sequel::Deprecation.deprecate_constant(self, :FDBSQL_DURATION_UNITS)
|
|
71
69
|
|
|
72
70
|
# Append the SQL fragment for the DateAdd expression to the SQL query.
|
|
73
71
|
def date_add_sql_append(sql, da)
|
|
@@ -93,8 +91,7 @@ module Sequel
|
|
|
93
91
|
args << "#{value} #{sql_unit}"
|
|
94
92
|
end
|
|
95
93
|
return function_sql_append(sql, Sequel.function(:datetime, *args))
|
|
96
|
-
|
|
97
|
-
when :mysql, :hsqldb, :cubrid
|
|
94
|
+
when :mysql, :hsqldb
|
|
98
95
|
if db_type == :hsqldb
|
|
99
96
|
# HSQLDB requires 2.2.9+ for the DATE_ADD function
|
|
100
97
|
expr = Sequel.cast(expr, Time)
|
|
@@ -181,12 +178,15 @@ module Sequel
|
|
|
181
178
|
raise Sequel::InvalidValue, "cannot provide String value as interval part: #{v.inspect}"
|
|
182
179
|
end
|
|
183
180
|
end
|
|
184
|
-
interval
|
|
181
|
+
Hash[interval]
|
|
185
182
|
else
|
|
186
183
|
h = Hash.new(0)
|
|
187
184
|
interval.parts.each{|unit, value| h[unit] += value}
|
|
188
185
|
Hash[h]
|
|
189
186
|
end
|
|
187
|
+
|
|
188
|
+
@interval.freeze
|
|
189
|
+
freeze
|
|
190
190
|
end
|
|
191
191
|
|
|
192
192
|
to_s_method :date_add_sql
|
|
@@ -10,24 +10,28 @@
|
|
|
10
10
|
#
|
|
11
11
|
# DB.extension :duplicate_columns_handler
|
|
12
12
|
#
|
|
13
|
+
# or into individual datasets:
|
|
14
|
+
#
|
|
15
|
+
# ds = DB[:items].extension(:duplicate_columns_handler)
|
|
16
|
+
#
|
|
13
17
|
# A database option is introduced: :on_duplicate_columns. It accepts a Symbol
|
|
14
18
|
# or any object that responds to :call.
|
|
15
19
|
#
|
|
16
|
-
# :
|
|
17
|
-
# :
|
|
18
|
-
# :
|
|
19
|
-
# :
|
|
20
|
+
# on_duplicate_columns: :raise
|
|
21
|
+
# on_duplicate_columns: :warn
|
|
22
|
+
# on_duplicate_columns: :ignore
|
|
23
|
+
# on_duplicate_columns: lambda{|columns| arbitrary_condition? ? :raise : :warn}
|
|
20
24
|
#
|
|
21
25
|
# You may also configure duplicate columns handling for a specific dataset:
|
|
22
26
|
#
|
|
23
27
|
# ds.on_duplicate_columns(:warn)
|
|
24
28
|
# ds.on_duplicate_columns(:raise)
|
|
25
29
|
# ds.on_duplicate_columns(:ignore)
|
|
26
|
-
# ds.on_duplicate_columns
|
|
27
|
-
# ds.on_duplicate_columns(
|
|
30
|
+
# ds.on_duplicate_columns{|columns| arbitrary_condition? ? :raise : :warn}
|
|
31
|
+
# ds.on_duplicate_columns(lambda{|columns| arbitrary_condition? ? :raise : :warn})
|
|
28
32
|
#
|
|
29
33
|
# If :raise is specified, a Sequel::DuplicateColumnError is raised.
|
|
30
|
-
# If :warn is specified, you will receive a warning via
|
|
34
|
+
# If :warn is specified, you will receive a warning via +warn+.
|
|
31
35
|
# If a callable is specified, it will be called.
|
|
32
36
|
# If no on_duplicate_columns is specified, the default is :warn.
|
|
33
37
|
#
|
|
@@ -45,8 +49,7 @@ module Sequel
|
|
|
45
49
|
|
|
46
50
|
private
|
|
47
51
|
|
|
48
|
-
#
|
|
49
|
-
# handle_duplicate_columns if necessary.
|
|
52
|
+
# Call handle_duplicate_columns if there are duplicate columns.
|
|
50
53
|
def columns=(cols)
|
|
51
54
|
if cols && cols.uniq.size != cols.size
|
|
52
55
|
handle_duplicate_columns(cols)
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
# array value to consider NULL values if one of the referenced
|
|
5
5
|
# columns is NULL:
|
|
6
6
|
#
|
|
7
|
-
# DB[:test].where(:
|
|
7
|
+
# DB[:test].where(name: [])
|
|
8
8
|
# # SELECT * FROM test WHERE (name != name)
|
|
9
|
-
# DB[:test].exclude(:
|
|
9
|
+
# DB[:test].exclude(name: [])
|
|
10
10
|
# # SELECT * FROM test WHERE (name = name)
|
|
11
11
|
#
|
|
12
12
|
# The default Sequel behavior is to ignore NULLs, as the above
|
|
@@ -36,16 +36,7 @@ module Sequel
|
|
|
36
36
|
"{#{obj.map{|k, v| "#{eval_inspect(k)} => #{eval_inspect(v)}"}.join(', ')}}"
|
|
37
37
|
when Time
|
|
38
38
|
datepart = "%Y-%m-%dT" unless obj.is_a?(Sequel::SQLTime)
|
|
39
|
-
if
|
|
40
|
-
# :nocov:
|
|
41
|
-
# Time on 1.8 doesn't handle %N (or %z on Windows), manually set the usec value in the string
|
|
42
|
-
hours, mins = obj.utc_offset.divmod(3600)
|
|
43
|
-
mins /= 60
|
|
44
|
-
"#{obj.class}.parse(#{obj.strftime("#{datepart}%H:%M:%S.#{sprintf('%06i%+03i%02i', obj.usec, hours, mins)}").inspect})#{'.utc' if obj.utc?}"
|
|
45
|
-
# :nocov:
|
|
46
|
-
else
|
|
47
|
-
"#{obj.class}.parse(#{obj.strftime("#{datepart}%T.%N%z").inspect})#{'.utc' if obj.utc?}"
|
|
48
|
-
end
|
|
39
|
+
"#{obj.class}.parse(#{obj.strftime("#{datepart}%T.%N%z").inspect})#{'.utc' if obj.utc?}"
|
|
49
40
|
when DateTime
|
|
50
41
|
# Ignore date of calendar reform
|
|
51
42
|
"DateTime.parse(#{obj.strftime('%FT%T.%N%z').inspect})"
|
|
@@ -73,9 +64,11 @@ module Sequel
|
|
|
73
64
|
args = inspect_args.map do |arg|
|
|
74
65
|
if arg.is_a?(String) && arg =~ /\A\*/
|
|
75
66
|
# Special case string arguments starting with *, indicating that
|
|
76
|
-
# they should return an array to be splatted as the remaining arguments
|
|
67
|
+
# they should return an array to be splatted as the remaining arguments.
|
|
68
|
+
# Allow calling private methods to get inspect output.
|
|
77
69
|
send(arg.sub('*', '')).map{|a| Sequel.eval_inspect(a)}.join(', ')
|
|
78
70
|
else
|
|
71
|
+
# Allow calling private methods to get inspect output.
|
|
79
72
|
Sequel.eval_inspect(send(arg))
|
|
80
73
|
end
|
|
81
74
|
end
|