datamapper 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +31 -1
- data/MIT-LICENSE +1 -1
- data/README +9 -1
- data/example.rb +23 -15
- data/lib/data_mapper.rb +5 -0
- data/lib/data_mapper/adapters/abstract_adapter.rb +9 -207
- data/lib/data_mapper/adapters/mysql_adapter.rb +132 -108
- data/lib/data_mapper/adapters/postgresql_adapter.rb +242 -0
- data/lib/data_mapper/adapters/sql/coersion.rb +74 -0
- data/lib/data_mapper/adapters/sql/commands/advanced_load_command.rb +140 -0
- data/lib/data_mapper/adapters/sql/commands/conditions.rb +161 -0
- data/lib/data_mapper/adapters/sql/commands/delete_command.rb +113 -0
- data/lib/data_mapper/adapters/sql/commands/load_command.rb +296 -0
- data/lib/data_mapper/adapters/sql/commands/save_command.rb +141 -0
- data/lib/data_mapper/adapters/sql/commands/table_exists_command.rb +33 -0
- data/lib/data_mapper/adapters/sql/mappings/column.rb +91 -0
- data/lib/data_mapper/adapters/sql/mappings/schema.rb +30 -0
- data/lib/data_mapper/adapters/sql/mappings/table.rb +143 -0
- data/lib/data_mapper/adapters/sql/quoting.rb +38 -0
- data/lib/data_mapper/adapters/sql_adapter.rb +163 -0
- data/lib/data_mapper/adapters/sqlite3_adapter.rb +155 -116
- data/lib/data_mapper/associations.rb +2 -0
- data/lib/data_mapper/associations/advanced_has_many_association.rb +55 -0
- data/lib/data_mapper/associations/belongs_to_association.rb +2 -2
- data/lib/data_mapper/associations/has_many_association.rb +3 -3
- data/lib/data_mapper/associations/has_one_association.rb +2 -2
- data/lib/data_mapper/base.rb +30 -11
- data/lib/data_mapper/callbacks.rb +4 -1
- data/lib/data_mapper/database.rb +8 -41
- data/lib/data_mapper/identity_map.rb +23 -3
- data/lib/data_mapper/session.rb +34 -186
- data/lib/data_mapper/{extensions → support}/active_record_impersonation.rb +16 -12
- data/lib/data_mapper/support/blank.rb +35 -0
- data/lib/data_mapper/support/connection_pool.rb +2 -1
- data/lib/data_mapper/support/string.rb +27 -0
- data/lib/data_mapper/support/struct.rb +26 -0
- data/lib/data_mapper/validations/unique_validator.rb +1 -3
- data/lib/data_mapper/validations/validation_helper.rb +1 -1
- data/performance.rb +24 -7
- data/profile_data_mapper.rb +24 -2
- data/rakefile.rb +2 -2
- data/spec/basic_finder.rb +2 -2
- data/spec/belongs_to.rb +1 -1
- data/spec/delete_command_spec.rb +9 -0
- data/spec/fixtures/zoos.yaml +4 -0
- data/spec/has_many.rb +1 -1
- data/spec/load_command_spec.rb +44 -0
- data/spec/models/zoo.rb +2 -0
- data/spec/save_command_spec.rb +13 -0
- data/spec/spec_helper.rb +10 -1
- data/spec/support/string_spec.rb +7 -0
- data/spec/validates_confirmation_of.rb +1 -1
- data/spec/validates_format_of.rb +1 -1
- data/spec/validates_length_of.rb +1 -1
- data/spec/validations.rb +1 -1
- metadata +23 -20
- data/lib/data_mapper/extensions/callback_helpers.rb +0 -35
- data/lib/data_mapper/loaded_set.rb +0 -45
- data/lib/data_mapper/mappings/column.rb +0 -78
- data/lib/data_mapper/mappings/schema.rb +0 -28
- data/lib/data_mapper/mappings/table.rb +0 -99
- data/lib/data_mapper/queries/conditions.rb +0 -141
- data/lib/data_mapper/queries/connection.rb +0 -34
- data/lib/data_mapper/queries/create_table_statement.rb +0 -38
- data/lib/data_mapper/queries/delete_statement.rb +0 -17
- data/lib/data_mapper/queries/drop_table_statement.rb +0 -17
- data/lib/data_mapper/queries/insert_statement.rb +0 -29
- data/lib/data_mapper/queries/reader.rb +0 -42
- data/lib/data_mapper/queries/result.rb +0 -19
- data/lib/data_mapper/queries/select_statement.rb +0 -103
- data/lib/data_mapper/queries/table_exists_statement.rb +0 -17
- data/lib/data_mapper/queries/truncate_table_statement.rb +0 -17
- data/lib/data_mapper/queries/update_statement.rb +0 -25
@@ -0,0 +1,13 @@
|
|
1
|
+
describe DataMapper::Adapters::Sql::Commands::SaveCommand do
|
2
|
+
|
3
|
+
it "should create a new row" do
|
4
|
+
Zoo.create({ :name => 'bob' })
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should update an existing row" do
|
8
|
+
dallas = Zoo[:name => 'Dallas']
|
9
|
+
dallas.name = 'bob'
|
10
|
+
dallas.save
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,6 +15,14 @@ when 'sqlite3' then
|
|
15
15
|
log_stream 'spec.log'
|
16
16
|
log_level Logger::DEBUG
|
17
17
|
end
|
18
|
+
when 'postgresql' then
|
19
|
+
DataMapper::Database.setup do
|
20
|
+
adapter 'postgresql'
|
21
|
+
database 'data_mapper_1'
|
22
|
+
username 'postgres'
|
23
|
+
log_stream 'spec.log'
|
24
|
+
log_level Logger::DEBUG
|
25
|
+
end
|
18
26
|
else
|
19
27
|
DataMapper::Database.setup do
|
20
28
|
adapter 'mysql'
|
@@ -48,6 +56,7 @@ def fixtures(name)
|
|
48
56
|
entry = YAML::load_file(File.dirname(__FILE__) + "/fixtures/#{name}.yaml")
|
49
57
|
klass = Kernel::const_get(Inflector.classify(Inflector.singularize(name)))
|
50
58
|
|
59
|
+
database.schema[klass].create!
|
51
60
|
klass.truncate!
|
52
61
|
|
53
62
|
(entry.kind_of?(Array) ? entry : [entry]).each do |hash|
|
@@ -58,4 +67,4 @@ end
|
|
58
67
|
# Pre-fill the database so non-destructive tests don't need to reload fixtures.
|
59
68
|
Dir[File.dirname(__FILE__) + "/fixtures/*.yaml"].each do |path|
|
60
69
|
fixtures(File::basename(path).sub(/\.yaml$/, ''))
|
61
|
-
end
|
70
|
+
end
|
data/spec/validates_format_of.rb
CHANGED
data/spec/validates_length_of.rb
CHANGED
data/spec/validations.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: datamapper
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.1
|
7
|
+
date: 2007-08-12 00:00:00 -05:00
|
8
8
|
summary: An Object/Relational Mapper for Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -42,39 +42,38 @@ files:
|
|
42
42
|
- lib/data_mapper/callbacks.rb
|
43
43
|
- lib/data_mapper/database.rb
|
44
44
|
- lib/data_mapper/identity_map.rb
|
45
|
-
- lib/data_mapper/loaded_set.rb
|
46
45
|
- lib/data_mapper/session.rb
|
47
46
|
- lib/data_mapper/unit_of_work.rb
|
48
47
|
- lib/data_mapper/adapters/abstract_adapter.rb
|
49
48
|
- lib/data_mapper/adapters/mysql_adapter.rb
|
49
|
+
- lib/data_mapper/adapters/postgresql_adapter.rb
|
50
|
+
- lib/data_mapper/adapters/sql_adapter.rb
|
50
51
|
- lib/data_mapper/adapters/sqlite3_adapter.rb
|
52
|
+
- lib/data_mapper/adapters/sql/coersion.rb
|
53
|
+
- lib/data_mapper/adapters/sql/quoting.rb
|
54
|
+
- lib/data_mapper/adapters/sql/commands/advanced_load_command.rb
|
55
|
+
- lib/data_mapper/adapters/sql/commands/conditions.rb
|
56
|
+
- lib/data_mapper/adapters/sql/commands/delete_command.rb
|
57
|
+
- lib/data_mapper/adapters/sql/commands/load_command.rb
|
58
|
+
- lib/data_mapper/adapters/sql/commands/save_command.rb
|
59
|
+
- lib/data_mapper/adapters/sql/commands/table_exists_command.rb
|
60
|
+
- lib/data_mapper/adapters/sql/mappings/column.rb
|
61
|
+
- lib/data_mapper/adapters/sql/mappings/schema.rb
|
62
|
+
- lib/data_mapper/adapters/sql/mappings/table.rb
|
63
|
+
- lib/data_mapper/associations/advanced_has_many_association.rb
|
51
64
|
- lib/data_mapper/associations/belongs_to_association.rb
|
52
65
|
- lib/data_mapper/associations/has_and_belongs_to_many_association.rb
|
53
66
|
- lib/data_mapper/associations/has_many_association.rb
|
54
67
|
- lib/data_mapper/associations/has_one_association.rb
|
55
|
-
- lib/data_mapper/
|
56
|
-
- lib/data_mapper/
|
57
|
-
- lib/data_mapper/mappings/column.rb
|
58
|
-
- lib/data_mapper/mappings/schema.rb
|
59
|
-
- lib/data_mapper/mappings/table.rb
|
60
|
-
- lib/data_mapper/queries/conditions.rb
|
61
|
-
- lib/data_mapper/queries/connection.rb
|
62
|
-
- lib/data_mapper/queries/create_table_statement.rb
|
63
|
-
- lib/data_mapper/queries/delete_statement.rb
|
64
|
-
- lib/data_mapper/queries/drop_table_statement.rb
|
65
|
-
- lib/data_mapper/queries/insert_statement.rb
|
66
|
-
- lib/data_mapper/queries/reader.rb
|
67
|
-
- lib/data_mapper/queries/result.rb
|
68
|
-
- lib/data_mapper/queries/select_statement.rb
|
69
|
-
- lib/data_mapper/queries/table_exists_statement.rb
|
70
|
-
- lib/data_mapper/queries/truncate_table_statement.rb
|
71
|
-
- lib/data_mapper/queries/update_statement.rb
|
68
|
+
- lib/data_mapper/support/active_record_impersonation.rb
|
69
|
+
- lib/data_mapper/support/blank.rb
|
72
70
|
- lib/data_mapper/support/blank_slate.rb
|
73
71
|
- lib/data_mapper/support/connection_pool.rb
|
74
72
|
- lib/data_mapper/support/enumerable.rb
|
75
73
|
- lib/data_mapper/support/inflector.rb
|
76
74
|
- lib/data_mapper/support/proc.rb
|
77
75
|
- lib/data_mapper/support/string.rb
|
76
|
+
- lib/data_mapper/support/struct.rb
|
78
77
|
- lib/data_mapper/support/symbol.rb
|
79
78
|
- lib/data_mapper/support/weak_hash.rb
|
80
79
|
- lib/data_mapper/validations/confirmation_validator.rb
|
@@ -89,10 +88,13 @@ files:
|
|
89
88
|
- lib/data_mapper/validations/formats/email.rb
|
90
89
|
- spec/basic_finder.rb
|
91
90
|
- spec/belongs_to.rb
|
91
|
+
- spec/delete_command_spec.rb
|
92
92
|
- spec/has_and_belongs_to_many.rb
|
93
93
|
- spec/has_many.rb
|
94
94
|
- spec/legacy.rb
|
95
|
+
- spec/load_command_spec.rb
|
95
96
|
- spec/new_record.rb
|
97
|
+
- spec/save_command_spec.rb
|
96
98
|
- spec/spec_helper.rb
|
97
99
|
- spec/sub_select.rb
|
98
100
|
- spec/symbolic_operators.rb
|
@@ -108,6 +110,7 @@ files:
|
|
108
110
|
- spec/models/post.rb
|
109
111
|
- spec/models/sales_person.rb
|
110
112
|
- spec/models/zoo.rb
|
113
|
+
- spec/support/string_spec.rb
|
111
114
|
- spec/fixtures/animals.yaml
|
112
115
|
- spec/fixtures/exhibits.yaml
|
113
116
|
- spec/fixtures/fruit.yaml
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'data_mapper/callbacks'
|
2
|
-
|
3
|
-
module DataMapper
|
4
|
-
module Extensions
|
5
|
-
|
6
|
-
module CallbackHelpers
|
7
|
-
|
8
|
-
def self.included(base)
|
9
|
-
base.extend(ClassMethods)
|
10
|
-
|
11
|
-
# declare helpers for the standard callbacks
|
12
|
-
Callbacks::EVENTS.each do |name|
|
13
|
-
base.class_eval <<-EOS
|
14
|
-
def self.#{name}(string = nil, &block)
|
15
|
-
if string.nil?
|
16
|
-
callbacks.add(:#{name}, &block)
|
17
|
-
else
|
18
|
-
callbacks.add(:#{name}, string)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
EOS
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module ClassMethods
|
26
|
-
|
27
|
-
def callbacks
|
28
|
-
@callbacks ||= Callbacks.new
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'data_mapper/support/enumerable'
|
2
|
-
|
3
|
-
module DataMapper
|
4
|
-
|
5
|
-
# LoadedSet's purpose is to give a common reference for the results of a query,
|
6
|
-
# so that they can be manipulated by the DataMapper, behind-the-scenes, as a set.
|
7
|
-
class LoadedSet
|
8
|
-
|
9
|
-
# Provides a reference to the database that originally loaded the instances.
|
10
|
-
attr_reader :database
|
11
|
-
# Provides an Enumerable of the instances loaded in the set.
|
12
|
-
attr_reader :instances
|
13
|
-
|
14
|
-
def initialize(database)
|
15
|
-
@database = database
|
16
|
-
@instances = [] # ObjectIdCollection.new
|
17
|
-
end
|
18
|
-
|
19
|
-
# Not sure if this is necessary yet...
|
20
|
-
# In other words: Does it make sense to allow portions of a set to be
|
21
|
-
# garbage-collected?
|
22
|
-
#
|
23
|
-
# If so, then this isn't good enough because it's likely to
|
24
|
-
# throw errors. If it's not, then letting Ruby itself track the
|
25
|
-
# references with a simple Array is probably more effecient.
|
26
|
-
class ObjectIdCollection
|
27
|
-
|
28
|
-
include Enumerable
|
29
|
-
include Support::Enumerable
|
30
|
-
|
31
|
-
def initialize
|
32
|
-
@object_ids = []
|
33
|
-
end
|
34
|
-
|
35
|
-
def each
|
36
|
-
@object_ids.map { |id| yield ObjectSpace::_id2ref(id) }
|
37
|
-
end
|
38
|
-
|
39
|
-
def <<(object)
|
40
|
-
@object_ids << object.object_id
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
module DataMapper
|
2
|
-
module Mappings
|
3
|
-
|
4
|
-
# TODO: There are of course many more options to add here.
|
5
|
-
# Ordinal, Length/Size, Nullability are just a few.
|
6
|
-
class Column
|
7
|
-
|
8
|
-
attr_accessor :name, :type, :options
|
9
|
-
|
10
|
-
def initialize(database, name, type, options = {})
|
11
|
-
@database = database
|
12
|
-
@name, @type, @options = name.to_sym, type, options
|
13
|
-
end
|
14
|
-
|
15
|
-
def lazy=(value)
|
16
|
-
@options[:lazy] = value
|
17
|
-
end
|
18
|
-
|
19
|
-
# Determines if the field should be lazy loaded.
|
20
|
-
# You can set this explicitly, or accept the default,
|
21
|
-
# which is false for all but text fields.
|
22
|
-
def lazy?
|
23
|
-
@options[:lazy] || (type == :text)
|
24
|
-
end
|
25
|
-
|
26
|
-
def nullable?
|
27
|
-
@options[:nullable] || true
|
28
|
-
end
|
29
|
-
|
30
|
-
def key?
|
31
|
-
@options[:key] || false
|
32
|
-
end
|
33
|
-
|
34
|
-
def to_sym
|
35
|
-
@name
|
36
|
-
end
|
37
|
-
|
38
|
-
def instance_variable_name
|
39
|
-
@instance_variable_name || (@instance_variable_name = "@#{@name.to_s.gsub(/\?$/, '')}".freeze)
|
40
|
-
end
|
41
|
-
|
42
|
-
def to_s
|
43
|
-
@name.to_s
|
44
|
-
end
|
45
|
-
|
46
|
-
def type_cast_value(value)
|
47
|
-
@database.type_cast_value(type, value)
|
48
|
-
end
|
49
|
-
|
50
|
-
def column_name
|
51
|
-
@column_name || (@column_name = (@options.has_key?(:column) ? @options[:column].to_s : name.to_s.gsub(/\?$/, '')).freeze)
|
52
|
-
end
|
53
|
-
|
54
|
-
def to_sql
|
55
|
-
@to_sql || (@to_sql = @database.quote_column_name(column_name).freeze)
|
56
|
-
end
|
57
|
-
|
58
|
-
def size
|
59
|
-
@size || begin
|
60
|
-
return @size = @options[:size] if @options.has_key?(:size)
|
61
|
-
return @size = @options[:length] if @options.has_key?(:length)
|
62
|
-
|
63
|
-
@size = case type
|
64
|
-
when :integer then 4
|
65
|
-
when :string, :class then 50
|
66
|
-
else nil
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def inspect
|
72
|
-
"#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'data_mapper/mappings/table'
|
2
|
-
|
3
|
-
module DataMapper
|
4
|
-
module Mappings
|
5
|
-
|
6
|
-
class Schema
|
7
|
-
|
8
|
-
def initialize(database)
|
9
|
-
@database = database
|
10
|
-
@tables = Hash.new { |h,k| h[k] = Table.new(@database, k) }
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](klass)
|
14
|
-
@tables[klass]
|
15
|
-
rescue
|
16
|
-
raise "#{klass.inspect} can't be mapped to a table"
|
17
|
-
end
|
18
|
-
|
19
|
-
def each
|
20
|
-
@tables.values.each do |table|
|
21
|
-
yield table
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'data_mapper/mappings/column'
|
2
|
-
|
3
|
-
module DataMapper
|
4
|
-
module Mappings
|
5
|
-
|
6
|
-
class Table
|
7
|
-
|
8
|
-
attr_reader :klass
|
9
|
-
|
10
|
-
def initialize(database, klass)
|
11
|
-
unless database.kind_of?(DataMapper::Database) && klass.kind_of?(Class)
|
12
|
-
raise "Database and klass are required: #{ { :database => database, :klass => klass }.inspect }"
|
13
|
-
end
|
14
|
-
|
15
|
-
@database = database
|
16
|
-
@klass = klass
|
17
|
-
@columns = []
|
18
|
-
@columns_hash = Hash.new { |h,k| h[k] = @columns.find { |c| c.name == k } }
|
19
|
-
@columns_by_column_name = Hash.new { |h,k| h[k.to_s] = @columns.find { |c| c.column_name == k.to_s } }
|
20
|
-
end
|
21
|
-
|
22
|
-
def columns
|
23
|
-
key if @key.nil?
|
24
|
-
@columns
|
25
|
-
end
|
26
|
-
|
27
|
-
def key
|
28
|
-
if @key.nil?
|
29
|
-
key_column = @columns.find { |c| c.key? }
|
30
|
-
@key = if key_column.nil?
|
31
|
-
add_column(:id, :integer, :key => true)
|
32
|
-
@klass.send(:attr_reader, :id) unless @klass.methods.include?(:id)
|
33
|
-
@columns.last
|
34
|
-
else
|
35
|
-
key_column
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
@key
|
40
|
-
end
|
41
|
-
|
42
|
-
def add_column(column_name, type, options)
|
43
|
-
column = @columns.find { |c| c.name == column_name.to_sym }
|
44
|
-
|
45
|
-
if column.nil?
|
46
|
-
reset_derived_columns!
|
47
|
-
column = Column.new(@database, column_name, type, options)
|
48
|
-
@columns << column
|
49
|
-
end
|
50
|
-
|
51
|
-
return column
|
52
|
-
end
|
53
|
-
|
54
|
-
def [](column_name)
|
55
|
-
return key if column_name == :id
|
56
|
-
@columns_hash[column_name.kind_of?(Symbol) ? column_name : column_name.to_sym]
|
57
|
-
end
|
58
|
-
|
59
|
-
def find_by_column_name(column_name)
|
60
|
-
@columns_by_column_name[column_name.kind_of?(String) ? column_name : column_name.to_s]
|
61
|
-
end
|
62
|
-
|
63
|
-
def name
|
64
|
-
@name || begin
|
65
|
-
@name = if @klass.superclass != DataMapper::Base
|
66
|
-
@database[@klass.superclass].name
|
67
|
-
else
|
68
|
-
Inflector.tableize(@klass.name)
|
69
|
-
end.freeze
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def name=(value)
|
74
|
-
@name = value
|
75
|
-
end
|
76
|
-
|
77
|
-
def default_foreign_key
|
78
|
-
@default_foreign_key || (@default_foreign_key = "#{Inflector.underscore(Inflector.singularize(name))}_id".freeze)
|
79
|
-
end
|
80
|
-
|
81
|
-
def to_sql
|
82
|
-
@to_sql || (@to_sql = @database.quote_table_name(name).freeze)
|
83
|
-
end
|
84
|
-
|
85
|
-
def inspect
|
86
|
-
"#<%s:0x%x @klass=%s, @name=%s, @columns=%s>" % [self.class.name, (object_id * 2), @klass.name, to_sql, @columns.inspect]
|
87
|
-
end
|
88
|
-
|
89
|
-
private
|
90
|
-
def reset_derived_columns!
|
91
|
-
@columns_hash.clear
|
92
|
-
@columns_by_column_name.clear
|
93
|
-
@key = nil
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
end
|