datamapper 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/CHANGELOG +16 -1
  2. data/README +10 -8
  3. data/environment.rb +1 -1
  4. data/example.rb +13 -5
  5. data/lib/data_mapper.rb +2 -0
  6. data/lib/data_mapper/adapters/abstract_adapter.rb +61 -0
  7. data/lib/data_mapper/adapters/data_object_adapter.rb +33 -6
  8. data/lib/data_mapper/adapters/mysql_adapter.rb +5 -0
  9. data/lib/data_mapper/adapters/postgresql_adapter.rb +12 -0
  10. data/lib/data_mapper/adapters/sql/commands/load_command.rb +6 -14
  11. data/lib/data_mapper/adapters/sql/mappings/column.rb +37 -26
  12. data/lib/data_mapper/adapters/sql/mappings/table.rb +50 -8
  13. data/lib/data_mapper/associations.rb +4 -5
  14. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +2 -2
  15. data/lib/data_mapper/associations/has_many_association.rb +40 -13
  16. data/lib/data_mapper/associations/has_n_association.rb +1 -1
  17. data/lib/data_mapper/base.rb +5 -448
  18. data/lib/data_mapper/callbacks.rb +12 -2
  19. data/lib/data_mapper/context.rb +4 -0
  20. data/lib/data_mapper/database.rb +1 -1
  21. data/lib/data_mapper/identity_map.rb +2 -2
  22. data/lib/data_mapper/persistence.rb +538 -0
  23. data/lib/data_mapper/support/active_record_impersonation.rb +21 -3
  24. data/lib/data_mapper/support/errors.rb +2 -0
  25. data/lib/data_mapper/support/serialization.rb +7 -10
  26. data/lib/data_mapper/support/struct.rb +7 -0
  27. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +11 -4
  28. data/performance.rb +23 -10
  29. data/rakefile.rb +1 -1
  30. data/spec/active_record_impersonation_spec.rb +2 -6
  31. data/spec/acts_as_tree_spec.rb +3 -1
  32. data/spec/associations_spec.rb +40 -160
  33. data/spec/attributes_spec.rb +1 -1
  34. data/spec/base_spec.rb +41 -13
  35. data/spec/callbacks_spec.rb +32 -0
  36. data/spec/coersion_spec.rb +1 -1
  37. data/spec/column_spec.rb +22 -12
  38. data/spec/dependency_spec.rb +5 -3
  39. data/spec/embedded_value_spec.rb +33 -17
  40. data/spec/has_many_association_spec.rb +173 -0
  41. data/spec/legacy_spec.rb +2 -2
  42. data/spec/load_command_spec.rb +59 -7
  43. data/spec/models/animal.rb +6 -2
  44. data/spec/models/animals_exhibit.rb +3 -1
  45. data/spec/models/career.rb +2 -1
  46. data/spec/models/comment.rb +3 -1
  47. data/spec/models/exhibit.rb +3 -1
  48. data/spec/models/fruit.rb +3 -1
  49. data/spec/models/person.rb +10 -1
  50. data/spec/models/post.rb +3 -1
  51. data/spec/models/project.rb +3 -1
  52. data/spec/models/section.rb +3 -1
  53. data/spec/models/serializer.rb +3 -1
  54. data/spec/models/user.rb +3 -1
  55. data/spec/models/zoo.rb +3 -1
  56. data/spec/paranoia_spec.rb +3 -1
  57. data/spec/postgres_spec.rb +54 -0
  58. data/spec/save_command_spec.rb +9 -5
  59. data/spec/schema_spec.rb +0 -91
  60. data/spec/single_table_inheritance_spec.rb +8 -0
  61. data/spec/table_spec.rb +46 -0
  62. data/spec/validates_uniqueness_of_spec.rb +19 -1
  63. metadata +8 -10
  64. data/lib/data_mapper/associations/has_one_association.rb +0 -77
  65. data/plugins/dataobjects/do_rb +0 -0
@@ -32,4 +32,12 @@ describe 'Single Table Inheritance' do
32
32
 
33
33
  end
34
34
 
35
+ it "should inherit the callbacks of the parent class" do
36
+ database do
37
+ adam = SalesPerson.new(:name => 'adam')
38
+ adam.save
39
+ adam.reload.notes.should eql("Lorem ipsum dolor sit amet")
40
+ end
41
+ end
42
+
35
43
  end
data/spec/table_spec.rb CHANGED
@@ -30,4 +30,50 @@ describe DataMapper::Adapters::Sql::Mappings::Table do
30
30
  column2.nullable?.should be_true
31
31
  end
32
32
 
33
+ it "should create sql for composite unique indexes" do
34
+ class Cage
35
+ include DataMapper::Persistence
36
+
37
+ property :name, :string
38
+ property :cage_id, :integer
39
+
40
+ index [:name, :cage_id], :unique => true
41
+ end
42
+
43
+ index_sql = database.adapter.table(Cage).to_create_composite_index_sql
44
+ index_sql[0].should match(/CREATE UNIQUE INDEX cages_name_cage_id_index/)
45
+ end
46
+
47
+ it "should create sql for composite indexes" do
48
+ class Lion
49
+ include DataMapper::Persistence
50
+
51
+ property :name, :string
52
+ property :tamer_id, :integer
53
+
54
+ index [:name, :tamer_id]
55
+ end
56
+
57
+ index_sql = database.adapter.table(Lion).to_create_composite_index_sql
58
+ index_sql[0].should match(/CREATE INDEX lions_name_tamer_id_index/)
59
+ end
60
+
61
+ it "should create sql for multiple composite indexes" do
62
+ class Course
63
+ include DataMapper::Persistence
64
+
65
+ property :code, :string
66
+ property :name, :string
67
+ property :description, :text
68
+ property :department_id, :integer
69
+ property :professor_id, :integer
70
+
71
+ index [:code, :name], :unique => true
72
+ index [:department_id, :professor_id], :unique => true
73
+ end
74
+
75
+ index_sql = database.adapter.table(Course).to_create_composite_index_sql
76
+ index_sql[0].should match(/CREATE UNIQUE INDEX courses_code_name_index/)
77
+ index_sql[1].should match(/CREATE UNIQUE INDEX courses_department_id_professor_id_index/)
78
+ end
33
79
  end
@@ -40,6 +40,24 @@ describe Validatable::ValidatesUniquenessOf do
40
40
  new_programmer_scott.valid?(:save).should == false
41
41
  new_programmer_scott.errors.full_messages.first.should == "Name has already been taken"
42
42
  end
43
+
44
+ it 'must have a unique name for their occupation and career_name' do
45
+ class Person
46
+ validations.clear
47
+ validates_uniqueness_of :name, :event => :save, :scope => [:occupation, :career_name]
48
+ end
49
+
50
+ new_programmer_scott = Person.new(:name => 'Scott', :age => 29, :occupation => 'Programmer', :career_name => 'Programmer')
51
+ junior_programmer_scott = Person.new(:name => 'Scott', :age => 25, :occupation => 'Programmer', :career_name => 'Junior Programmer')
52
+
53
+ # Should be valid even though there is another 'Scott' already in the database
54
+ junior_programmer_scott.valid?(:save).should == true
55
+
56
+ # Should NOT be valid, there is already a Programmer names Scott, adding one more
57
+ # would destroy the universe or something
58
+ new_programmer_scott.valid?(:save).should == false
59
+ new_programmer_scott.errors.full_messages.first.should == "Name has already been taken"
60
+ end
43
61
 
44
62
  it "should allow custom error messages" do
45
63
  class Animal
@@ -54,4 +72,4 @@ describe Validatable::ValidatesUniquenessOf do
54
72
  bugaboo.valid?(:save).should == false
55
73
  bugaboo.errors.full_messages.first.should == 'You try to steal my name? I kill you!'
56
74
  end
57
- end
75
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datamapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Smoot
@@ -9,7 +9,7 @@ autorequire: data_mapper
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2007-12-10 00:00:00 -06:00
12
+ date: 2007-12-19 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -80,7 +80,6 @@ extra_rdoc_files:
80
80
  - lib/data_mapper/associations/has_and_belongs_to_many_association.rb
81
81
  - lib/data_mapper/associations/has_many_association.rb
82
82
  - lib/data_mapper/associations/has_n_association.rb
83
- - lib/data_mapper/associations/has_one_association.rb
84
83
  - lib/data_mapper/associations/reference.rb
85
84
  - lib/data_mapper/associations.rb
86
85
  - lib/data_mapper/auto_migrations.rb
@@ -91,6 +90,7 @@ extra_rdoc_files:
91
90
  - lib/data_mapper/dependency_queue.rb
92
91
  - lib/data_mapper/embedded_value.rb
93
92
  - lib/data_mapper/identity_map.rb
93
+ - lib/data_mapper/persistence.rb
94
94
  - lib/data_mapper/property.rb
95
95
  - lib/data_mapper/support/active_record_impersonation.rb
96
96
  - lib/data_mapper/support/blank.rb
@@ -101,6 +101,7 @@ extra_rdoc_files:
101
101
  - lib/data_mapper/support/serialization.rb
102
102
  - lib/data_mapper/support/silence.rb
103
103
  - lib/data_mapper/support/string.rb
104
+ - lib/data_mapper/support/struct.rb
104
105
  - lib/data_mapper/support/symbol.rb
105
106
  - lib/data_mapper/support/weak_hash.rb
106
107
  - lib/data_mapper/validatable_extensions/errors.rb
@@ -130,7 +131,6 @@ extra_rdoc_files:
130
131
  - plugins/can_has_sphinx/REVISION
131
132
  - plugins/can_has_sphinx/scripts/sphinx.sh
132
133
  - plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake
133
- - plugins/dataobjects/do_rb
134
134
  files:
135
135
  - README
136
136
  - CHANGELOG
@@ -157,7 +157,6 @@ files:
157
157
  - lib/data_mapper/associations/has_and_belongs_to_many_association.rb
158
158
  - lib/data_mapper/associations/has_many_association.rb
159
159
  - lib/data_mapper/associations/has_n_association.rb
160
- - lib/data_mapper/associations/has_one_association.rb
161
160
  - lib/data_mapper/associations/reference.rb
162
161
  - lib/data_mapper/associations.rb
163
162
  - lib/data_mapper/auto_migrations.rb
@@ -168,6 +167,7 @@ files:
168
167
  - lib/data_mapper/dependency_queue.rb
169
168
  - lib/data_mapper/embedded_value.rb
170
169
  - lib/data_mapper/identity_map.rb
170
+ - lib/data_mapper/persistence.rb
171
171
  - lib/data_mapper/property.rb
172
172
  - lib/data_mapper/support/active_record_impersonation.rb
173
173
  - lib/data_mapper/support/blank.rb
@@ -178,6 +178,7 @@ files:
178
178
  - lib/data_mapper/support/serialization.rb
179
179
  - lib/data_mapper/support/silence.rb
180
180
  - lib/data_mapper/support/string.rb
181
+ - lib/data_mapper/support/struct.rb
181
182
  - lib/data_mapper/support/symbol.rb
182
183
  - lib/data_mapper/support/weak_hash.rb
183
184
  - lib/data_mapper/validatable_extensions/errors.rb
@@ -212,6 +213,7 @@ files:
212
213
  - spec/delete_command_spec.rb
213
214
  - spec/dependency_spec.rb
214
215
  - spec/embedded_value_spec.rb
216
+ - spec/has_many_association_spec.rb
215
217
  - spec/legacy_spec.rb
216
218
  - spec/load_command_spec.rb
217
219
  - spec/magic_columns_spec.rb
@@ -232,6 +234,7 @@ files:
232
234
  - spec/models/zoo.rb
233
235
  - spec/natural_key_spec.rb
234
236
  - spec/paranoia_spec.rb
237
+ - spec/postgres_spec.rb
235
238
  - spec/property_spec.rb
236
239
  - spec/query_spec.rb
237
240
  - spec/save_command_spec.rb
@@ -276,11 +279,6 @@ files:
276
279
  - plugins/can_has_sphinx/scripts/sphinx.sh
277
280
  - plugins/can_has_sphinx/tasks
278
281
  - plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake
279
- - plugins/dataobjects
280
- - plugins/dataobjects/do_rb
281
- - plugins/dataobjects/swig_mysql
282
- - plugins/dataobjects/swig_postgres
283
- - plugins/dataobjects/swig_sqlite
284
282
  has_rdoc: true
285
283
  homepage: http://datamapper.org
286
284
  post_install_message:
@@ -1,77 +0,0 @@
1
- require 'data_mapper/associations/has_n_association'
2
-
3
- module DataMapper
4
- module Associations
5
-
6
- class HasOneAssociation < HasNAssociation
7
-
8
- # Define the association instance method (i.e. Project#tasks)
9
- def define_accessor(klass)
10
- klass.class_eval <<-EOS
11
- def create_#{@association_name}(options)
12
- #{@association_name}_association.create(options)
13
- end
14
-
15
- def build_#{@association_name}(options)
16
- #{@association_name}_association.build(options)
17
- end
18
-
19
- def #{@association_name}
20
- #{@association_name}_association.instance
21
- end
22
-
23
- def #{@association_name}=(value)
24
- #{@association_name}_association.set(value)
25
- end
26
-
27
- private
28
- def #{@association_name}_association
29
- @#{@association_name}_association || (@#{@association_name}_association = DataMapper::Associations::HasOneAssociation::Instance.new(self, #{@association_name.inspect}))
30
- end
31
- EOS
32
- end
33
-
34
- class Instance < Associations::Reference
35
-
36
- def instance
37
- @associated || @associated = begin
38
- if @instance.loaded_set.nil?
39
- nil
40
- else
41
- # Temp variable for the instance variable name.
42
- setter_method = "#{@association_name}=".to_sym
43
- instance_variable_name = "@#{association.foreign_key_column}".to_sym
44
-
45
- set = @instance.loaded_set.group_by { |instance| instance.key }
46
-
47
- # Fetch the foreign objects for all instances in the current object's loaded-set.
48
- @instance.database_context.all(association.associated_constant, association.foreign_key_column => set.keys).each do |assoc|
49
- set[assoc.instance_variable_get(instance_variable_name)].first.send(setter_method, assoc)
50
- end
51
-
52
- @associated
53
- end
54
-
55
- end
56
- end
57
-
58
- def create(options)
59
- @associated = association.constant.new(options)
60
- if @associated.save
61
- @associated.send("#{@associated_class.foreign_key}=", @instance.key)
62
- end
63
- end
64
-
65
- def build(options)
66
- @associated = association.constant.new(options)
67
- end
68
-
69
- def set(val)
70
- @associated = val
71
- end
72
-
73
- end # class Instance
74
-
75
- end # class HasOneAssociation
76
- end # module Associations
77
- end # module DataMapper
Binary file