datamapper 0.2.4 → 0.2.5

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