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.
Files changed (73) hide show
  1. data/CHANGELOG +31 -1
  2. data/MIT-LICENSE +1 -1
  3. data/README +9 -1
  4. data/example.rb +23 -15
  5. data/lib/data_mapper.rb +5 -0
  6. data/lib/data_mapper/adapters/abstract_adapter.rb +9 -207
  7. data/lib/data_mapper/adapters/mysql_adapter.rb +132 -108
  8. data/lib/data_mapper/adapters/postgresql_adapter.rb +242 -0
  9. data/lib/data_mapper/adapters/sql/coersion.rb +74 -0
  10. data/lib/data_mapper/adapters/sql/commands/advanced_load_command.rb +140 -0
  11. data/lib/data_mapper/adapters/sql/commands/conditions.rb +161 -0
  12. data/lib/data_mapper/adapters/sql/commands/delete_command.rb +113 -0
  13. data/lib/data_mapper/adapters/sql/commands/load_command.rb +296 -0
  14. data/lib/data_mapper/adapters/sql/commands/save_command.rb +141 -0
  15. data/lib/data_mapper/adapters/sql/commands/table_exists_command.rb +33 -0
  16. data/lib/data_mapper/adapters/sql/mappings/column.rb +91 -0
  17. data/lib/data_mapper/adapters/sql/mappings/schema.rb +30 -0
  18. data/lib/data_mapper/adapters/sql/mappings/table.rb +143 -0
  19. data/lib/data_mapper/adapters/sql/quoting.rb +38 -0
  20. data/lib/data_mapper/adapters/sql_adapter.rb +163 -0
  21. data/lib/data_mapper/adapters/sqlite3_adapter.rb +155 -116
  22. data/lib/data_mapper/associations.rb +2 -0
  23. data/lib/data_mapper/associations/advanced_has_many_association.rb +55 -0
  24. data/lib/data_mapper/associations/belongs_to_association.rb +2 -2
  25. data/lib/data_mapper/associations/has_many_association.rb +3 -3
  26. data/lib/data_mapper/associations/has_one_association.rb +2 -2
  27. data/lib/data_mapper/base.rb +30 -11
  28. data/lib/data_mapper/callbacks.rb +4 -1
  29. data/lib/data_mapper/database.rb +8 -41
  30. data/lib/data_mapper/identity_map.rb +23 -3
  31. data/lib/data_mapper/session.rb +34 -186
  32. data/lib/data_mapper/{extensions → support}/active_record_impersonation.rb +16 -12
  33. data/lib/data_mapper/support/blank.rb +35 -0
  34. data/lib/data_mapper/support/connection_pool.rb +2 -1
  35. data/lib/data_mapper/support/string.rb +27 -0
  36. data/lib/data_mapper/support/struct.rb +26 -0
  37. data/lib/data_mapper/validations/unique_validator.rb +1 -3
  38. data/lib/data_mapper/validations/validation_helper.rb +1 -1
  39. data/performance.rb +24 -7
  40. data/profile_data_mapper.rb +24 -2
  41. data/rakefile.rb +2 -2
  42. data/spec/basic_finder.rb +2 -2
  43. data/spec/belongs_to.rb +1 -1
  44. data/spec/delete_command_spec.rb +9 -0
  45. data/spec/fixtures/zoos.yaml +4 -0
  46. data/spec/has_many.rb +1 -1
  47. data/spec/load_command_spec.rb +44 -0
  48. data/spec/models/zoo.rb +2 -0
  49. data/spec/save_command_spec.rb +13 -0
  50. data/spec/spec_helper.rb +10 -1
  51. data/spec/support/string_spec.rb +7 -0
  52. data/spec/validates_confirmation_of.rb +1 -1
  53. data/spec/validates_format_of.rb +1 -1
  54. data/spec/validates_length_of.rb +1 -1
  55. data/spec/validations.rb +1 -1
  56. metadata +23 -20
  57. data/lib/data_mapper/extensions/callback_helpers.rb +0 -35
  58. data/lib/data_mapper/loaded_set.rb +0 -45
  59. data/lib/data_mapper/mappings/column.rb +0 -78
  60. data/lib/data_mapper/mappings/schema.rb +0 -28
  61. data/lib/data_mapper/mappings/table.rb +0 -99
  62. data/lib/data_mapper/queries/conditions.rb +0 -141
  63. data/lib/data_mapper/queries/connection.rb +0 -34
  64. data/lib/data_mapper/queries/create_table_statement.rb +0 -38
  65. data/lib/data_mapper/queries/delete_statement.rb +0 -17
  66. data/lib/data_mapper/queries/drop_table_statement.rb +0 -17
  67. data/lib/data_mapper/queries/insert_statement.rb +0 -29
  68. data/lib/data_mapper/queries/reader.rb +0 -42
  69. data/lib/data_mapper/queries/result.rb +0 -19
  70. data/lib/data_mapper/queries/select_statement.rb +0 -103
  71. data/lib/data_mapper/queries/table_exists_statement.rb +0 -17
  72. data/lib/data_mapper/queries/truncate_table_statement.rb +0 -17
  73. 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
@@ -0,0 +1,7 @@
1
+ describe DataMapper::Support::String do
2
+
3
+ it 'should underscore camel-cased words' do
4
+ String::memoized_underscore('DataMapper').should == 'data_mapper'
5
+ end
6
+
7
+ end
@@ -3,7 +3,7 @@ context 'A Cow' do
3
3
  setup do
4
4
  class Cow
5
5
 
6
- include DataMapper::Extensions::ValidationHelper
6
+ include DataMapper::Validations::ValidationHelper
7
7
 
8
8
  attr_accessor :name, :name_confirmation, :age
9
9
  end
@@ -3,7 +3,7 @@ context 'An Employee' do
3
3
  setup do
4
4
  class Employee
5
5
 
6
- include DataMapper::Extensions::ValidationHelper
6
+ include DataMapper::Validations::ValidationHelper
7
7
 
8
8
  attr_accessor :email
9
9
  end
@@ -3,7 +3,7 @@ context 'A Cow' do
3
3
  setup do
4
4
  class Cow
5
5
 
6
- include DataMapper::Extensions::ValidationHelper
6
+ include DataMapper::Validations::ValidationHelper
7
7
 
8
8
  attr_accessor :name, :age
9
9
  end
data/spec/validations.rb CHANGED
@@ -3,7 +3,7 @@ context 'Validations' do
3
3
  setup do
4
4
  class Cow
5
5
 
6
- include DataMapper::Extensions::ValidationHelper
6
+ include DataMapper::Validations::ValidationHelper
7
7
 
8
8
  attr_accessor :name, :age
9
9
  end
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.0
7
- date: 2007-06-09 00:00:00 -05:00
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/extensions/active_record_impersonation.rb
56
- - lib/data_mapper/extensions/callback_helpers.rb
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