sequel 3.47.0 → 3.48.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +230 -0
- data/README.rdoc +31 -40
- data/Rakefile +1 -14
- data/doc/active_record.rdoc +29 -29
- data/doc/association_basics.rdoc +4 -13
- data/doc/cheat_sheet.rdoc +8 -6
- data/doc/code_order.rdoc +89 -0
- data/doc/core_extensions.rdoc +3 -3
- data/doc/dataset_basics.rdoc +7 -8
- data/doc/dataset_filtering.rdoc +7 -2
- data/doc/mass_assignment.rdoc +2 -3
- data/doc/migration.rdoc +8 -8
- data/doc/model_hooks.rdoc +11 -7
- data/doc/object_model.rdoc +2 -2
- data/doc/opening_databases.rdoc +5 -14
- data/doc/prepared_statements.rdoc +5 -9
- data/doc/querying.rdoc +23 -28
- data/doc/reflection.rdoc +11 -0
- data/doc/release_notes/3.48.0.txt +477 -0
- data/doc/schema_modification.rdoc +12 -5
- data/doc/security.rdoc +2 -2
- data/doc/sharding.rdoc +1 -2
- data/doc/sql.rdoc +10 -13
- data/doc/testing.rdoc +8 -4
- data/doc/transactions.rdoc +2 -2
- data/doc/validations.rdoc +40 -17
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +25 -20
- data/lib/sequel/adapters/ado/access.rb +1 -0
- data/lib/sequel/adapters/ado/mssql.rb +1 -0
- data/lib/sequel/adapters/db2.rb +9 -7
- data/lib/sequel/adapters/dbi.rb +16 -16
- data/lib/sequel/adapters/do.rb +17 -18
- data/lib/sequel/adapters/do/mysql.rb +1 -0
- data/lib/sequel/adapters/do/postgres.rb +2 -0
- data/lib/sequel/adapters/do/sqlite.rb +1 -0
- data/lib/sequel/adapters/firebird.rb +5 -7
- data/lib/sequel/adapters/ibmdb.rb +23 -20
- data/lib/sequel/adapters/informix.rb +8 -2
- data/lib/sequel/adapters/jdbc.rb +39 -35
- data/lib/sequel/adapters/jdbc/as400.rb +1 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
- data/lib/sequel/adapters/jdbc/db2.rb +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
- data/lib/sequel/adapters/jdbc/h2.rb +1 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
- data/lib/sequel/adapters/jdbc/informix.rb +1 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
- data/lib/sequel/adapters/jdbc/progress.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
- data/lib/sequel/adapters/mock.rb +30 -31
- data/lib/sequel/adapters/mysql.rb +6 -7
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/odbc.rb +22 -20
- data/lib/sequel/adapters/odbc/mssql.rb +1 -0
- data/lib/sequel/adapters/openbase.rb +4 -1
- data/lib/sequel/adapters/oracle.rb +10 -8
- data/lib/sequel/adapters/postgres.rb +12 -10
- data/lib/sequel/adapters/shared/access.rb +6 -0
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/db2.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +14 -8
- data/lib/sequel/adapters/shared/mysql.rb +6 -0
- data/lib/sequel/adapters/shared/oracle.rb +2 -0
- data/lib/sequel/adapters/shared/postgres.rb +14 -4
- data/lib/sequel/adapters/shared/progress.rb +1 -0
- data/lib/sequel/adapters/shared/sqlite.rb +4 -3
- data/lib/sequel/adapters/sqlite.rb +6 -7
- data/lib/sequel/adapters/swift.rb +20 -21
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +2 -0
- data/lib/sequel/adapters/swift/sqlite.rb +1 -0
- data/lib/sequel/adapters/tinytds.rb +5 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +57 -50
- data/lib/sequel/database/connecting.rb +9 -10
- data/lib/sequel/database/dataset.rb +11 -6
- data/lib/sequel/database/dataset_defaults.rb +61 -69
- data/lib/sequel/database/features.rb +21 -0
- data/lib/sequel/database/misc.rb +23 -3
- data/lib/sequel/database/query.rb +13 -7
- data/lib/sequel/database/schema_methods.rb +6 -6
- data/lib/sequel/database/transactions.rb +1 -0
- data/lib/sequel/dataset/actions.rb +51 -38
- data/lib/sequel/dataset/features.rb +1 -0
- data/lib/sequel/dataset/graph.rb +9 -33
- data/lib/sequel/dataset/misc.rb +30 -5
- data/lib/sequel/dataset/mutation.rb +2 -3
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/query.rb +91 -27
- data/lib/sequel/dataset/sql.rb +40 -6
- data/lib/sequel/deprecated.rb +74 -0
- data/lib/sequel/deprecated_core_extensions.rb +135 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -5
- data/lib/sequel/extensions/core_extensions.rb +10 -3
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
- data/lib/sequel/extensions/filter_having.rb +58 -0
- data/lib/sequel/extensions/graph_each.rb +63 -0
- data/lib/sequel/extensions/hash_aliases.rb +44 -0
- data/lib/sequel/extensions/looser_typecasting.rb +14 -3
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/extensions/named_timezones.rb +14 -1
- data/lib/sequel/extensions/null_dataset.rb +7 -1
- data/lib/sequel/extensions/pagination.rb +15 -5
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
- data/lib/sequel/extensions/pg_json.rb +7 -7
- data/lib/sequel/extensions/pg_range_ops.rb +8 -2
- data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
- data/lib/sequel/extensions/pretty_table.rb +13 -4
- data/lib/sequel/extensions/query.rb +21 -4
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -7
- data/lib/sequel/extensions/schema_dumper.rb +35 -48
- data/lib/sequel/extensions/select_remove.rb +13 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
- data/lib/sequel/extensions/set_overrides.rb +43 -0
- data/lib/sequel/extensions/to_dot.rb +6 -0
- data/lib/sequel/model.rb +12 -6
- data/lib/sequel/model/associations.rb +80 -38
- data/lib/sequel/model/base.rb +137 -52
- data/lib/sequel/model/errors.rb +7 -2
- data/lib/sequel/plugins/active_model.rb +13 -0
- data/lib/sequel/plugins/after_initialize.rb +43 -0
- data/lib/sequel/plugins/association_proxies.rb +63 -7
- data/lib/sequel/plugins/auto_validations.rb +56 -16
- data/lib/sequel/plugins/blacklist_security.rb +63 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
- data/lib/sequel/plugins/constraint_validations.rb +50 -8
- data/lib/sequel/plugins/dataset_associations.rb +2 -0
- data/lib/sequel/plugins/hook_class_methods.rb +7 -1
- data/lib/sequel/plugins/identity_map.rb +4 -0
- data/lib/sequel/plugins/json_serializer.rb +32 -13
- data/lib/sequel/plugins/optimistic_locking.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/scissors.rb +33 -0
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
- data/lib/sequel/plugins/tree.rb +5 -1
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +15 -11
- data/lib/sequel/plugins/xml_serializer.rb +12 -3
- data/lib/sequel/sql.rb +12 -2
- data/lib/sequel/timezones.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/mssql_spec.rb +24 -57
- data/spec/adapters/postgres_spec.rb +27 -55
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/bin_spec.rb +251 -0
- data/spec/core/database_spec.rb +46 -32
- data/spec/core/dataset_spec.rb +233 -181
- data/spec/core/deprecated_spec.rb +78 -0
- data/spec/core/expression_filters_spec.rb +3 -4
- data/spec/core/mock_adapter_spec.rb +9 -9
- data/spec/core/object_graph_spec.rb +9 -19
- data/spec/core/schema_spec.rb +3 -1
- data/spec/core/spec_helper.rb +19 -0
- data/spec/core_extensions_spec.rb +80 -30
- data/spec/extensions/after_initialize_spec.rb +24 -0
- data/spec/extensions/association_proxies_spec.rb +37 -1
- data/spec/extensions/auto_validations_spec.rb +20 -4
- data/spec/extensions/blacklist_security_spec.rb +87 -0
- data/spec/extensions/boolean_readers_spec.rb +2 -1
- data/spec/extensions/class_table_inheritance_spec.rb +7 -0
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
- data/spec/extensions/core_refinements_spec.rb +7 -7
- data/spec/extensions/dataset_associations_spec.rb +2 -2
- data/spec/extensions/date_arithmetic_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -1
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
- data/spec/extensions/filter_having_spec.rb +40 -0
- data/spec/extensions/graph_each_spec.rb +109 -0
- data/spec/extensions/hash_aliases_spec.rb +16 -0
- data/spec/extensions/hook_class_methods_spec.rb +2 -2
- data/spec/extensions/identity_map_spec.rb +3 -3
- data/spec/extensions/json_serializer_spec.rb +19 -19
- data/spec/extensions/lazy_attributes_spec.rb +1 -0
- data/spec/extensions/list_spec.rb +13 -13
- data/spec/extensions/looser_typecasting_spec.rb +10 -3
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +7 -7
- data/spec/extensions/named_timezones_spec.rb +6 -0
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
- data/spec/extensions/pg_range_ops_spec.rb +4 -2
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_caching_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +27 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +26 -0
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
- data/spec/extensions/set_overrides_spec.rb +45 -0
- data/spec/extensions/single_table_inheritance_spec.rb +10 -0
- data/spec/extensions/spec_helper.rb +24 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +2 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +3 -2
- data/spec/extensions/update_primary_key_spec.rb +2 -2
- data/spec/extensions/validation_class_methods_spec.rb +19 -19
- data/spec/extensions/validation_helpers_spec.rb +30 -21
- data/spec/extensions/xml_serializer_spec.rb +5 -5
- data/spec/integration/associations_test.rb +10 -30
- data/spec/integration/dataset_test.rb +20 -24
- data/spec/integration/eager_loader_test.rb +5 -5
- data/spec/integration/model_test.rb +3 -3
- data/spec/integration/plugin_test.rb +7 -39
- data/spec/integration/schema_test.rb +4 -38
- data/spec/integration/spec_helper.rb +2 -1
- data/spec/model/association_reflection_spec.rb +70 -5
- data/spec/model/associations_spec.rb +11 -11
- data/spec/model/base_spec.rb +25 -8
- data/spec/model/class_dataset_methods_spec.rb +143 -0
- data/spec/model/dataset_methods_spec.rb +1 -1
- data/spec/model/eager_loading_spec.rb +25 -25
- data/spec/model/hooks_spec.rb +1 -1
- data/spec/model/model_spec.rb +22 -7
- data/spec/model/plugins_spec.rb +1 -6
- data/spec/model/record_spec.rb +37 -29
- data/spec/model/spec_helper.rb +23 -1
- data/spec/model/validations_spec.rb +15 -17
- metadata +32 -3
data/lib/sequel/timezones.rb
CHANGED
@@ -82,7 +82,7 @@ module Sequel
|
|
82
82
|
end
|
83
83
|
|
84
84
|
# Convert the given object into an object of <tt>Sequel.datetime_class</tt> in the
|
85
|
-
# +application_timezone+. Used when
|
85
|
+
# +application_timezone+. Used when converting datetime/timestamp columns
|
86
86
|
# returned by the database.
|
87
87
|
def database_to_application_timestamp(v)
|
88
88
|
convert_timestamp(v, Sequel.database_timezone)
|
data/lib/sequel/version.rb
CHANGED
@@ -3,7 +3,7 @@ module Sequel
|
|
3
3
|
MAJOR = 3
|
4
4
|
# The minor version of Sequel. Bumped for every non-patch level
|
5
5
|
# release, generally around once a month.
|
6
|
-
MINOR =
|
6
|
+
MINOR = 48
|
7
7
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
8
8
|
# releases that fix regressions from previous versions.
|
9
9
|
TINY = 0
|
data/lib/sequel_core.rb
CHANGED
data/lib/sequel_model.rb
CHANGED
data/spec/adapters/mssql_spec.rb
CHANGED
@@ -195,78 +195,38 @@ describe "MSSQL Dataset#output" do
|
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
198
|
-
describe "MSSQL dataset" do
|
198
|
+
describe "MSSQL dataset using #with and #with_recursive" do
|
199
199
|
before do
|
200
200
|
@db = MSSQL_DB
|
201
201
|
@ds = MSSQL_DB[:t]
|
202
|
-
end
|
203
|
-
|
204
|
-
describe "using #with and #with_recursive" do
|
205
|
-
before do
|
206
202
|
@ds1 = @ds.with(:t, @db[:x])
|
207
203
|
@ds2 = @ds.with_recursive(:t, @db[:x], @db[:t])
|
208
|
-
|
209
|
-
|
210
|
-
specify "should prepend UPDATE statements with WITH clause" do
|
211
|
-
@ds1.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X]) UPDATE [T] SET [X] = [Y]'
|
212
|
-
@ds2.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) UPDATE [T] SET [X] = [Y]'
|
213
|
-
end
|
214
|
-
|
215
|
-
specify "should prepend DELETE statements with WITH clause" do
|
216
|
-
@ds1.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X]) DELETE FROM [T] WHERE ([Y] = 1)'
|
217
|
-
@ds2.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) DELETE FROM [T] WHERE ([Y] = 1)'
|
218
|
-
end
|
204
|
+
end
|
219
205
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
206
|
+
specify "should prepend UPDATE statements with WITH clause" do
|
207
|
+
@ds1.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X]) UPDATE [T] SET [X] = [Y]'
|
208
|
+
@ds2.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) UPDATE [T] SET [X] = [Y]'
|
209
|
+
end
|
224
210
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
211
|
+
specify "should prepend DELETE statements with WITH clause" do
|
212
|
+
@ds1.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X]) DELETE FROM [T] WHERE ([Y] = 1)'
|
213
|
+
@ds2.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) DELETE FROM [T] WHERE ([Y] = 1)'
|
214
|
+
end
|
229
215
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
attr_reader :import_sqls
|
235
|
-
|
236
|
-
def execute(sql, opts={})
|
237
|
-
@import_sqls ||= []
|
238
|
-
@import_sqls << sql
|
239
|
-
end
|
240
|
-
alias execute_dui execute
|
241
|
-
|
242
|
-
def transaction(opts={})
|
243
|
-
@import_sqls ||= []
|
244
|
-
@import_sqls << 'BEGIN'
|
245
|
-
yield
|
246
|
-
@import_sqls << 'COMMIT'
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
216
|
+
specify "should prepend INSERT statements with WITH clause" do
|
217
|
+
@ds1.insert_sql(@db[:t]).should == 'WITH [T] AS (SELECT * FROM [X]) INSERT INTO [T] SELECT * FROM [T]'
|
218
|
+
@ds2.insert_sql(@db[:t]).should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) INSERT INTO [T] SELECT * FROM [T]'
|
219
|
+
end
|
250
220
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
'BEGIN',
|
255
|
-
"WITH [ITEMS] AS (SELECT * FROM [INVENTORY] GROUP BY [TYPE]) INSERT INTO [ITEMS] ([X], [Y]) SELECT 1, 2 UNION ALL SELECT 3, 4",
|
256
|
-
'COMMIT',
|
257
|
-
'BEGIN',
|
258
|
-
"WITH [ITEMS] AS (SELECT * FROM [INVENTORY] GROUP BY [TYPE]) INSERT INTO [ITEMS] ([X], [Y]) SELECT 5, 6",
|
259
|
-
'COMMIT'
|
260
|
-
]
|
261
|
-
end
|
262
|
-
end
|
221
|
+
specify "should move WITH clause on joined dataset to top level" do
|
222
|
+
@db[:s].inner_join(@ds1).sql.should == "WITH [T] AS (SELECT * FROM [X]) SELECT * FROM [S] INNER JOIN (SELECT * FROM [T]) AS [T1]"
|
223
|
+
@ds1.inner_join(@db[:s].with(:s, @db[:y])).sql.should == "WITH [T] AS (SELECT * FROM [X]), [S] AS (SELECT * FROM [Y]) SELECT * FROM [T] INNER JOIN (SELECT * FROM [S]) AS [T1]"
|
263
224
|
end
|
264
225
|
end
|
265
226
|
|
266
227
|
describe "MSSQL::Dataset#import" do
|
267
228
|
before do
|
268
229
|
@db = MSSQL_DB
|
269
|
-
@db.create_table!(:test){primary_key :x; Integer :y}
|
270
230
|
@db.sqls.clear
|
271
231
|
@ds = @db[:test]
|
272
232
|
end
|
@@ -275,9 +235,16 @@ describe "MSSQL::Dataset#import" do
|
|
275
235
|
end
|
276
236
|
|
277
237
|
specify "#import should work correctly with an arbitrary output value" do
|
238
|
+
@db.create_table!(:test){primary_key :x; Integer :y}
|
278
239
|
@ds.output(nil, [:inserted__y, :inserted__x]).import([:y], [[3], [4]]).should == [{:y=>3, :x=>1}, {:y=>4, :x=>2}]
|
279
240
|
@ds.all.should == [{:x=>1, :y=>3}, {:x=>2, :y=>4}]
|
280
241
|
end
|
242
|
+
|
243
|
+
specify "should handle WITH statements" do
|
244
|
+
@db.create_table!(:test){Integer :x; Integer :y}
|
245
|
+
@db[:testx].with(:testx, @db[:test]).import([:x, :y], [[1, 2], [3, 4], [5, 6]], :slice => 2)
|
246
|
+
@ds.select_order_map([:x, :y]).should == [[1, 2], [3, 4], [5, 6]]
|
247
|
+
end
|
281
248
|
end
|
282
249
|
|
283
250
|
describe "MSSQL joined datasets" do
|
@@ -643,25 +643,6 @@ describe "A PostgreSQL database" do
|
|
643
643
|
@db[:posts].order(:a).map(:a).should == [1, 2, 10, 20, 21]
|
644
644
|
end
|
645
645
|
|
646
|
-
specify "should support resetting the primary key sequence with default_schema" do
|
647
|
-
begin
|
648
|
-
@db.run("DROP SCHEMA p") rescue nil
|
649
|
-
@db.run("CREATE SCHEMA p")
|
650
|
-
@db.default_schema = :p
|
651
|
-
@db.create_table(:posts){primary_key :a}
|
652
|
-
@db[:p__posts].insert(:a=>20).should == 20
|
653
|
-
@db[:p__posts].insert.should == 1
|
654
|
-
@db[:p__posts].insert.should == 2
|
655
|
-
@db[:p__posts].insert(:a=>10).should == 10
|
656
|
-
@db.reset_primary_key_sequence(:posts).should == 21
|
657
|
-
@db[:p__posts].insert.should == 21
|
658
|
-
@db[:p__posts].order(:a).map(:a).should == [1, 2, 10, 20, 21]
|
659
|
-
ensure
|
660
|
-
@db.default_schema = nil
|
661
|
-
@db.run("DROP SCHEMA p CASCADE")
|
662
|
-
end
|
663
|
-
end
|
664
|
-
|
665
646
|
specify "should support specifying Integer/Bignum/Fixnum types in primary keys and have them be auto incrementing" do
|
666
647
|
@db.create_table(:posts){primary_key :a, :type=>Integer}
|
667
648
|
@db[:posts].insert.should == 1
|
@@ -959,15 +940,6 @@ describe "Postgres::Database schema qualified tables" do
|
|
959
940
|
@db.primary_key_sequence(:"schema_test__schema test").should == '"schema_test"."ks eq"'
|
960
941
|
end
|
961
942
|
|
962
|
-
specify "#default_schema= should change the default schema used from public" do
|
963
|
-
@db.create_table(:schema_test__schema_test){primary_key :i}
|
964
|
-
@db.default_schema = :schema_test
|
965
|
-
@db.table_exists?(:schema_test).should == true
|
966
|
-
@db.tables.should == [:schema_test]
|
967
|
-
@db.primary_key(:schema_test__schema_test).should == 'i'
|
968
|
-
@db.primary_key_sequence(:schema_test__schema_test).should == '"schema_test"."schema_test_i_seq"'
|
969
|
-
end
|
970
|
-
|
971
943
|
specify "should handle schema introspection cases with tables with same name in multiple schemas" do
|
972
944
|
begin
|
973
945
|
@db.create_table(:schema_test__schema_test) do
|
@@ -2103,8 +2075,8 @@ describe 'PostgreSQL hstore handling' do
|
|
2103
2075
|
c.one_to_many :items, :class=>c, :key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer), :key_method=>:item_id
|
2104
2076
|
c.many_to_many :related_items, :class=>c, :join_table=>:items___i, :left_key=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer), :right_key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
2105
2077
|
|
2106
|
-
c.many_to_one :other_item, :class=>c, :key=>:id, :primary_key_method=>:item_id, :primary_key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
2107
|
-
c.one_to_many :other_items, :class=>c, :primary_key=>:item_id, :key=>:id, :primary_key_column=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
2078
|
+
c.many_to_one :other_item, :class=>c, :key=>:id, :primary_key_method=>:item_id, :primary_key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer), :reciprocal=>:other_items
|
2079
|
+
c.one_to_many :other_items, :class=>c, :primary_key=>:item_id, :key=>:id, :primary_key_column=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer), :reciprocal=>:other_item
|
2108
2080
|
c.many_to_many :other_related_items, :class=>c, :join_table=>:items___i, :left_key=>:id, :right_key=>:id,
|
2109
2081
|
:left_primary_key_column=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer),
|
2110
2082
|
:left_primary_key=>:left_item_id,
|
@@ -2180,18 +2152,18 @@ describe 'PostgreSQL hstore handling' do
|
|
2180
2152
|
@ds.get(h1['a']).should == 'b'
|
2181
2153
|
@ds.get(h1['d']).should == nil
|
2182
2154
|
|
2183
|
-
@ds.get(h2.concat(h3).keys.
|
2184
|
-
@ds.get(h1.concat(h3).keys.
|
2185
|
-
@ds.get(h2.merge(h3).keys.
|
2186
|
-
@ds.get(h1.merge(h3).keys.
|
2155
|
+
@ds.get(h2.concat(h3).keys.length).should == 2
|
2156
|
+
@ds.get(h1.concat(h3).keys.length).should == 3
|
2157
|
+
@ds.get(h2.merge(h3).keys.length).should == 2
|
2158
|
+
@ds.get(h1.merge(h3).keys.length).should == 3
|
2187
2159
|
|
2188
2160
|
unless [:do].include?(@db.adapter_scheme)
|
2189
2161
|
# Broken DataObjects thinks operators with ? represent placeholders
|
2190
|
-
@ds.get(h1.contain_all(
|
2191
|
-
@ds.get(h1.contain_all(
|
2162
|
+
@ds.get(h1.contain_all(%w'a c')).should == true
|
2163
|
+
@ds.get(h1.contain_all(%w'a d')).should == false
|
2192
2164
|
|
2193
|
-
@ds.get(h1.contain_any(
|
2194
|
-
@ds.get(h1.contain_any(
|
2165
|
+
@ds.get(h1.contain_any(%w'a d')).should == true
|
2166
|
+
@ds.get(h1.contain_any(%w'e d')).should == false
|
2195
2167
|
end
|
2196
2168
|
|
2197
2169
|
@ds.get(h1.contains(h2)).should == true
|
@@ -2205,7 +2177,7 @@ describe 'PostgreSQL hstore handling' do
|
|
2205
2177
|
@ds.get(h1.defined('d')).should == false
|
2206
2178
|
|
2207
2179
|
@ds.get(h1.delete('a')['c']).should == nil
|
2208
|
-
@ds.get(h1.delete(
|
2180
|
+
@ds.get(h1.delete(%w'a d')['c']).should == nil
|
2209
2181
|
@ds.get(h1.delete(h2)['c']).should == nil
|
2210
2182
|
|
2211
2183
|
@ds.from(Sequel.hstore('a'=>'b', 'c'=>nil).op.each).order(:key).all.should == [{:key=>'a', :value=>'b'}, {:key=>'c', :value=>nil}]
|
@@ -2223,11 +2195,11 @@ describe 'PostgreSQL hstore handling' do
|
|
2223
2195
|
@ds.get(h1.exist?('d')).should == false
|
2224
2196
|
end
|
2225
2197
|
|
2226
|
-
@ds.get(h1.hstore.hstore.hstore.keys.
|
2227
|
-
@ds.get(h1.keys.
|
2228
|
-
@ds.get(h2.keys.
|
2229
|
-
@ds.get(h1.akeys.
|
2230
|
-
@ds.get(h2.akeys.
|
2198
|
+
@ds.get(h1.hstore.hstore.hstore.keys.length).should == 2
|
2199
|
+
@ds.get(h1.keys.length).should == 2
|
2200
|
+
@ds.get(h2.keys.length).should == 1
|
2201
|
+
@ds.get(h1.akeys.length).should == 2
|
2202
|
+
@ds.get(h2.akeys.length).should == 1
|
2231
2203
|
|
2232
2204
|
@ds.from(Sequel.hstore('t'=>'s').op.populate(Sequel::SQL::Cast.new(nil, :items))).select_map(:t).should == ['s']
|
2233
2205
|
@ds.from(:items___i).select(Sequel.hstore('t'=>'s').op.record_set(:i).as(:r)).from_self(:alias=>:s).select(Sequel.lit('(r).*')).from_self.select_map(:t).should == ['s']
|
@@ -2235,22 +2207,22 @@ describe 'PostgreSQL hstore handling' do
|
|
2235
2207
|
@ds.from(Sequel.hstore('t'=>'s', 'a'=>'b').op.skeys.as(:s)).select_order_map(:s).should == %w'a t'
|
2236
2208
|
@ds.from((Sequel.hstore('t'=>'s', 'a'=>'b').op - 'a').skeys.as(:s)).select_order_map(:s).should == %w't'
|
2237
2209
|
|
2238
|
-
@ds.get(h1.slice(
|
2239
|
-
@ds.get(h1.slice(
|
2240
|
-
@ds.get(h1.slice(
|
2210
|
+
@ds.get(h1.slice(%w'a c').keys.length).should == 2
|
2211
|
+
@ds.get(h1.slice(%w'd c').keys.length).should == 1
|
2212
|
+
@ds.get(h1.slice(%w'd e').keys.length).should == nil
|
2241
2213
|
|
2242
2214
|
@ds.from(Sequel.hstore('t'=>'s', 'a'=>'b').op.svals.as(:s)).select_order_map(:s).should == %w'b s'
|
2243
2215
|
|
2244
|
-
@ds.get(h1.to_array.
|
2245
|
-
@ds.get(h2.to_array.
|
2216
|
+
@ds.get(h1.to_array.length).should == 4
|
2217
|
+
@ds.get(h2.to_array.length).should == 2
|
2246
2218
|
|
2247
|
-
@ds.get(h1.to_matrix.
|
2248
|
-
@ds.get(h2.to_matrix.
|
2219
|
+
@ds.get(h1.to_matrix.length).should == 2
|
2220
|
+
@ds.get(h2.to_matrix.length).should == 1
|
2249
2221
|
|
2250
|
-
@ds.get(h1.values.
|
2251
|
-
@ds.get(h2.values.
|
2252
|
-
@ds.get(h1.avals.
|
2253
|
-
@ds.get(h2.avals.
|
2222
|
+
@ds.get(h1.values.length).should == 2
|
2223
|
+
@ds.get(h2.values.length).should == 1
|
2224
|
+
@ds.get(h1.avals.length).should == 2
|
2225
|
+
@ds.get(h2.avals.length).should == 1
|
2254
2226
|
end
|
2255
2227
|
end if POSTGRES_DB.type_supported?(:hstore)
|
2256
2228
|
|
@@ -317,7 +317,7 @@ describe "An SQLite dataset AS clause" do
|
|
317
317
|
end
|
318
318
|
|
319
319
|
specify "should use a string literal in the JOIN clause" do
|
320
|
-
SQLITE_DB[:t].join_table(:natural, :j, nil, :a).sql.should == "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
|
320
|
+
SQLITE_DB[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.should == "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
|
321
321
|
end
|
322
322
|
end
|
323
323
|
|
data/spec/bin_spec.rb
ADDED
@@ -0,0 +1,251 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
RUBY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
|
6
|
+
OUTPUT = "spec/bin-sequel-spec-output-#{$$}.log"
|
7
|
+
TMP_FILE = "spec/bin-sequel-tmp-#{$$}.rb"
|
8
|
+
BIN_SPEC_DB = "spec/bin-sequel-spec-db-#{$$}.sqlite3"
|
9
|
+
BIN_SPEC_DB2 = "spec/bin-sequel-spec-db2-#{$$}.sqlite3"
|
10
|
+
|
11
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
12
|
+
CONN_PREFIX = 'jdbc:sqlite:'
|
13
|
+
CONN_HASH = {:adapter=>'jdbc', :uri=>"#{CONN_PREFIX}#{BIN_SPEC_DB}"}
|
14
|
+
else
|
15
|
+
CONN_PREFIX = 'sqlite://'
|
16
|
+
CONN_HASH = {:adapter=>'sqlite', :database=>BIN_SPEC_DB}
|
17
|
+
end
|
18
|
+
|
19
|
+
unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
|
20
|
+
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
21
|
+
require 'sequel'
|
22
|
+
end
|
23
|
+
|
24
|
+
DB = Sequel.connect("#{CONN_PREFIX}#{BIN_SPEC_DB}")
|
25
|
+
DB2 = Sequel.connect("#{CONN_PREFIX}#{BIN_SPEC_DB2}")
|
26
|
+
File.delete(BIN_SPEC_DB) if File.file?(BIN_SPEC_DB)
|
27
|
+
File.delete(BIN_SPEC_DB2) if File.file?(BIN_SPEC_DB2)
|
28
|
+
|
29
|
+
describe "bin/sequel" do
|
30
|
+
def bin(opts={})
|
31
|
+
cmd = "#{opts[:pre]}\"#{RUBY}\" -I lib bin/sequel #{opts[:args]} #{"#{CONN_PREFIX}#{BIN_SPEC_DB}" unless opts[:no_conn]} #{opts[:post]}> #{OUTPUT}#{" 2>&1" if opts[:stderr]}"
|
32
|
+
system(cmd)
|
33
|
+
File.read(OUTPUT)
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
DB.disconnect
|
38
|
+
DB2.disconnect
|
39
|
+
File.delete(BIN_SPEC_DB) if File.file?(BIN_SPEC_DB)
|
40
|
+
File.delete(BIN_SPEC_DB2) if File.file?(BIN_SPEC_DB2)
|
41
|
+
File.delete(TMP_FILE) if File.file?(TMP_FILE)
|
42
|
+
end
|
43
|
+
after(:all) do
|
44
|
+
File.delete(OUTPUT) if File.file?(OUTPUT)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "-h should print the help" do
|
48
|
+
help = bin(:args=>"-h", :no_conn=>true)
|
49
|
+
help.should =~ /\ASequel: The Database Toolkit for Ruby/
|
50
|
+
help.should =~ /^Usage: sequel /
|
51
|
+
end
|
52
|
+
|
53
|
+
it "-c should run code" do
|
54
|
+
bin(:args=>'-c "print DB.tables.inspect"').should == '[]'
|
55
|
+
DB.create_table(:a){Integer :a}
|
56
|
+
bin(:args=>'-c "print DB.tables.inspect"').should == '[:a]'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "-C should copy databases" do
|
60
|
+
DB.create_table(:a) do
|
61
|
+
primary_key :a
|
62
|
+
String :name
|
63
|
+
end
|
64
|
+
DB.create_table(:b) do
|
65
|
+
foreign_key :a, :a
|
66
|
+
index :a
|
67
|
+
end
|
68
|
+
DB[:a].insert(1, 'foo')
|
69
|
+
DB[:b].insert(1)
|
70
|
+
bin(:args=>'-C', :post=>"#{CONN_PREFIX}#{BIN_SPEC_DB2}").should =~ Regexp.new(<<END)
|
71
|
+
Databases connections successful
|
72
|
+
Migrations dumped successfully
|
73
|
+
Tables created
|
74
|
+
Begin copying data
|
75
|
+
Begin copying records for table: a
|
76
|
+
Finished copying 1 records for table: a
|
77
|
+
Begin copying records for table: b
|
78
|
+
Finished copying 1 records for table: b
|
79
|
+
Finished copying data
|
80
|
+
Begin creating indexes
|
81
|
+
Finished creating indexes
|
82
|
+
Begin adding foreign key constraints
|
83
|
+
Finished adding foreign key constraints
|
84
|
+
Database copy finished in \\d\\.\\d+ seconds
|
85
|
+
END
|
86
|
+
DB2.tables.sort_by{|t| t.to_s}.should == [:a, :b]
|
87
|
+
DB[:a].all.should == [{:a=>1, :name=>'foo'}]
|
88
|
+
DB[:b].all.should == [{:a=>1}]
|
89
|
+
DB2.schema(:a).should == [[:a, {:allow_null=>false, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil}], [:name, {:allow_null=>true, :default=>nil, :primary_key=>false, :db_type=>"varchar(255)", :type=>:string, :ruby_default=>nil}]]
|
90
|
+
DB2.schema(:b).should == [[:a, {:allow_null=>true, :default=>nil, :primary_key=>false, :db_type=>"integer", :type=>:integer, :ruby_default=>nil}]]
|
91
|
+
DB2.indexes(:a).should == {}
|
92
|
+
DB2.indexes(:b).should == {:b_a_index=>{:unique=>false, :columns=>[:a]}}
|
93
|
+
DB2.foreign_key_list(:a).should == []
|
94
|
+
DB2.foreign_key_list(:b).should == [{:columns=>[:a], :table=>:a, :key=>nil, :on_update=>:no_action, :on_delete=>:no_action}]
|
95
|
+
end
|
96
|
+
|
97
|
+
it "-d and -D should dump generic and specific migrations" do
|
98
|
+
DB.create_table(:a) do
|
99
|
+
primary_key :a
|
100
|
+
String :name
|
101
|
+
end
|
102
|
+
DB.create_table(:b) do
|
103
|
+
foreign_key :a, :a
|
104
|
+
index :a
|
105
|
+
end
|
106
|
+
bin(:args=>'-d').should == <<END
|
107
|
+
Sequel.migration do
|
108
|
+
change do
|
109
|
+
create_table(:a) do
|
110
|
+
primary_key :a
|
111
|
+
String :name, :size=>255
|
112
|
+
end
|
113
|
+
|
114
|
+
create_table(:b, :ignore_index_errors=>true) do
|
115
|
+
foreign_key :a, :a
|
116
|
+
|
117
|
+
index [:a]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
END
|
122
|
+
bin(:args=>'-D').should == <<END
|
123
|
+
Sequel.migration do
|
124
|
+
change do
|
125
|
+
create_table(:a) do
|
126
|
+
primary_key :a
|
127
|
+
column :name, "varchar(255)"
|
128
|
+
end
|
129
|
+
|
130
|
+
create_table(:b) do
|
131
|
+
foreign_key :a, :a
|
132
|
+
|
133
|
+
index [:a]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
END
|
138
|
+
end
|
139
|
+
|
140
|
+
it "-E should echo SQL statements to stdout" do
|
141
|
+
bin(:args=>'-E -c DB.tables').should =~ %r{I, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) PRAGMA foreign_keys = 1\nI, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) PRAGMA case_sensitive_like = 1\nI, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) SELECT \* FROM `sqlite_master` WHERE \(type = 'table' AND NOT name = 'sqlite_sequence'\)\n}
|
142
|
+
end
|
143
|
+
|
144
|
+
it "-I should include directory in load path" do
|
145
|
+
bin(:args=>'-Ifoo -c "p 1 if $:.include?(\'foo\')"').should == "1\n"
|
146
|
+
end
|
147
|
+
|
148
|
+
it "-l should log SQL statements to file" do
|
149
|
+
bin(:args=>"-l #{TMP_FILE} -c DB.tables").should == ''
|
150
|
+
File.read(TMP_FILE).should =~ %r{I, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) PRAGMA foreign_keys = 1\nI, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) PRAGMA case_sensitive_like = 1\nI, \[\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+ #\d+\] INFO -- : \(\d\.\d+s\) SELECT \* FROM `sqlite_master` WHERE \(type = 'table' AND NOT name = 'sqlite_sequence'\)\n}
|
151
|
+
end
|
152
|
+
|
153
|
+
it "-L should load all *.rb files in given directory" do
|
154
|
+
bin(:args=>'-L ./lib/sequel/connection_pool -c "p [Sequel::SingleConnectionPool, Sequel::ThreadedConnectionPool, Sequel::ShardedSingleConnectionPool, Sequel::ShardedThreadedConnectionPool].length"').should == "4\n"
|
155
|
+
end
|
156
|
+
|
157
|
+
it "-m should migrate database up" do
|
158
|
+
bin(:args=>"-m spec/files/integer_migrations").should == ''
|
159
|
+
DB.tables.sort_by{|t| t.to_s}.should == [:schema_info, :sm1111, :sm2222, :sm3333]
|
160
|
+
end
|
161
|
+
|
162
|
+
it "-M should specify version to migrate to" do
|
163
|
+
bin(:args=>"-m spec/files/integer_migrations -M 2").should == ''
|
164
|
+
DB.tables.sort_by{|t| t.to_s}.should == [:schema_info, :sm1111, :sm2222]
|
165
|
+
end
|
166
|
+
|
167
|
+
it "-N should not test for a valid connection" do
|
168
|
+
bin(:no_conn=>true, :args=>"-c '' -N #{CONN_PREFIX}spec/nonexistent/foo").should == ''
|
169
|
+
bin(:no_conn=>true, :args=>"-c '' #{CONN_PREFIX}spec/nonexistent/foo", :stderr=>true).should =~ /\AError: Sequel::DatabaseConnectionError: /
|
170
|
+
end
|
171
|
+
|
172
|
+
it "-r should require a given library" do
|
173
|
+
bin(:args=>'-rsequel/extensions/sql_expr -c "print DB.literal(1.sql_expr)"').should == "1"
|
174
|
+
end
|
175
|
+
|
176
|
+
it "-S should dump the schema cache" do
|
177
|
+
bin(:args=>"-S #{TMP_FILE}").should == ''
|
178
|
+
Marshal.load(File.read(TMP_FILE)).should == {}
|
179
|
+
DB.create_table(:a){Integer :a}
|
180
|
+
bin(:args=>"-S #{TMP_FILE}").should == ''
|
181
|
+
Marshal.load(File.read(TMP_FILE)).should == {"`a`"=>[[:a, {:type=>:integer, :db_type=>"integer", :ruby_default=>nil, :allow_null=>true, :default=>nil, :primary_key=>false}]]}
|
182
|
+
end
|
183
|
+
|
184
|
+
it "-t should output full backtraces on error" do
|
185
|
+
bin(:args=>'-c "lambda{lambda{lambda{raise \'foo\'}.call}.call}.call"', :stderr=>true).count("\n").should < 3
|
186
|
+
bin(:args=>'-t -c "lambda{lambda{lambda{raise \'foo\'}.call}.call}.call"', :stderr=>true).count("\n").should > 3
|
187
|
+
end
|
188
|
+
|
189
|
+
it "-v should output the Sequel version" do
|
190
|
+
bin(:args=>"-v", :no_conn=>true).should == "sequel #{Sequel.version}\n"
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should error if using -M without -m" do
|
194
|
+
bin(:args=>'-M 2', :stderr=>true).should == "Error: Must specify -m if using -M\n"
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should error if using mutually exclusive options together" do
|
198
|
+
bin(:args=>'-c foo -d', :stderr=>true).should == "Error: Cannot specify -c and -d together\n"
|
199
|
+
bin(:args=>'-D -d', :stderr=>true).should == "Error: Cannot specify -D and -d together\n"
|
200
|
+
bin(:args=>'-m foo -d', :stderr=>true).should == "Error: Cannot specify -m and -d together\n"
|
201
|
+
bin(:args=>'-S foo -d', :stderr=>true).should == "Error: Cannot specify -S and -d together\n"
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should use a mock database if no database is given" do
|
205
|
+
bin(:args=>'-c "print DB.adapter_scheme"', :no_conn=>true).should == "mock"
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should work with a yaml config file" do
|
209
|
+
File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(CONN_HASH))}
|
210
|
+
bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).should == "[]"
|
211
|
+
DB.create_table(:a){Integer :a}
|
212
|
+
bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).should == "[:a]"
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should work with a yaml config file with string keys" do
|
216
|
+
h = {}
|
217
|
+
CONN_HASH.each{|k,v| h[k.to_s] = v}
|
218
|
+
File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(h))}
|
219
|
+
DB.create_table(:a){Integer :a}
|
220
|
+
bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).should == "[:a]"
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should work with a yaml config file with environments" do
|
224
|
+
File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(:development=>CONN_HASH))}
|
225
|
+
bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).should == "[]"
|
226
|
+
DB.create_table(:a){Integer :a}
|
227
|
+
bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).should == "[:a]"
|
228
|
+
end
|
229
|
+
|
230
|
+
it "-e should set environment for yaml config file" do
|
231
|
+
File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(:foo=>CONN_HASH))}
|
232
|
+
bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).should == "[]"
|
233
|
+
DB.create_table(:a){Integer :a}
|
234
|
+
bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).should == "[:a]"
|
235
|
+
File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump('foo'=>CONN_HASH))}
|
236
|
+
bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).should == "[:a]"
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should run code in given filenames" do
|
240
|
+
File.open(TMP_FILE, 'wb'){|f| f.write('print DB.tables.inspect')}
|
241
|
+
bin(:post=>TMP_FILE).should == '[]'
|
242
|
+
DB.create_table(:a){Integer :a}
|
243
|
+
bin(:post=>TMP_FILE).should == '[:a]'
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should run code provided on stdin" do
|
247
|
+
bin(:pre=>'echo print DB.tables.inspect | ').should == '[]'
|
248
|
+
DB.create_table(:a){Integer :a}
|
249
|
+
bin(:pre=>'echo print DB.tables.inspect | ').should == '[:a]'
|
250
|
+
end
|
251
|
+
end
|