sequel 3.21.0 → 3.41.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.
- data/CHANGELOG +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +576 -0
- data/doc/opening_databases.rdoc +121 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +539 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +334 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +137 -16
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +77 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +168 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +227 -33
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +324 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +200 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +340 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +65 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +53 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -2,54 +2,44 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe "instance_filters plugin" do
|
|
4
4
|
before do
|
|
5
|
-
@c = Class.new(Sequel::Model(:people))
|
|
6
|
-
end
|
|
7
|
-
@sql = sql = ''
|
|
8
|
-
@v = v = [1]
|
|
5
|
+
@c = Class.new(Sequel::Model(:people))
|
|
9
6
|
@c.dataset.quote_identifiers = false
|
|
10
|
-
@c.dataset.meta_def(:update) do |opts|
|
|
11
|
-
sql.replace(update_sql(opts))
|
|
12
|
-
return v.first
|
|
13
|
-
end
|
|
14
|
-
@c.dataset.meta_def(:delete) do
|
|
15
|
-
sql.replace(delete_sql)
|
|
16
|
-
return v.first
|
|
17
|
-
end
|
|
18
7
|
@c.columns :id, :name, :num
|
|
19
8
|
@c.plugin :instance_filters
|
|
20
9
|
@p = @c.load(:id=>1, :name=>'John', :num=>1)
|
|
10
|
+
MODEL_DB.sqls
|
|
21
11
|
end
|
|
22
12
|
|
|
23
13
|
specify "should raise an error when updating a stale record" do
|
|
24
14
|
@p.update(:name=>'Bob')
|
|
25
|
-
|
|
15
|
+
MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
|
|
26
16
|
@p.instance_filter(:name=>'Jim')
|
|
27
|
-
@
|
|
17
|
+
@p.this.numrows = 0
|
|
28
18
|
proc{@p.update(:name=>'Joe')}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
|
|
29
|
-
|
|
19
|
+
MODEL_DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
|
|
30
20
|
end
|
|
31
21
|
|
|
32
22
|
specify "should raise an error when destroying a stale record" do
|
|
33
23
|
@p.destroy
|
|
34
|
-
|
|
24
|
+
MODEL_DB.sqls.should == ["DELETE FROM people WHERE id = 1"]
|
|
35
25
|
@p.instance_filter(:name=>'Jim')
|
|
36
|
-
@
|
|
26
|
+
@p.this.numrows = 0
|
|
37
27
|
proc{@p.destroy}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
|
|
38
|
-
|
|
28
|
+
MODEL_DB.sqls.should == ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
|
|
39
29
|
end
|
|
40
30
|
|
|
41
31
|
specify "should apply all instance filters" do
|
|
42
32
|
@p.instance_filter(:name=>'Jim')
|
|
43
33
|
@p.instance_filter{num > 2}
|
|
44
34
|
@p.update(:name=>'Bob')
|
|
45
|
-
|
|
35
|
+
MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"]
|
|
46
36
|
end
|
|
47
37
|
|
|
48
38
|
specify "should drop instance filters after updating" do
|
|
49
39
|
@p.instance_filter(:name=>'Joe')
|
|
50
40
|
@p.update(:name=>'Joe')
|
|
51
|
-
|
|
41
|
+
MODEL_DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"]
|
|
52
42
|
@p.update(:name=>'Bob')
|
|
53
|
-
|
|
43
|
+
MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
|
|
54
44
|
end
|
|
55
45
|
end
|
|
@@ -177,3 +177,75 @@ describe "InstanceHooks plugin" do
|
|
|
177
177
|
@r.should == [2, 1, 4, 3]
|
|
178
178
|
end
|
|
179
179
|
end
|
|
180
|
+
|
|
181
|
+
describe "InstanceHooks plugin with transactions" do
|
|
182
|
+
before do
|
|
183
|
+
@db = Sequel.mock(:numrows=>1)
|
|
184
|
+
pr = proc{|x| r(x)}
|
|
185
|
+
@c = Class.new(Sequel::Model(@db[:items])) do
|
|
186
|
+
attr_accessor :rb
|
|
187
|
+
def after_save
|
|
188
|
+
db.execute('as')
|
|
189
|
+
raise Sequel::Rollback if rb
|
|
190
|
+
end
|
|
191
|
+
def after_destroy
|
|
192
|
+
db.execute('ad')
|
|
193
|
+
raise Sequel::Rollback if rb
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
@c.use_transactions = true
|
|
197
|
+
@c.plugin :instance_hooks
|
|
198
|
+
@o = @c.load({:id=>1})
|
|
199
|
+
@or = @c.load({:id=>1})
|
|
200
|
+
@or.rb = true
|
|
201
|
+
@r = []
|
|
202
|
+
@db.sqls
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "should support after_commit_hook" do
|
|
206
|
+
@o.after_commit_hook{@db.execute('ac1')}
|
|
207
|
+
@o.after_commit_hook{@db.execute('ac2')}
|
|
208
|
+
@o.save.should_not be_nil
|
|
209
|
+
@db.sqls.should == ['BEGIN', 'as', 'COMMIT', 'ac1', 'ac2']
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
it "should support after_rollback_hook" do
|
|
213
|
+
@or.after_rollback_hook{@db.execute('ar1')}
|
|
214
|
+
@or.after_rollback_hook{@db.execute('ar2')}
|
|
215
|
+
@or.save.should be_nil
|
|
216
|
+
@db.sqls.should == ['BEGIN', 'as', 'ROLLBACK', 'ar1', 'ar2']
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "should support after_commit_hook" do
|
|
220
|
+
@o.after_destroy_commit_hook{@db.execute('adc1')}
|
|
221
|
+
@o.after_destroy_commit_hook{@db.execute('adc2')}
|
|
222
|
+
@o.destroy.should_not be_nil
|
|
223
|
+
@db.sqls.should == ['BEGIN', "DELETE FROM items WHERE (id = 1)", 'ad', 'COMMIT', 'adc1', 'adc2']
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "should support after_rollback_hook" do
|
|
227
|
+
@or.after_destroy_rollback_hook{@db.execute('adr1')}
|
|
228
|
+
@or.after_destroy_rollback_hook{@db.execute('adr2')}
|
|
229
|
+
@or.destroy.should be_nil
|
|
230
|
+
@db.sqls.should == ['BEGIN', "DELETE FROM items WHERE (id = 1)", 'ad', 'ROLLBACK', 'adr1', 'adr2']
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it "should have *_hook methods return self "do
|
|
234
|
+
@o.before_destroy_hook{r 1}.should equal(@o)
|
|
235
|
+
@o.before_validation_hook{r 1}.should equal(@o)
|
|
236
|
+
@o.before_save_hook{r 1}.should equal(@o)
|
|
237
|
+
@o.before_update_hook{r 1}.should equal(@o)
|
|
238
|
+
@o.before_create_hook{r 1}.should equal(@o)
|
|
239
|
+
|
|
240
|
+
@o.after_destroy_hook{r 1}.should equal(@o)
|
|
241
|
+
@o.after_validation_hook{r 1}.should equal(@o)
|
|
242
|
+
@o.after_save_hook{r 1}.should equal(@o)
|
|
243
|
+
@o.after_update_hook{r 1}.should equal(@o)
|
|
244
|
+
@o.after_create_hook{r 1}.should equal(@o)
|
|
245
|
+
@o.after_commit_hook{r 1}.should equal(@o)
|
|
246
|
+
@o.after_rollback_hook{r 1}.should equal(@o)
|
|
247
|
+
@o.after_destroy_commit_hook{r 1}.should equal(@o)
|
|
248
|
+
@o.after_destroy_rollback_hook{r 1}.should equal(@o)
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
end
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
-
begin
|
|
4
|
-
require 'json'
|
|
5
|
-
rescue LoadError => e
|
|
6
|
-
skip_warn "json_serializer plugin: can't load json (#{e.class}: #{e})"
|
|
7
|
-
else
|
|
8
3
|
describe "Sequel::Plugins::JsonSerializer" do
|
|
9
4
|
before do
|
|
10
5
|
class ::Artist < Sequel::Model
|
|
@@ -96,14 +91,30 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
|
96
91
|
@artist.id.should == 2
|
|
97
92
|
end
|
|
98
93
|
|
|
94
|
+
it "should support #from_json to support specific :fields" do
|
|
95
|
+
@album.from_json('{"name": "AS", "artist_id": 3}', :fields=>['name'])
|
|
96
|
+
@album.name.should == 'AS'
|
|
97
|
+
@album.artist_id.should == 2
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "should support #from_json to support :missing=>:skip option" do
|
|
101
|
+
@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:skip)
|
|
102
|
+
@album.name.should == 'RF'
|
|
103
|
+
@album.artist_id.should == 2
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should support #from_json to support :missing=>:raise option" do
|
|
107
|
+
proc{@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:raise)}.should raise_error(Sequel::Error)
|
|
108
|
+
end
|
|
109
|
+
|
|
99
110
|
it "should raise an exception for json keys that aren't associations, columns, or setter methods" do
|
|
100
111
|
Album.send(:undef_method, :blah=)
|
|
101
112
|
proc{JSON.parse(@album.to_json(:include=>:blah))}.should raise_error(Sequel::Error)
|
|
102
113
|
end
|
|
103
114
|
|
|
104
115
|
it "should support a to_json class and dataset method" do
|
|
105
|
-
|
|
106
|
-
|
|
116
|
+
Album.dataset._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
|
|
117
|
+
Artist.dataset._fetch = {:id=>2, :name=>'YJM'}
|
|
107
118
|
JSON.parse(Album.to_json).should == [@album]
|
|
108
119
|
JSON.parse(Album.to_json(:include=>:artist)).map{|x| x.artist}.should == [@artist]
|
|
109
120
|
JSON.parse(Album.dataset.to_json(:only=>:name)).should == [Album.load(:name=>@album.name)]
|
|
@@ -112,10 +123,23 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
|
112
123
|
it "should have dataset to_json method work with naked datasets" do
|
|
113
124
|
album = @album
|
|
114
125
|
ds = Album.dataset.naked
|
|
115
|
-
ds.
|
|
126
|
+
ds._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
|
|
116
127
|
JSON.parse(ds.to_json).should == [@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}]
|
|
117
128
|
end
|
|
118
129
|
|
|
130
|
+
it "should have dataset to_json method respect :array option for the array to use" do
|
|
131
|
+
a = Album.load(:id=>1, :name=>'RF', :artist_id=>3)
|
|
132
|
+
JSON.parse(Album.to_json(:array=>[a])).should == [a]
|
|
133
|
+
|
|
134
|
+
a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
|
|
135
|
+
JSON.parse(Album.to_json(:array=>[a], :include=>:artist)).first.artist.should == artist
|
|
136
|
+
|
|
137
|
+
artist.associations[:albums] = [a]
|
|
138
|
+
x = JSON.parse(Artist.to_json(:array=>[artist], :include=>:albums))
|
|
139
|
+
x.should == [artist]
|
|
140
|
+
x.first.albums.should == [a]
|
|
141
|
+
end
|
|
142
|
+
|
|
119
143
|
it "should propagate class default options to instance to_json output" do
|
|
120
144
|
class ::Album2 < Sequel::Model
|
|
121
145
|
attr_accessor :blah
|
|
@@ -136,9 +160,23 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
|
136
160
|
@album.to_json(:root=>true, :only => :name).to_s.should == '{"album":{"name":"RF"}}'
|
|
137
161
|
end
|
|
138
162
|
|
|
139
|
-
it "should handle the :root option to qualify a dataset of records" do
|
|
140
|
-
|
|
141
|
-
Album.dataset.
|
|
163
|
+
it "should handle the :root=>:both option to qualify a dataset of records" do
|
|
164
|
+
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
|
165
|
+
Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "should handle the :root=>:collection option to qualify just the collection" do
|
|
169
|
+
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
|
170
|
+
Album.dataset.to_json(:root=>:collection, :only => :id).to_s.should == '{"albums":[{"id":1},{"id":1}]}'
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should handle the :root=>:instance option to qualify just the instances" do
|
|
174
|
+
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
|
175
|
+
Album.dataset.to_json(:root=>:instance, :only => :id).to_s.should == '[{"album":{"id":1}},{"album":{"id":1}}]'
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should handle the :root=>true option be the same as :root=>:both for backwards compatibility" do
|
|
179
|
+
Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
|
|
142
180
|
Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
|
|
143
181
|
end
|
|
144
182
|
|
|
@@ -162,4 +200,3 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
|
162
200
|
Object.send(:remove_const, :Artist3)
|
|
163
201
|
end
|
|
164
202
|
end
|
|
165
|
-
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
require 'yaml'
|
|
2
3
|
|
|
3
4
|
describe "Sequel::Plugins::LazyAttributes" do
|
|
4
5
|
before do
|
|
5
|
-
@db =
|
|
6
|
+
@db = Sequel.mock
|
|
6
7
|
@db.meta_def(:schema){|*a| [[:id, {:type=>:integer}], [:name,{:type=>:string}]]}
|
|
7
8
|
class ::LazyAttributesModel < Sequel::Model(@db[:la])
|
|
8
9
|
plugin :lazy_attributes
|
|
@@ -10,27 +11,23 @@ describe "Sequel::Plugins::LazyAttributes" do
|
|
|
10
11
|
meta_def(:columns){[:id, :name]}
|
|
11
12
|
lazy_attributes :name
|
|
12
13
|
meta_def(:columns){[:id]}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
where = @opts[:where]
|
|
18
|
-
block = @mod_block || proc{|s| s}
|
|
19
|
-
if !where
|
|
20
|
-
if select.include?(:name)
|
|
21
|
-
yield(block[:id=>1, :name=>'1'])
|
|
22
|
-
yield(block[:id=>2, :name=>'2'])
|
|
14
|
+
instance_dataset._fetch = dataset._fetch = proc do |sql|
|
|
15
|
+
if sql !~ /WHERE/
|
|
16
|
+
if sql =~ /name/
|
|
17
|
+
[{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
|
|
23
18
|
else
|
|
24
|
-
|
|
25
|
-
yield(:id=>2)
|
|
19
|
+
[{:id=>1}, {:id=>2}]
|
|
26
20
|
end
|
|
27
21
|
else
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
if sql =~ /id IN \(([\d, ]+)\)/
|
|
23
|
+
$1.split(', ')
|
|
24
|
+
elsif sql =~ /id = (\d)/
|
|
25
|
+
[$1]
|
|
26
|
+
end.map do |x|
|
|
30
27
|
if sql =~ /SELECT name FROM/
|
|
31
|
-
|
|
28
|
+
{:name=>x.to_s}
|
|
32
29
|
else
|
|
33
|
-
|
|
30
|
+
{:id=>x.to_i, :name=>x.to_s}
|
|
34
31
|
end
|
|
35
32
|
end
|
|
36
33
|
end
|
|
@@ -38,7 +35,7 @@ describe "Sequel::Plugins::LazyAttributes" do
|
|
|
38
35
|
end
|
|
39
36
|
@c = ::LazyAttributesModel
|
|
40
37
|
@ds = LazyAttributesModel.dataset
|
|
41
|
-
@db.
|
|
38
|
+
@db.sqls
|
|
42
39
|
end
|
|
43
40
|
after do
|
|
44
41
|
Object.send(:remove_const, :LazyAttributesModel)
|
|
@@ -136,7 +133,7 @@ describe "Sequel::Plugins::LazyAttributes" do
|
|
|
136
133
|
|
|
137
134
|
it "should work with the serialization plugin" do
|
|
138
135
|
@c.plugin :serialization, :yaml, :name
|
|
139
|
-
@ds.
|
|
136
|
+
@c.instance_dataset._fetch = @ds._fetch = [[{:id=>1}, {:id=>2}], [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}], [{:id=>1}], [{:name=>"--- 3\n"}]]
|
|
140
137
|
@c.with_identity_map do
|
|
141
138
|
ms = @ds.all
|
|
142
139
|
ms.map{|m| m.values}.should == [{:id=>1}, {:id=>2}]
|
|
@@ -146,7 +143,6 @@ describe "Sequel::Plugins::LazyAttributes" do
|
|
|
146
143
|
ms.map{|m| m.name}.should == [3,6]
|
|
147
144
|
@db.sqls.should == ['SELECT id FROM la', 'SELECT id, name FROM la WHERE (id IN (1, 2))']
|
|
148
145
|
end
|
|
149
|
-
@db.reset
|
|
150
146
|
@c.with_identity_map do
|
|
151
147
|
m = @ds.first
|
|
152
148
|
m.values.should == {:id=>1}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), '
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
2
2
|
|
|
3
3
|
describe "List plugin" do
|
|
4
4
|
def klass(opts={})
|
|
@@ -8,32 +8,10 @@ describe "List plugin" do
|
|
|
8
8
|
columns :id, :position, :scope_id, :pos
|
|
9
9
|
plugin :list, opts
|
|
10
10
|
self.use_transactions = false
|
|
11
|
-
|
|
12
|
-
class << self
|
|
13
|
-
attr_accessor :rows
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def checked_transaction(opts={})
|
|
17
|
-
return super if @in_transaction || !use_transaction?(opts)
|
|
18
|
-
@in_transaction = true
|
|
19
|
-
db.execute 'BEGIN'
|
|
20
|
-
super
|
|
21
|
-
db.execute 'COMMIT'
|
|
22
|
-
@in_transaction = false
|
|
23
|
-
end
|
|
24
11
|
end
|
|
25
12
|
c
|
|
26
13
|
end
|
|
27
14
|
|
|
28
|
-
def y(c, *hs)
|
|
29
|
-
c.rows = hs
|
|
30
|
-
ds = c.dataset
|
|
31
|
-
def ds.fetch_rows(sql)
|
|
32
|
-
db.execute(sql)
|
|
33
|
-
yield model.rows.shift
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
15
|
before do
|
|
38
16
|
@c = klass
|
|
39
17
|
@o = @c.load(:id=>7, :position=>3)
|
|
@@ -89,18 +67,49 @@ describe "List plugin" do
|
|
|
89
67
|
end
|
|
90
68
|
|
|
91
69
|
it "should have at_position return the model object at the given position" do
|
|
92
|
-
|
|
70
|
+
@c.dataset._fetch = {:id=>1, :position=>1}
|
|
93
71
|
@o.at_position(10).should == @c.load(:id=>1, :position=>1)
|
|
94
|
-
|
|
72
|
+
@sc.dataset._fetch = {:id=>2, :position=>2, :scope_id=>5}
|
|
95
73
|
@so.at_position(20).should == @sc.load(:id=>2, :position=>2, :scope_id=>5)
|
|
96
74
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 10) ORDER BY position LIMIT 1",
|
|
97
75
|
"SELECT * FROM items WHERE ((scope_id = 5) AND (position = 20)) ORDER BY scope_id, position LIMIT 1"]
|
|
98
76
|
end
|
|
99
77
|
|
|
78
|
+
it "should have position field set to max+1 when creating if not already set" do
|
|
79
|
+
@c.instance_dataset._fetch = @c.dataset._fetch = [[{:pos=>nil}], [{:id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :position=>2}]]
|
|
80
|
+
@c.instance_dataset.autoid = @c.dataset.autoid = 1
|
|
81
|
+
@c.create.values.should == {:id=>1, :position=>1}
|
|
82
|
+
@c.create.values.should == {:id=>2, :position=>2}
|
|
83
|
+
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
84
|
+
"INSERT INTO items (position) VALUES (1)",
|
|
85
|
+
"SELECT * FROM items WHERE (id = 1) ORDER BY position LIMIT 1",
|
|
86
|
+
"SELECT max(position) FROM items LIMIT 1",
|
|
87
|
+
"INSERT INTO items (position) VALUES (2)",
|
|
88
|
+
"SELECT * FROM items WHERE (id = 2) ORDER BY position LIMIT 1"]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should have position field set to max+1 in scope when creating if not already set" do
|
|
92
|
+
@sc.instance_dataset._fetch = @sc.dataset._fetch = [[{:pos=>nil}], [{:id=>1, :scope_id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :scope_id=>1, :position=>2}], [{:pos=>nil}], [{:id=>3, :scope_id=>2, :position=>1}]]
|
|
93
|
+
@sc.instance_dataset.autoid = @sc.dataset.autoid = 1
|
|
94
|
+
@sc.create(:scope_id=>1).values.should == {:id=>1, :scope_id=>1, :position=>1}
|
|
95
|
+
@sc.create(:scope_id=>1).values.should == {:id=>2, :scope_id=>1, :position=>2}
|
|
96
|
+
@sc.create(:scope_id=>2).values.should == {:id=>3, :scope_id=>2, :position=>1}
|
|
97
|
+
sqls = @db.sqls
|
|
98
|
+
sqls.slice!(7).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \([12], [12]\)/
|
|
99
|
+
sqls.slice!(4).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \([12], [12]\)/
|
|
100
|
+
sqls.slice!(1).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \(1, 1\)/
|
|
101
|
+
sqls.should == ["SELECT max(position) FROM items WHERE (scope_id = 1) LIMIT 1",
|
|
102
|
+
"SELECT * FROM items WHERE (id = 1) ORDER BY scope_id, position LIMIT 1",
|
|
103
|
+
"SELECT max(position) FROM items WHERE (scope_id = 1) LIMIT 1",
|
|
104
|
+
"SELECT * FROM items WHERE (id = 2) ORDER BY scope_id, position LIMIT 1",
|
|
105
|
+
"SELECT max(position) FROM items WHERE (scope_id = 2) LIMIT 1",
|
|
106
|
+
"SELECT * FROM items WHERE (id = 3) ORDER BY scope_id, position LIMIT 1"]
|
|
107
|
+
end
|
|
108
|
+
|
|
100
109
|
it "should have last_position return the last position in the list" do
|
|
101
|
-
|
|
110
|
+
@c.dataset._fetch = {:max=>10}
|
|
102
111
|
@o.last_position.should == 10
|
|
103
|
-
|
|
112
|
+
@sc.dataset._fetch = {:max=>20}
|
|
104
113
|
@so.last_position.should == 20
|
|
105
114
|
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
106
115
|
"SELECT max(position) FROM items WHERE (scope_id = 5) LIMIT 1"]
|
|
@@ -115,7 +124,7 @@ describe "List plugin" do
|
|
|
115
124
|
end
|
|
116
125
|
|
|
117
126
|
it "should have move_down without an argument move down a single position" do
|
|
118
|
-
|
|
127
|
+
@c.dataset._fetch = {:max=>10}
|
|
119
128
|
@o.move_down.should == @o
|
|
120
129
|
@o.position.should == 4
|
|
121
130
|
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
@@ -124,7 +133,7 @@ describe "List plugin" do
|
|
|
124
133
|
end
|
|
125
134
|
|
|
126
135
|
it "should have move_down with an argument move down the given number of positions" do
|
|
127
|
-
|
|
136
|
+
@c.dataset._fetch = {:max=>10}
|
|
128
137
|
@o.move_down(3).should == @o
|
|
129
138
|
@o.position.should == 6
|
|
130
139
|
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
@@ -141,11 +150,11 @@ describe "List plugin" do
|
|
|
141
150
|
|
|
142
151
|
it "should have move_to raise an error if an invalid target is used" do
|
|
143
152
|
proc{@o.move_to(0)}.should raise_error(Sequel::Error)
|
|
144
|
-
|
|
153
|
+
@c.dataset._fetch = {:max=>10}
|
|
145
154
|
proc{@o.move_to(11)}.should raise_error(Sequel::Error)
|
|
146
155
|
end
|
|
147
156
|
|
|
148
|
-
it "should have move_to use a transaction
|
|
157
|
+
it "should have move_to use a transaction if the instance is configured to use transactions" do
|
|
149
158
|
@o.use_transactions = true
|
|
150
159
|
@o.move_to(2)
|
|
151
160
|
@db.sqls.should == ["BEGIN",
|
|
@@ -167,13 +176,13 @@ describe "List plugin" do
|
|
|
167
176
|
end
|
|
168
177
|
|
|
169
178
|
it "should have move to shift entries correctly between current and target if moving down" do
|
|
170
|
-
|
|
179
|
+
@c.dataset._fetch = {:max=>10}
|
|
171
180
|
@o.move_to(4)
|
|
172
181
|
@db.sqls[1].should == "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))"
|
|
173
182
|
end
|
|
174
183
|
|
|
175
184
|
it "should have move_to_bottom move the item to the last position" do
|
|
176
|
-
|
|
185
|
+
@c.dataset._fetch = {:max=>10}
|
|
177
186
|
@o.move_to_bottom
|
|
178
187
|
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
179
188
|
"UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 10))",
|
|
@@ -201,7 +210,7 @@ describe "List plugin" do
|
|
|
201
210
|
end
|
|
202
211
|
|
|
203
212
|
it "should have move_up with a negative argument move down the given number of positions" do
|
|
204
|
-
|
|
213
|
+
@c.dataset._fetch = {:max=>10}
|
|
205
214
|
@o.move_up(-1).should == @o
|
|
206
215
|
@o.position.should == 4
|
|
207
216
|
@db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
|
|
@@ -210,19 +219,19 @@ describe "List plugin" do
|
|
|
210
219
|
end
|
|
211
220
|
|
|
212
221
|
it "should have next return the next entry in the list if not given an argument" do
|
|
213
|
-
|
|
222
|
+
@c.dataset._fetch = {:id=>9, :position=>4}
|
|
214
223
|
@o.next.should == @c.load(:id=>9, :position=>4)
|
|
215
224
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
|
|
216
225
|
end
|
|
217
226
|
|
|
218
227
|
it "should have next return the entry the given number of positions below the instance if given an argument" do
|
|
219
|
-
|
|
228
|
+
@c.dataset._fetch = {:id=>9, :position=>5}
|
|
220
229
|
@o.next(2).should == @c.load(:id=>9, :position=>5)
|
|
221
230
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 5) ORDER BY position LIMIT 1"]
|
|
222
231
|
end
|
|
223
232
|
|
|
224
233
|
it "should have next return a previous entry if given a negative argument" do
|
|
225
|
-
|
|
234
|
+
@c.dataset._fetch = {:id=>9, :position=>2}
|
|
226
235
|
@o.next(-1).should == @c.load(:id=>9, :position=>2)
|
|
227
236
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
|
|
228
237
|
end
|
|
@@ -232,19 +241,19 @@ describe "List plugin" do
|
|
|
232
241
|
end
|
|
233
242
|
|
|
234
243
|
it "should have prev return the previous entry in the list if not given an argument" do
|
|
235
|
-
|
|
244
|
+
@c.dataset._fetch = {:id=>9, :position=>2}
|
|
236
245
|
@o.prev.should == @c.load(:id=>9, :position=>2)
|
|
237
246
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
|
|
238
247
|
end
|
|
239
248
|
|
|
240
249
|
it "should have prev return the entry the given number of positions above the instance if given an argument" do
|
|
241
|
-
|
|
250
|
+
@c.dataset._fetch = {:id=>9, :position=>1}
|
|
242
251
|
@o.prev(2).should == @c.load(:id=>9, :position=>1)
|
|
243
252
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 1) ORDER BY position LIMIT 1"]
|
|
244
253
|
end
|
|
245
254
|
|
|
246
255
|
it "should have prev return a following entry if given a negative argument" do
|
|
247
|
-
|
|
256
|
+
@c.dataset._fetch = {:id=>9, :position=>4}
|
|
248
257
|
@o.prev(-1).should == @c.load(:id=>9, :position=>4)
|
|
249
258
|
@db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
|
|
250
259
|
end
|
|
@@ -4,18 +4,18 @@ describe "LooserTypecasting Extension" do
|
|
|
4
4
|
before do
|
|
5
5
|
@db = Sequel::Database.new({})
|
|
6
6
|
def @db.schema(*args)
|
|
7
|
-
[[:id, {}], [:
|
|
7
|
+
[[:id, {}], [:z, {:type=>:float}], [:b, {:type=>:integer}]]
|
|
8
8
|
end
|
|
9
9
|
@c = Class.new(Sequel::Model(@db[:items]))
|
|
10
10
|
@c.instance_eval do
|
|
11
|
-
@columns = [:id, :b, :
|
|
11
|
+
@columns = [:id, :b, :z]
|
|
12
12
|
def columns; @columns; end
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
specify "Should use to_i instead of Integer() for typecasting integers" do
|
|
17
17
|
proc{@c.new(:b=>'a')}.should raise_error(Sequel::InvalidValue)
|
|
18
|
-
@db.
|
|
18
|
+
@db.extension(:looser_typecasting)
|
|
19
19
|
@c.new(:b=>'a').b.should == 0
|
|
20
20
|
|
|
21
21
|
o = Object.new
|
|
@@ -26,14 +26,14 @@ describe "LooserTypecasting Extension" do
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
specify "Should use to_f instead of Float() for typecasting floats" do
|
|
29
|
-
proc{@c.new(:
|
|
30
|
-
@db.
|
|
31
|
-
@c.new(:
|
|
29
|
+
proc{@c.new(:z=>'a')}.should raise_error(Sequel::InvalidValue)
|
|
30
|
+
@db.extension(:looser_typecasting)
|
|
31
|
+
@c.new(:z=>'a').z.should == 0.0
|
|
32
32
|
|
|
33
33
|
o = Object.new
|
|
34
34
|
def o.to_f
|
|
35
35
|
1.0
|
|
36
36
|
end
|
|
37
|
-
@c.new(:
|
|
37
|
+
@c.new(:z=>o).z.should == 1.0
|
|
38
38
|
end
|
|
39
39
|
end
|