dm-core 0.10.2 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,14 @@
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
+ @primitive = String
8
+ @value = 'value'
9
+ @other_value = 'return value'
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,14 @@
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
+ @primitive = TrueClass
8
+ @value = true
9
+ @other_value = false
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,20 @@
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
+ @primitive = Class
14
+ @value = Foo
15
+ @other_value = Bar
16
+ @invalid_value = 1
17
+ end
18
+
19
+ it_should_behave_like "A public Property"
20
+ end
@@ -0,0 +1,14 @@
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
+ @primitive = Date
8
+ @value = Date.today
9
+ @other_value = Date.today+1
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::DateTime do
4
+ before :all do
5
+ @name = :created_at
6
+ @type = DataMapper::Property::DateTime
7
+ @primitive = DateTime
8
+ @value = DateTime.now
9
+ @other_value = DateTime.now+15
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Decimal do
4
+ before :all do
5
+ @name = :rate
6
+ @type = DataMapper::Property::Decimal
7
+ @primitive = BigDecimal
8
+ @value = BigDecimal('1.0')
9
+ @other_value = BigDecimal('2.0')
10
+ @invalid_value = true
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
2
 
3
- describe DataMapper::Types::Discriminator do
3
+ describe DataMapper::Property::Discriminator do
4
4
  before :all do
5
5
  module ::Blog
6
6
  class Article
@@ -98,17 +98,7 @@ describe DataMapper::Types::Discriminator do
98
98
 
99
99
  supported_by :all do
100
100
  before :all do
101
- @skip = defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
102
- end
103
-
104
- before do
105
- pending if @skip
106
- end
107
-
108
- before :all do
109
- rescue_if 'TODO: fix YAML serialization/deserialization', @skip do
110
- @announcement = @announcement_model.create(:title => 'Announcement')
111
- end
101
+ @announcement = @announcement_model.create(:title => 'Announcement')
112
102
  end
113
103
 
114
104
  it 'should persist the type' do
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Float do
4
+ before :all do
5
+ @name = :rating
6
+ @type = DataMapper::Property::Float
7
+ @primitive = Float
8
+ @value = 0.1
9
+ @other_value = 0.2
10
+ @invalid_value = '1'
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Integer do
4
+ before :all do
5
+ @name = :age
6
+ @type = DataMapper::Property::Integer
7
+ @primitive = Integer
8
+ @value = 1
9
+ @other_value = 2
10
+ @invalid_value = '1'
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -32,19 +32,19 @@ describe DataMapper::Property, 'Object type' do
32
32
 
33
33
  it { should respond_to(:value) }
34
34
 
35
- describe '#value' do
35
+ describe '#dump' do
36
36
  describe 'with a value' do
37
37
  before do
38
38
  @value = { 'lang' => 'en_CA' }
39
39
  end
40
40
 
41
- subject { @property.value(@value) }
41
+ subject { @property.dump(@value) }
42
42
 
43
- it { @property.type.load(subject, @property).should == @value }
43
+ it { @property.load(subject).should == @value }
44
44
  end
45
45
 
46
46
  describe 'with nil' do
47
- subject { @property.value(nil) }
47
+ subject { @property.dump(nil) }
48
48
 
49
49
  it { should be_nil }
50
50
  end
@@ -56,7 +56,7 @@ describe DataMapper::Property, 'Object type' do
56
56
  describe 'with a valid primitive' do
57
57
  subject { @property.valid?('lang' => 'en_CA') }
58
58
 
59
- it { should be_true }
59
+ it { should be(true) }
60
60
  end
61
61
 
62
62
  describe 'with nil and property is not required' do
@@ -66,28 +66,24 @@ describe DataMapper::Property, 'Object type' do
66
66
 
67
67
  subject { @property.valid?(nil) }
68
68
 
69
- it { should be_true }
69
+ it { should be(true) }
70
70
  end
71
71
 
72
72
  describe 'with nil and property is required' do
73
73
  subject { @property.valid?(nil) }
74
74
 
75
- it { should be_false }
75
+ it { should be(false) }
76
76
  end
77
77
 
78
78
  describe 'with nil and property is required, but validity is negated' do
79
79
  subject { @property.valid?(nil, true) }
80
80
 
81
- it { should be_true }
81
+ it { should be(true) }
82
82
  end
83
83
  end
84
84
 
85
85
  describe 'persistable' do
86
86
  supported_by :all do
87
- before :all do
88
- @do_adapter = defined?(DataMapper::Adapters::DataObjectsAdapter) && @adapter.kind_of?(DataMapper::Adapters::DataObjectsAdapter)
89
- end
90
-
91
87
  before :all do
92
88
  @resource = @model.create(:title => 'Test', :meta => { 'lang' => 'en_CA' })
93
89
  end
@@ -95,11 +91,7 @@ describe DataMapper::Property, 'Object type' do
95
91
  subject { @resource.reload.meta }
96
92
 
97
93
  it 'should load the correct value' do
98
- pending_if 'Fix adapters to use different serialization methods', !@do_adapter do
99
- pending_if 'Fix DO adapter to send String for Text primitive', !!(RUBY_PLATFORM =~ /java/) do
100
- should == { 'lang' => 'en_CA' }
101
- end
102
- end
94
+ should == { 'lang' => 'en_CA' }
103
95
  end
104
96
  end
105
97
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Serial do
4
+ before :all do
5
+ @name = :id
6
+ @type = DataMapper::Property::Serial
7
+ @primitive = Integer
8
+ @value = 1
9
+ @other_value = 2
10
+ @invalid_value = 'foo'
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::String do
4
+ before :all do
5
+ @name = :name
6
+ @type = DataMapper::Property::String
7
+ @primitive = String
8
+ @value = 'value'
9
+ @other_value = 'return value'
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Text do
4
+ before :all do
5
+ @name = :title
6
+ @type = DataMapper::Property::Text
7
+ @primitive = String
8
+ @value = 'value'
9
+ @other_value = 'return value'
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+
15
+ describe 'migration with an index' do
16
+ supported_by :all do
17
+ before do
18
+ @model = DataMapper::Model.new do
19
+ storage_names[:default] = 'anonymous'
20
+
21
+ property :id, DataMapper::Property::Serial
22
+ property :body, DataMapper::Property::Text, :index => true
23
+ end
24
+ end
25
+
26
+ it 'should allow a migration' do
27
+ lambda {
28
+ @model.auto_migrate!
29
+ }.should_not raise_error(DataObjects::SyntaxError)
30
+ end
31
+ end
32
+ end if defined?(DataObjects::SyntaxError)
33
+
34
+ describe 'migration with a unique index' do
35
+ supported_by :all do
36
+ before do
37
+ @model = DataMapper::Model.new do
38
+ storage_names[:default] = 'anonymous'
39
+
40
+ property :id, DataMapper::Property::Serial
41
+ property :body, DataMapper::Property::Text, :unique_index => true
42
+ end
43
+ end
44
+
45
+ it 'should allow a migration' do
46
+ lambda {
47
+ @model.auto_migrate!
48
+ }.should_not raise_error(DataObjects::SyntaxError)
49
+ end
50
+ end
51
+ end if defined?(DataObjects::SyntaxError)
52
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../..', 'spec_helper'))
2
+
3
+ describe DataMapper::Property::Time do
4
+ before :all do
5
+ @name = :deleted_at
6
+ @type = DataMapper::Property::Time
7
+ @primitive = Time
8
+ @value = Time.now
9
+ @other_value = Time.now+15
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_should_behave_like "A public Property"
14
+ end
@@ -69,36 +69,6 @@ describe DataMapper::Property do
69
69
  end
70
70
  end
71
71
 
72
- describe '#get' do
73
- before :all do
74
- @image = Image.create(:md5hash => '5268f0f3f452844c79843e820f998869',
75
- :title => 'Rome at the sunset',
76
- :description => 'Just wow')
77
-
78
- @image.should be_saved
79
-
80
- @image = Image.first(:fields => [ :md5hash, :title ], :md5hash => @image.md5hash)
81
- end
82
-
83
- it 'triggers loading for lazy loaded properties' do
84
- Image.properties[:description].get(@image)
85
- Image.properties[:description].loaded?(@image).should be(true)
86
- end
87
-
88
- it 'assigns loaded value to @ivar' do
89
- Image.properties[:description].get(@image)
90
- @image.instance_variable_get(:@description).should == 'Just wow'
91
- end
92
-
93
- it 'sets default value for new records with nil value' do
94
- Image.properties[:format].get(@image).should == 'jpeg'
95
- end
96
-
97
- it 'returns property value' do
98
- Image.properties[:description].get(@image).should == 'Just wow'
99
- end
100
- end
101
-
102
72
  describe '#get!' do
103
73
  before :all do
104
74
  @image = Image.new
@@ -116,7 +86,7 @@ describe DataMapper::Property do
116
86
 
117
87
  describe '#index' do
118
88
  it 'returns true when property has an index' do
119
- Track.properties[:title].index.should be_true
89
+ Track.properties[:title].index.should be(true)
120
90
  end
121
91
 
122
92
  it 'returns index name when property has a named index' do
@@ -155,27 +125,27 @@ describe DataMapper::Property do
155
125
  describe '#key?' do
156
126
  describe 'returns true when property is a ' do
157
127
  it 'serial key' do
158
- Track.properties[:id].key?.should be_true
128
+ Track.properties[:id].key?.should be(true)
159
129
  end
160
130
  it 'natural key' do
161
- Image.properties[:md5hash].key?.should be_true
131
+ Image.properties[:md5hash].key?.should be(true)
162
132
  end
163
133
  end
164
134
 
165
135
  it 'returns true when property is a part of composite key'
166
136
 
167
137
  it 'returns false when property does not relate to a key' do
168
- Track.properties[:title].key?.should be_false
138
+ Track.properties[:title].key?.should be(false)
169
139
  end
170
140
  end
171
141
 
172
142
  describe '#lazy?' do
173
143
  it 'returns true when property is lazy loaded' do
174
- Image.properties[:description].lazy?.should be_true
144
+ Image.properties[:description].lazy?.should be(true)
175
145
  end
176
146
 
177
147
  it 'returns false when property is not lazy loaded' do
178
- Track.properties[:artist].lazy?.should be_false
148
+ Track.properties[:artist].lazy?.should be(false)
179
149
  end
180
150
  end
181
151
 
@@ -257,59 +227,21 @@ describe DataMapper::Property do
257
227
 
258
228
  describe '#allow_nil?' do
259
229
  it 'returns true when property can accept nil as its value' do
260
- Track.properties[:artist].allow_nil?.should be_true
230
+ Track.properties[:artist].allow_nil?.should be(true)
261
231
  end
262
232
 
263
233
  it 'returns false when property nil value is prohibited for this property' do
264
- Image.properties[:title].allow_nil?.should be_false
234
+ Image.properties[:title].allow_nil?.should be(false)
265
235
  end
266
236
  end
267
237
 
268
238
  describe '#serial?' do
269
239
  it 'returns true when property is serial (auto incrementing)' do
270
- Track.properties[:id].serial?.should be_true
240
+ Track.properties[:id].serial?.should be(true)
271
241
  end
272
242
 
273
243
  it 'returns false when property is NOT serial (auto incrementing)' do
274
- Image.properties[:md5hash].serial?.should be_false
275
- end
276
- end
277
-
278
- # What's going on here:
279
- #
280
- # we first set original value and make an assertion on it
281
- # then we try to set it again, which clears original value
282
- # (since original value is set, property is no longer dirty)
283
- describe '#set_original_value' do
284
- before :all do
285
- @image = Image.create(
286
- :md5hash => '5268f0f3f452844c79843e820f998869',
287
- :title => 'Rome at the sunset',
288
- :description => 'Just wow'
289
- )
290
-
291
- @property = Image.properties[:title]
292
- end
293
-
294
- describe 'when value changes' do
295
- before :all do
296
- @property.set_original_value(@image, 'New title')
297
- end
298
-
299
- it 'sets original value of the property' do
300
- @image.original_attributes[@property].should == 'Rome at the sunset'
301
- end
302
- end
303
-
304
- describe 'when value stays the same' do
305
- before :all do
306
- @property.set_original_value(@image, 'Rome at the sunset')
307
- end
308
-
309
- it 'only sets original value when it has changed' do
310
- @property.set_original_value(@image, 'Rome at the sunset')
311
- @image.original_attributes.should_not have_key(@property)
312
- end
244
+ Image.properties[:md5hash].serial?.should be(false)
313
245
  end
314
246
  end
315
247
 
@@ -334,11 +266,6 @@ describe DataMapper::Property do
334
266
  @image.title.should == 'http://test.example/'
335
267
  end
336
268
 
337
- it 'stores original value' do
338
- @property.set(@image, 'Updated value')
339
- @image.original_attributes[@property].should == 'Rome at the sunset'
340
- end
341
-
342
269
  it 'sets new property value' do
343
270
  @property.set(@image, 'Updated value')
344
271
  @image.title.should == 'Updated value'
@@ -362,28 +289,42 @@ describe DataMapper::Property do
362
289
 
363
290
  describe '#unique?' do
364
291
  it 'is true for fields that explicitly given uniq index' do
365
- Track.properties[:musicbrainz_hash].unique?.should be_true
292
+ Track.properties[:musicbrainz_hash].unique?.should be(true)
366
293
  end
367
294
 
368
295
  it 'is true for serial fields' do
369
296
  pending do
370
- Track.properties[:title].unique?.should be_true
297
+ Track.properties[:title].unique?.should be(true)
371
298
  end
372
299
  end
373
300
 
374
301
  it 'is true for keys' do
375
- Image.properties[:md5hash].unique?.should be_true
302
+ Image.properties[:md5hash].unique?.should be(true)
376
303
  end
377
304
  end
378
305
 
379
306
  describe '#unique_index' do
380
307
  it 'returns true when property has unique index' do
381
- Track.properties[:musicbrainz_hash].unique_index.should be_true
308
+ Track.properties[:musicbrainz_hash].unique_index.should be(true)
382
309
  end
383
310
 
384
311
  it 'returns nil when property has no unique index' do
385
312
  Image.properties[:title].unique_index.should be_nil
386
313
  end
387
314
  end
315
+
316
+ describe "exception on bad property names" do
317
+ it "is raised for 'model'" do
318
+ lambda {
319
+ Track.property :model, String
320
+ }.should raise_error(ArgumentError)
321
+ end
322
+
323
+ it "is raised for 'repository_name'" do
324
+ lambda {
325
+ Track.property :repository_name, String
326
+ }.should raise_error(ArgumentError)
327
+ end
328
+ end
388
329
  end
389
330
  end # DataMapper::Property