sequel 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/CHANGELOG +1551 -4
  2. data/README +306 -19
  3. data/Rakefile +84 -56
  4. data/bin/sequel +106 -0
  5. data/doc/cheat_sheet.rdoc +225 -0
  6. data/doc/dataset_filtering.rdoc +182 -0
  7. data/lib/sequel_core.rb +136 -0
  8. data/lib/sequel_core/adapters/adapter_skeleton.rb +54 -0
  9. data/lib/sequel_core/adapters/ado.rb +80 -0
  10. data/lib/sequel_core/adapters/db2.rb +148 -0
  11. data/lib/sequel_core/adapters/dbi.rb +117 -0
  12. data/lib/sequel_core/adapters/informix.rb +78 -0
  13. data/lib/sequel_core/adapters/jdbc.rb +186 -0
  14. data/lib/sequel_core/adapters/jdbc/mysql.rb +55 -0
  15. data/lib/sequel_core/adapters/jdbc/postgresql.rb +66 -0
  16. data/lib/sequel_core/adapters/jdbc/sqlite.rb +47 -0
  17. data/lib/sequel_core/adapters/mysql.rb +231 -0
  18. data/lib/sequel_core/adapters/odbc.rb +155 -0
  19. data/lib/sequel_core/adapters/odbc_mssql.rb +106 -0
  20. data/lib/sequel_core/adapters/openbase.rb +64 -0
  21. data/lib/sequel_core/adapters/oracle.rb +170 -0
  22. data/lib/sequel_core/adapters/postgres.rb +199 -0
  23. data/lib/sequel_core/adapters/shared/mysql.rb +275 -0
  24. data/lib/sequel_core/adapters/shared/postgres.rb +351 -0
  25. data/lib/sequel_core/adapters/shared/sqlite.rb +146 -0
  26. data/lib/sequel_core/adapters/sqlite.rb +138 -0
  27. data/lib/sequel_core/connection_pool.rb +194 -0
  28. data/lib/sequel_core/core_ext.rb +203 -0
  29. data/lib/sequel_core/core_sql.rb +184 -0
  30. data/lib/sequel_core/database.rb +471 -0
  31. data/lib/sequel_core/database/schema.rb +156 -0
  32. data/lib/sequel_core/dataset.rb +457 -0
  33. data/lib/sequel_core/dataset/callback.rb +13 -0
  34. data/lib/sequel_core/dataset/convenience.rb +245 -0
  35. data/lib/sequel_core/dataset/pagination.rb +96 -0
  36. data/lib/sequel_core/dataset/query.rb +41 -0
  37. data/lib/sequel_core/dataset/schema.rb +15 -0
  38. data/lib/sequel_core/dataset/sql.rb +889 -0
  39. data/lib/sequel_core/deprecated.rb +26 -0
  40. data/lib/sequel_core/exceptions.rb +42 -0
  41. data/lib/sequel_core/migration.rb +187 -0
  42. data/lib/sequel_core/object_graph.rb +216 -0
  43. data/lib/sequel_core/pretty_table.rb +71 -0
  44. data/lib/sequel_core/schema.rb +2 -0
  45. data/lib/sequel_core/schema/generator.rb +239 -0
  46. data/lib/sequel_core/schema/sql.rb +325 -0
  47. data/lib/sequel_core/sql.rb +812 -0
  48. data/lib/sequel_model.rb +5 -1
  49. data/lib/sequel_model/association_reflection.rb +3 -8
  50. data/lib/sequel_model/base.rb +15 -10
  51. data/lib/sequel_model/inflector.rb +3 -5
  52. data/lib/sequel_model/plugins.rb +1 -1
  53. data/lib/sequel_model/record.rb +11 -3
  54. data/lib/sequel_model/schema.rb +4 -4
  55. data/lib/sequel_model/validations.rb +6 -1
  56. data/spec/adapters/ado_spec.rb +17 -0
  57. data/spec/adapters/informix_spec.rb +96 -0
  58. data/spec/adapters/mysql_spec.rb +764 -0
  59. data/spec/adapters/oracle_spec.rb +222 -0
  60. data/spec/adapters/postgres_spec.rb +441 -0
  61. data/spec/adapters/spec_helper.rb +7 -0
  62. data/spec/adapters/sqlite_spec.rb +400 -0
  63. data/spec/integration/dataset_test.rb +51 -0
  64. data/spec/integration/eager_loader_test.rb +702 -0
  65. data/spec/integration/schema_test.rb +102 -0
  66. data/spec/integration/spec_helper.rb +44 -0
  67. data/spec/integration/type_test.rb +43 -0
  68. data/spec/rcov.opts +2 -0
  69. data/spec/sequel_core/connection_pool_spec.rb +363 -0
  70. data/spec/sequel_core/core_ext_spec.rb +156 -0
  71. data/spec/sequel_core/core_sql_spec.rb +427 -0
  72. data/spec/sequel_core/database_spec.rb +964 -0
  73. data/spec/sequel_core/dataset_spec.rb +2977 -0
  74. data/spec/sequel_core/expression_filters_spec.rb +346 -0
  75. data/spec/sequel_core/migration_spec.rb +261 -0
  76. data/spec/sequel_core/object_graph_spec.rb +234 -0
  77. data/spec/sequel_core/pretty_table_spec.rb +58 -0
  78. data/spec/sequel_core/schema_generator_spec.rb +122 -0
  79. data/spec/sequel_core/schema_spec.rb +497 -0
  80. data/spec/sequel_core/spec_helper.rb +51 -0
  81. data/spec/{association_reflection_spec.rb → sequel_model/association_reflection_spec.rb} +6 -6
  82. data/spec/{associations_spec.rb → sequel_model/associations_spec.rb} +47 -18
  83. data/spec/{base_spec.rb → sequel_model/base_spec.rb} +2 -1
  84. data/spec/{caching_spec.rb → sequel_model/caching_spec.rb} +0 -0
  85. data/spec/{dataset_methods_spec.rb → sequel_model/dataset_methods_spec.rb} +13 -1
  86. data/spec/{eager_loading_spec.rb → sequel_model/eager_loading_spec.rb} +75 -14
  87. data/spec/{hooks_spec.rb → sequel_model/hooks_spec.rb} +4 -4
  88. data/spec/sequel_model/inflector_spec.rb +119 -0
  89. data/spec/{model_spec.rb → sequel_model/model_spec.rb} +30 -11
  90. data/spec/{plugins_spec.rb → sequel_model/plugins_spec.rb} +0 -0
  91. data/spec/{record_spec.rb → sequel_model/record_spec.rb} +47 -6
  92. data/spec/{schema_spec.rb → sequel_model/schema_spec.rb} +18 -4
  93. data/spec/{spec_helper.rb → sequel_model/spec_helper.rb} +3 -2
  94. data/spec/{validations_spec.rb → sequel_model/validations_spec.rb} +37 -17
  95. data/spec/spec_config.rb +9 -0
  96. data/spec/spec_config.rb.example +10 -0
  97. metadata +110 -37
  98. data/spec/inflector_spec.rb +0 -34
@@ -349,24 +349,24 @@ describe "Model#before_validation && Model#after_validation" do
349
349
 
350
350
  specify "should be called around validation" do
351
351
  @c.before_validation{MODEL_DB << "BLAH before"}
352
- m = @c.new(:id => 2233)
352
+ m = @c.load(:id => 2233)
353
353
  m.should be_valid
354
354
  MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
355
355
 
356
356
  MODEL_DB.sqls.clear
357
- m = @c.new(:id => 22)
357
+ m = @c.load(:id => 22)
358
358
  m.should_not be_valid
359
359
  MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
360
360
  end
361
361
 
362
362
  specify "should be called when calling save" do
363
363
  @c.before_validation{MODEL_DB << "BLAH before"}
364
- m = @c.new(:id => 2233)
364
+ m = @c.load(:id => 2233)
365
365
  m.save.should == m
366
366
  MODEL_DB.sqls.should == ['BLAH before', 'BLAH after', 'CREATE BLAH']
367
367
 
368
368
  MODEL_DB.sqls.clear
369
- m = @c.new(:id => 22)
369
+ m = @c.load(:id => 22)
370
370
  m.raise_on_save_failure = false
371
371
  m.save.should == nil
372
372
  MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
@@ -0,0 +1,119 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe String do
4
+ it "#camelize and #camelcase should transform the word to CamelCase" do
5
+ "egg_and_hams".camelize.should == "EggAndHams"
6
+ "egg_and_hams".camelize(false).should == "eggAndHams"
7
+ "post".camelize.should == "Post"
8
+ "post".camelcase.should == "Post"
9
+ end
10
+
11
+ it "#constantize should eval the string to get a constant" do
12
+ "String".constantize.should == String
13
+ "String::Inflections".constantize.should == String::Inflections
14
+ proc{"BKSDDF".constantize}.should raise_error
15
+ proc{"++A++".constantize}.should raise_error
16
+ end
17
+
18
+ it "#dasherize should transform underscores to dashes" do
19
+ "egg_and_hams".dasherize.should == "egg-and-hams"
20
+ "post".dasherize.should == "post"
21
+ end
22
+
23
+ it "#demodulize should remove any preceding modules" do
24
+ "String::Inflections::Blah".demodulize.should == "Blah"
25
+ "String::Inflections".demodulize.should == "Inflections"
26
+ "String".demodulize.should == "String"
27
+ end
28
+
29
+ it "#humanize should remove _i, transform underscore to spaces, and capitalize" do
30
+ "egg_and_hams".humanize.should == "Egg and hams"
31
+ "post".humanize.should == "Post"
32
+ "post_id".humanize.should == "Post"
33
+ end
34
+
35
+ it "#titleize and #titlecase should underscore, humanize, and capitalize all words" do
36
+ "egg-and: hams".titleize.should == "Egg And: Hams"
37
+ "post".titleize.should == "Post"
38
+ "post".titlecase.should == "Post"
39
+ end
40
+
41
+ it "#underscore should add underscores between CamelCased words, change :: to / and - to _, and downcase" do
42
+ "EggAndHams".underscore.should == "egg_and_hams"
43
+ "EGGAndHams".underscore.should == "egg_and_hams"
44
+ "Egg::And::Hams".underscore.should == "egg/and/hams"
45
+ "post".underscore.should == "post"
46
+ "post-id".underscore.should == "post_id"
47
+ end
48
+
49
+ it "#pluralize should transform words from singular to plural" do
50
+ "post".pluralize.should == "posts"
51
+ "octopus".pluralize.should =="octopi"
52
+ "the blue mailman".pluralize.should == "the blue mailmen"
53
+ "CamelOctopus".pluralize.should == "CamelOctopi"
54
+ end
55
+
56
+ it "#singularize should transform words from plural to singular" do
57
+ "posts".singularize.should == "post"
58
+ "octopi".singularize.should == "octopus"
59
+ "the blue mailmen".singularize.should == "the blue mailman"
60
+ "CamelOctopi".singularize.should == "CamelOctopus"
61
+ end
62
+
63
+ it "#tableize should transform class names to table names" do
64
+ "RawScaledScorer".tableize.should == "raw_scaled_scorers"
65
+ "egg_and_ham".tableize.should == "egg_and_hams"
66
+ "fancyCategory".tableize.should == "fancy_categories"
67
+ end
68
+
69
+ it "#classify should tranform table names to class names" do
70
+ "egg_and_hams".classify.should == "EggAndHam"
71
+ "post".classify.should == "Post"
72
+ end
73
+
74
+ it "#foreign_key should create a foreign key name from a class name" do
75
+ "Message".foreign_key.should == "message_id"
76
+ "Message".foreign_key(false).should == "messageid"
77
+ "Admin::Post".foreign_key.should == "post_id"
78
+ end
79
+ end
80
+
81
+ describe String::Inflections do
82
+ before do
83
+ @plurals, @singulars, @uncountables = String.inflections.plurals.dup, String.inflections.singulars.dup, String.inflections.uncountables.dup
84
+ end
85
+ after do
86
+ String.inflections.plurals.replace(@plurals)
87
+ String.inflections.singulars.replace(@singulars)
88
+ String.inflections.uncountables.replace(@uncountables)
89
+ end
90
+
91
+ it "should be possible to clear the list of singulars, plurals, and uncountables" do
92
+ String.inflections.clear(:plurals)
93
+ String.inflections.plurals.should == []
94
+ String.inflections.plural('blah', 'blahs')
95
+ String.inflections.clear
96
+ String.inflections.plurals.should == []
97
+ String.inflections.singulars.should == []
98
+ String.inflections.uncountables.should == []
99
+ end
100
+
101
+ it "should be able to specify new inflection rules" do
102
+ String.inflections do |i|
103
+ i.plural(/xx$/i, 'xxx')
104
+ i.singular(/ttt$/i, 'tt')
105
+ i.irregular('yy', 'yyy')
106
+ i.uncountable(%w'zz')
107
+ end
108
+ 'roxx'.pluralize.should == 'roxxx'
109
+ 'rottt'.singularize.should == 'rott'
110
+ 'yy'.pluralize.should == 'yyy'
111
+ 'yyy'.singularize.should == 'yy'
112
+ 'zz'.pluralize.should == 'zz'
113
+ 'zz'.singularize.should == 'zz'
114
+ end
115
+
116
+ it "should be yielded and returned by String.inflections" do
117
+ String.inflections{|i| i.should == String::Inflections}.should == String::Inflections
118
+ end
119
+ end
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "spec_helper")
2
2
 
3
3
  describe Sequel::Model do
4
4
  it "should have class method aliased as model" do
5
- Sequel::Model.instance_methods.should include("model")
5
+ Sequel::Model.instance_methods.collect{|x| x.to_s}.should include("model")
6
6
 
7
7
  model_a = Class.new(Sequel::Model(:items))
8
8
  model_a.new.model.should be(model_a)
@@ -79,18 +79,28 @@ describe Sequel::Model, "dataset & schema" do
79
79
  @model.primary_key.should == :id
80
80
  @model.table_name.should == :foo
81
81
  end
82
+
83
+ it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
84
+ @model.meta_def(:get_db_schema){raise Sequel::Error}
85
+ proc{@model.set_dataset(MODEL_DB[:foo])}.should_not raise_error
86
+ end
87
+
88
+ it "doesn't raise an error on inherited if there is an error setting the dataset" do
89
+ @model.meta_def(:set_dataset){raise Sequel::Error}
90
+ proc{Class.new(@model)}.should_not raise_error
91
+ end
82
92
  end
83
93
 
84
94
  describe Sequel::Model, "#sti_key" do
85
95
  before do
86
- class StiTest < Sequel::Model
96
+ class ::StiTest < Sequel::Model
87
97
  def kind=(x); self[:kind] = x; end
88
98
  def refresh; end
89
99
  set_sti_key :kind
90
100
  end
91
- class StiTestSub1 < StiTest
101
+ class ::StiTestSub1 < StiTest
92
102
  end
93
- class StiTestSub2 < StiTest
103
+ class ::StiTestSub2 < StiTest
94
104
  end
95
105
  @ds = StiTest.dataset
96
106
  MODEL_DB.reset
@@ -435,15 +445,15 @@ describe Sequel::Model, "attribute accessors" do
435
445
 
436
446
  it "should be created on set_dataset unless lazy loading schema" do
437
447
  %w'x y x= y='.each do |x|
438
- @c.instance_methods.include?(x).should == false
448
+ @c.instance_methods.collect{|y| y.to_s}.should_not include(x)
439
449
  end
440
450
  @c.set_dataset(@dataset)
441
451
  %w'x y x= y='.each do |x|
442
- @c.instance_methods.include?(x).should == true
452
+ @c.instance_methods.collect{|y| y.to_s}.should include(x)
443
453
  end
444
454
  o = @c.new
445
455
  %w'x y x= y='.each do |x|
446
- o.methods.include?(x).should == true
456
+ o.methods.collect{|y| y.to_s}.should include(x)
447
457
  end
448
458
 
449
459
  o.x.should be_nil
@@ -454,18 +464,18 @@ describe Sequel::Model, "attribute accessors" do
454
464
  it "should be created on first initialization if lazy loading schema" do
455
465
  Sequel::Model.lazy_load_schema = true
456
466
  %w'x y x= y='.each do |x|
457
- @c.instance_methods.include?(x).should == false
467
+ @c.instance_methods.collect{|y| y.to_s}.should_not include(x)
458
468
  end
459
469
  @c.set_dataset(@dataset)
460
470
  %w'x y x= y='.each do |x|
461
- @c.instance_methods.include?(x).should == false
471
+ @c.instance_methods.collect{|y| y.to_s}.should_not include(x)
462
472
  end
463
473
  o = @c.new
464
474
  %w'x y x= y='.each do |x|
465
- @c.instance_methods.include?(x).should == true
475
+ @c.instance_methods.collect{|y| y.to_s}.should include(x)
466
476
  end
467
477
  %w'x y x= y='.each do |x|
468
- o.methods.include?(x).should == true
478
+ o.methods.collect{|y| y.to_s}.should include(x)
469
479
  end
470
480
 
471
481
  o.x.should be_nil
@@ -596,3 +606,12 @@ context "Model.db_schema" do
596
606
  @c.db_schema.should == {:x=>{}}
597
607
  end
598
608
  end
609
+
610
+ context "Model.str_columns" do
611
+ specify "should return the columns as frozen strings" do
612
+ c = Class.new(Sequel::Model)
613
+ c.meta_def(:columns){[:a, :b]}
614
+ c.orig_str_columns.should == %w'a b'
615
+ proc{c.orig_str_columns.first << 'a'}.should raise_error
616
+ end
617
+ end
@@ -33,7 +33,7 @@ describe "Model#save" do
33
33
  end
34
34
 
35
35
  it "should mark saved columns as not changed" do
36
- o = @c.new(:id => 3, :x => 1, :y => nil)
36
+ o = @c.load(:id => 3, :x => 1, :y => nil)
37
37
  o[:y] = 4
38
38
  o.changed_columns.should == [:y]
39
39
  o.save(:x)
@@ -50,6 +50,7 @@ describe "Model#save_changes" do
50
50
  MODEL_DB.reset
51
51
 
52
52
  @c = Class.new(Sequel::Model(:items)) do
53
+ unrestrict_primary_key
53
54
  columns :id, :x, :y
54
55
  end
55
56
  end
@@ -110,6 +111,7 @@ describe "Model#update_values" do
110
111
  MODEL_DB.reset
111
112
 
112
113
  @c = Class.new(Sequel::Model(:items)) do
114
+ unrestrict_primary_key
113
115
  columns :id, :x, :y
114
116
  end
115
117
  end
@@ -141,6 +143,7 @@ describe "Model#set_values" do
141
143
  MODEL_DB.reset
142
144
 
143
145
  @c = Class.new(Sequel::Model(:items)) do
146
+ unrestrict_primary_key
144
147
  columns :id, :x, :y
145
148
  end
146
149
  end
@@ -164,6 +167,10 @@ describe "Model#set_values" do
164
167
  o.set_values('x' => 1)
165
168
  o.x.should == 1
166
169
  end
170
+
171
+ it "should raise an error if used with a non-String, non-Symbol key" do
172
+ proc{@c.new.set_values(1=>2)}.should raise_error(Sequel::Error)
173
+ end
167
174
  end
168
175
 
169
176
  describe "Model#new?" do
@@ -172,6 +179,7 @@ describe "Model#new?" do
172
179
  MODEL_DB.reset
173
180
 
174
181
  @c = Class.new(Sequel::Model(:items)) do
182
+ unrestrict_primary_key
175
183
  end
176
184
  end
177
185
 
@@ -380,6 +388,12 @@ describe Sequel::Model, "#set" do
380
388
  @o1.values.should == {:x => 1}
381
389
  MODEL_DB.sqls.should == []
382
390
  end
391
+
392
+ it "should return self" do
393
+ returned_value = @o1.set_with_params(:x => 1, :z => 2)
394
+ returned_value.should == @o1
395
+ MODEL_DB.sqls.should == []
396
+ end
383
397
  end
384
398
 
385
399
  describe Sequel::Model, "#update" do
@@ -712,6 +726,7 @@ describe Sequel::Model, ".create" do
712
726
  before(:each) do
713
727
  MODEL_DB.reset
714
728
  @c = Class.new(Sequel::Model(:items)) do
729
+ unrestrict_primary_key
715
730
  columns :x
716
731
  end
717
732
  end
@@ -730,7 +745,7 @@ describe Sequel::Model, ".create" do
730
745
 
731
746
  it "should accept a block and run it" do
732
747
  o1, o2, o3 = nil, nil, nil
733
- o = @c.create {|o3| o1 = o3; o2 = :blah; o3.x = 333}
748
+ o = @c.create {|o4| o1 = o4; o3 = o4; o2 = :blah; o3.x = 333}
734
749
  o.class.should == @c
735
750
  o1.should === o
736
751
  o3.should === o
@@ -750,7 +765,8 @@ describe Sequel::Model, "#refresh" do
750
765
  setup do
751
766
  MODEL_DB.reset
752
767
  @c = Class.new(Sequel::Model(:items)) do
753
- columns :x
768
+ unrestrict_primary_key
769
+ columns :id, :x
754
770
  end
755
771
  end
756
772
 
@@ -815,6 +831,30 @@ describe Sequel::Model, "typecasting" do
815
831
  m.x.should == 1
816
832
  end
817
833
 
834
+ specify "should typecast '' to nil unless type is string or blob" do
835
+ [:integer, :float, :decimal, :boolean, :date, :time, :datetime].each do |x|
836
+ @c.instance_variable_set(:@db_schema, {:x=>{:type=>x}})
837
+ m = @c.new
838
+ m.x = ''
839
+ m.x.should == nil
840
+ end
841
+ [:string, :blob].each do |x|
842
+ @c.instance_variable_set(:@db_schema, {:x=>{:type=>x}})
843
+ m = @c.new
844
+ m.x = ''
845
+ m.x.should == ''
846
+ end
847
+ end
848
+
849
+ specify "should not typecast '' to nil if typecast_empty_string_to_nil is false" do
850
+ @c.instance_variable_set(:@db_schema, {:x=>{:type=>:integer}})
851
+ m = @c.new
852
+ m.typecast_empty_string_to_nil = false
853
+ proc{m.x = ''}.should raise_error
854
+ @c.typecast_empty_string_to_nil = false
855
+ proc{@c.new.x = ''}.should raise_error
856
+ end
857
+
818
858
  specify "should not typecast nil if NULLs are allowed" do
819
859
  @c.instance_variable_set(:@db_schema, {:x=>{:type=>:integer,:allow_null=>true}})
820
860
  m = @c.new
@@ -825,6 +865,7 @@ describe Sequel::Model, "typecasting" do
825
865
  specify "should raise an error if attempting to typecast nil and NULLs are not allowed" do
826
866
  @c.instance_variable_set(:@db_schema, {:x=>{:type=>:integer,:allow_null=>false}})
827
867
  proc{@c.new.x = nil}.should raise_error(Sequel::Error)
868
+ proc{@c.new.x = ''}.should raise_error(Sequel::Error)
828
869
  end
829
870
 
830
871
  specify "should not raise an error if NULLs are not allowed and typecasting is turned off" do
@@ -940,6 +981,7 @@ describe Sequel::Model, "typecasting" do
940
981
  specify "should raise an error if invalid data is used in a date field" do
941
982
  @c.instance_variable_set(:@db_schema, {:x=>{:type=>:date}})
942
983
  proc{@c.new.x = 'a'}.should raise_error
984
+ proc{@c.new.x = 100}.should raise_error
943
985
  end
944
986
 
945
987
  specify "should convert to time for a time field" do
@@ -989,10 +1031,9 @@ describe Sequel::Model, "typecasting" do
989
1031
  specify "should raise an error if invalid data is used in a datetime field" do
990
1032
  @c.instance_variable_set(:@db_schema, {:x=>{:type=>:datetime}})
991
1033
  proc{@c.new.x = '0000'}.should raise_error
992
- proc{@c.new.x = ''}.should_not raise_error # Valid Time
1034
+ proc{@c.new.x = 'a'}.should_not raise_error # Valid Time
993
1035
  Sequel.datetime_class = DateTime
994
1036
  proc{@c.new.x = '0000'}.should raise_error
995
- proc{@c.new.x = ''}.should raise_error
1037
+ proc{@c.new.x = 'a'}.should raise_error
996
1038
  end
997
-
998
1039
  end
@@ -15,13 +15,12 @@ describe Sequel::Model, "table_exists?" do
15
15
 
16
16
  end
17
17
 
18
- describe Sequel::Model, "create_table" do
18
+ describe Sequel::Model, "create_table and schema" do
19
19
 
20
20
  before(:each) do
21
21
  MODEL_DB.reset
22
22
  @model = Class.new(Sequel::Model) do
23
- set_dataset MODEL_DB[:items]
24
- set_schema do
23
+ set_schema(:items) do
25
24
  text :name
26
25
  float :price, :null => false
27
26
  end
@@ -40,6 +39,22 @@ describe Sequel::Model, "create_table" do
40
39
  @model.db_schema.should == schem
41
40
  @model.instance_variable_get(:@columns).should == [:name, :price]
42
41
  end
42
+
43
+ it "should return the schema generator via schema" do
44
+ @model.schema.should be_a_kind_of(Sequel::Schema::Generator)
45
+ end
46
+
47
+ it "should use the superclasses schema if it exists" do
48
+ @submodel = Class.new(@model)
49
+ @submodel.schema.should be_a_kind_of(Sequel::Schema::Generator)
50
+ end
51
+
52
+ it "should return nil if no schema is present" do
53
+ @model = Class.new(Sequel::Model)
54
+ @model.schema.should == nil
55
+ @submodel = Class.new(@model)
56
+ @submodel.schema.should == nil
57
+ end
43
58
  end
44
59
 
45
60
  describe Sequel::Model, "drop_table" do
@@ -66,7 +81,6 @@ describe Sequel::Model, "create_table!" do
66
81
  end
67
82
 
68
83
  it "should drop table if it exists and then create the table" do
69
- @model.should_receive(:table_exists?).and_return(true)
70
84
  @model.should_receive(:drop_table).and_return(true)
71
85
  @model.should_receive(:create_table).and_return(true)
72
86
 
@@ -1,10 +1,10 @@
1
1
  require 'rubygems'
2
2
  unless Object.const_defined?('Sequel')
3
- $:.unshift(File.join(File.dirname(__FILE__), "../../sequel_core/lib/"))
3
+ $:.unshift(File.join(File.dirname(__FILE__), "../../lib/"))
4
4
  require 'sequel_core'
5
5
  end
6
6
  unless Sequel.const_defined?('Model')
7
- $:.unshift(File.join(File.dirname(__FILE__), "../lib/"))
7
+ $:.unshift(File.join(File.dirname(__FILE__), "../../lib/"))
8
8
  require 'sequel_model'
9
9
  end
10
10
 
@@ -52,6 +52,7 @@ end
52
52
 
53
53
  class << Sequel::Model
54
54
  alias orig_columns columns
55
+ alias orig_str_columns str_columns
55
56
  def columns(*cols)
56
57
  return if cols.empty?
57
58
  define_method(:columns){cols}