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
@@ -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