datamapper 0.1.0 → 0.1.1
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 +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
|