datamapper 0.3.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/History.txt +0 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +11 -0
  4. data/Rakefile +70 -0
  5. data/lib/datamapper.rb +8 -0
  6. metadata +152 -319
  7. data/CHANGELOG +0 -145
  8. data/FAQ +0 -96
  9. data/MIT-LICENSE +0 -22
  10. data/QUICKLINKS +0 -12
  11. data/README +0 -105
  12. data/environment.rb +0 -62
  13. data/example.rb +0 -156
  14. data/lib/data_mapper.rb +0 -88
  15. data/lib/data_mapper/adapters/abstract_adapter.rb +0 -43
  16. data/lib/data_mapper/adapters/data_object_adapter.rb +0 -480
  17. data/lib/data_mapper/adapters/mysql_adapter.rb +0 -72
  18. data/lib/data_mapper/adapters/postgresql_adapter.rb +0 -258
  19. data/lib/data_mapper/adapters/sql/coersion.rb +0 -134
  20. data/lib/data_mapper/adapters/sql/commands/load_command.rb +0 -545
  21. data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +0 -34
  22. data/lib/data_mapper/adapters/sql/mappings/column.rb +0 -279
  23. data/lib/data_mapper/adapters/sql/mappings/conditions.rb +0 -172
  24. data/lib/data_mapper/adapters/sql/mappings/schema.rb +0 -60
  25. data/lib/data_mapper/adapters/sql/mappings/table.rb +0 -459
  26. data/lib/data_mapper/adapters/sql/quoting.rb +0 -24
  27. data/lib/data_mapper/adapters/sqlite3_adapter.rb +0 -159
  28. data/lib/data_mapper/associations.rb +0 -106
  29. data/lib/data_mapper/associations/belongs_to_association.rb +0 -160
  30. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +0 -437
  31. data/lib/data_mapper/associations/has_many_association.rb +0 -283
  32. data/lib/data_mapper/associations/has_n_association.rb +0 -143
  33. data/lib/data_mapper/associations/reference.rb +0 -47
  34. data/lib/data_mapper/attributes.rb +0 -73
  35. data/lib/data_mapper/auto_migrations.rb +0 -36
  36. data/lib/data_mapper/base.rb +0 -17
  37. data/lib/data_mapper/callbacks.rb +0 -107
  38. data/lib/data_mapper/context.rb +0 -112
  39. data/lib/data_mapper/database.rb +0 -234
  40. data/lib/data_mapper/dependency_queue.rb +0 -28
  41. data/lib/data_mapper/embedded_value.rb +0 -145
  42. data/lib/data_mapper/identity_map.rb +0 -47
  43. data/lib/data_mapper/is/tree.rb +0 -121
  44. data/lib/data_mapper/migration.rb +0 -155
  45. data/lib/data_mapper/persistence.rb +0 -852
  46. data/lib/data_mapper/property.rb +0 -310
  47. data/lib/data_mapper/query.rb +0 -164
  48. data/lib/data_mapper/support/blank.rb +0 -35
  49. data/lib/data_mapper/support/connection_pool.rb +0 -117
  50. data/lib/data_mapper/support/enumerable.rb +0 -35
  51. data/lib/data_mapper/support/errors.rb +0 -16
  52. data/lib/data_mapper/support/inflector.rb +0 -265
  53. data/lib/data_mapper/support/object.rb +0 -54
  54. data/lib/data_mapper/support/serialization.rb +0 -96
  55. data/lib/data_mapper/support/silence.rb +0 -10
  56. data/lib/data_mapper/support/string.rb +0 -72
  57. data/lib/data_mapper/support/struct.rb +0 -7
  58. data/lib/data_mapper/support/symbol.rb +0 -82
  59. data/lib/data_mapper/support/typed_set.rb +0 -65
  60. data/lib/data_mapper/types/base.rb +0 -44
  61. data/lib/data_mapper/types/string.rb +0 -34
  62. data/lib/data_mapper/validatable_extensions/errors.rb +0 -12
  63. data/lib/data_mapper/validatable_extensions/macros.rb +0 -7
  64. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +0 -62
  65. data/lib/data_mapper/validatable_extensions/validation_base.rb +0 -18
  66. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +0 -43
  67. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +0 -7
  68. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +0 -7
  69. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +0 -7
  70. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +0 -28
  71. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +0 -15
  72. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +0 -7
  73. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +0 -7
  74. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +0 -7
  75. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +0 -40
  76. data/lib/data_mapper/validations.rb +0 -20
  77. data/lib/data_mapper/validations/number_validator.rb +0 -40
  78. data/lib/data_mapper/validations/string_validator.rb +0 -20
  79. data/lib/data_mapper/validations/validator.rb +0 -13
  80. data/performance.rb +0 -307
  81. data/plugins/can_has_sphinx/LICENSE +0 -23
  82. data/plugins/can_has_sphinx/README +0 -4
  83. data/plugins/can_has_sphinx/REVISION +0 -1
  84. data/plugins/can_has_sphinx/Rakefile +0 -22
  85. data/plugins/can_has_sphinx/init.rb +0 -1
  86. data/plugins/can_has_sphinx/install.rb +0 -1
  87. data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +0 -123
  88. data/plugins/can_has_sphinx/lib/sphinx.rb +0 -460
  89. data/plugins/can_has_sphinx/scripts/sphinx.sh +0 -47
  90. data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +0 -41
  91. data/profile_data_mapper.rb +0 -40
  92. data/rakefile.rb +0 -159
  93. data/spec/acts_as_tree_spec.rb +0 -67
  94. data/spec/adapters/data_object_adapter_spec.rb +0 -31
  95. data/spec/associations/belongs_to_association_spec.rb +0 -98
  96. data/spec/associations/has_and_belongs_to_many_association_spec.rb +0 -377
  97. data/spec/associations/has_many_association_spec.rb +0 -337
  98. data/spec/attributes_spec.rb +0 -52
  99. data/spec/auto_migrations_spec.rb +0 -101
  100. data/spec/callbacks_spec.rb +0 -186
  101. data/spec/can_has_sphinx.rb +0 -5
  102. data/spec/coersion_spec.rb +0 -41
  103. data/spec/column_spec.rb +0 -114
  104. data/spec/count_command_spec.rb +0 -45
  105. data/spec/database_spec.rb +0 -18
  106. data/spec/dataobjects_spec.rb +0 -27
  107. data/spec/delete_command_spec.rb +0 -11
  108. data/spec/dependency_spec.rb +0 -29
  109. data/spec/embedded_value_spec.rb +0 -161
  110. data/spec/fixtures/animals.yaml +0 -33
  111. data/spec/fixtures/animals_exhibits.yaml +0 -2
  112. data/spec/fixtures/careers.yaml +0 -5
  113. data/spec/fixtures/comments.yaml +0 -1
  114. data/spec/fixtures/exhibits.yaml +0 -90
  115. data/spec/fixtures/fruit.yaml +0 -6
  116. data/spec/fixtures/people.yaml +0 -37
  117. data/spec/fixtures/posts.yaml +0 -3
  118. data/spec/fixtures/projects.yaml +0 -13
  119. data/spec/fixtures/sections.yaml +0 -5
  120. data/spec/fixtures/serializers.yaml +0 -6
  121. data/spec/fixtures/tasks.yaml +0 -6
  122. data/spec/fixtures/tasks_tasks.yaml +0 -2
  123. data/spec/fixtures/tomatoes.yaml +0 -1
  124. data/spec/fixtures/users.yaml +0 -1
  125. data/spec/fixtures/zoos.yaml +0 -24
  126. data/spec/is_a_tree_spec.rb +0 -149
  127. data/spec/legacy_spec.rb +0 -16
  128. data/spec/load_command_spec.rb +0 -322
  129. data/spec/magic_columns_spec.rb +0 -26
  130. data/spec/migration_spec.rb +0 -267
  131. data/spec/mock_adapter.rb +0 -20
  132. data/spec/models/animal.rb +0 -12
  133. data/spec/models/candidate.rb +0 -8
  134. data/spec/models/career.rb +0 -7
  135. data/spec/models/chain.rb +0 -8
  136. data/spec/models/comment.rb +0 -6
  137. data/spec/models/exhibit.rb +0 -14
  138. data/spec/models/fence.rb +0 -7
  139. data/spec/models/fruit.rb +0 -8
  140. data/spec/models/job.rb +0 -8
  141. data/spec/models/person.rb +0 -30
  142. data/spec/models/post.rb +0 -14
  143. data/spec/models/project.rb +0 -41
  144. data/spec/models/sales_person.rb +0 -5
  145. data/spec/models/section.rb +0 -8
  146. data/spec/models/serializer.rb +0 -5
  147. data/spec/models/task.rb +0 -9
  148. data/spec/models/tomato.rb +0 -27
  149. data/spec/models/user.rb +0 -12
  150. data/spec/models/zoo.rb +0 -13
  151. data/spec/natural_key_spec.rb +0 -36
  152. data/spec/paranoia_spec.rb +0 -38
  153. data/spec/persistence_spec.rb +0 -479
  154. data/spec/postgres_spec.rb +0 -96
  155. data/spec/property_spec.rb +0 -151
  156. data/spec/query_spec.rb +0 -77
  157. data/spec/save_command_spec.rb +0 -94
  158. data/spec/schema_spec.rb +0 -8
  159. data/spec/serialize_spec.rb +0 -19
  160. data/spec/single_table_inheritance_spec.rb +0 -43
  161. data/spec/spec_helper.rb +0 -45
  162. data/spec/support/blank_spec.rb +0 -8
  163. data/spec/support/inflector_spec.rb +0 -41
  164. data/spec/support/object_spec.rb +0 -9
  165. data/spec/support/serialization_spec.rb +0 -61
  166. data/spec/support/silence_spec.rb +0 -15
  167. data/spec/support/string_spec.rb +0 -7
  168. data/spec/support/struct_spec.rb +0 -12
  169. data/spec/support/typed_set_spec.rb +0 -66
  170. data/spec/symbolic_operators_spec.rb +0 -27
  171. data/spec/table_spec.rb +0 -79
  172. data/spec/types/string.rb +0 -81
  173. data/spec/validates_confirmation_of_spec.rb +0 -55
  174. data/spec/validates_format_of_spec.rb +0 -78
  175. data/spec/validates_length_of_spec.rb +0 -117
  176. data/spec/validates_uniqueness_of_spec.rb +0 -92
  177. data/spec/validations/number_validator.rb +0 -59
  178. data/spec/validations/string_validator.rb +0 -14
  179. data/spec/validations_spec.rb +0 -141
  180. data/tasks/fixtures.rb +0 -53
@@ -1,41 +0,0 @@
1
- class Project #< DataMapper::Base # please do not remove this
2
- include DataMapper::Persistence
3
-
4
- property :title, :string
5
- property :description, :string
6
- property :deleted_at, :datetime
7
-
8
- has_many :sections
9
-
10
- before_create :create_main_section
11
-
12
- def tickets
13
- return [] if sections.empty?
14
- sections.map { |section| section.tickets }
15
- end
16
-
17
-
18
- def set_us_up_the_bomb=(val)
19
- @set_us_up_the_bomb = !val.blank?
20
- end
21
-
22
- def set_up_for_bomb?
23
- @set_us_up_the_bomb
24
- end
25
-
26
- def wery_sneaky?
27
- @be_wery_sneaky
28
- end
29
-
30
-
31
- private
32
-
33
- def create_main_section
34
- sections << Section.find_or_create(:title => "Main") if sections.empty?
35
- end
36
-
37
- def be_wery_sneaky=(val)
38
- @be_wery_sneaky = val
39
- end
40
-
41
- end
@@ -1,5 +0,0 @@
1
- require File.dirname(__FILE__) + '/person'
2
-
3
- class SalesPerson < Person
4
- property :commission, :integer
5
- end
@@ -1,8 +0,0 @@
1
- class Section #< DataMapper::Base # please do not remove this
2
- include DataMapper::Persistence
3
-
4
- property :title, :string
5
- property :created_at, :datetime
6
-
7
- belongs_to :project
8
- end
@@ -1,5 +0,0 @@
1
- class Serializer #< DataMapper::Base # please do not remove this
2
- include DataMapper::Persistence
3
-
4
- property :content, :object, :lazy => false
5
- end
@@ -1,9 +0,0 @@
1
- class Task #< DataMapper::Base # please do not remove this
2
- include DataMapper::Persistence
3
-
4
- property :name, :string, :default => "No Name", :index => :unique
5
- property :notes, :string
6
- property :completed, :boolean, :default => false
7
-
8
- has_and_belongs_to_many :tasks
9
- end
@@ -1,27 +0,0 @@
1
- class Tomato
2
- include DataMapper::Persistence
3
-
4
- ATTRIBUTES << :bruised
5
-
6
- def initialize(details = nil)
7
- super
8
-
9
- @name = 'Ugly'
10
- @init_run = true
11
- @bruised = true
12
- end
13
-
14
- def initialized?
15
- @init_run
16
- end
17
-
18
- property :name, :string
19
-
20
- def heal!
21
- @bruised = false
22
- end
23
-
24
- def bruised?
25
- @bruised
26
- end
27
- end
@@ -1,12 +0,0 @@
1
- # This uses the inheritance method of declaring
2
- # a model to boost spec coverage and ensure that the to
3
- # ways of declaring a model are compatible within the
4
- # same project and/or object graphs.
5
- class User < DataMapper::Base
6
-
7
- property :name, :string
8
- property :email, :string, :format => :email_address
9
- has_many :comments, :class => 'Comment', :foreign_key => 'user_id'
10
-
11
- after_create { false }
12
- end
@@ -1,13 +0,0 @@
1
- class Zoo #< DataMapper::Base # please do not remove this
2
- include DataMapper::Persistence
3
-
4
- property :name, :string, :nullable => false, :default => "Zoo"
5
- property :notes, :text
6
- property :updated_at, :datetime
7
-
8
- has_many :exhibits
9
-
10
- def name=(val)
11
- @name = (val == "Colorado Springs") ? "Cheyenne Mountain" : val
12
- end
13
- end
@@ -1,36 +0,0 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
2
-
3
- describe('A Natural Key') do
4
-
5
- it "should cause the Table to return a default foreign key composed of it's table and key column name" do
6
- database.table(Person).default_foreign_key.should eql('person_id')
7
- database.table(Career).default_foreign_key.should eql('career_name')
8
- end
9
-
10
- it "should load the object based on it's natural key" do
11
- programmer = Career['Programmer']
12
- programmer.should_not be_nil
13
- programmer.name.should eql('Programmer')
14
- programmer.attributes.should include(:name)
15
- end
16
-
17
- it "should load an association based on the natural key" do
18
- database do
19
- programmer = Career['Programmer']
20
- programmer.followers.should have(2).entries
21
-
22
- sam = Person.first(:name => 'Sam')
23
- scott = Person.first(:name => 'Scott')
24
-
25
- programmer.followers.should include(sam)
26
- programmer.followers.should include(scott)
27
-
28
- peon = Career['Peon']
29
- peon.followers.should have(1).entries
30
-
31
- bob = Person.first(:name => 'Bob')
32
- peon.followers.should include(bob)
33
- end
34
- end
35
-
36
- end
@@ -1,38 +0,0 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
2
-
3
- describe 'Paranoia' do
4
-
5
- before(:all) do
6
- class Scared #< DataMapper::Base # please do not remove this
7
- include DataMapper::Persistence
8
-
9
- property :name, :string
10
- property :deleted_at, :datetime
11
- end
12
-
13
- Scared.auto_migrate!
14
- end
15
-
16
- after(:all) do
17
- database.table(Scared).drop!
18
- end
19
-
20
- it "should not be found" do
21
- cat = Scared.create(:name => 'bob')
22
-
23
- database.query('SELECT name FROM scareds').should have(1).entries
24
-
25
- cat2 = Scared.first(:name => 'bob')
26
- cat2.should_not be_nil
27
- cat2.should be_a_kind_of(Scared)
28
-
29
- cat.destroy!
30
-
31
- Scared.first(:name => 'bob').should be_nil
32
-
33
- Scared.first.should be_nil
34
-
35
- database.query('SELECT name FROM scareds').should have(1).entries
36
- end
37
-
38
- end
@@ -1,479 +0,0 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
2
-
3
- describe "DataMapper::Persistence::ConvenienceMethods::ClassMethods" do
4
-
5
- before(:all) do
6
- fixtures(:animals)
7
- fixtures(:exhibits)
8
- end
9
-
10
- describe 'A record' do
11
- it 'should save and return true if validations pass' do
12
- count = Exhibit.count
13
- bugs_and_more_bugs = Exhibit.new(:name => 'Bugs And More Bugs')
14
- bugs_and_more_bugs.save.should be_true
15
- Exhibit.count.should == count + 1
16
- end
17
-
18
- it 'should return false on save if validations fail' do
19
- count = Exhibit.count
20
- bugs_and_more_bugs = Exhibit.new
21
- bugs_and_more_bugs.save.should be_false
22
- Exhibit.count.should == count
23
- end
24
-
25
- it 'should reload its attributes' do
26
- frog = Animal.first(:name => 'Frog')
27
- frog.name = 'MegaFrog'
28
- frog.name.should == 'MegaFrog'
29
- frog.reload!
30
- frog.name.should == 'Frog'
31
- end
32
-
33
- it "should prepare it's associations for reload" do
34
- chippy = Animal.first(:name => 'Cup')
35
- amazonia = Exhibit.first(:name => 'Amazonia')
36
- amazonia.animals << chippy
37
- amazonia.animals.should include(chippy)
38
- amazonia.reload!
39
- amazonia.animals.should_not include(chippy)
40
- end
41
-
42
- it 'should be destroyed!' do
43
- capybara = Animal.create(:name => 'Capybara')
44
- count = Animal.count
45
- capybara.destroy!
46
- Animal.first(:name => 'Capybara').should be_nil
47
- Animal.count.should == count - 1
48
- end
49
- end
50
-
51
- it 'should return the first match using find_or_create' do
52
- count = Animal.count
53
- frog = Animal.find_or_create(:name => 'Frog')
54
- frog.name.should == 'Frog'
55
- Animal.count.should == count
56
- end
57
-
58
- it 'should create a record if a match is not found with find_or_create' do
59
- count = Animal.count
60
- capybara = Animal.find_or_create(:name => 'Capybara')
61
- capybara.name.should == 'Capybara'
62
- Animal.count.should == count + 1
63
- end
64
-
65
- it 'should return all records' do
66
- all_animals = Animal.all
67
- all_animals.length.should == Animal.count
68
- all_animals.each do |animal|
69
- animal.class.should == Animal
70
- end
71
- end
72
-
73
- it 'should return the first record' do
74
- Animal.first.should == Animal.find(:first)
75
- end
76
-
77
- it 'should return a count of the records' do
78
- Animal.count.should == Animal.find_by_sql("SELECT COUNT(*) FROM animals")[0]
79
- end
80
-
81
- it 'should delete all records' do
82
- Animal.delete_all
83
- Animal.count.should == 0
84
-
85
- fixtures(:animals)
86
- end
87
-
88
- #it 'should be truncated' do
89
- # Animal.truncate!
90
- # Animal.count.should == 0
91
- #
92
- # fixtures(:animals)
93
- #end
94
-
95
- it 'should find a matching record given an id' do
96
- Animal.find(1).name.should == 'Frog'
97
- end
98
-
99
- it 'should find all records' do
100
- Animal.find(:all).length.should == Animal.count
101
- end
102
-
103
- it 'should find all matching records given some condition' do
104
- Animal.find(:all, :conditions => ["name = ?", "Frog"])[0].name.should == 'Frog'
105
- end
106
-
107
- it 'should find the first matching record' do
108
- Animal.find(:first).name.should == 'Frog'
109
- end
110
-
111
- it 'should find the first matching record given some condition' do
112
- Animal.find(:first, :conditions => ["name = ?", "Frog"]).name.should == 'Frog'
113
- end
114
-
115
- it 'should select records using the supplied sql fragment' do
116
- Animal.find_by_sql("SELECT name FROM animals WHERE name='Frog'")[0].should == 'Frog'
117
- end
118
-
119
- it 'should retrieve the indexed element' do
120
- Animal[1].id.should == 1
121
- end
122
-
123
- it 'should create a new record' do
124
- count = Animal.count
125
- capybara = Animal.create(:name => 'Capybara')
126
- capybara.name.should == 'Capybara'
127
- Animal.count.should == count + 1
128
- end
129
- end
130
-
131
-
132
- # Can't describe DataMapper::Persistence because
133
- # rspec will include it for some crazy reason!
134
- describe "DataMapper::Persistence" do
135
-
136
- it "should raise ObjectNotFoundError for missing objects with the indexer finder" do
137
- # pending "http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/111-should-raise-objectnotfounderror-on-the-indexer-finder"
138
- lambda { Zoo[900] }.should raise_error(DataMapper::ObjectNotFoundError)
139
- end
140
-
141
- it "should raise IncompleteModelDefinitionError for a model with no properties" do
142
- lambda { class IncompleteZoo; include DataMapper::Persistence; end; IncompleteZoo.new }.should raise_error(DataMapper::Persistence::IncompleteModelDefinitionError)
143
- end
144
-
145
- it "attributes method should load all lazy-loaded values" do
146
- Animal.first(:name => 'Cup').attributes[:notes].should == 'I am a Cup!'
147
- end
148
-
149
- it "mass assignment should call methods" do
150
- class Animal
151
- attr_reader :test
152
- def test=(value)
153
- @test = value + '!'
154
- end
155
- end
156
-
157
- a = Animal.new(:test => 'testing')
158
- a.test.should == 'testing!'
159
- end
160
-
161
- it "should be dirty" do
162
- x = Person.create(:name => 'a')
163
- x.should_not be_dirty
164
- x.name = 'dslfay'
165
- x.should be_dirty
166
- end
167
-
168
- it "should be dirty when set to nil" do
169
- x = Person.create(:name => 'a')
170
- x.should_not be_dirty
171
- x.name = "asdfasfd"
172
- x.should be_dirty
173
- end
174
-
175
- it "should return a diff" do
176
- x = Person.new(:name => 'Sam', :age => 30, :occupation => 'Programmer')
177
- y = Person.new(:name => 'Amy', :age => 21, :occupation => 'Programmer')
178
-
179
- diff = (x ^ y)
180
- diff.should include(:name)
181
- diff.should include(:age)
182
- diff[:name].should eql(['Sam', 'Amy'])
183
- diff[:age].should eql([30, 21])
184
-
185
- x.destroy!
186
- y.destroy!
187
- end
188
-
189
- it "should update attributes" do
190
- x = Person.create(:name => 'Sam')
191
- x.update_attributes(:age => 30).should eql(true)
192
- x.age.should eql(30)
193
- x.should_not be_dirty
194
- end
195
-
196
- it "should return the table for a given model" do
197
- Person.table.should be_a_kind_of(DataMapper::Adapters::Sql::Mappings::Table)
198
- end
199
-
200
- it "should support boolean accessors" do
201
- dolphin = Animal.first(:name => 'Dolphin')
202
- dolphin.should be_nice
203
- end
204
-
205
- it "should be comparable" do
206
- p1 = Person.create(:name => 'Sam')
207
- p2 = Person[p1.id]
208
-
209
- p1.should == p2
210
- end
211
-
212
- # This is unnecessary. Use #dirty? to check for changes.
213
- # it "should not be equal if attributes have changed" do
214
- # p1 = Person.create(:name => 'Sam')
215
- # p2 = Person[p1.id]
216
- # p2.name = "Paul"
217
- #
218
- # p1.should_not == p2
219
- # end
220
-
221
- end
222
-
223
- describe 'A new record' do
224
-
225
- before(:each) do
226
- @bob = Person.new(:name => 'Bob', :age => 30, :occupation => 'Sales')
227
- end
228
-
229
- it 'should be dirty' do
230
- @bob.dirty?.should == true
231
- end
232
-
233
- it 'set attributes should be dirty' do
234
- attributes = @bob.attributes.dup.reject { |k,v| k == :id }
235
- @bob.dirty_attributes.should == { :name => 'Bob', :age => 30, :occupation => 'Sales' }
236
- end
237
-
238
- it 'should be marked as new' do
239
- @bob.new_record?.should == true
240
- end
241
-
242
- it 'should have a nil id' do
243
- @bob.id.should == nil
244
- end
245
-
246
- it "should not have dirty attributes when not dirty" do
247
- x = Person.create(:name => 'a')
248
- x.should_not be_dirty
249
- x.dirty_attributes.should be_empty
250
- end
251
-
252
- it "should only list attributes that have changed in the dirty attributes hash" do
253
- x = Person.create(:name => 'a')
254
- x.name = "asdfr"
255
- x.should be_dirty
256
- x.dirty_attributes.keys.should == [:name]
257
- end
258
-
259
- it "should not have original_values when a new record" do
260
- x = Person.new(:name => 'a')
261
- x.original_values.should be_empty
262
- end
263
-
264
- it "should have original_values after saved" do
265
- x = Person.new(:name => 'a')
266
- x.save
267
- x.original_values.should_not be_empty
268
- x.original_values.keys.should include(:name)
269
- x.original_values[:name].should == 'a'
270
- end
271
-
272
- it "should have original values when created" do
273
- x = Person.create(:name => 'a')
274
- x.original_values.should_not be_empty
275
- x.original_values.keys.should include(:name)
276
- x.original_values[:name].should == "a"
277
- end
278
-
279
- it "should have original values when loaded from the database" do
280
- Person.create(:name => 'a')
281
- x = Person.first(:name => 'a')
282
- x.original_values.should_not be_empty
283
- x.original_values.keys.should include(:name)
284
- x.original_values[:name].should == "a"
285
- end
286
-
287
- it "should reset the original values when not new, changed then saved" do
288
- x = Person.create(:name => 'a')
289
- x.should_not be_new_record
290
- x.original_values[:name].should == "a"
291
- x.name = "b"
292
- x.save
293
- x.original_values[:name].should == "b"
294
- end
295
-
296
- it "should allow a value to be set to nil" do
297
- x = Person.create(:name => 'a')
298
- x.name = nil
299
- x.save
300
- x.reload!
301
- x.name.should be_nil
302
- end
303
-
304
- end
305
-
306
- describe 'Properties' do
307
-
308
- it 'should default to public method visibility' do
309
- class SoftwareEngineer #< DataMapper::Base # please do not remove this
310
- include DataMapper::Persistence
311
-
312
- set_table_name 'people'
313
- property :name, :string
314
- end
315
-
316
- public_properties = SoftwareEngineer.public_instance_methods.select { |m| ["name", "name="].include?(m) }
317
- public_properties.length.should == 2
318
- end
319
-
320
- it 'should respect protected property options' do
321
- class SanitationEngineer #< DataMapper::Base # please do not remove this
322
- include DataMapper::Persistence
323
-
324
- set_table_name 'people'
325
- property :name, :string, :reader => :protected
326
- property :age, :integer, :writer => :protected
327
- end
328
-
329
- protected_properties = SanitationEngineer.protected_instance_methods.select { |m| ["name", "age="].include?(m) }
330
- protected_properties.length.should == 2
331
- end
332
-
333
- it 'should respect private property options' do
334
- class ElectricalEngineer #< DataMapper::Base # please do not remove this
335
- include DataMapper::Persistence
336
-
337
- set_table_name 'people'
338
- property :name, :string, :reader => :private
339
- property :age, :integer, :writer => :private
340
- end
341
-
342
- private_properties = ElectricalEngineer.private_instance_methods.select { |m| ["name", "age="].include?(m) }
343
- private_properties.length.should == 2
344
- end
345
-
346
- it 'should set both reader and writer visibiliy when accessor option is passed' do
347
- class TrainEngineer #< DataMapper::Base # please do not remove this
348
- include DataMapper::Persistence
349
-
350
- property :name, :string, :accessor => :private
351
- end
352
-
353
- private_properties = TrainEngineer.private_instance_methods.select { |m| ["name", "name="].include?(m) }
354
- private_properties.length.should == 2
355
- end
356
-
357
- it 'should only be listed in attributes if they have public getters' do
358
- class SalesEngineer #< DataMapper::Base # please do not remove this
359
- include DataMapper::Persistence
360
-
361
- set_table_name 'people'
362
- property :name, :string
363
- property :age, :integer, :reader => :private
364
- end
365
-
366
- @sam = SalesEngineer.first(:name => 'Sam')
367
- # note: id default key gets a public reader by default (but writer is protected)
368
- @sam.attributes.should == {:id => @sam.id, :name => @sam.name}
369
- end
370
-
371
- it 'should not allow mass assignment if private or protected' do
372
- class ChemicalEngineer #< DataMapper::Base # please do not remove this
373
- include DataMapper::Persistence
374
-
375
- set_table_name 'people'
376
- property :name, :string, :writer => :private
377
- property :age, :integer
378
- end
379
-
380
- @sam = ChemicalEngineer.first(:name => 'Sam')
381
- @sam.attributes = {:name => 'frank', :age => 101}
382
- @sam.age.should == 101
383
- @sam.name.should == 'Sam'
384
- end
385
-
386
- it 'should allow :protected to be passed as an alias for a public reader, protected writer' do
387
- class CivilEngineer #< DataMapper::Base # please do not remove this
388
- include DataMapper::Persistence
389
-
390
- set_table_name 'people'
391
- property :name, :string, :protected => true
392
- end
393
-
394
- CivilEngineer.public_instance_methods.should include("name")
395
- CivilEngineer.protected_instance_methods.should include("name=")
396
- end
397
-
398
- it 'should allow :private to be passed as an alias for a public reader, private writer' do
399
- class AudioEngineer #< DataMapper::Base # please do not remove this
400
- include DataMapper::Persistence
401
-
402
- set_table_name 'people'
403
- property :name, :string, :private => true
404
- end
405
-
406
- AudioEngineer.public_instance_methods.should include("name")
407
- AudioEngineer.private_instance_methods.should include("name=")
408
- end
409
-
410
- it 'should raise an error when invalid options are passsed' do
411
- lambda do
412
- class JumpyCow #< DataMapper::Base # please do not remove this
413
- include DataMapper::Persistence
414
-
415
- set_table_name 'animals'
416
- property :name, :string, :laze => true
417
- end
418
- end.should raise_error(ArgumentError)
419
- end
420
-
421
- it 'should raise an error when the first argument to index isnt an array' do
422
- lambda do
423
- class JumpyCow #< DataMapper::Base # please do not remove this
424
- include DataMapper::Persistence
425
-
426
- set_table_name 'animals'
427
- index :name, :parent
428
- end
429
- end.should raise_error(ArgumentError)
430
- end
431
-
432
- it "should return true on saving a new record" do
433
- bob = User.new(:name => 'bob', :email => 'bob@example.com')
434
- bob.save!.should == true
435
- bob.destroy!
436
- end
437
-
438
- it "should assign to public setters" do
439
- x = Project.new
440
- x.attributes = { :set_us_up_the_bomb => true }
441
- x.should be_set_up_for_bomb
442
- end
443
-
444
- it "should protect private setters" do
445
- x = Project.new
446
- x.attributes = { :be_wery_sneaky => true }
447
- x.should_not be_wery_sneaky
448
- end
449
-
450
- it "should not call initialize on materialization" do
451
- # pending "http://wm.lighthouseapp.com/projects/4819-datamapper/tickets/113-use-allocate-to-materialize-objects"
452
- x = Tomato.new
453
- x.should be_initialized
454
- x.save!
455
- x.name.should eql('Ugly')
456
- x.should be_bruised
457
-
458
- x.name = 'Bob'
459
- x.save!
460
-
461
- x2 = Tomato.first(:name => 'Bob')
462
- x2.should_not be_bruised
463
- x2.heal!
464
- x2.should == x
465
- x2.name.should eql('Bob')
466
- x2.should_not be_initialized
467
-
468
- x3 = Tomato.get(x.key)
469
- x3.should_not be_bruised
470
- x3.heal!
471
- x3.should == x
472
- x3.name.should eql('Bob')
473
- x3.should_not be_initialized
474
- end
475
-
476
- it "should report persistence" do
477
- Tomato.should be_persistent
478
- end
479
- end