datamapper 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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