datamapper 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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