sequel 3.42.0 → 3.43.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.
Files changed (80) hide show
  1. data/CHANGELOG +40 -0
  2. data/MIT-LICENSE +1 -1
  3. data/Rakefile +1 -1
  4. data/doc/opening_databases.rdoc +2 -2
  5. data/doc/prepared_statements.rdoc +7 -0
  6. data/doc/release_notes/3.43.0.txt +105 -0
  7. data/doc/schema_modification.rdoc +19 -0
  8. data/lib/sequel/adapters/do/mysql.rb +1 -1
  9. data/lib/sequel/adapters/jdbc.rb +13 -8
  10. data/lib/sequel/adapters/jdbc/hsqldb.rb +5 -0
  11. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  12. data/lib/sequel/adapters/jdbc/oracle.rb +6 -0
  13. data/lib/sequel/adapters/jdbc/postgresql.rb +9 -3
  14. data/lib/sequel/adapters/mysql.rb +1 -1
  15. data/lib/sequel/adapters/mysql2.rb +1 -1
  16. data/lib/sequel/adapters/oracle.rb +1 -1
  17. data/lib/sequel/adapters/postgres.rb +4 -2
  18. data/lib/sequel/adapters/shared/db2.rb +12 -0
  19. data/lib/sequel/adapters/shared/mssql.rb +9 -5
  20. data/lib/sequel/adapters/shared/postgres.rb +2 -0
  21. data/lib/sequel/adapters/swift/mysql.rb +1 -1
  22. data/lib/sequel/core.rb +2 -2
  23. data/lib/sequel/database.rb +0 -2
  24. data/lib/sequel/database/query.rb +20 -5
  25. data/lib/sequel/database/schema_generator.rb +5 -0
  26. data/lib/sequel/database/schema_methods.rb +5 -0
  27. data/lib/sequel/dataset.rb +0 -2
  28. data/lib/sequel/dataset/actions.rb +25 -2
  29. data/lib/sequel/dataset/misc.rb +1 -1
  30. data/lib/sequel/dataset/sql.rb +28 -6
  31. data/lib/sequel/extensions/core_refinements.rb +221 -0
  32. data/lib/sequel/extensions/date_arithmetic.rb +194 -0
  33. data/lib/sequel/extensions/meta_def.rb +30 -0
  34. data/lib/sequel/extensions/migration.rb +5 -0
  35. data/lib/sequel/extensions/null_dataset.rb +2 -0
  36. data/lib/sequel/extensions/pagination.rb +2 -0
  37. data/lib/sequel/extensions/pg_array.rb +12 -1
  38. data/lib/sequel/extensions/pg_array_ops.rb +10 -1
  39. data/lib/sequel/extensions/pg_hstore.rb +12 -1
  40. data/lib/sequel/extensions/pg_hstore_ops.rb +10 -1
  41. data/lib/sequel/extensions/pg_json.rb +18 -1
  42. data/lib/sequel/extensions/pg_range.rb +12 -1
  43. data/lib/sequel/extensions/pg_range_ops.rb +10 -1
  44. data/lib/sequel/extensions/pg_row.rb +18 -2
  45. data/lib/sequel/extensions/pg_row_ops.rb +10 -1
  46. data/lib/sequel/extensions/query.rb +2 -0
  47. data/lib/sequel/model/associations.rb +5 -13
  48. data/lib/sequel/model/base.rb +4 -6
  49. data/lib/sequel/plugins/boolean_readers.rb +4 -2
  50. data/lib/sequel/plugins/many_through_many.rb +23 -0
  51. data/lib/sequel/plugins/string_stripper.rb +53 -3
  52. data/lib/sequel/plugins/validation_class_methods.rb +5 -0
  53. data/lib/sequel/sql.rb +3 -3
  54. data/lib/sequel/version.rb +1 -1
  55. data/spec/adapters/db2_spec.rb +19 -8
  56. data/spec/adapters/mssql_spec.rb +1 -2
  57. data/spec/adapters/mysql_spec.rb +2 -2
  58. data/spec/adapters/postgres_spec.rb +29 -3
  59. data/spec/core/dataset_spec.rb +107 -0
  60. data/spec/core/expression_filters_spec.rb +5 -0
  61. data/spec/core/schema_spec.rb +14 -3
  62. data/spec/core/spec_helper.rb +2 -0
  63. data/spec/extensions/core_refinements_spec.rb +551 -0
  64. data/spec/extensions/date_arithmetic_spec.rb +150 -0
  65. data/spec/extensions/force_encoding_spec.rb +1 -1
  66. data/spec/extensions/meta_def_spec.rb +21 -0
  67. data/spec/extensions/spec_helper.rb +5 -0
  68. data/spec/extensions/string_stripper_spec.rb +44 -2
  69. data/spec/integration/associations_test.rb +2 -2
  70. data/spec/integration/plugin_test.rb +90 -0
  71. data/spec/integration/schema_test.rb +1 -1
  72. data/spec/model/association_reflection_spec.rb +4 -4
  73. data/spec/model/associations_spec.rb +2 -2
  74. data/spec/model/base_spec.rb +2 -2
  75. data/spec/model/eager_loading_spec.rb +5 -5
  76. data/spec/model/hooks_spec.rb +4 -4
  77. data/spec/model/model_spec.rb +9 -9
  78. data/spec/model/record_spec.rb +15 -18
  79. metadata +12 -5
  80. data/lib/sequel/metaprogramming.rb +0 -13
@@ -0,0 +1,150 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ asd = begin
4
+ require 'active_support/duration'
5
+ true
6
+ rescue LoadError => e
7
+ skip_warn "date_arithmetic extension (partial): can't load active_support/duration (#{e.class}: #{e})"
8
+ false
9
+ end
10
+
11
+ Sequel.extension :date_arithmetic
12
+
13
+ describe "date_arithmetic extension" do
14
+ dbf = lambda do |db_type|
15
+ db = Sequel.connect("mock://#{db_type}")
16
+ db.extension :date_arithmetic
17
+ db
18
+ end
19
+
20
+ before do
21
+ @h0 = {:days=>0}
22
+ @h1 = {:days=>1, :years=>nil, :hours=>0}
23
+ @h2 = {:years=>1, :months=>1, :days=>1, :hours=>1, :minutes=>1, :seconds=>1}
24
+ end
25
+
26
+ it "should have Sequel.date_add with an interval hash return an appropriate Sequel::SQL::DateAdd expression" do
27
+ da = Sequel.date_add(:a, :days=>1)
28
+ da.should be_a_kind_of(Sequel::SQL::DateAdd)
29
+ da.expr.should == :a
30
+ da.interval.should == {:days=>1}
31
+ Sequel.date_add(:a, :years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1).interval.should == {:years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1}
32
+ end
33
+
34
+ it "should have Sequel.date_sub with an interval hash return an appropriate Sequel::SQL::DateAdd expression" do
35
+ da = Sequel.date_sub(:a, :days=>1)
36
+ da.should be_a_kind_of(Sequel::SQL::DateAdd)
37
+ da.expr.should == :a
38
+ da.interval.should == {:days=>-1}
39
+ Sequel.date_sub(:a, :years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1).interval.should == {:years=>-1, :months=>-2, :days=>-3, :hours=>-1, :minutes=>-1, :seconds=>-1}
40
+ end
41
+
42
+ it "should have Sequel.date_* with an interval hash handle nil values" do
43
+ Sequel.date_sub(:a, :days=>1, :hours=>nil).interval.should == {:days=>-1}
44
+ end
45
+
46
+ it "should raise an error if given string values in an interval hash" do
47
+ lambda{Sequel.date_add(:a, :days=>'1')}.should raise_error(Sequel::InvalidValue)
48
+ end
49
+
50
+ if asd
51
+ it "should have Sequel.date_add with an ActiveSupport::Duration return an appropriate Sequel::SQL::DateAdd expression" do
52
+ da = Sequel.date_add(:a, ActiveSupport::Duration.new(1, [[:days, 1]]))
53
+ da.should be_a_kind_of(Sequel::SQL::DateAdd)
54
+ da.expr.should == :a
55
+ da.interval.should == {:days=>1}
56
+ Sequel.date_add(:a, ActiveSupport::Duration.new(1, [[:years, 1], [:months, 1], [:days, 1], [:minutes, 61], [:seconds, 1]])).interval.should == {:years=>1, :months=>1, :days=>1, :minutes=>61, :seconds=>1}
57
+ end
58
+
59
+ it "should have Sequel.date_sub with an ActiveSupport::Duration return an appropriate Sequel::SQL::DateAdd expression" do
60
+ da = Sequel.date_sub(:a, ActiveSupport::Duration.new(1, [[:days, 1]]))
61
+ da.should be_a_kind_of(Sequel::SQL::DateAdd)
62
+ da.expr.should == :a
63
+ da.interval.should == {:days=>-1}
64
+ Sequel.date_sub(:a, ActiveSupport::Duration.new(1, [[:years, 1], [:months, 1], [:days, 1], [:minutes, 61], [:seconds, 1]])).interval.should == {:years=>-1, :months=>-1, :days=>-1, :minutes=>-61, :seconds=>-1}
65
+ end
66
+ end
67
+
68
+ it "should correctly literalize on Postgres" do
69
+ db = dbf.call(:postgres)
70
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS timestamp)"
71
+ db.literal(Sequel.date_add(:a, @h1)).should == "(CAST(a AS timestamp) + CAST('1 days ' AS interval))"
72
+ db.literal(Sequel.date_add(:a, @h2)).should == "(CAST(a AS timestamp) + CAST('1 years 1 months 1 days 1 hours 1 minutes 1 seconds ' AS interval))"
73
+ end
74
+
75
+ it "should correctly literalize on SQLite" do
76
+ db = dbf.call(:sqlite)
77
+ db.literal(Sequel.date_add(:a, @h0)).should == "datetime(a)"
78
+ db.literal(Sequel.date_add(:a, @h1)).should == "datetime(a, '1 days')"
79
+ db.literal(Sequel.date_add(:a, @h2)).should == "datetime(a, '1 years', '1 months', '1 days', '1 hours', '1 minutes', '1 seconds')"
80
+ end
81
+
82
+ it "should correctly literalize on MySQL" do
83
+ db = dbf.call(:mysql)
84
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS DATETIME)"
85
+ db.literal(Sequel.date_add(:a, @h1)).should == "DATE_ADD(a, INTERVAL 1 DAY)"
86
+ db.literal(Sequel.date_add(:a, @h2)).should == "DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(a, INTERVAL 1 YEAR), INTERVAL 1 MONTH), INTERVAL 1 DAY), INTERVAL 1 HOUR), INTERVAL 1 MINUTE), INTERVAL 1 SECOND)"
87
+ end
88
+
89
+ it "should correctly literalize on HSQLDB" do
90
+ db = Sequel.mock
91
+ def db.database_type; :hsqldb end
92
+ db.extension :date_arithmetic
93
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(CAST(a AS timestamp) AS timestamp)"
94
+ db.literal(Sequel.date_add(:a, @h1)).should == "DATE_ADD(CAST(a AS timestamp), INTERVAL 1 DAY)"
95
+ db.literal(Sequel.date_add(:a, @h2)).should == "DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(CAST(a AS timestamp), INTERVAL 1 YEAR), INTERVAL 1 MONTH), INTERVAL 1 DAY), INTERVAL 1 HOUR), INTERVAL 1 MINUTE), INTERVAL 1 SECOND)"
96
+ end
97
+
98
+ it "should correctly literalize on MSSQL" do
99
+ db = dbf.call(:mssql)
100
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS datetime)"
101
+ db.literal(Sequel.date_add(:a, @h1)).should == "DATEADD(day, 1, a)"
102
+ db.literal(Sequel.date_add(:a, @h2)).should == "DATEADD(second, 1, DATEADD(minute, 1, DATEADD(hour, 1, DATEADD(day, 1, DATEADD(month, 1, DATEADD(year, 1, a))))))"
103
+ end
104
+
105
+ it "should correctly literalize on H2" do
106
+ db = Sequel.mock
107
+ def db.database_type; :h2 end
108
+ db.extension :date_arithmetic
109
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS timestamp)"
110
+ db.literal(Sequel.date_add(:a, @h1)).should == "DATEADD('day', 1, a)"
111
+ db.literal(Sequel.date_add(:a, @h2)).should == "DATEADD('second', 1, DATEADD('minute', 1, DATEADD('hour', 1, DATEADD('day', 1, DATEADD('month', 1, DATEADD('year', 1, a))))))"
112
+ end
113
+
114
+ it "should correctly literalize on access" do
115
+ db = dbf.call(:access)
116
+ db.literal(Sequel.date_add(:a, @h0)).should == "CDate(a)"
117
+ db.literal(Sequel.date_add(:a, @h1)).should == "DATEADD('d', 1, a)"
118
+ db.literal(Sequel.date_add(:a, @h2)).should == "DATEADD('s', 1, DATEADD('n', 1, DATEADD('h', 1, DATEADD('d', 1, DATEADD('m', 1, DATEADD('yyyy', 1, a))))))"
119
+ end
120
+
121
+ it "should correctly literalize on Derby" do
122
+ db = Sequel.mock
123
+ def db.database_type; :derby end
124
+ db.extension :date_arithmetic
125
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS timestamp)"
126
+ db.literal(Sequel.date_add(:a, @h1)).should == "{fn timestampadd(SQL_TSI_DAY, 1, timestamp(a))}"
127
+ db.literal(Sequel.date_add(:a, @h2)).should == "{fn timestampadd(SQL_TSI_SECOND, 1, timestamp({fn timestampadd(SQL_TSI_MINUTE, 1, timestamp({fn timestampadd(SQL_TSI_HOUR, 1, timestamp({fn timestampadd(SQL_TSI_DAY, 1, timestamp({fn timestampadd(SQL_TSI_MONTH, 1, timestamp({fn timestampadd(SQL_TSI_YEAR, 1, timestamp(a))}))}))}))}))}))}"
128
+ db.literal(Sequel.date_add(Date.civil(2012, 11, 12), @h1)).should == "{fn timestampadd(SQL_TSI_DAY, 1, timestamp((CAST('2012-11-12' AS varchar(255)) || ' 00:00:00')))}"
129
+ end
130
+
131
+ it "should correctly literalize on Oracle" do
132
+ db = dbf.call(:oracle)
133
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS timestamp)"
134
+ db.literal(Sequel.date_add(:a, @h1)).should == "(a + INTERVAL '1' DAY)"
135
+ db.literal(Sequel.date_add(:a, @h2)).should == "(a + INTERVAL '1' YEAR + INTERVAL '1' MONTH + INTERVAL '1' DAY + INTERVAL '1' HOUR + INTERVAL '1' MINUTE + INTERVAL '1' SECOND)"
136
+ end
137
+
138
+ it "should correctly literalize on DB2" do
139
+ db = dbf.call(:db2)
140
+ db.literal(Sequel.date_add(:a, @h0)).should == "CAST(a AS timestamp)"
141
+ db.literal(Sequel.date_add(:a, @h1)).should == "(CAST(a AS timestamp) + 1 days)"
142
+ db.literal(Sequel.date_add(:a, @h2)).should == "(CAST(a AS timestamp) + 1 years + 1 months + 1 days + 1 hours + 1 minutes + 1 seconds)"
143
+ end
144
+
145
+ it "should raise error if literalizing on an unsupported database" do
146
+ db = Sequel.mock
147
+ db.extension :date_arithmetic
148
+ lambda{db.literal(Sequel.date_add(:a, @h0))}.should raise_error(Sequel::NotImplemented)
149
+ end
150
+ end
@@ -126,5 +126,5 @@ describe "force_encoding plugin" do
126
126
  end
127
127
  end
128
128
  else
129
- skip_warn "force_encoding plugin: only works on ruby 1.9"
129
+ skip_warn "force_encoding plugin: only works on ruby 1.9+"
130
130
  end
@@ -0,0 +1,21 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "Sequel::Metaprogramming" do
4
+ specify "should add meta_def method to Database, Dataset, and Model classes and instances" do
5
+ Sequel::Database.meta_def(:foo){1}
6
+ Sequel::Database.foo.should == 1
7
+ Sequel::Dataset.meta_def(:foo){2}
8
+ Sequel::Dataset.foo.should == 2
9
+ Sequel::Model.meta_def(:foo){3}
10
+ Sequel::Model.foo.should == 3
11
+ o = Sequel::Database.new
12
+ o.meta_def(:foo){4}
13
+ o.foo.should == 4
14
+ o = o[:a]
15
+ o.meta_def(:foo){5}
16
+ o.foo.should == 5
17
+ o = Sequel::Model.new
18
+ o.meta_def(:foo){6}
19
+ o.foo.should == 6
20
+ end
21
+ end
@@ -22,6 +22,11 @@ rescue LoadError
22
22
  nil
23
23
  end
24
24
 
25
+ Sequel.extension :meta_def
26
+
27
+ # Load core_refinements extension first, so pg_* extensions add their own refinements
28
+ Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0'
29
+
25
30
  # Load most extensions by default, so that any conflicts are easily detectable.
26
31
  Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones to_dot columns_introspection server_block arbitrary_servers pg_auto_parameterize pg_statement_cache pg_array pg_array_ops pg_hstore pg_hstore_ops pg_range pg_range_ops pg_json pg_inet pg_row pg_row_ops schema_caching null_dataset select_remove query_literals eval_inspect')
27
32
 
@@ -3,9 +3,10 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
3
3
  describe "Sequel::Plugins::StringStripper" do
4
4
  before do
5
5
  @db = Sequel::Database.new
6
- @c = Class.new(Sequel::Model(@db))
6
+ @c = Class.new(Sequel::Model(@db[:test]))
7
+ @c.columns :name, :b
8
+ @c.db_schema[:b][:type] = :blob
7
9
  @c.plugin :string_stripper
8
- @c.columns :name
9
10
  @o = @c.new
10
11
  end
11
12
 
@@ -20,4 +21,45 @@ describe "Sequel::Plugins::StringStripper" do
20
21
  @o.name = Date.today
21
22
  @o.name.should == Date.today
22
23
  end
24
+
25
+ it "should not strip strings for blob arguments" do
26
+ v = Sequel.blob(' name ')
27
+ @o.name = v
28
+ @o.name.should equal(v)
29
+ end
30
+
31
+ it "should not strip strings for blob columns" do
32
+ @o.b = ' name '
33
+ @o.b.should be_a_kind_of(Sequel::SQL::Blob)
34
+ @o.b.should == Sequel.blob(' name ')
35
+ end
36
+
37
+ it "should allow skipping of columns using Model.skip_string_stripping" do
38
+ @c.skip_string_stripping :name
39
+ v = ' name '
40
+ @o.name = v
41
+ @o.name.should equal(v)
42
+ end
43
+
44
+ it "should work correctly in subclasses" do
45
+ o = Class.new(@c).new
46
+ o.name = ' name '
47
+ o.name.should == 'name'
48
+ o.b = ' name '
49
+ o.b.should be_a_kind_of(Sequel::SQL::Blob)
50
+ o.b.should == Sequel.blob(' name ')
51
+ end
52
+
53
+ it "should work correctly for dataset changes" do
54
+ c = Class.new(Sequel::Model(@db[:test]))
55
+ c.plugin :string_stripper
56
+ def @db.schema(*) [[:name, {}], [:b, {:type=>:blob}]] end
57
+ c.set_dataset(@db[:test2])
58
+ o = c.new
59
+ o.name = ' name '
60
+ o.name.should == 'name'
61
+ o.b = ' name '
62
+ o.b.should be_a_kind_of(Sequel::SQL::Blob)
63
+ o.b.should == Sequel.blob(' name ')
64
+ end
23
65
  end
@@ -608,7 +608,7 @@ describe "Sequel::Model Simple Associations" do
608
608
  @els = {:eager_limit_strategy=>:correlated_subquery}
609
609
  end
610
610
  it_should_behave_like "eager limit strategies"
611
- end unless Sequel.guarded?(:mysql, :db2, :oracle, :h2, :cubrid)
611
+ end unless Sequel.guarded?(:mysql, :db2, :oracle, :h2, :cubrid, :hsqldb)
612
612
 
613
613
  specify "should handle many_to_one associations with same name as :key" do
614
614
  Album.def_column_alias(:artist_id_id, :artist_id)
@@ -821,7 +821,7 @@ describe "Sequel::Model Composite Key Associations" do
821
821
  @els = {:eager_limit_strategy=>:correlated_subquery}
822
822
  end
823
823
  it_should_behave_like "eager limit strategies"
824
- end if INTEGRATION_DB.dataset.supports_multiple_column_in? && !Sequel.guarded?(:mysql, :db2, :oracle)
824
+ end if INTEGRATION_DB.dataset.supports_multiple_column_in? && !Sequel.guarded?(:mysql, :db2, :oracle, :hsqldb)
825
825
 
826
826
  specify "should have add method accept hashes and create new records" do
827
827
  @artist.remove_all_albums
@@ -2017,3 +2017,93 @@ describe "Sequel::Plugins::ConstraintValidations" do
2017
2017
  it_should_behave_like "constraint validations"
2018
2018
  end
2019
2019
  end
2020
+
2021
+ describe "date_arithmetic extension" do
2022
+ asd = begin
2023
+ require 'active_support/duration'
2024
+ require 'active_support/inflector'
2025
+ require 'active_support/core_ext/string/inflections'
2026
+ true
2027
+ rescue LoadError
2028
+ false
2029
+ end
2030
+
2031
+ before(:all) do
2032
+ @db = INTEGRATION_DB
2033
+ @db.extension(:date_arithmetic)
2034
+ if @db.database_type == :sqlite
2035
+ @db.use_timestamp_timezones = false
2036
+ end
2037
+ @date = Date.civil(2010, 7, 12)
2038
+ @dt = Time.local(2010, 7, 12)
2039
+ if asd
2040
+ @d0 = ActiveSupport::Duration.new(0, [[:days, 0]])
2041
+ @d1 = ActiveSupport::Duration.new(1, [[:days, 1]])
2042
+ @d2 = ActiveSupport::Duration.new(1, [[:years, 1], [:months, 1], [:days, 1], [:minutes, 61], [:seconds, 1]])
2043
+ end
2044
+ @h0 = {:days=>0}
2045
+ @h1 = {:days=>1, :years=>nil, :hours=>0}
2046
+ @h2 = {:years=>1, :months=>1, :days=>1, :hours=>1, :minutes=>1, :seconds=>1}
2047
+ @a1 = Time.local(2010, 7, 13)
2048
+ @a2 = Time.local(2011, 8, 13, 1, 1, 1)
2049
+ @s1 = Time.local(2010, 7, 11)
2050
+ @s2 = Time.local(2009, 6, 10, 22, 58, 59)
2051
+ @check = lambda do |meth, in_date, in_interval, should|
2052
+ output = @db.get(Sequel.send(meth, in_date, in_interval))
2053
+ output = Time.parse(output.to_s) unless output.is_a?(Time) || output.is_a?(DateTime)
2054
+ output.year.should == should.year
2055
+ output.month.should == should.month
2056
+ output.day.should == should.day
2057
+ output.hour.should == should.hour
2058
+ output.min.should == should.min
2059
+ output.sec.should == should.sec
2060
+ end
2061
+ end
2062
+ after(:all) do
2063
+ if @db.database_type == :sqlite
2064
+ @db.use_timestamp_timezones = true
2065
+ end
2066
+ end
2067
+
2068
+ if asd
2069
+ specify "be able to use Sequel.date_add to add ActiveSupport::Duration objects to dates and datetimes" do
2070
+ @check.call(:date_add, @date, @d0, @dt)
2071
+ @check.call(:date_add, @date, @d1, @a1)
2072
+ @check.call(:date_add, @date, @d2, @a2)
2073
+
2074
+ @check.call(:date_add, @dt, @d0, @dt)
2075
+ @check.call(:date_add, @dt, @d1, @a1)
2076
+ @check.call(:date_add, @dt, @d2, @a2)
2077
+ end
2078
+
2079
+ specify "be able to use Sequel.date_sub to subtract ActiveSupport::Duration objects from dates and datetimes" do
2080
+ @check.call(:date_sub, @date, @d0, @dt)
2081
+ @check.call(:date_sub, @date, @d1, @s1)
2082
+ @check.call(:date_sub, @date, @d2, @s2)
2083
+
2084
+ @check.call(:date_sub, @dt, @d0, @dt)
2085
+ @check.call(:date_sub, @dt, @d1, @s1)
2086
+ @check.call(:date_sub, @dt, @d2, @s2)
2087
+ end
2088
+ end
2089
+
2090
+ specify "be able to use Sequel.date_add to add interval hashes to dates and datetimes" do
2091
+ @check.call(:date_add, @date, @h0, @dt)
2092
+ @check.call(:date_add, @date, @h1, @a1)
2093
+ @check.call(:date_add, @date, @h2, @a2)
2094
+
2095
+ @check.call(:date_add, @dt, @h0, @dt)
2096
+ @check.call(:date_add, @dt, @h1, @a1)
2097
+ @check.call(:date_add, @dt, @h2, @a2)
2098
+ end
2099
+
2100
+ specify "be able to use Sequel.date_sub to subtract interval hashes from dates and datetimes" do
2101
+ @check.call(:date_sub, @date, @h0, @dt)
2102
+ @check.call(:date_sub, @date, @h1, @s1)
2103
+ @check.call(:date_sub, @date, @h2, @s2)
2104
+
2105
+ @check.call(:date_sub, @dt, @h0, @dt)
2106
+ @check.call(:date_sub, @dt, @h1, @s1)
2107
+ @check.call(:date_sub, @dt, @h2, @s2)
2108
+ end
2109
+ end
@@ -382,7 +382,7 @@ describe "Database schema modifiers" do
382
382
  proc{@ds.insert(10)}.should_not raise_error
383
383
  end
384
384
 
385
- specify "should add foreign key columns to tables correctly" do
385
+ cspecify "should add foreign key columns to tables correctly", :hsqldb do
386
386
  @db.create_table!(:items){primary_key :id}
387
387
  @ds.insert
388
388
  i = @ds.get(:id)
@@ -190,7 +190,7 @@ end
190
190
  describe Sequel::Model::Associations::AssociationReflection do
191
191
  before do
192
192
  @c = Class.new(Sequel::Model(:foo))
193
- @c.meta_def(:name){"C"}
193
+ def @c.name() "C" end
194
194
  end
195
195
 
196
196
  it "#eager_loading_predicate_key should be an alias of predicate_key for backwards compatibility" do
@@ -276,13 +276,13 @@ describe Sequel::Model::Associations::AssociationReflection, "#eager_limit_strat
276
276
  end
277
277
 
278
278
  it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
279
- @c.dataset.meta_def(:supports_ordered_distinct_on?){true}
279
+ def (@c.dataset).supports_ordered_distinct_on?() true end
280
280
  @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
281
281
  @c.association_reflection(:c).eager_limit_strategy.should == :distinct_on
282
282
  end
283
283
 
284
284
  it "should use :window_function for associations if picking and the association dataset supports window functions" do
285
- @c.dataset.meta_def(:supports_window_functions?){true}
285
+ def (@c.dataset).supports_window_functions?() true end
286
286
  @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
287
287
  @c.association_reflection(:c).eager_limit_strategy.should == :window_function
288
288
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
@@ -314,7 +314,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#eager_limit_strat
314
314
  c.dataset = :a
315
315
  c.one_to_many :cs, :class=>c, :limit=>1
316
316
  c.association_reflection(:cs).eager_limit_strategy.should == :ruby
317
- c.dataset.meta_def(:supports_window_functions?){true}
317
+ def (c.dataset).supports_window_functions?() true end
318
318
  c.many_to_many :cs, :class=>c, :limit=>1
319
319
  c.association_reflection(:cs).eager_limit_strategy.should == :window_function
320
320
 
@@ -602,7 +602,7 @@ describe Sequel::Model, "many_to_one" do
602
602
  c = @c2.load(:id=>123)
603
603
  p.raise_on_save_failure = false
604
604
  @c2.many_to_one :parent, :class => @c2, :before_set=>:bs
605
- p.meta_def(:bs){|x| false}
605
+ def p.bs(x) false end
606
606
  p.should_not_receive(:_parent=)
607
607
  proc{p.parent = c}.should raise_error(Sequel::Error)
608
608
 
@@ -1038,7 +1038,7 @@ describe Sequel::Model, "one_to_one" do
1038
1038
  c = @c2.load(:id=>123)
1039
1039
  p.raise_on_save_failure = false
1040
1040
  @c2.one_to_one :parent, :class => @c2, :before_set=>:bs
1041
- p.meta_def(:bs){|x| false}
1041
+ def p.bs(x) false end
1042
1042
  p.should_not_receive(:_parent=)
1043
1043
  proc{p.parent = c}.should raise_error(Sequel::Error)
1044
1044
 
@@ -588,9 +588,9 @@ end
588
588
  describe Sequel::Model, ".require_modification" do
589
589
  before do
590
590
  @ds1 = MODEL_DB[:items]
591
- @ds1.meta_def(:provides_accurate_rows_matched?){false}
591
+ def @ds1.provides_accurate_rows_matched?() false end
592
592
  @ds2 = MODEL_DB[:items]
593
- @ds2.meta_def(:provides_accurate_rows_matched?){true}
593
+ def @ds2.provides_accurate_rows_matched?() true end
594
594
  end
595
595
  after do
596
596
  Sequel::Model.require_modification = nil
@@ -150,7 +150,7 @@ describe Sequel::Model, "#eager" do
150
150
  end
151
151
 
152
152
  it "should eagerly load a single one_to_one association using the :distinct_on strategy" do
153
- EagerTrack.dataset.meta_def(:supports_distinct_on?){true}
153
+ def (EagerTrack.dataset).supports_distinct_on?() true end
154
154
  EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>true
155
155
  a = EagerAlbum.eager(:track).all
156
156
  a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
@@ -160,7 +160,7 @@ describe Sequel::Model, "#eager" do
160
160
  end
161
161
 
162
162
  it "should eagerly load a single one_to_one association using the :window_function strategy" do
163
- EagerTrack.dataset.meta_def(:supports_window_functions?){true}
163
+ def (EagerTrack.dataset).supports_window_functions?() true end
164
164
  EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>true, :order=>:name
165
165
  a = EagerAlbum.eager(:track).all
166
166
  a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
@@ -562,7 +562,7 @@ describe Sequel::Model, "#eager" do
562
562
  end
563
563
 
564
564
  it "should respect the :limit option on a one_to_many association using the :window_function strategy" do
565
- EagerTrack.dataset.meta_def(:supports_window_functions?){true}
565
+ def (EagerTrack.dataset).supports_window_functions?() true end
566
566
  EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>true, :order=>:name, :limit=>2
567
567
  a = EagerAlbum.eager(:tracks).all
568
568
  a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
@@ -572,7 +572,7 @@ describe Sequel::Model, "#eager" do
572
572
  end
573
573
 
574
574
  it "should respect the :limit option with an offset on a one_to_many association using the :window_function strategy" do
575
- EagerTrack.dataset.meta_def(:supports_window_functions?){true}
575
+ def (EagerTrack.dataset).supports_window_functions?() true end
576
576
  EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>true, :order=>:name, :limit=>[2, 1]
577
577
  a = EagerAlbum.eager(:tracks).all
578
578
  a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
@@ -616,7 +616,7 @@ describe Sequel::Model, "#eager" do
616
616
  end
617
617
 
618
618
  it "should respect the limit option on a many_to_many association using the :window_function strategy" do
619
- EagerGenre.dataset.meta_def(:supports_window_functions?){true}
619
+ def (EagerGenre.dataset).supports_window_functions?() true end
620
620
  EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :eager_limit_strategy=>true, :limit=>2, :order=>:name
621
621
  EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
622
622
  as = EagerAlbum.eager(:first_two_genres).all