dm-core 0.10.2 → 1.0.0.rc1

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 (183) hide show
  1. data/.gitignore +10 -1
  2. data/Gemfile +143 -0
  3. data/Rakefile +9 -5
  4. data/VERSION +1 -1
  5. data/dm-core.gemspec +160 -57
  6. data/lib/dm-core.rb +131 -56
  7. data/lib/dm-core/adapters.rb +98 -14
  8. data/lib/dm-core/adapters/abstract_adapter.rb +24 -4
  9. data/lib/dm-core/adapters/in_memory_adapter.rb +7 -2
  10. data/lib/dm-core/associations/many_to_many.rb +19 -30
  11. data/lib/dm-core/associations/many_to_one.rb +58 -42
  12. data/lib/dm-core/associations/one_to_many.rb +33 -23
  13. data/lib/dm-core/associations/one_to_one.rb +27 -11
  14. data/lib/dm-core/associations/relationship.rb +4 -4
  15. data/lib/dm-core/collection.rb +23 -16
  16. data/lib/dm-core/core_ext/array.rb +36 -0
  17. data/lib/dm-core/core_ext/hash.rb +30 -0
  18. data/lib/dm-core/core_ext/module.rb +46 -0
  19. data/lib/dm-core/core_ext/object.rb +31 -0
  20. data/lib/dm-core/core_ext/pathname.rb +20 -0
  21. data/lib/dm-core/core_ext/string.rb +22 -0
  22. data/lib/dm-core/core_ext/try_dup.rb +44 -0
  23. data/lib/dm-core/model.rb +88 -27
  24. data/lib/dm-core/model/hook.rb +75 -18
  25. data/lib/dm-core/model/property.rb +50 -9
  26. data/lib/dm-core/model/relationship.rb +31 -31
  27. data/lib/dm-core/model/scope.rb +3 -3
  28. data/lib/dm-core/property.rb +196 -516
  29. data/lib/dm-core/property/binary.rb +7 -0
  30. data/lib/dm-core/property/boolean.rb +35 -0
  31. data/lib/dm-core/property/class.rb +24 -0
  32. data/lib/dm-core/property/date.rb +47 -0
  33. data/lib/dm-core/property/date_time.rb +48 -0
  34. data/lib/dm-core/property/decimal.rb +43 -0
  35. data/lib/dm-core/property/discriminator.rb +48 -0
  36. data/lib/dm-core/property/float.rb +24 -0
  37. data/lib/dm-core/property/integer.rb +32 -0
  38. data/lib/dm-core/property/numeric.rb +43 -0
  39. data/lib/dm-core/property/object.rb +32 -0
  40. data/lib/dm-core/property/serial.rb +8 -0
  41. data/lib/dm-core/property/string.rb +49 -0
  42. data/lib/dm-core/property/text.rb +12 -0
  43. data/lib/dm-core/property/time.rb +48 -0
  44. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  45. data/lib/dm-core/property/typecast/time.rb +28 -0
  46. data/lib/dm-core/property_set.rb +10 -4
  47. data/lib/dm-core/query.rb +14 -37
  48. data/lib/dm-core/query/conditions/comparison.rb +8 -6
  49. data/lib/dm-core/query/conditions/operation.rb +33 -2
  50. data/lib/dm-core/query/operator.rb +2 -5
  51. data/lib/dm-core/query/path.rb +4 -6
  52. data/lib/dm-core/repository.rb +21 -6
  53. data/lib/dm-core/resource.rb +316 -133
  54. data/lib/dm-core/resource/state.rb +79 -0
  55. data/lib/dm-core/resource/state/clean.rb +40 -0
  56. data/lib/dm-core/resource/state/deleted.rb +30 -0
  57. data/lib/dm-core/resource/state/dirty.rb +86 -0
  58. data/lib/dm-core/resource/state/immutable.rb +34 -0
  59. data/lib/dm-core/resource/state/persisted.rb +29 -0
  60. data/lib/dm-core/resource/state/transient.rb +70 -0
  61. data/lib/dm-core/spec/lib/adapter_helpers.rb +52 -0
  62. data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
  63. data/{spec → lib/dm-core/spec}/lib/counter_adapter.rb +5 -1
  64. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  65. data/lib/dm-core/spec/lib/spec_helper.rb +68 -0
  66. data/lib/dm-core/spec/setup.rb +165 -0
  67. data/lib/dm-core/spec/{adapter_shared_spec.rb → shared/adapter_spec.rb} +21 -7
  68. data/{spec/public/shared/resource_shared_spec.rb → lib/dm-core/spec/shared/resource_spec.rb} +120 -83
  69. data/{spec/public/shared/sel_shared_spec.rb → lib/dm-core/spec/shared/sel_spec.rb} +5 -6
  70. data/lib/dm-core/support/assertions.rb +8 -0
  71. data/lib/dm-core/support/equalizer.rb +1 -0
  72. data/lib/dm-core/support/hook.rb +420 -0
  73. data/lib/dm-core/support/lazy_array.rb +453 -0
  74. data/lib/dm-core/support/local_object_space.rb +12 -0
  75. data/lib/dm-core/support/logger.rb +193 -6
  76. data/lib/dm-core/support/naming_conventions.rb +8 -8
  77. data/lib/dm-core/support/subject.rb +33 -0
  78. data/lib/dm-core/type.rb +4 -0
  79. data/lib/dm-core/types/boolean.rb +2 -0
  80. data/lib/dm-core/types/decimal.rb +9 -0
  81. data/lib/dm-core/types/discriminator.rb +2 -0
  82. data/lib/dm-core/types/object.rb +3 -0
  83. data/lib/dm-core/types/serial.rb +2 -0
  84. data/lib/dm-core/types/text.rb +2 -0
  85. data/lib/dm-core/version.rb +1 -1
  86. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +67 -0
  87. data/spec/public/model/hook_spec.rb +209 -0
  88. data/spec/public/model/property_spec.rb +35 -0
  89. data/spec/public/model/relationship_spec.rb +33 -20
  90. data/spec/public/model_spec.rb +142 -10
  91. data/spec/public/property/binary_spec.rb +14 -0
  92. data/spec/public/property/boolean_spec.rb +14 -0
  93. data/spec/public/property/class_spec.rb +20 -0
  94. data/spec/public/property/date_spec.rb +14 -0
  95. data/spec/public/property/date_time_spec.rb +14 -0
  96. data/spec/public/property/decimal_spec.rb +14 -0
  97. data/spec/public/{types → property}/discriminator_spec.rb +2 -12
  98. data/spec/public/property/float_spec.rb +14 -0
  99. data/spec/public/property/integer_spec.rb +14 -0
  100. data/spec/public/property/object_spec.rb +9 -17
  101. data/spec/public/property/serial_spec.rb +14 -0
  102. data/spec/public/property/string_spec.rb +14 -0
  103. data/spec/public/property/text_spec.rb +52 -0
  104. data/spec/public/property/time_spec.rb +14 -0
  105. data/spec/public/property_spec.rb +28 -87
  106. data/spec/public/resource_spec.rb +101 -0
  107. data/spec/public/sel_spec.rb +5 -15
  108. data/spec/public/shared/collection_shared_spec.rb +16 -30
  109. data/spec/public/shared/finder_shared_spec.rb +2 -4
  110. data/spec/public/shared/property_shared_spec.rb +176 -0
  111. data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
  112. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +2 -2
  113. data/spec/semipublic/associations/many_to_many_spec.rb +89 -0
  114. data/spec/semipublic/associations/many_to_one_spec.rb +24 -1
  115. data/spec/semipublic/associations/one_to_many_spec.rb +51 -0
  116. data/spec/semipublic/associations/one_to_one_spec.rb +49 -0
  117. data/spec/semipublic/associations/relationship_spec.rb +3 -3
  118. data/spec/semipublic/associations_spec.rb +1 -1
  119. data/spec/semipublic/property/binary_spec.rb +13 -0
  120. data/spec/semipublic/property/boolean_spec.rb +65 -0
  121. data/spec/semipublic/property/class_spec.rb +33 -0
  122. data/spec/semipublic/property/date_spec.rb +43 -0
  123. data/spec/semipublic/property/date_time_spec.rb +46 -0
  124. data/spec/semipublic/property/decimal_spec.rb +82 -0
  125. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  126. data/spec/semipublic/property/float_spec.rb +82 -0
  127. data/spec/semipublic/property/integer_spec.rb +82 -0
  128. data/spec/semipublic/property/serial_spec.rb +13 -0
  129. data/spec/semipublic/property/string_spec.rb +13 -0
  130. data/spec/semipublic/property/text_spec.rb +31 -0
  131. data/spec/semipublic/property/time_spec.rb +50 -0
  132. data/spec/semipublic/property_spec.rb +2 -532
  133. data/spec/semipublic/query/conditions/comparison_spec.rb +171 -169
  134. data/spec/semipublic/query/conditions/operation_spec.rb +53 -51
  135. data/spec/semipublic/query/path_spec.rb +17 -17
  136. data/spec/semipublic/query_spec.rb +47 -78
  137. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  138. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  139. data/spec/semipublic/resource/state/dirty_spec.rb +133 -0
  140. data/spec/semipublic/resource/state/immutable_spec.rb +99 -0
  141. data/spec/semipublic/resource/state/transient_spec.rb +128 -0
  142. data/spec/semipublic/resource/state_spec.rb +226 -0
  143. data/spec/semipublic/shared/property_shared_spec.rb +143 -0
  144. data/spec/semipublic/shared/resource_shared_spec.rb +16 -15
  145. data/spec/semipublic/shared/resource_state_shared_spec.rb +78 -0
  146. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  147. data/spec/spec_helper.rb +21 -97
  148. data/spec/support/types/huge_integer.rb +17 -0
  149. data/spec/unit/array_spec.rb +48 -0
  150. data/spec/unit/hash_spec.rb +35 -0
  151. data/spec/unit/hook_spec.rb +1234 -0
  152. data/spec/unit/lazy_array_spec.rb +1959 -0
  153. data/spec/unit/module_spec.rb +70 -0
  154. data/spec/unit/object_spec.rb +37 -0
  155. data/spec/unit/try_dup_spec.rb +45 -0
  156. data/tasks/local_gemfile.rake +18 -0
  157. data/tasks/spec.rake +0 -3
  158. metadata +197 -71
  159. data/deps.rip +0 -2
  160. data/lib/dm-core/adapters/data_objects_adapter.rb +0 -712
  161. data/lib/dm-core/adapters/mysql_adapter.rb +0 -42
  162. data/lib/dm-core/adapters/oracle_adapter.rb +0 -229
  163. data/lib/dm-core/adapters/postgres_adapter.rb +0 -22
  164. data/lib/dm-core/adapters/sqlite3_adapter.rb +0 -17
  165. data/lib/dm-core/adapters/sqlserver_adapter.rb +0 -114
  166. data/lib/dm-core/adapters/yaml_adapter.rb +0 -111
  167. data/lib/dm-core/core_ext/enumerable.rb +0 -28
  168. data/lib/dm-core/migrations.rb +0 -1427
  169. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +0 -366
  170. data/lib/dm-core/transaction.rb +0 -508
  171. data/lib/dm-core/types/paranoid_boolean.rb +0 -42
  172. data/lib/dm-core/types/paranoid_datetime.rb +0 -41
  173. data/spec/lib/adapter_helpers.rb +0 -105
  174. data/spec/lib/collection_helpers.rb +0 -18
  175. data/spec/lib/pending_helpers.rb +0 -46
  176. data/spec/public/migrations_spec.rb +0 -503
  177. data/spec/public/transaction_spec.rb +0 -153
  178. data/spec/semipublic/adapters/mysql_adapter_spec.rb +0 -17
  179. data/spec/semipublic/adapters/oracle_adapter_spec.rb +0 -194
  180. data/spec/semipublic/adapters/postgres_adapter_spec.rb +0 -17
  181. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +0 -17
  182. data/spec/semipublic/adapters/sqlserver_adapter_spec.rb +0 -17
  183. data/spec/semipublic/adapters/yaml_adapter_spec.rb +0 -12
@@ -4,7 +4,7 @@ describe 'AbstractAdapter' do
4
4
  before :all do
5
5
  @adapter = DataMapper::Adapters::AbstractAdapter.new(:abstract, :foo => 'bar')
6
6
  @adapter_class = @adapter.class
7
- @scheme = Extlib::Inflection.underscore(Extlib::Inflection.demodulize(@adapter_class).chomp('Adapter'))
7
+ @scheme = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(@adapter_class).chomp('Adapter'))
8
8
  @adapter_name = "test_#{@scheme}".to_sym
9
9
  end
10
10
 
@@ -1,9 +1,9 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
- require DataMapper.root / 'lib' / 'dm-core' / 'spec' / 'adapter_shared_spec'
2
+ require DataMapper.root / 'lib' / 'dm-core' / 'spec' / 'shared' / 'adapter_spec'
3
3
 
4
4
  describe 'Adapter' do
5
5
  supported_by :in_memory do
6
- describe DataMapper::Adapters::InMemoryAdapter do
6
+ describe 'DataMapper::Adapters::InMemoryAdapter' do
7
7
 
8
8
  it_should_behave_like 'An Adapter'
9
9
 
@@ -0,0 +1,89 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
+
3
+ describe 'Many to Many Associations' do
4
+ before :all do
5
+ module ::Blog
6
+ class Article
7
+ include DataMapper::Resource
8
+
9
+ property :title, String, :key => true
10
+ property :body, Text, :required => true
11
+
12
+ has n, :without_default_join, 'WithoutDefault'
13
+ has n, :with_default_join, 'WithDefault'
14
+ has n, :with_default_callable_join, 'WithDefaultCallable'
15
+ end
16
+
17
+ class Author
18
+ include DataMapper::Resource
19
+
20
+ property :name, String, :key => true
21
+
22
+ has n, :without_default_join, 'WithoutDefault'
23
+ has n, :with_default_join, 'WithDefault'
24
+ has n, :with_default_callable_join, 'WithDefaultCallable'
25
+
26
+ has n, :without_default, 'Article', :through => :without_default_join, :via => :article
27
+ has n, :with_default, 'Article', :through => :with_default_join, :via => :article
28
+ has n, :with_default_callable, 'Article', :through => :with_default_callable_join, :via => :article
29
+ end
30
+
31
+ class WithoutDefault
32
+ include DataMapper::Resource
33
+
34
+ belongs_to :article, :key => true
35
+ belongs_to :author, :key => true
36
+ end
37
+
38
+ class WithDefault
39
+ include DataMapper::Resource
40
+
41
+ belongs_to :article, :key => true
42
+ belongs_to :author, :key => true
43
+ end
44
+
45
+ class WithDefaultCallable
46
+ include DataMapper::Resource
47
+
48
+ belongs_to :article, :key => true
49
+ belongs_to :author, :key => true
50
+ end
51
+ end
52
+
53
+ @article_model = Blog::Article
54
+ @author_model = Blog::Author
55
+
56
+ n = @article_model.n
57
+
58
+ @default_value = [ @author_model.new(:name => 'Dan Kubb') ]
59
+ @default_value_callable = [ @author_model.new(:name => 'John Doe') ]
60
+
61
+ @subject_without_default = @article_model.has(n, :without_default, 'Author', :through => :without_default_join, :via => :author)
62
+ @subject_with_default = @article_model.has(n, :with_default, 'Author', :through => :with_default_join, :via => :author, :default => @default_value)
63
+ @subject_with_default_callable = @article_model.has(n, :with_default_callable, 'Author', :through => :with_default_callable_join, :via => :author, :default => lambda { |resource, relationship| @default_value_callable })
64
+ end
65
+
66
+ supported_by :all do
67
+ before :all do
68
+ @no_join = defined?(DataMapper::Adapters::InMemoryAdapter) && @adapter.kind_of?(DataMapper::Adapters::InMemoryAdapter) ||
69
+ defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
70
+ end
71
+
72
+ before do
73
+ pending if @no_join
74
+ end
75
+
76
+ before :all do
77
+ @default_value.each { |resource| resource.save }
78
+ @default_value_callable.each { |resource| resource.save }
79
+ end
80
+
81
+ describe 'acts like a subject' do
82
+ before do
83
+ @resource = @article_model.new(:title => 'DataMapper Rocks!', :body => 'TSIA')
84
+ end
85
+
86
+ it_should_behave_like 'A semipublic Subject'
87
+ end
88
+ end
89
+ end
@@ -22,15 +22,38 @@ describe 'Many to One Associations' do
22
22
 
23
23
  @user_model = User
24
24
  @comment_model = Comment
25
+
26
+ @default_value = @user_model.new(:name => 'dkubb', :age => 34, :description => 'Test')
27
+ @default_value_callable = @user_model.new(:name => 'jdoe', :age => 21, :description => 'Test')
28
+
29
+ @subject_without_default = @user_model.belongs_to(:without_default, @user_model, :required => false, :child_key => [ :without_default_id ])
30
+ @subject_with_default = @user_model.belongs_to(:with_default, @user_model, :required => false, :child_key => [ :with_default_id ], :default => @default_value)
31
+ @subject_with_default_callable = @user_model.belongs_to(:with_default_callable, @user_model, :required => false, :child_key => [ :with_default_callable_id ], :default => lambda { |resource, relationship| @default_value_callable })
32
+
33
+ @default_value.with_default = nil
34
+ @default_value.with_default_callable = nil
25
35
  end
26
36
 
27
37
  supported_by :all do
28
38
  before :all do
29
- comment = @comment_model.create(:user => User.create(:name => 'dbussink', :age => 25, :description => 'Test'))
39
+ @default_value.save
40
+ @default_value_callable.save
41
+ end
42
+
43
+ before :all do
44
+ comment = @comment_model.create(:user => { :name => 'dbussink', :age => 25, :description => 'Test' })
30
45
 
31
46
  @user = @comment_model.get(*comment.key).user
32
47
  end
33
48
 
34
49
  it_should_behave_like 'A semipublic Resource'
50
+
51
+ describe 'acts like a subject' do
52
+ before do
53
+ @resource = @user_model.new(:name => 'A subject')
54
+ end
55
+
56
+ it_should_behave_like 'A semipublic Subject'
57
+ end
35
58
  end
36
59
  end
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
+
3
+ describe 'One to Many Associations' do
4
+ before :all do
5
+ module ::Blog
6
+ class Article
7
+ include DataMapper::Resource
8
+
9
+ property :title, String, :key => true
10
+ property :body, Text, :required => true
11
+ end
12
+
13
+ class Author
14
+ include DataMapper::Resource
15
+
16
+ property :name, String, :key => true
17
+
18
+ belongs_to :without_default, 'Article', :child_key => [ :without_default_id ], :required => false
19
+ belongs_to :with_default, 'Article', :child_key => [ :with_default_id ], :required => false
20
+ belongs_to :with_default_callable, 'Article', :child_key => [ :with_default_callable_id ], :required => false
21
+ end
22
+ end
23
+
24
+ @article_model = Blog::Article
25
+ @author_model = Blog::Author
26
+
27
+ n = @article_model.n
28
+
29
+ @default_value = [ @author_model.new(:name => 'Dan Kubb') ]
30
+ @default_value_callable = [ @author_model.new(:name => 'John Doe') ]
31
+
32
+ @subject_without_default = @article_model.has(n, :without_default, @author_model, :child_key => [ :without_default_id ])
33
+ @subject_with_default = @article_model.has(n, :with_default, @author_model, :child_key => [ :with_default_id ], :default => @default_value)
34
+ @subject_with_default_callable = @article_model.has(n, :with_default_callable, @author_model, :child_key => [ :with_default_callable_id ], :default => lambda { |resource, relationship| @default_value_callable })
35
+ end
36
+
37
+ supported_by :all do
38
+ before :all do
39
+ @default_value.each { |resource| resource.save }
40
+ @default_value_callable.each { |resource| resource.save }
41
+ end
42
+
43
+ describe 'acts like a subject' do
44
+ before do
45
+ @resource = @article_model.new(:title => 'DataMapper Rocks!', :body => 'TSIA')
46
+ end
47
+
48
+ it_should_behave_like 'A semipublic Subject'
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
+
3
+ describe 'One to One Associations' do
4
+ before :all do
5
+ module ::Blog
6
+ class Article
7
+ include DataMapper::Resource
8
+
9
+ property :title, String, :key => true
10
+ property :body, Text, :required => true
11
+ end
12
+
13
+ class Author
14
+ include DataMapper::Resource
15
+
16
+ property :name, String, :key => true
17
+
18
+ belongs_to :without_default, 'Article', :child_key => [ :without_default_id ], :required => false
19
+ belongs_to :with_default, 'Article', :child_key => [ :with_default_id ], :required => false
20
+ belongs_to :with_default_callable, 'Article', :child_key => [ :with_default_callable_id ], :required => false
21
+ end
22
+ end
23
+
24
+ @article_model = Blog::Article
25
+ @author_model = Blog::Author
26
+
27
+ @default_value = @author_model.new(:name => 'Dan Kubb')
28
+ @default_value_callable = @author_model.new(:name => 'John Doe')
29
+
30
+ @subject_without_default = @article_model.has(1, :without_default, @author_model, :child_key => [ :without_default_id ])
31
+ @subject_with_default = @article_model.has(1, :with_default, @author_model, :child_key => [ :with_default_id ], :default => @default_value)
32
+ @subject_with_default_callable = @article_model.has(1, :with_default_callable, @author_model, :child_key => [ :with_default_callable_id ], :default => lambda { |resource, relationship| @default_value_callable })
33
+ end
34
+
35
+ supported_by :all do
36
+ before :all do
37
+ @default_value.save
38
+ @default_value_callable.save
39
+ end
40
+
41
+ describe 'acts like a subject' do
42
+ before do
43
+ @resource = @article_model.new(:title => 'DataMapper Rocks!', :body => 'TSIA')
44
+ end
45
+
46
+ it_should_behave_like 'A semipublic Subject'
47
+ end
48
+ end
49
+ end
@@ -166,7 +166,7 @@ describe DataMapper::Associations::Relationship do
166
166
  end
167
167
 
168
168
  it 'should return true' do
169
- @relationship.valid?(@resource).should be_true
169
+ @relationship.valid?(@resource).should be(true)
170
170
  end
171
171
  end
172
172
 
@@ -176,7 +176,7 @@ describe DataMapper::Associations::Relationship do
176
176
  end
177
177
 
178
178
  it 'should return false' do
179
- @relationship.valid?(@resource).should be_false
179
+ @relationship.valid?(@resource).should be(false)
180
180
  end
181
181
  end
182
182
 
@@ -186,7 +186,7 @@ describe DataMapper::Associations::Relationship do
186
186
  end
187
187
 
188
188
  it 'should return false' do
189
- @relationship.valid?(@resource).should be_false
189
+ @relationship.valid?(@resource).should be(false)
190
190
  end
191
191
  end
192
192
  end
@@ -171,7 +171,7 @@ describe DataMapper::Associations do
171
171
  end
172
172
 
173
173
  it 'should return a Relationship that is required' do
174
- @relationship.required?.should be_true
174
+ @relationship.required?.should be(true)
175
175
  end
176
176
  end
177
177
  end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Binary do
4
+ before :all do
5
+ @name = :title
6
+ @type = DataMapper::Property::Binary
7
+ @value = 'value'
8
+ @other_value = 'return value'
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_should_behave_like "A semipublic Property"
13
+ end
@@ -0,0 +1,65 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Boolean do
4
+ before :all do
5
+ @name = :active
6
+ @type = DataMapper::Property::Boolean
7
+ @value = true
8
+ @other_value = false
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_should_behave_like "A semipublic Property"
13
+
14
+ describe '#load' do
15
+ before :all do
16
+ @value = mock('value')
17
+ end
18
+
19
+ subject { @property.load(@value) }
20
+
21
+ before do
22
+ @property = @type.new(@model, @name)
23
+ end
24
+
25
+ it 'should delegate to #type.load' do
26
+ return_value = mock('return value')
27
+ @property.should_receive(:load).with(@value).and_return(return_value)
28
+ should == return_value
29
+ end
30
+ end
31
+
32
+ describe '#valid?' do
33
+ [ true, false ].each do |value|
34
+ it "returns true when value is #{value.inspect}" do
35
+ @property.valid?(value).should be(true)
36
+ end
37
+ end
38
+
39
+ [ 'true', 'TRUE', '1', 1, 't', 'T', 'false', 'FALSE', '0', 0, 'f', 'F' ].each do |value|
40
+ it "returns false for #{value.inspect}" do
41
+ @property.valid?(value).should be(false)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#typecast_to_primitive' do
47
+ [ true, 'true', 'TRUE', '1', 1, 't', 'T' ].each do |value|
48
+ it "returns true when value is #{value.inspect}" do
49
+ @property.typecast(value).should be(true)
50
+ end
51
+ end
52
+
53
+ [ false, 'false', 'FALSE', '0', 0, 'f', 'F' ].each do |value|
54
+ it "returns false when value is #{value.inspect}" do
55
+ @property.typecast(value).should be(false)
56
+ end
57
+ end
58
+
59
+ [ 'string', 2, 1.0, BigDecimal('1.0'), DateTime.now, Time.now, Date.today, Class, Object.new, ].each do |value|
60
+ it "does not typecast value #{value.inspect}" do
61
+ @property.typecast(value).should equal(value)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Class do
4
+ before :all do
5
+ Object.send(:remove_const, :Foo) if defined?(Foo)
6
+ Object.send(:remove_const, :Bar) if defined?(Bar)
7
+
8
+ class ::Foo; end
9
+ class ::Bar; end
10
+
11
+ @name = :type
12
+ @type = DataMapper::Property::Class
13
+ @value = Foo
14
+ @other_value = Bar
15
+ @invalid_value = 1
16
+ end
17
+
18
+ it_should_behave_like "A semipublic Property"
19
+
20
+ describe '#typecast_to_primitive' do
21
+ it 'returns same value if a class' do
22
+ @property.typecast(@model).should equal(@model)
23
+ end
24
+
25
+ it 'returns the class if found' do
26
+ @property.typecast(@model.name).should eql(@model)
27
+ end
28
+
29
+ it 'does not typecast non-class values' do
30
+ @property.typecast('NoClass').should eql('NoClass')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Date do
4
+ before :all do
5
+ @name = :created_on
6
+ @type = DataMapper::Property::Date
7
+ @value = Date.today
8
+ @other_value = Date.today+1
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_should_behave_like "A semipublic Property"
13
+
14
+ describe '#typecast_to_primitive' do
15
+ describe 'and value given as a hash with keys like :year, :month, etc' do
16
+ it 'builds a Date instance from hash values' do
17
+ result = @property.typecast(
18
+ 'year' => '2007',
19
+ 'month' => '3',
20
+ 'day' => '25'
21
+ )
22
+
23
+ result.should be_kind_of(Date)
24
+ result.year.should eql(2007)
25
+ result.month.should eql(3)
26
+ result.day.should eql(25)
27
+ end
28
+ end
29
+
30
+ describe 'and value is a string' do
31
+ it 'parses the string' do
32
+ result = @property.typecast('Dec 20th, 2006')
33
+ result.month.should == 12
34
+ result.day.should == 20
35
+ result.year.should == 2006
36
+ end
37
+ end
38
+
39
+ it 'does not typecast non-date values' do
40
+ @property.typecast('not-date').should eql('not-date')
41
+ end
42
+ end
43
+ end