sequel 5.8.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "integer64 extension" do
|
|
4
|
-
before do
|
|
5
|
-
@db = Sequel.mock.extension(:integer64)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
it "should use bigint as default integer type" do
|
|
9
|
-
@db.create_table(:t){Integer :a; column :b, Integer}
|
|
10
|
-
@db.sqls.must_equal ['CREATE TABLE t (a bigint, b bigint)']
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should use bigint as default type for primary_key and foreign_key" do
|
|
14
|
-
@db.create_table(:t){primary_key :id; foreign_key :t_id, :t}
|
|
15
|
-
@db.sqls.must_equal ['CREATE TABLE t (id bigint PRIMARY KEY AUTOINCREMENT, t_id bigint REFERENCES t)']
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should use bigint when casting" do
|
|
19
|
-
@db.get(Sequel.cast('a', Integer))
|
|
20
|
-
@db.sqls.must_equal ["SELECT CAST('a' AS bigint) AS v LIMIT 1"]
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::InvertedSubsets" do
|
|
4
|
-
it "should add an inverted subset method which inverts the condition" do
|
|
5
|
-
c = Class.new(Sequel::Model(:a))
|
|
6
|
-
c.plugin :inverted_subsets
|
|
7
|
-
c.dataset_module{subset(:published, :published => true)}
|
|
8
|
-
c.not_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "should support a configuration block to customise the inverted method name" do
|
|
12
|
-
c = Class.new(Sequel::Model(:a))
|
|
13
|
-
c.plugin(:inverted_subsets){|name| "exclude_#{name}"}
|
|
14
|
-
c.dataset_module{where(:published, :published => true)}
|
|
15
|
-
c.exclude_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should chain to existing dataset" do
|
|
19
|
-
c = Class.new(Sequel::Model(:a))
|
|
20
|
-
c.plugin :inverted_subsets
|
|
21
|
-
c.dataset_module{where(:published, :published => true)}
|
|
22
|
-
c.where(1=>0).not_published.sql.must_equal 'SELECT * FROM a WHERE ((1 = 0) AND (published IS NOT TRUE))'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "should work in subclasses" do
|
|
26
|
-
c = Class.new(Sequel::Model)
|
|
27
|
-
c.plugin(:inverted_subsets){|name| "exclude_#{name}"}
|
|
28
|
-
c = Class.new(c)
|
|
29
|
-
c.dataset = :a
|
|
30
|
-
c.dataset_module{subset(:published, :published => true)}
|
|
31
|
-
c.exclude_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Sequel::Plugins::JsonSerializer" do
|
|
4
|
-
before do
|
|
5
|
-
class ::Artist < Sequel::Model
|
|
6
|
-
unrestrict_primary_key
|
|
7
|
-
plugin :json_serializer, :naked=>true
|
|
8
|
-
columns :id, :name
|
|
9
|
-
def_column_accessor :id, :name
|
|
10
|
-
@db_schema = {:id=>{:type=>:integer}}
|
|
11
|
-
one_to_many :albums
|
|
12
|
-
end
|
|
13
|
-
class ::Album < Sequel::Model
|
|
14
|
-
unrestrict_primary_key
|
|
15
|
-
attr_accessor :blah
|
|
16
|
-
plugin :json_serializer, :naked=>true
|
|
17
|
-
columns :id, :name, :artist_id
|
|
18
|
-
def_column_accessor :id, :name, :artist_id
|
|
19
|
-
many_to_one :artist
|
|
20
|
-
end
|
|
21
|
-
@artist = Artist.load(:id=>2, :name=>'YJM')
|
|
22
|
-
@artist.associations[:albums] = []
|
|
23
|
-
@album = Album.load(:id=>1, :name=>'RF')
|
|
24
|
-
@album.artist = @artist
|
|
25
|
-
@album.blah = 'Blah'
|
|
26
|
-
end
|
|
27
|
-
after do
|
|
28
|
-
Object.send(:remove_const, :Artist)
|
|
29
|
-
Object.send(:remove_const, :Album)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "should round trip successfully" do
|
|
33
|
-
Artist.from_json(@artist.to_json).must_equal @artist
|
|
34
|
-
Album.from_json(@album.to_json).must_equal @album
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "should handle ruby objects in values" do
|
|
38
|
-
class ::Artist
|
|
39
|
-
def name=(v)
|
|
40
|
-
super(Date.parse(v))
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
Artist.from_json(Artist.load(:name=>Date.today).to_json).must_equal Artist.load(:name=>Date.today)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "should support setting json_serializer_opts on models" do
|
|
47
|
-
@artist.json_serializer_opts(:only=>:name)
|
|
48
|
-
Sequel.parse_json([@artist].to_json).must_equal [{'name'=>@artist.name}]
|
|
49
|
-
@artist.json_serializer_opts(:include=>{:albums=>{:only=>:name}})
|
|
50
|
-
Sequel.parse_json([@artist].to_json).must_equal [{'name'=>@artist.name, 'albums'=>[{'name'=>@album.name}]}]
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "should handle the :only option" do
|
|
54
|
-
Artist.from_json(@artist.to_json(:only=>:name)).must_equal Artist.load(:name=>@artist.name)
|
|
55
|
-
Album.from_json(@album.to_json(:only=>[:id, :name])).must_equal Album.load(:id=>@album.id, :name=>@album.name)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "should handle the :except option" do
|
|
59
|
-
Artist.from_json(@artist.to_json(:except=>:id)).must_equal Artist.load(:name=>@artist.name)
|
|
60
|
-
Album.from_json(@album.to_json(:except=>[:id, :artist_id])).must_equal Album.load(:name=>@album.name)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "should handle the :include option for associations" do
|
|
64
|
-
Artist.from_json(@artist.to_json(:include=>:albums), :associations=>:albums).albums.must_equal [@album]
|
|
65
|
-
Album.from_json(@album.to_json(:include=>:artist), :associations=>:artist).artist.must_equal @artist
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "should have #to_json support blocks for transformations" do
|
|
69
|
-
values = {}
|
|
70
|
-
@artist.values.each{|k,v| values[k.to_s] = v}
|
|
71
|
-
Sequel.parse_json(@artist.to_json{|h| {'data'=>h}}).must_equal({'data'=>values})
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should raise an error if attempting to parse json when providing array to non-array association or vice-versa" do
|
|
75
|
-
proc{Artist.from_json('{"albums":{"id":1,"name":"RF","artist_id":2},"id":2,"name":"YJM"}', :associations=>:albums)}.must_raise(Sequel::Error)
|
|
76
|
-
proc{Album.from_json('{"artist":[{"id":2,"name":"YJM"}],"id":1,"name":"RF","artist_id":2}', :associations=>:artist)}.must_raise(Sequel::Error)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should raise an error if attempting to parse an array containing non-hashes" do
|
|
80
|
-
proc{Artist.from_json('[{"id":2,"name":"YJM"}, 2]')}.must_raise(Sequel::Error)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should raise an error if attempting to parse invalid JSON" do
|
|
84
|
-
begin
|
|
85
|
-
Sequel.instance_eval do
|
|
86
|
-
alias pj parse_json
|
|
87
|
-
def parse_json(v)
|
|
88
|
-
v
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
proc{Album.from_json('1')}.must_raise(Sequel::Error)
|
|
92
|
-
ensure
|
|
93
|
-
Sequel.instance_eval do
|
|
94
|
-
alias parse_json pj
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "should handle case where Sequel.parse_json already returns an instance" do
|
|
100
|
-
begin
|
|
101
|
-
Sequel.instance_eval do
|
|
102
|
-
alias pj parse_json
|
|
103
|
-
def parse_json(v)
|
|
104
|
-
Album.load(:id=>3)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
::Album.from_json('1').must_equal Album.load(:id=>3)
|
|
108
|
-
ensure
|
|
109
|
-
Sequel.instance_eval do
|
|
110
|
-
alias parse_json pj
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should handle the :include option for arbitrary attributes" do
|
|
116
|
-
Album.from_json(@album.to_json(:include=>:blah)).blah.must_equal @album.blah
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "should handle multiple inclusions using an array for the :include option" do
|
|
120
|
-
a = Album.from_json(@album.to_json(:include=>[:blah, :artist]), :associations=>:artist)
|
|
121
|
-
a.blah.must_equal @album.blah
|
|
122
|
-
a.artist.must_equal @artist
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "should handle cascading using a hash for the :include option" do
|
|
126
|
-
Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.must_equal [@artist]
|
|
127
|
-
Album.from_json(@album.to_json(:include=>{:artist=>{:include=>:albums}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.must_equal [@album]
|
|
128
|
-
|
|
129
|
-
Artist.from_json(@artist.to_json(:include=>{:albums=>{:only=>:name}}), :associations=>[:albums]).albums.must_equal [Album.load(:name=>@album.name)]
|
|
130
|
-
Album.from_json(@album.to_json(:include=>{:artist=>{:except=>:name}}), :associations=>[:artist]).artist.must_equal Artist.load(:id=>@artist.id)
|
|
131
|
-
|
|
132
|
-
Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>{:artist=>{:include=>:albums}}}}), :associations=>{:albums=>{:associations=>{:artist=>{:associations=>:albums}}}}).albums.map{|a| a.artist.albums}.must_equal [[@album]]
|
|
133
|
-
Album.from_json(@album.to_json(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.must_equal [Album.load(:name=>@album.name)]
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should handle usage of association_proxies when cascading using the :include option" do
|
|
137
|
-
Artist.plugin :association_proxies
|
|
138
|
-
Artist.one_to_many :albums, :clone=>:albums
|
|
139
|
-
Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.must_equal [@artist]
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "should handle the :include option cascading with an empty hash" do
|
|
143
|
-
Album.from_json(@album.to_json(:include=>{:artist=>{}}), :associations=>:artist).artist.must_equal @artist
|
|
144
|
-
Album.from_json(@album.to_json(:include=>{:blah=>{}})).blah.must_equal @album.blah
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
it "should accept a :naked option to not include the JSON.create_id, so parsing yields a plain hash" do
|
|
148
|
-
Sequel.parse_json(@album.to_json(:naked=>true)).must_equal @album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
it "should support #from_json to set column values" do
|
|
152
|
-
@artist.from_json('{"name": "AS"}')
|
|
153
|
-
@artist.name.must_equal 'AS'
|
|
154
|
-
@artist.id.must_equal 2
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
it "should support #from_json to support specific :fields" do
|
|
158
|
-
@album.from_json('{"name": "AS", "artist_id": 3}', :fields=>['name'])
|
|
159
|
-
@album.name.must_equal 'AS'
|
|
160
|
-
@album.artist_id.must_equal 2
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "should support #from_json to support :missing=>:skip option" do
|
|
164
|
-
@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:skip)
|
|
165
|
-
@album.name.must_equal 'RF'
|
|
166
|
-
@album.artist_id.must_equal 2
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it "should support #from_json to support :missing=>:raise option" do
|
|
170
|
-
proc{@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:raise)}.must_raise(Sequel::Error)
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should have #from_json raise an error if parsed json isn't a hash" do
|
|
174
|
-
proc{@artist.from_json('[]')}.must_raise(Sequel::Error)
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
it "should raise an exception for json keys that aren't associations, columns, or setter methods" do
|
|
178
|
-
Album.send(:undef_method, :blah=)
|
|
179
|
-
proc{Album.from_json(@album.to_json(:include=>:blah))}.must_raise(Sequel::MassAssignmentRestriction)
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
it "should support a to_json class and dataset method" do
|
|
183
|
-
Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
|
|
184
|
-
Artist.dataset = Artist.dataset.with_fetch(:id=>2, :name=>'YJM')
|
|
185
|
-
Album.array_from_json(Album.to_json).must_equal [@album]
|
|
186
|
-
Album.array_from_json(Album.to_json(:include=>:artist), :associations=>:artist).map{|x| x.artist}.must_equal [@artist]
|
|
187
|
-
Album.array_from_json(Album.dataset.to_json(:only=>:name)).must_equal [Album.load(:name=>@album.name)]
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
it "should have dataset to_json method work with eager_graph datasets" do
|
|
191
|
-
ds = Album.dataset.eager_graph(:artist).with_fetch(:id=>1, :name=>'RF', :artist_id=>2, :artist_id_0=>2, :artist_name=>'YM')
|
|
192
|
-
Sequel.parse_json(ds.to_json(:only=>:name, :include=>{:artist=>{:only=>:name}})).must_equal [{"name"=>"RF", "artist"=>{"name"=>"YM"}}]
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
it "should have dataset to_json method work with naked datasets" do
|
|
196
|
-
ds = Album.dataset.naked.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
|
|
197
|
-
Sequel.parse_json(ds.to_json).must_equal [@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}]
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
it "should have class and dataset to_json method accept blocks for transformations" do
|
|
201
|
-
Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
|
|
202
|
-
Sequel.parse_json(Album.to_json{|h| {'data'=>h}}).must_equal('data'=>[@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}])
|
|
203
|
-
Sequel.parse_json(Album.dataset.to_json{|h| {'data'=>h}}).must_equal('data'=>[@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}])
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
it "should have class and dataset to_json method support :instance_block option for instance_transformations" do
|
|
207
|
-
Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
|
|
208
|
-
Sequel.parse_json(Album.to_json(:instance_block=>lambda{|h| {'data'=>h}})).must_equal [{'data'=>@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}}]
|
|
209
|
-
Sequel.parse_json(Album.dataset.to_json(:instance_block=>lambda{|h| {'data'=>h}})).must_equal [{'data'=>@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}}]
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
it "should have dataset to_json method respect :array option for the array to use" do
|
|
213
|
-
a = Album.new(:name=>'RF', :artist_id=>3)
|
|
214
|
-
Album.array_from_json(Album.to_json(:array=>[a])).must_equal [a]
|
|
215
|
-
|
|
216
|
-
a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
|
|
217
|
-
Album.array_from_json(Album.to_json(:array=>[a], :include=>:artist), :associations=>:artist).first.artist.must_equal artist
|
|
218
|
-
|
|
219
|
-
artist.associations[:albums] = [a]
|
|
220
|
-
x = Artist.array_from_json(Artist.to_json(:array=>[artist], :include=>:albums), :associations=>[:albums])
|
|
221
|
-
x.must_equal [artist]
|
|
222
|
-
x.first.albums.must_equal [a]
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
it "should propagate class default options to instance to_json output" do
|
|
226
|
-
class ::Album2 < Sequel::Model
|
|
227
|
-
attr_accessor :blah
|
|
228
|
-
plugin :json_serializer, :naked => true, :except => :id
|
|
229
|
-
columns :id, :name, :artist_id
|
|
230
|
-
many_to_one :artist
|
|
231
|
-
end
|
|
232
|
-
@album2 = Album2.load(:id=>2, :name=>'JK')
|
|
233
|
-
@album2.artist = @artist
|
|
234
|
-
@album2.blah = 'Gak'
|
|
235
|
-
JSON.parse(@album2.to_json).must_equal @album2.values.reject{|k,v| k.to_s == 'id'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
|
|
236
|
-
JSON.parse(@album2.to_json(:only => :name)).must_equal @album2.values.reject{|k,v| k.to_s != 'name'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
|
|
237
|
-
JSON.parse(@album2.to_json(:except => :artist_id)).must_equal @album2.values.reject{|k,v| k.to_s == 'artist_id'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
it "should handle the :root option to qualify single records" do
|
|
241
|
-
@album.to_json(:root=>true, :except => [:name, :artist_id]).to_s.must_equal '{"album":{"id":1}}'
|
|
242
|
-
@album.to_json(:root=>true, :only => :name).to_s.must_equal '{"album":{"name":"RF"}}'
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
it "should handle the :root option to qualify single records of namespaced models" do
|
|
246
|
-
module ::Namespace
|
|
247
|
-
class Album < Sequel::Model
|
|
248
|
-
plugin :json_serializer, :naked=>true
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
Namespace::Album.new({}).to_json(:root=>true).to_s.must_equal '{"album":{}}'
|
|
252
|
-
Namespace::Album.dataset = Namespace::Album.dataset.with_fetch([{}])
|
|
253
|
-
Namespace::Album.dataset.to_json(:root=>:collection).to_s.must_equal '{"albums":[{}]}'
|
|
254
|
-
Namespace::Album.dataset.to_json(:root=>:both).to_s.must_equal '{"albums":[{"album":{}}]}'
|
|
255
|
-
Object.send(:remove_const, :Namespace)
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
it "should handle the :root option with a string to qualify single records using the string as the key" do
|
|
259
|
-
@album.to_json(:root=>"foo", :except => [:name, :artist_id]).to_s.must_equal '{"foo":{"id":1}}'
|
|
260
|
-
@album.to_json(:root=>"bar", :only => :name).to_s.must_equal '{"bar":{"name":"RF"}}'
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
it "should handle the :root=>:both option to qualify a dataset of records" do
|
|
264
|
-
Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]).to_json(:root=>:both, :only => :id).to_s.must_equal '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
it "should handle the :root=>:collection option to qualify just the collection" do
|
|
268
|
-
ds = Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}])
|
|
269
|
-
ds.to_json(:root=>:collection, :only => :id).to_s.must_equal '{"albums":[{"id":1},{"id":1}]}'
|
|
270
|
-
ds.to_json(:root=>true, :only => :id).to_s.must_equal '{"albums":[{"id":1},{"id":1}]}'
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
it "should handle the :root=>:instance option to qualify just the instances" do
|
|
274
|
-
Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]).to_json(:root=>:instance, :only => :id).to_s.must_equal '[{"album":{"id":1}},{"album":{"id":1}}]'
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
it "should handle the :root=>string option to qualify just the collection using the string as the key" do
|
|
278
|
-
ds = Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}])
|
|
279
|
-
ds.to_json(:root=>"foos", :only => :id).to_s.must_equal '{"foos":[{"id":1},{"id":1}]}'
|
|
280
|
-
ds.to_json(:root=>"bars", :only => :id).to_s.must_equal '{"bars":[{"id":1},{"id":1}]}'
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
it "should use an alias for an included asscociation to qualify an association" do
|
|
284
|
-
JSON.parse(@album.to_json(:include=>Sequel.as(:artist, :singer)).to_s).must_equal JSON.parse('{"id":1,"name":"RF","artist_id":2,"singer":{"id":2,"name":"YJM"}}')
|
|
285
|
-
JSON.parse(@album.to_json(:include=>{Sequel.as(:artist, :singer)=>{:only=>:name}}).to_s).must_equal JSON.parse('{"id":1,"name":"RF","artist_id":2,"singer":{"name":"YJM"}}')
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
it "should store the default options in json_serializer_opts" do
|
|
289
|
-
Album.json_serializer_opts.must_equal(:naked=>true)
|
|
290
|
-
c = Class.new(Album)
|
|
291
|
-
c.plugin :json_serializer, :naked=>false
|
|
292
|
-
c.json_serializer_opts.must_equal(:naked=>false)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
it "should work correctly when subclassing" do
|
|
296
|
-
class ::Artist2 < Artist
|
|
297
|
-
plugin :json_serializer, :only=>:name
|
|
298
|
-
end
|
|
299
|
-
Artist2.from_json(Artist2.load(:id=>2, :name=>'YYY').to_json).must_equal Artist2.load(:name=>'YYY')
|
|
300
|
-
class ::Artist3 < Artist2
|
|
301
|
-
plugin :json_serializer, :naked=>:true
|
|
302
|
-
end
|
|
303
|
-
Sequel.parse_json(Artist3.load(:id=>2, :name=>'YYY').to_json).must_equal("name"=>'YYY')
|
|
304
|
-
Object.send(:remove_const, :Artist2)
|
|
305
|
-
Object.send(:remove_const, :Artist3)
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
|
|
309
|
-
Artist.restrict_primary_key
|
|
310
|
-
proc{Artist.from_json(@artist.to_json)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
it "should raise an error if an unsupported association is passed in the :associations option" do
|
|
314
|
-
Artist.association_reflections.delete(:albums)
|
|
315
|
-
proc{Artist.from_json(@artist.to_json(:include=>:albums), :associations=>:albums)}.must_raise(Sequel::Error)
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
it "should raise an error if using from_json and JSON parsing returns an array" do
|
|
319
|
-
proc{Artist.from_json([@artist].to_json)}.must_raise(Sequel::Error)
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
it "should raise an error if using array_from_json and JSON parsing does not return an array" do
|
|
323
|
-
proc{Artist.array_from_json(@artist.to_json)}.must_raise(Sequel::Error)
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
it "should raise an error if using an unsupported :associations option" do
|
|
327
|
-
proc{Artist.from_json(@artist.to_json, :associations=>'')}.must_raise(Sequel::Error)
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
it "should freeze json serializier opts when model class is frozen" do
|
|
331
|
-
Album.json_serializer_opts[:only] = [:id]
|
|
332
|
-
Album.freeze
|
|
333
|
-
Album.json_serializer_opts.frozen?.must_equal true
|
|
334
|
-
Album.json_serializer_opts[:only].frozen?.must_equal true
|
|
335
|
-
end
|
|
336
|
-
end
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
require_relative "spec_helper"
|
|
2
|
-
require 'yaml'
|
|
3
|
-
|
|
4
|
-
describe "Sequel::Plugins::LazyAttributes" do
|
|
5
|
-
before do
|
|
6
|
-
@db = Sequel.mock
|
|
7
|
-
def @db.supports_schema_parsing?() true end
|
|
8
|
-
def @db.schema(*a) [[:id, {:type=>:integer}], [:name,{:type=>:string}]] end
|
|
9
|
-
class ::LazyAttributesModel < Sequel::Model(@db[:la])
|
|
10
|
-
plugin :lazy_attributes
|
|
11
|
-
set_columns([:id, :name])
|
|
12
|
-
def self.columns; [:id, :name] end
|
|
13
|
-
lazy_attributes :name
|
|
14
|
-
def self.columns; [:id] end
|
|
15
|
-
set_dataset dataset.with_fetch(proc do |sql|
|
|
16
|
-
if sql !~ /WHERE/
|
|
17
|
-
if sql =~ /name/
|
|
18
|
-
[{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
19
|
-
else
|
|
20
|
-
[{:id=>1}, {:id=>2}]
|
|
21
|
-
end
|
|
22
|
-
else
|
|
23
|
-
if sql =~ /id IN \(([\d, ]+)\)/
|
|
24
|
-
$1.split(', ')
|
|
25
|
-
elsif sql =~ /id = (\d)/
|
|
26
|
-
[$1]
|
|
27
|
-
end.map do |x|
|
|
28
|
-
if sql =~ /SELECT (la.)?name FROM/
|
|
29
|
-
{:name=>x.to_s}
|
|
30
|
-
else
|
|
31
|
-
{:id=>x.to_i, :name=>x.to_s}
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end)
|
|
36
|
-
end
|
|
37
|
-
@c = ::LazyAttributesModel
|
|
38
|
-
@ds = LazyAttributesModel.dataset
|
|
39
|
-
@db.sqls
|
|
40
|
-
end
|
|
41
|
-
after do
|
|
42
|
-
Object.send(:remove_const, :LazyAttributesModel)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should allowing adding additional lazy attributes via plugin :lazy_attributes" do
|
|
46
|
-
@c.set_dataset(@ds.select(:id, :blah))
|
|
47
|
-
@c.dataset.sql.must_equal 'SELECT id, blah FROM la'
|
|
48
|
-
@c.plugin :lazy_attributes, :blah
|
|
49
|
-
@c.dataset.sql.must_equal 'SELECT id FROM la'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should allowing adding additional lazy attributes via lazy_attributes" do
|
|
53
|
-
@c.set_dataset(@ds.select(:id, :blah))
|
|
54
|
-
@c.dataset.sql.must_equal 'SELECT id, blah FROM la'
|
|
55
|
-
@c.lazy_attributes :blah
|
|
56
|
-
@c.dataset.sql.must_equal 'SELECT id FROM la'
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "should handle lazy attributes that are qualified in the selection" do
|
|
60
|
-
@c.set_dataset(@ds.select(Sequel[:la][:id], Sequel[:la][:blah]))
|
|
61
|
-
@c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
|
|
62
|
-
@c.plugin :lazy_attributes, :blah
|
|
63
|
-
@c.dataset.sql.must_equal 'SELECT la.id FROM la'
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
with_symbol_splitting "should handle lazy attributes that are qualified in the selection using symbol splitting" do
|
|
67
|
-
@c.set_dataset(@ds.select(:la__id, :la__blah))
|
|
68
|
-
@c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
|
|
69
|
-
@c.plugin :lazy_attributes, :blah
|
|
70
|
-
@c.dataset.sql.must_equal 'SELECT la.id FROM la'
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should remove the attributes given from the SELECT columns of the model's dataset" do
|
|
74
|
-
@ds.sql.must_equal 'SELECT la.id FROM la'
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should still typecast correctly in lazy loaded column setters" do
|
|
78
|
-
m = @c.new
|
|
79
|
-
m.name = 1
|
|
80
|
-
m.name.must_equal '1'
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should raise error if the model has no primary key" do
|
|
84
|
-
m = @c.first
|
|
85
|
-
@c.no_primary_key
|
|
86
|
-
proc{m.name}.must_raise(Sequel::Error)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should lazily load the attribute for a single model object" do
|
|
90
|
-
m = @c.first
|
|
91
|
-
m.values.must_equal(:id=>1)
|
|
92
|
-
m.name.must_equal '1'
|
|
93
|
-
m.values.must_equal(:id=>1, :name=>'1')
|
|
94
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "should lazily load the attribute for a frozen model object" do
|
|
98
|
-
m = @c.first
|
|
99
|
-
m.freeze
|
|
100
|
-
m.name.must_equal '1'
|
|
101
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
102
|
-
m.name.must_equal '1'
|
|
103
|
-
@db.sqls.must_equal ['SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "should not lazily load the attribute for a single model object if the value already exists" do
|
|
107
|
-
m = @c.first
|
|
108
|
-
m.values.must_equal(:id=>1)
|
|
109
|
-
m[:name] = '1'
|
|
110
|
-
m.name.must_equal '1'
|
|
111
|
-
m.values.must_equal(:id=>1, :name=>'1')
|
|
112
|
-
@db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1']
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should not lazily load the attribute for a single model object if it is a new record" do
|
|
116
|
-
m = @c.new
|
|
117
|
-
m.values.must_equal({})
|
|
118
|
-
m.name.must_be_nil
|
|
119
|
-
@db.sqls.must_equal []
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "should eagerly load the attribute for all model objects reteived with it" do
|
|
123
|
-
ms = @c.all
|
|
124
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
125
|
-
ms.map{|m| m.name}.must_equal %w'1 2'
|
|
126
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
127
|
-
sqls = @db.sqls
|
|
128
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
129
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
130
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "should not eagerly load the attribute if model instance is frozen, and deal with other frozen instances if not frozen" do
|
|
134
|
-
ms = @c.all
|
|
135
|
-
ms.first.freeze
|
|
136
|
-
ms.map{|m| m.name}.must_equal %w'1 2'
|
|
137
|
-
@db.sqls.must_equal ['SELECT la.id FROM la', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1', 'SELECT la.id, la.name FROM la WHERE (la.id IN (2))']
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
it "should add the accessors to a module included in the class, so they can be easily overridden" do
|
|
141
|
-
@c.class_eval do
|
|
142
|
-
def name
|
|
143
|
-
"#{super}-blah"
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
ms = @c.all
|
|
147
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
148
|
-
ms.map{|m| m.name}.must_equal %w'1-blah 2-blah'
|
|
149
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
150
|
-
sqls = @db.sqls
|
|
151
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
152
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
153
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it "should work with the serialization plugin" do
|
|
157
|
-
@c.plugin :serialization, :yaml, :name
|
|
158
|
-
@ds = @c.dataset = @ds.with_fetch([[{:id=>1}, {:id=>2}], [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}], [{:id=>1}], [{:name=>"--- 3\n"}]])
|
|
159
|
-
ms = @ds.all
|
|
160
|
-
ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
|
|
161
|
-
ms.map{|m| m.name}.must_equal [3,6]
|
|
162
|
-
ms.map{|m| m.values}.must_equal [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}]
|
|
163
|
-
ms.map{|m| m.deserialized_values}.must_equal [{:name=>3}, {:name=>6}]
|
|
164
|
-
ms.map{|m| m.name}.must_equal [3,6]
|
|
165
|
-
sqls = @db.sqls
|
|
166
|
-
['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
|
|
167
|
-
'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
|
|
168
|
-
sqls.must_equal ['SELECT la.id FROM la']
|
|
169
|
-
m = @ds.first
|
|
170
|
-
m.values.must_equal(:id=>1)
|
|
171
|
-
m.name.must_equal 3
|
|
172
|
-
m.values.must_equal(:id=>1, :name=>"--- 3\n")
|
|
173
|
-
m.deserialized_values.must_equal(:name=>3)
|
|
174
|
-
m.name.must_equal 3
|
|
175
|
-
@db.sqls.must_equal ["SELECT la.id FROM la LIMIT 1", "SELECT la.name FROM la WHERE (id = 1) LIMIT 1"]
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "should not allow additional lazy attributes after freezing" do
|
|
179
|
-
@c.plugin :lazy_attributes, :blah
|
|
180
|
-
@c.freeze
|
|
181
|
-
proc{@c.lazy_attributes :name}.must_raise RuntimeError, TypeError
|
|
182
|
-
end
|
|
183
|
-
end
|