datamapper 0.3.2 → 0.9.3
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/History.txt +0 -0
- data/Manifest.txt +5 -0
- data/README.txt +11 -0
- data/Rakefile +70 -0
- data/lib/datamapper.rb +8 -0
- metadata +152 -319
- data/CHANGELOG +0 -145
- data/FAQ +0 -96
- data/MIT-LICENSE +0 -22
- data/QUICKLINKS +0 -12
- data/README +0 -105
- data/environment.rb +0 -62
- data/example.rb +0 -156
- data/lib/data_mapper.rb +0 -88
- data/lib/data_mapper/adapters/abstract_adapter.rb +0 -43
- data/lib/data_mapper/adapters/data_object_adapter.rb +0 -480
- data/lib/data_mapper/adapters/mysql_adapter.rb +0 -72
- data/lib/data_mapper/adapters/postgresql_adapter.rb +0 -258
- data/lib/data_mapper/adapters/sql/coersion.rb +0 -134
- data/lib/data_mapper/adapters/sql/commands/load_command.rb +0 -545
- data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +0 -34
- data/lib/data_mapper/adapters/sql/mappings/column.rb +0 -279
- data/lib/data_mapper/adapters/sql/mappings/conditions.rb +0 -172
- data/lib/data_mapper/adapters/sql/mappings/schema.rb +0 -60
- data/lib/data_mapper/adapters/sql/mappings/table.rb +0 -459
- data/lib/data_mapper/adapters/sql/quoting.rb +0 -24
- data/lib/data_mapper/adapters/sqlite3_adapter.rb +0 -159
- data/lib/data_mapper/associations.rb +0 -106
- data/lib/data_mapper/associations/belongs_to_association.rb +0 -160
- data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +0 -437
- data/lib/data_mapper/associations/has_many_association.rb +0 -283
- data/lib/data_mapper/associations/has_n_association.rb +0 -143
- data/lib/data_mapper/associations/reference.rb +0 -47
- data/lib/data_mapper/attributes.rb +0 -73
- data/lib/data_mapper/auto_migrations.rb +0 -36
- data/lib/data_mapper/base.rb +0 -17
- data/lib/data_mapper/callbacks.rb +0 -107
- data/lib/data_mapper/context.rb +0 -112
- data/lib/data_mapper/database.rb +0 -234
- data/lib/data_mapper/dependency_queue.rb +0 -28
- data/lib/data_mapper/embedded_value.rb +0 -145
- data/lib/data_mapper/identity_map.rb +0 -47
- data/lib/data_mapper/is/tree.rb +0 -121
- data/lib/data_mapper/migration.rb +0 -155
- data/lib/data_mapper/persistence.rb +0 -852
- data/lib/data_mapper/property.rb +0 -310
- data/lib/data_mapper/query.rb +0 -164
- data/lib/data_mapper/support/blank.rb +0 -35
- data/lib/data_mapper/support/connection_pool.rb +0 -117
- data/lib/data_mapper/support/enumerable.rb +0 -35
- data/lib/data_mapper/support/errors.rb +0 -16
- data/lib/data_mapper/support/inflector.rb +0 -265
- data/lib/data_mapper/support/object.rb +0 -54
- data/lib/data_mapper/support/serialization.rb +0 -96
- data/lib/data_mapper/support/silence.rb +0 -10
- data/lib/data_mapper/support/string.rb +0 -72
- data/lib/data_mapper/support/struct.rb +0 -7
- data/lib/data_mapper/support/symbol.rb +0 -82
- data/lib/data_mapper/support/typed_set.rb +0 -65
- data/lib/data_mapper/types/base.rb +0 -44
- data/lib/data_mapper/types/string.rb +0 -34
- data/lib/data_mapper/validatable_extensions/errors.rb +0 -12
- data/lib/data_mapper/validatable_extensions/macros.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +0 -62
- data/lib/data_mapper/validatable_extensions/validation_base.rb +0 -18
- data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +0 -43
- data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +0 -28
- data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +0 -15
- data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +0 -7
- data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +0 -40
- data/lib/data_mapper/validations.rb +0 -20
- data/lib/data_mapper/validations/number_validator.rb +0 -40
- data/lib/data_mapper/validations/string_validator.rb +0 -20
- data/lib/data_mapper/validations/validator.rb +0 -13
- data/performance.rb +0 -307
- data/plugins/can_has_sphinx/LICENSE +0 -23
- data/plugins/can_has_sphinx/README +0 -4
- data/plugins/can_has_sphinx/REVISION +0 -1
- data/plugins/can_has_sphinx/Rakefile +0 -22
- data/plugins/can_has_sphinx/init.rb +0 -1
- data/plugins/can_has_sphinx/install.rb +0 -1
- data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +0 -123
- data/plugins/can_has_sphinx/lib/sphinx.rb +0 -460
- data/plugins/can_has_sphinx/scripts/sphinx.sh +0 -47
- data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +0 -41
- data/profile_data_mapper.rb +0 -40
- data/rakefile.rb +0 -159
- data/spec/acts_as_tree_spec.rb +0 -67
- data/spec/adapters/data_object_adapter_spec.rb +0 -31
- data/spec/associations/belongs_to_association_spec.rb +0 -98
- data/spec/associations/has_and_belongs_to_many_association_spec.rb +0 -377
- data/spec/associations/has_many_association_spec.rb +0 -337
- data/spec/attributes_spec.rb +0 -52
- data/spec/auto_migrations_spec.rb +0 -101
- data/spec/callbacks_spec.rb +0 -186
- data/spec/can_has_sphinx.rb +0 -5
- data/spec/coersion_spec.rb +0 -41
- data/spec/column_spec.rb +0 -114
- data/spec/count_command_spec.rb +0 -45
- data/spec/database_spec.rb +0 -18
- data/spec/dataobjects_spec.rb +0 -27
- data/spec/delete_command_spec.rb +0 -11
- data/spec/dependency_spec.rb +0 -29
- data/spec/embedded_value_spec.rb +0 -161
- data/spec/fixtures/animals.yaml +0 -33
- data/spec/fixtures/animals_exhibits.yaml +0 -2
- data/spec/fixtures/careers.yaml +0 -5
- data/spec/fixtures/comments.yaml +0 -1
- data/spec/fixtures/exhibits.yaml +0 -90
- data/spec/fixtures/fruit.yaml +0 -6
- data/spec/fixtures/people.yaml +0 -37
- data/spec/fixtures/posts.yaml +0 -3
- data/spec/fixtures/projects.yaml +0 -13
- data/spec/fixtures/sections.yaml +0 -5
- data/spec/fixtures/serializers.yaml +0 -6
- data/spec/fixtures/tasks.yaml +0 -6
- data/spec/fixtures/tasks_tasks.yaml +0 -2
- data/spec/fixtures/tomatoes.yaml +0 -1
- data/spec/fixtures/users.yaml +0 -1
- data/spec/fixtures/zoos.yaml +0 -24
- data/spec/is_a_tree_spec.rb +0 -149
- data/spec/legacy_spec.rb +0 -16
- data/spec/load_command_spec.rb +0 -322
- data/spec/magic_columns_spec.rb +0 -26
- data/spec/migration_spec.rb +0 -267
- data/spec/mock_adapter.rb +0 -20
- data/spec/models/animal.rb +0 -12
- data/spec/models/candidate.rb +0 -8
- data/spec/models/career.rb +0 -7
- data/spec/models/chain.rb +0 -8
- data/spec/models/comment.rb +0 -6
- data/spec/models/exhibit.rb +0 -14
- data/spec/models/fence.rb +0 -7
- data/spec/models/fruit.rb +0 -8
- data/spec/models/job.rb +0 -8
- data/spec/models/person.rb +0 -30
- data/spec/models/post.rb +0 -14
- data/spec/models/project.rb +0 -41
- data/spec/models/sales_person.rb +0 -5
- data/spec/models/section.rb +0 -8
- data/spec/models/serializer.rb +0 -5
- data/spec/models/task.rb +0 -9
- data/spec/models/tomato.rb +0 -27
- data/spec/models/user.rb +0 -12
- data/spec/models/zoo.rb +0 -13
- data/spec/natural_key_spec.rb +0 -36
- data/spec/paranoia_spec.rb +0 -38
- data/spec/persistence_spec.rb +0 -479
- data/spec/postgres_spec.rb +0 -96
- data/spec/property_spec.rb +0 -151
- data/spec/query_spec.rb +0 -77
- data/spec/save_command_spec.rb +0 -94
- data/spec/schema_spec.rb +0 -8
- data/spec/serialize_spec.rb +0 -19
- data/spec/single_table_inheritance_spec.rb +0 -43
- data/spec/spec_helper.rb +0 -45
- data/spec/support/blank_spec.rb +0 -8
- data/spec/support/inflector_spec.rb +0 -41
- data/spec/support/object_spec.rb +0 -9
- data/spec/support/serialization_spec.rb +0 -61
- data/spec/support/silence_spec.rb +0 -15
- data/spec/support/string_spec.rb +0 -7
- data/spec/support/struct_spec.rb +0 -12
- data/spec/support/typed_set_spec.rb +0 -66
- data/spec/symbolic_operators_spec.rb +0 -27
- data/spec/table_spec.rb +0 -79
- data/spec/types/string.rb +0 -81
- data/spec/validates_confirmation_of_spec.rb +0 -55
- data/spec/validates_format_of_spec.rb +0 -78
- data/spec/validates_length_of_spec.rb +0 -117
- data/spec/validates_uniqueness_of_spec.rb +0 -92
- data/spec/validations/number_validator.rb +0 -59
- data/spec/validations/string_validator.rb +0 -14
- data/spec/validations_spec.rb +0 -141
- data/tasks/fixtures.rb +0 -53
data/spec/postgres_spec.rb
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
-
|
|
3
|
-
# Only run these specs when the ADAPTER env-variable is set to 'postgresql'
|
|
4
|
-
# You will probably need to set the DATABASE and USERNAME vars as well.
|
|
5
|
-
if ENV['ADAPTER'] == 'postgresql'
|
|
6
|
-
|
|
7
|
-
describe DataMapper::Adapters::PostgresqlAdapter::Mappings::Column do
|
|
8
|
-
before(:all) do
|
|
9
|
-
@mappings = DataMapper::Adapters::PostgresqlAdapter::Mappings
|
|
10
|
-
@table = @mappings::Table.new(database(:mock).adapter, "Zebu")
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should be able to set check-constraints on columns" do
|
|
14
|
-
column = @mappings::Column.new(database(:mock).adapter, @table, :age,
|
|
15
|
-
:integer, 1, { :check => "age > 18"})
|
|
16
|
-
column.to_long_form.should match(/CHECK \(age > 18\)/)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "should not set varchar length if none is specified" do
|
|
20
|
-
column = @mappings::Column.new(database(:mock).adapter, @table,
|
|
21
|
-
:varchar_len_test, :string, 1, { })
|
|
22
|
-
column.size.should == nil
|
|
23
|
-
column.to_long_form.should match(/.varchar_len_test. varchar/)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should set varchar length when it is specified" do
|
|
27
|
-
column = @mappings::Column.new(database(:mock).adapter, @table,
|
|
28
|
-
:varchar_len_test, :string, 1, { :length => 100 })
|
|
29
|
-
column.size.should == 100
|
|
30
|
-
column.to_long_form.should match(/.varchar_len_test. varchar\(100\)/)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should accept :size as alternative to :length" do
|
|
34
|
-
column = @mappings::Column.new(database(:mock).adapter, @table,
|
|
35
|
-
:varchar_len_test, :string, 1, { :size => 100 })
|
|
36
|
-
column.size.should == 100
|
|
37
|
-
column.to_long_form.should match(/.varchar_len_test. varchar\(100\)/)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "should have size of nil when length of integer is specified" do
|
|
41
|
-
column = @mappings::Column.new(database(:mock).adapter, @table,
|
|
42
|
-
:integer_len_test, :integer, 1, { :length => 1 })
|
|
43
|
-
column.size.should == nil
|
|
44
|
-
column.to_long_form.should match(/.integer_len_test./)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should have size of nil when length of integer is not specified, overriding the default" do
|
|
48
|
-
column = @mappings::Column.new(database(:mock).adapter, @table,
|
|
49
|
-
:integer_len_test, :integer, 1)
|
|
50
|
-
column.size.should == nil
|
|
51
|
-
column.to_long_form.should match(/.integer_len_test./)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
describe DataMapper::Adapters::PostgresqlAdapter::Mappings::Table do
|
|
56
|
-
|
|
57
|
-
before(:all) do
|
|
58
|
-
class Cage #< DataMapper::Base # please do not remove this
|
|
59
|
-
include DataMapper::Base
|
|
60
|
-
|
|
61
|
-
set_table_name "cages"
|
|
62
|
-
property :name, :string
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
class CageInSchema #< DataMapper::Base # please do not remove this
|
|
66
|
-
include DataMapper::Base
|
|
67
|
-
|
|
68
|
-
set_table_name "my_schema.cages"
|
|
69
|
-
property :name, :string
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should return a quoted table name for a simple table" do
|
|
74
|
-
table_sql = database.adapter.table(Cage).to_sql
|
|
75
|
-
table_sql.should == "\"cages\""
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
it "should return a quoted schema and table name for a table which specifies a schema" do
|
|
79
|
-
table_sql = database.adapter.table(CageInSchema).to_sql
|
|
80
|
-
table_sql.should == "\"my_schema\".\"cages\""
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should search only the specified schema if qualified" do
|
|
84
|
-
database.save(Cage)
|
|
85
|
-
database.adapter.table(CageInSchema).exists?.should == false
|
|
86
|
-
database.save(CageInSchema)
|
|
87
|
-
database.adapter.table(CageInSchema).exists?.should == true
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
after do
|
|
91
|
-
database.adapter.execute("DROP SCHEMA my_schema CASCADE") rescue nil
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
end
|
data/spec/property_spec.rb
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
-
|
|
3
|
-
describe DataMapper::Property do
|
|
4
|
-
|
|
5
|
-
before(:all) do
|
|
6
|
-
@property = Zoo.properties.find { |property| property.name == :notes }
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it "should map a column" do
|
|
10
|
-
@property.column.should eql(database.table(Zoo)[:notes])
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should determine lazyness" do
|
|
14
|
-
@property.should be_lazy
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "should determine protection level" do
|
|
18
|
-
@property.reader_visibility.should == :public
|
|
19
|
-
@property.writer_visibility.should == :public
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it "should return instance variable name" do
|
|
23
|
-
@property.instance_variable_name.should == database.table(Zoo)[:notes].instance_variable_name
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should add a validates_presence_of for not-null properties" do
|
|
27
|
-
class NullableZoo #< DataMapper::Base # please do not remove this
|
|
28
|
-
include DataMapper::Persistence
|
|
29
|
-
|
|
30
|
-
property :name, :string, :nullable => false, :default => "Zoo"
|
|
31
|
-
end
|
|
32
|
-
zoo = NullableZoo.new
|
|
33
|
-
zoo.valid?.should == false
|
|
34
|
-
zoo.name = "Content"
|
|
35
|
-
zoo.valid?.should == true
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "should add a validates_length_of for maximum size" do
|
|
39
|
-
class SizableZoo #< DataMapper::Base # please do not remove this
|
|
40
|
-
include DataMapper::Persistence
|
|
41
|
-
property :name, :string, :length => 50
|
|
42
|
-
end
|
|
43
|
-
zoo = SizableZoo.new(:name => "San Diego" * 100)
|
|
44
|
-
zoo.valid?.should == false
|
|
45
|
-
zoo.name = "San Diego"
|
|
46
|
-
zoo.valid?.should == true
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "should add a validates_length_of for a range" do
|
|
50
|
-
class RangableZoo #< DataMapper::Base # please do not remove this
|
|
51
|
-
include DataMapper::Persistence
|
|
52
|
-
property :name, :string, :length => 2..255
|
|
53
|
-
end
|
|
54
|
-
zoo = RangableZoo.new(:name => "A")
|
|
55
|
-
zoo.valid?.should == false
|
|
56
|
-
zoo.name = "Zoo"
|
|
57
|
-
zoo.valid?.should == true
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it "should add a validates_format_of if you pass a format option" do
|
|
61
|
-
class FormatableUser
|
|
62
|
-
include DataMapper::Persistence
|
|
63
|
-
property :email, :string, :format => :email_address
|
|
64
|
-
end
|
|
65
|
-
user = FormatableUser.new(:email => "incomplete_email")
|
|
66
|
-
user.valid?.should == false
|
|
67
|
-
user.email = "complete_email@anonymous.com"
|
|
68
|
-
user.valid?.should == true
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "should not add a validates_presence_of for not-null properties if auto valdations are disabled" do
|
|
72
|
-
class NullableZoo #< DataMapper::Base # please do not remove this
|
|
73
|
-
include DataMapper::Persistence
|
|
74
|
-
property :name, :string, :nullable => false, :default => "Zoo", :auto_validation => false
|
|
75
|
-
end
|
|
76
|
-
zoo = NullableZoo.new
|
|
77
|
-
zoo.errors.empty?.should == true
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should not add a validates_length_of if auto validations are disabled" do
|
|
81
|
-
class SizableZoo #< DataMapper::Base # please do not remove this
|
|
82
|
-
include DataMapper::Persistence
|
|
83
|
-
property :name, :string, :length => 50, :auto_validation => false
|
|
84
|
-
end
|
|
85
|
-
zoo = SizableZoo.new(:name => "San Diego" * 100)
|
|
86
|
-
zoo.errors.empty?.should == true
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should not add a validates_format_of if you pass a format option if auto validations are disabled" do
|
|
90
|
-
class FormatableUser
|
|
91
|
-
include DataMapper::Persistence
|
|
92
|
-
property :email, :string, :format => :email_address, :auto_validation => false
|
|
93
|
-
end
|
|
94
|
-
user = FormatableUser.new(:email => "incomplete_email")
|
|
95
|
-
user.errors.empty?.should == true
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "should raise ArgumentError for unsupported types" do
|
|
99
|
-
lambda {
|
|
100
|
-
class PersistentFailure #< DataMapper::Base # please do not remove this
|
|
101
|
-
include DataMapper::Persistence
|
|
102
|
-
property :created_at, :timestamp
|
|
103
|
-
end
|
|
104
|
-
}.should raise_error(ArgumentError)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
describe DataMapper::Adapters::Sql::Mappings do
|
|
109
|
-
|
|
110
|
-
it "should return the same Table instance for two objects mapped to the same database table" do
|
|
111
|
-
# Refers to the same Table instance
|
|
112
|
-
database.table(Person) == database.table(SalesPerson)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should have one super-set of total mapped columns" do
|
|
116
|
-
# Refers to the mapped columns
|
|
117
|
-
database.table(Person).columns == database.table(SalesPerson).columns
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "should have one set of columns that represents the actual database" do
|
|
121
|
-
# Refers to the actual columns in the database, which may/are-likely-to-be different
|
|
122
|
-
# than the mapped columns, sometimes just because your models are dealing with
|
|
123
|
-
# a legacy database where not every column is mapped to the new model, so this
|
|
124
|
-
# is expected.
|
|
125
|
-
database.table(Person).send(:database_columns) == database.table(SalesPerson).send(:database_columns)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "should have two different sets of mapped properties that point to subsets of the Table columns" do
|
|
129
|
-
# pending("This one still needs some love to pass.")
|
|
130
|
-
table = database.table(Person)
|
|
131
|
-
|
|
132
|
-
# Every property's column should be represented in the Table's column mappings.
|
|
133
|
-
Person.properties.each do |property|
|
|
134
|
-
table.columns.should include(property.column)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
# For both models in the STI setup...
|
|
138
|
-
SalesPerson.properties.each do |property|
|
|
139
|
-
database.table(SalesPerson).columns.should include(property.column)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
# Even though Person's properties are fewer than a SalesPerson's
|
|
143
|
-
Person.properties.size.should_not eql(SalesPerson.properties.size)
|
|
144
|
-
|
|
145
|
-
# And Person's properties should be a subset of a SalesPerson's
|
|
146
|
-
Person.properties.each do |property|
|
|
147
|
-
SalesPerson.properties.map(&:column).should include(property.column)
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
end
|
data/spec/query_spec.rb
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
-
|
|
3
|
-
# * you have some crazy finder options... ie: Zoo, :name => 'bob', :include => :exhibits
|
|
4
|
-
#
|
|
5
|
-
# * you want to turn this into SQL.
|
|
6
|
-
#
|
|
7
|
-
# * you want to execute this SQL...
|
|
8
|
-
#
|
|
9
|
-
# * you want to load objects from the results, which means you have to know what columns in the results map to what objects
|
|
10
|
-
#
|
|
11
|
-
# * some values in the results will have no corresponding objects, theyll be indicators of other behaviour that should take place
|
|
12
|
-
# ie: the values for a m:n join table will tell you how to bind the associated objects together, or...
|
|
13
|
-
# the :type column will tell you what type to instantiate
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# So... the Query class should basically take the options from step 1, give you the SQL in step 2,
|
|
17
|
-
# allow you to handle step 3, and expose types/result-set mappings to load objects by for step 4.
|
|
18
|
-
# step 5 should be handled in the DataObjectAdapter
|
|
19
|
-
describe DataMapper::Query do
|
|
20
|
-
|
|
21
|
-
it "should generate the correct queries for the given options" do
|
|
22
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :name => 'bob')
|
|
23
|
-
query.to_sql.should == "SELECT `id`, `name`, `updated_at` FROM `zoos` WHERE (`name` = ?)"
|
|
24
|
-
query.parameters.should == ['bob']
|
|
25
|
-
|
|
26
|
-
query = DataMapper::Query.new(database(:mock).adapter, Animal, :name => 'bob')
|
|
27
|
-
query.to_sql.should == "SELECT `id`, `name`, `nice` FROM `animals` WHERE (`name` = ?)"
|
|
28
|
-
query.parameters.should == ['bob']
|
|
29
|
-
|
|
30
|
-
query = DataMapper::Query.new(database(:mock).adapter, Project)
|
|
31
|
-
query.to_sql.should == "SELECT `id`, `title`, `description`, `deleted_at` FROM `projects` WHERE (`deleted_at` IS NULL OR `deleted_at` > NOW())"
|
|
32
|
-
query.parameters.should be_empty
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "should use the include option for lazily-loaded columns" do
|
|
36
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :include => :notes)
|
|
37
|
-
query.to_sql.should == "SELECT `id`, `name`, `notes`, `updated_at` FROM `zoos`"
|
|
38
|
-
query.parameters.should be_empty
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "should generate the correct join query" do
|
|
42
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :include => [:exhibits])
|
|
43
|
-
query.to_sql.should == <<-EOS.compress_lines
|
|
44
|
-
SELECT `zoos`.`id`, `zoos`.`name`, `zoos`.`updated_at`, `exhibits`.`id`, `exhibits`.`name`, `exhibits`.`zoo_id`
|
|
45
|
-
FROM `zoos`
|
|
46
|
-
JOIN `exhibits` ON `exhibits`.`zoo_id` = `zoos`.`id`
|
|
47
|
-
EOS
|
|
48
|
-
|
|
49
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :include => [:exhibits], :name => ['bob', 'sam'])
|
|
50
|
-
query.to_sql.should == <<-EOS.compress_lines
|
|
51
|
-
SELECT `zoos`.`id`, `zoos`.`name`, `zoos`.`updated_at`, `exhibits`.`id`, `exhibits`.`name`, `exhibits`.`zoo_id`
|
|
52
|
-
FROM `zoos`
|
|
53
|
-
JOIN `exhibits` ON `exhibits`.`zoo_id` = `zoos`.`id`
|
|
54
|
-
WHERE (`zoos`.`name` IN ?)
|
|
55
|
-
EOS
|
|
56
|
-
query.parameters.should == [['bob', 'sam']]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "should be forgiving with options that require Arrays" do
|
|
60
|
-
|
|
61
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :conditions => ["`name` = ?", 'bob'])
|
|
62
|
-
query.to_sql.should == "SELECT `id`, `name`, `updated_at` FROM `zoos` WHERE (`name` = ?)"
|
|
63
|
-
query.parameters.should == ['bob']
|
|
64
|
-
|
|
65
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :conditions => "`name` = 'bob'")
|
|
66
|
-
query.to_sql.should == "SELECT `id`, `name`, `updated_at` FROM `zoos` WHERE (`name` = 'bob')"
|
|
67
|
-
query.parameters.should be_empty
|
|
68
|
-
|
|
69
|
-
query = DataMapper::Query.new(database(:mock).adapter, Zoo, :include => :exhibits)
|
|
70
|
-
query.to_sql.should == <<-EOS.compress_lines
|
|
71
|
-
SELECT `zoos`.`id`, `zoos`.`name`, `zoos`.`updated_at`, `exhibits`.`id`, `exhibits`.`name`, `exhibits`.`zoo_id`
|
|
72
|
-
FROM `zoos`
|
|
73
|
-
JOIN `exhibits` ON `exhibits`.`zoo_id` = `zoos`.`id`
|
|
74
|
-
EOS
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
end
|
data/spec/save_command_spec.rb
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
-
|
|
3
|
-
describe "Save Commands" do
|
|
4
|
-
|
|
5
|
-
before(:all) do
|
|
6
|
-
fixtures(:zoos)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it "should create a new row" do
|
|
10
|
-
total = Zoo.all.length
|
|
11
|
-
Zoo.create({ :name => 'bob' })
|
|
12
|
-
zoo = Zoo.first(:name => 'bob')
|
|
13
|
-
zoo.name.should == 'bob'
|
|
14
|
-
Zoo.all.length.should == total+1
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "should update an existing row" do
|
|
18
|
-
dallas = Zoo.first(:name => 'Dallas')
|
|
19
|
-
dallas.name = 'bob'
|
|
20
|
-
dallas.save
|
|
21
|
-
dallas.name = 'Dallas'
|
|
22
|
-
dallas.save
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "should be able to read other attributes after a record is created" do
|
|
26
|
-
zoo = Zoo.create({ :name => 'bob' })
|
|
27
|
-
zoo.notes.should == nil
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should stamp association on save" do
|
|
31
|
-
database do
|
|
32
|
-
dallas = Zoo.first(:name => 'Dallas')
|
|
33
|
-
dallas.exhibits << Exhibit.new(:name => 'Flying Monkeys')
|
|
34
|
-
dallas.save
|
|
35
|
-
Exhibit.first(:name => 'Flying Monkeys').zoo.should == dallas
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should return success of save call, not status of query execution" do
|
|
40
|
-
# pending "http://wm.lighthouseapp.com/projects/4819/tickets/54-save-should-return-success"
|
|
41
|
-
Exhibit.first.save.should be_true
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should be invalid if invalid associations are loaded" do
|
|
45
|
-
miami = Zoo.first(:name => 'Miami')
|
|
46
|
-
fish_fancy = Exhibit.new
|
|
47
|
-
miami.exhibits << fish_fancy
|
|
48
|
-
miami.should_not be_valid
|
|
49
|
-
fish_fancy.name = 'Fish Fancy'
|
|
50
|
-
fish_fancy.should be_valid
|
|
51
|
-
miami.should be_valid
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it "should retrieve it's id on creation if the key is auto-incrementing so it can be successively updated" do
|
|
55
|
-
database do # Use the same Session so the reference-equality checks will pass.
|
|
56
|
-
mary = Animal::create(:name => 'Mary')
|
|
57
|
-
mary.name = 'Jane'
|
|
58
|
-
# Without retrieving the id during creation, the following #save call would fail,
|
|
59
|
-
# because we wouldn't know what id to update.
|
|
60
|
-
mary.save.should == true
|
|
61
|
-
jane = Animal.first(:name => 'Jane')
|
|
62
|
-
mary.should == jane
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "should not be dirty if there are no attributes to update" do
|
|
67
|
-
bob = Animal.new
|
|
68
|
-
bob.should_not be_dirty
|
|
69
|
-
bob.name = 'bob'
|
|
70
|
-
bob.dirty_attributes.should == { :name => 'bob' }
|
|
71
|
-
bob.should be_dirty
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should not persist invalid objects" do
|
|
75
|
-
zoo = Zoo.create(:notes => "I'm invalid!")
|
|
76
|
-
zoo.should_not be_valid
|
|
77
|
-
zoo.should be_new_record
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should create a Project with a \"Main\" Section" do
|
|
81
|
-
database do
|
|
82
|
-
project = Project::create(:title => 'Test')
|
|
83
|
-
project.sections.first.should == Section.first
|
|
84
|
-
project.sections.first.should be_a_kind_of(Section)
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "save! should raise an error if validation failed" do
|
|
89
|
-
# pending "http://wm.lighthouseapp.com/projects/4819/tickets/29-dm-context-write"
|
|
90
|
-
empty = Zoo.new
|
|
91
|
-
lambda { empty.save! }.should raise_error(DataMapper::ValidationError)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
end
|
data/spec/schema_spec.rb
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
-
|
|
3
|
-
describe DataMapper::Adapters::Sql::Mappings::Schema do
|
|
4
|
-
it "should return all tables from the database schema" do
|
|
5
|
-
database.adapter.schema.database_tables.size.should == Dir[File.dirname(__FILE__) + '/fixtures/*'].size
|
|
6
|
-
database.adapter.schema.database_tables.each { |table| table.should be_a_kind_of( DataMapper::Adapters::Sql::Mappings::Table ) }
|
|
7
|
-
end
|
|
8
|
-
end
|
data/spec/serialize_spec.rb
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
-
|
|
3
|
-
describe('An AR serialize implementation') do
|
|
4
|
-
|
|
5
|
-
it 'should instatiate, save, (clear and load) the original objects' do
|
|
6
|
-
test_data = { :first => 1, :second => "dos", :third => 3.0 }
|
|
7
|
-
|
|
8
|
-
srlzr1 = Serializer.new(:content => test_data)
|
|
9
|
-
srlzr1.content.should == test_data
|
|
10
|
-
|
|
11
|
-
srlzr1.save
|
|
12
|
-
srlzr1.content.should == test_data
|
|
13
|
-
|
|
14
|
-
srlzr1 = nil
|
|
15
|
-
srlzr2 = Serializer.first
|
|
16
|
-
srlzr2.content.should == test_data
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
end
|