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.
- data/CHANGELOG +16 -1
- data/README +10 -8
- data/environment.rb +1 -1
- data/example.rb +13 -5
- data/lib/data_mapper.rb +2 -0
- data/lib/data_mapper/adapters/abstract_adapter.rb +61 -0
- data/lib/data_mapper/adapters/data_object_adapter.rb +33 -6
- data/lib/data_mapper/adapters/mysql_adapter.rb +5 -0
- data/lib/data_mapper/adapters/postgresql_adapter.rb +12 -0
- data/lib/data_mapper/adapters/sql/commands/load_command.rb +6 -14
- data/lib/data_mapper/adapters/sql/mappings/column.rb +37 -26
- data/lib/data_mapper/adapters/sql/mappings/table.rb +50 -8
- data/lib/data_mapper/associations.rb +4 -5
- data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +2 -2
- data/lib/data_mapper/associations/has_many_association.rb +40 -13
- data/lib/data_mapper/associations/has_n_association.rb +1 -1
- data/lib/data_mapper/base.rb +5 -448
- data/lib/data_mapper/callbacks.rb +12 -2
- data/lib/data_mapper/context.rb +4 -0
- data/lib/data_mapper/database.rb +1 -1
- data/lib/data_mapper/identity_map.rb +2 -2
- data/lib/data_mapper/persistence.rb +538 -0
- data/lib/data_mapper/support/active_record_impersonation.rb +21 -3
- data/lib/data_mapper/support/errors.rb +2 -0
- data/lib/data_mapper/support/serialization.rb +7 -10
- data/lib/data_mapper/support/struct.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +11 -4
- data/performance.rb +23 -10
- data/rakefile.rb +1 -1
- data/spec/active_record_impersonation_spec.rb +2 -6
- data/spec/acts_as_tree_spec.rb +3 -1
- data/spec/associations_spec.rb +40 -160
- data/spec/attributes_spec.rb +1 -1
- data/spec/base_spec.rb +41 -13
- data/spec/callbacks_spec.rb +32 -0
- data/spec/coersion_spec.rb +1 -1
- data/spec/column_spec.rb +22 -12
- data/spec/dependency_spec.rb +5 -3
- data/spec/embedded_value_spec.rb +33 -17
- data/spec/has_many_association_spec.rb +173 -0
- data/spec/legacy_spec.rb +2 -2
- data/spec/load_command_spec.rb +59 -7
- data/spec/models/animal.rb +6 -2
- data/spec/models/animals_exhibit.rb +3 -1
- data/spec/models/career.rb +2 -1
- data/spec/models/comment.rb +3 -1
- data/spec/models/exhibit.rb +3 -1
- data/spec/models/fruit.rb +3 -1
- data/spec/models/person.rb +10 -1
- data/spec/models/post.rb +3 -1
- data/spec/models/project.rb +3 -1
- data/spec/models/section.rb +3 -1
- data/spec/models/serializer.rb +3 -1
- data/spec/models/user.rb +3 -1
- data/spec/models/zoo.rb +3 -1
- data/spec/paranoia_spec.rb +3 -1
- data/spec/postgres_spec.rb +54 -0
- data/spec/save_command_spec.rb +9 -5
- data/spec/schema_spec.rb +0 -91
- data/spec/single_table_inheritance_spec.rb +8 -0
- data/spec/table_spec.rb +46 -0
- data/spec/validates_uniqueness_of_spec.rb +19 -1
- metadata +8 -10
- data/lib/data_mapper/associations/has_one_association.rb +0 -77
- 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
|
+
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-
|
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
|
data/plugins/dataobjects/do_rb
DELETED
Binary file
|