datamapper 0.2.5 → 0.3.0

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 (121) hide show
  1. data/CHANGELOG +5 -1
  2. data/FAQ +96 -0
  3. data/QUICKLINKS +12 -0
  4. data/README +57 -155
  5. data/environment.rb +61 -43
  6. data/example.rb +30 -12
  7. data/lib/data_mapper.rb +6 -1
  8. data/lib/data_mapper/adapters/abstract_adapter.rb +0 -57
  9. data/lib/data_mapper/adapters/data_object_adapter.rb +203 -97
  10. data/lib/data_mapper/adapters/mysql_adapter.rb +4 -0
  11. data/lib/data_mapper/adapters/postgresql_adapter.rb +7 -1
  12. data/lib/data_mapper/adapters/sql/coersion.rb +3 -2
  13. data/lib/data_mapper/adapters/sql/commands/load_command.rb +29 -10
  14. data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +4 -0
  15. data/lib/data_mapper/adapters/sql/mappings/column.rb +13 -9
  16. data/lib/data_mapper/adapters/sql/mappings/conditions.rb +172 -0
  17. data/lib/data_mapper/adapters/sql/mappings/table.rb +43 -17
  18. data/lib/data_mapper/adapters/sqlite3_adapter.rb +9 -2
  19. data/lib/data_mapper/associations.rb +75 -3
  20. data/lib/data_mapper/associations/belongs_to_association.rb +70 -36
  21. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +195 -86
  22. data/lib/data_mapper/associations/has_many_association.rb +168 -61
  23. data/lib/data_mapper/associations/has_n_association.rb +23 -3
  24. data/lib/data_mapper/attributes.rb +73 -0
  25. data/lib/data_mapper/auto_migrations.rb +2 -6
  26. data/lib/data_mapper/base.rb +5 -9
  27. data/lib/data_mapper/database.rb +4 -3
  28. data/lib/data_mapper/embedded_value.rb +66 -30
  29. data/lib/data_mapper/identity_map.rb +1 -3
  30. data/lib/data_mapper/is/tree.rb +121 -0
  31. data/lib/data_mapper/migration.rb +155 -0
  32. data/lib/data_mapper/persistence.rb +532 -218
  33. data/lib/data_mapper/property.rb +306 -0
  34. data/lib/data_mapper/query.rb +164 -0
  35. data/lib/data_mapper/support/blank.rb +2 -2
  36. data/lib/data_mapper/support/connection_pool.rb +5 -6
  37. data/lib/data_mapper/support/enumerable.rb +3 -3
  38. data/lib/data_mapper/support/errors.rb +10 -1
  39. data/lib/data_mapper/support/inflector.rb +174 -238
  40. data/lib/data_mapper/support/object.rb +54 -0
  41. data/lib/data_mapper/support/serialization.rb +19 -1
  42. data/lib/data_mapper/support/string.rb +7 -16
  43. data/lib/data_mapper/support/symbol.rb +3 -15
  44. data/lib/data_mapper/support/typed_set.rb +68 -0
  45. data/lib/data_mapper/types/base.rb +44 -0
  46. data/lib/data_mapper/types/string.rb +34 -0
  47. data/lib/data_mapper/validations/number_validator.rb +40 -0
  48. data/lib/data_mapper/validations/string_validator.rb +20 -0
  49. data/lib/data_mapper/validations/validator.rb +13 -0
  50. data/performance.rb +26 -1
  51. data/profile_data_mapper.rb +1 -1
  52. data/rakefile.rb +42 -2
  53. data/spec/acts_as_tree_spec.rb +11 -3
  54. data/spec/adapters/data_object_adapter_spec.rb +31 -0
  55. data/spec/associations/belongs_to_association_spec.rb +98 -0
  56. data/spec/associations/has_and_belongs_to_many_association_spec.rb +377 -0
  57. data/spec/associations/has_many_association_spec.rb +337 -0
  58. data/spec/attributes_spec.rb +23 -1
  59. data/spec/auto_migrations_spec.rb +86 -29
  60. data/spec/callbacks_spec.rb +107 -0
  61. data/spec/column_spec.rb +5 -2
  62. data/spec/count_command_spec.rb +33 -1
  63. data/spec/database_spec.rb +18 -0
  64. data/spec/dependency_spec.rb +4 -2
  65. data/spec/embedded_value_spec.rb +8 -8
  66. data/spec/fixtures/people.yaml +1 -1
  67. data/spec/fixtures/projects.yaml +10 -1
  68. data/spec/fixtures/tasks.yaml +6 -0
  69. data/spec/fixtures/tasks_tasks.yaml +2 -0
  70. data/spec/fixtures/tomatoes.yaml +1 -0
  71. data/spec/is_a_tree_spec.rb +149 -0
  72. data/spec/load_command_spec.rb +71 -9
  73. data/spec/magic_columns_spec.rb +17 -2
  74. data/spec/migration_spec.rb +267 -0
  75. data/spec/models/animal.rb +1 -1
  76. data/spec/models/candidate.rb +8 -0
  77. data/spec/models/career.rb +1 -1
  78. data/spec/models/chain.rb +8 -0
  79. data/spec/models/comment.rb +1 -1
  80. data/spec/models/exhibit.rb +1 -1
  81. data/spec/models/fence.rb +7 -0
  82. data/spec/models/fruit.rb +2 -2
  83. data/spec/models/job.rb +8 -0
  84. data/spec/models/person.rb +2 -3
  85. data/spec/models/post.rb +1 -1
  86. data/spec/models/project.rb +21 -1
  87. data/spec/models/section.rb +1 -1
  88. data/spec/models/serializer.rb +1 -1
  89. data/spec/models/task.rb +9 -0
  90. data/spec/models/tomato.rb +27 -0
  91. data/spec/models/user.rb +8 -2
  92. data/spec/models/zoo.rb +2 -7
  93. data/spec/paranoia_spec.rb +1 -1
  94. data/spec/{base_spec.rb → persistence_spec.rb} +207 -18
  95. data/spec/postgres_spec.rb +48 -6
  96. data/spec/property_spec.rb +90 -9
  97. data/spec/query_spec.rb +71 -5
  98. data/spec/save_command_spec.rb +11 -0
  99. data/spec/spec_helper.rb +14 -11
  100. data/spec/support/blank_spec.rb +8 -0
  101. data/spec/support/inflector_spec.rb +41 -0
  102. data/spec/support/object_spec.rb +9 -0
  103. data/spec/{serialization_spec.rb → support/serialization_spec.rb} +1 -1
  104. data/spec/support/silence_spec.rb +15 -0
  105. data/spec/{support_spec.rb → support/string_spec.rb} +3 -3
  106. data/spec/support/struct_spec.rb +12 -0
  107. data/spec/support/typed_set_spec.rb +66 -0
  108. data/spec/table_spec.rb +3 -3
  109. data/spec/types/string.rb +81 -0
  110. data/spec/validates_uniqueness_of_spec.rb +17 -0
  111. data/spec/validations/number_validator.rb +59 -0
  112. data/spec/validations/string_validator.rb +14 -0
  113. metadata +59 -17
  114. data/do_performance.rb +0 -153
  115. data/lib/data_mapper/support/active_record_impersonation.rb +0 -103
  116. data/lib/data_mapper/support/weak_hash.rb +0 -46
  117. data/spec/active_record_impersonation_spec.rb +0 -129
  118. data/spec/associations_spec.rb +0 -232
  119. data/spec/conditions_spec.rb +0 -49
  120. data/spec/has_many_association_spec.rb +0 -173
  121. data/spec/models/animals_exhibit.rb +0 -8
@@ -1,49 +0,0 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
2
-
3
- describe DataMapper::Adapters::Sql::Commands::LoadCommand do
4
-
5
- def conditions_for(klass, options = {})
6
- database_context = database(:mock)
7
- DataMapper::Adapters::Sql::Commands::LoadCommand.new(
8
- database_context.adapter, database_context, klass, options
9
- ).conditions
10
- end
11
-
12
- it 'empty? should be false if conditions are present' do
13
- conditions_for(Zoo, :name => 'Galveston').should_not be_empty
14
- end
15
-
16
- it 'should map implicit option names to field names' do
17
- conditions_for(Zoo, :name => 'Galveston').should eql([["`name` = ?", 'Galveston']])
18
- end
19
-
20
- it 'should qualify with table name when using a join' do
21
- conditions_for(Zoo, :name => 'Galveston', :include => :exhibits).should eql([["`zoos`.`name` = ?", 'Galveston']])
22
- end
23
-
24
- it 'should use Symbol::Operator to determine operator' do
25
- conditions_for(Person, :age.gt => 28).should eql([["`age` > ?", 28]])
26
- conditions_for(Person, :age.gte => 28).should eql([["`age` >= ?", 28]])
27
-
28
- conditions_for(Person, :age.lt => 28).should eql([["`age` < ?", 28]])
29
- conditions_for(Person, :age.lte => 28).should eql([["`age` <= ?", 28]])
30
-
31
- conditions_for(Person, :age.not => 28).should eql([["`age` <> ?", 28]])
32
- conditions_for(Person, :age.eql => 28).should eql([["`age` = ?", 28]])
33
-
34
- conditions_for(Person, :name.like => 'S%').should eql([["`name` LIKE ?", 'S%']])
35
-
36
- conditions_for(Person, :age.in => [ 28, 29 ]).should eql([["`age` IN ?", [ 28, 29 ]]])
37
- end
38
-
39
- it 'should use an IN clause for an Array' do
40
- conditions_for(Person, :age => [ 28, 29 ]).should eql([["`age` IN ?", [ 28, 29 ]]])
41
- end
42
-
43
- it 'should use "not" for not-equal operations' do
44
- conditions_for(Person, :name.not => 'Bob').should eql([["`name` <> ?", 'Bob']])
45
- conditions_for(Person, :name.not => nil).should eql([["`name` IS NOT ?", nil]])
46
- conditions_for(Person, :name.not => ['Sam', 'Bob']).should eql([["`name` NOT IN ?", ['Sam', 'Bob']]])
47
- end
48
-
49
- end
@@ -1,173 +0,0 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
2
-
3
- describe DataMapper::Associations::HasManyAssociation do
4
-
5
- before(:all) do
6
- fixtures(:zoos)
7
- fixtures(:exhibits)
8
- fixtures(:fruit)
9
- fixtures(:animals)
10
- end
11
-
12
- after(:all) do
13
- fixtures(:fruit)
14
- fixtures(:animals)
15
- end
16
-
17
- before(:each) do
18
- @zoo = Zoo.new(:name => "ZOO")
19
- @zoo.save
20
- end
21
-
22
- after(:each) do
23
- @zoo.destroy!
24
- end
25
-
26
- it "should return an empty Enumerable for new objects" do
27
- project = Project.new
28
- project.sections.should be_a_kind_of(Enumerable)
29
- project.sections.should be_empty
30
- end
31
-
32
- it "should display correctly when inspected" do
33
- Zoo.first(:name => 'Dallas').exhibits.inspect.should match(/\#\<Exhibit\:0x.{7}/)
34
- end
35
-
36
- it 'should lazily-load the association when Enumerable methods are called' do
37
- database do |db|
38
- san_diego = Zoo.first(:name => 'San Diego')
39
- san_diego.exhibits.size.should == 2
40
- san_diego.exhibits.should include(Exhibit.first(:name => 'Monkey Mayhem'))
41
- end
42
- end
43
-
44
- it 'should eager-load associations for an entire set' do
45
- database do
46
- zoos = Zoo.all
47
- zoos.each do |zoo|
48
- zoo.exhibits.each do |exhibit|
49
- exhibit.zoo.should == zoo
50
- end
51
- end
52
- end
53
- end
54
-
55
- it "should be dirty even when clean objects are associated" do
56
- zoo = Zoo.first(:name => 'New York')
57
- zoo.exhibits << Exhibit.first
58
- zoo.should be_dirty
59
- end
60
-
61
- it "should proxy associations on the associated type" do
62
- Zoo.first(:name => 'Miami').exhibits.animals.size.should == 1
63
- end
64
-
65
- it "should have a valid zoo setup for testing" do
66
- @zoo.should be_valid
67
- @zoo.should_not be_a_new_record
68
- @zoo.id.should_not be_nil
69
- end
70
-
71
- it "should generate the SQL for a join statement" do
72
- exhibits_association = database(:mock).schema[Zoo].associations.find { |a| a.name == :exhibits }
73
-
74
- exhibits_association.to_sql.should == <<-EOS.compress_lines
75
- JOIN `exhibits` ON `exhibits`.`zoo_id` = `zoos`.`id`
76
- EOS
77
- end
78
-
79
- it "should add an item to an association" do
80
- bear = Exhibit.new( :name => "Bear")
81
- @zoo.exhibits << bear
82
- @zoo.exhibits.should include(bear)
83
- end
84
-
85
- it "should build a new item" do
86
- bear = @zoo.exhibits.build( :name => "Bear" )
87
- bear.should be_kind_of(Exhibit)
88
- @zoo.exhibits.should include(bear)
89
- end
90
-
91
- it "should not save the item when building" do
92
- bear = @zoo.exhibits.build( :name => "Bear" )
93
- bear.should be_new_record
94
- end
95
-
96
- it "should create a new item" do
97
- bear = @zoo.exhibits.create( :name => "Bear" )
98
- bear.should be_kind_of(Exhibit)
99
- @zoo.exhibits.should include(bear)
100
- end
101
-
102
- it "should save the item when creating" do
103
- bear = @zoo.exhibits.create( :name => "Bear" )
104
- bear.should_not be_new_record
105
- end
106
-
107
- it "should set the association to a saved target when added with <<" do
108
- pirahna = Exhibit.new(:name => "Pirahna")
109
- pirahna.zoo_id.should be_nil
110
-
111
- @zoo.exhibits << pirahna
112
- pirahna.zoo.should == @zoo
113
- end
114
-
115
- it "should set the association to a non-saved target when added with <<" do
116
- zoo = Zoo.new(:name => "My Zoo")
117
- kangaroo = Exhibit.new(:name => "Kangaroo")
118
- zoo.exhibits << kangaroo
119
- kangaroo.zoo.should == zoo
120
- end
121
-
122
- it "should set the id of the exhibit when the associated zoo is saved" do
123
- snake = Exhibit.new(:name => "Snake")
124
- @zoo.exhibits << snake
125
- @zoo.save
126
- @zoo.id.should == snake.zoo_id
127
- end
128
-
129
- it "should set the id of an already saved exibit if it's added to a different zoo" do
130
- beaver = Exhibit.new(:name => "Beaver")
131
- beaver.save
132
- beaver.should_not be_a_new_record
133
- @zoo.exhibits << beaver
134
- @zoo.save
135
- beaver.zoo.should == @zoo
136
- beaver.zoo_id.should == @zoo.id
137
- end
138
-
139
- it "should set the size of the assocation" do
140
- @zoo.exhibits << Exhibit.new(:name => "anonymous")
141
- @zoo.exhibits.size.should == 1
142
- end
143
-
144
- it "should give the association when an inspect is done on it" do
145
- whale = Exhibit.new(:name => "Whale")
146
- @zoo.exhibits << whale
147
- @zoo.exhibits.should_not == "nil"
148
- @zoo.exhibits.inspect.should_not be_nil
149
- end
150
-
151
- it "should generate the SQL for a join statement" do
152
- fruit_association = database(:mock).schema[Animal].associations.find { |a| a.name == :favourite_fruit }
153
-
154
- fruit_association.to_sql.should == <<-EOS.compress_lines
155
- JOIN `fruit` ON `fruit`.`devourer_id` = `animals`.`id`
156
- EOS
157
- end
158
-
159
- it "is assigned a devourer_id" do
160
- bob = Animal.new(:name => 'bob')
161
- fruit = Fruit.first
162
- bob.favourite_fruit = fruit
163
-
164
- bob.save
165
-
166
- bob.reload!
167
- fruit.devourer_id.should eql(bob.id)
168
- bob.favourite_fruit.should == fruit
169
-
170
- fruit.reload!
171
- fruit.devourer_of_souls.should == bob
172
- end
173
- end
@@ -1,8 +0,0 @@
1
- # This is just here to get around the fact I use a Class to load
2
- # fixtures right now.
3
- class AnimalsExhibit #< DataMapper::Base
4
- include DataMapper::Persistence
5
-
6
- property :animal_id, :integer, :key => true
7
- property :exhibit_id, :integer, :key => true
8
- end