dm-mapping 0.4.1 → 0.5.0
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/CHANGES +9 -0
- data/NOTICE +23 -2
- data/README +17 -15
- data/TODO +2 -3
- data/dm-mapping.gemspec +3 -3
- data/lib/dm-mapping/adapters/abstract_adapter.rb +11 -1
- data/lib/dm-mapping/adapters/mysql_adapter.rb +47 -0
- data/lib/dm-mapping/adapters/sqlite3_adapter.rb +52 -0
- data/lib/dm-mapping/type_map.rb +1 -1
- data/lib/dm-mapping/version.rb +1 -1
- data/lib/dm-mapping.rb +3 -2
- data/test/{test_sqlite3.rb → abstract.rb} +42 -47
- data/test/test_dm-mapping.rb +23 -0
- metadata +7 -5
- data/lib/dm-mapping/adapters/sqlite3adapter.rb +0 -37
data/CHANGES
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
= dm-mapper changes history
|
2
2
|
|
3
|
+
=== dm-mapping 0.5.0, 2008-08-14
|
4
|
+
* feature added
|
5
|
+
- added mysql support.
|
6
|
+
- reflect size 65535 in TEXT for sqlite3.
|
7
|
+
* bug fixed
|
8
|
+
- reflect VARCHAR(size) instead of default size in sqlite3.
|
9
|
+
* misc
|
10
|
+
- renamed sqlite3adapter to sqlite3_adapter.
|
11
|
+
|
3
12
|
=== dm-mapping 0.4.1, 2008-08-14
|
4
13
|
* removed type hack, replaced with rejecting special type to lookup.
|
5
14
|
|
data/NOTICE
CHANGED
@@ -1,9 +1,30 @@
|
|
1
|
-
= notice
|
1
|
+
= notice and thanks
|
2
2
|
|
3
3
|
* dm-mapping is a plugin of DataMapper
|
4
4
|
> sudo gem install dm-core
|
5
5
|
http://datamapper.org
|
6
6
|
|
7
7
|
* this project skeleton is built through Mr Bones
|
8
|
-
> sudo gem install bones
|
9
8
|
http://codeforpeople.rubyforge.org/bones/
|
9
|
+
|
10
|
+
* thanks to Rails team with ActiveRecord, it's inspiring.
|
11
|
+
and some SQL snippets are borrowed from it.
|
12
|
+
http://rubyonrails.org
|
13
|
+
|
14
|
+
* Ruby the great language
|
15
|
+
http://www.ruby-lang.org
|
16
|
+
|
17
|
+
* Rubygems the great package management
|
18
|
+
http://rubygems.org
|
19
|
+
|
20
|
+
* Rake the great task automation
|
21
|
+
http://rake.rubyforge.org
|
22
|
+
|
23
|
+
* Facets the great ruby library collection
|
24
|
+
http://facets.rubyforge.org/
|
25
|
+
|
26
|
+
* Rubyforge for distributing ruby gems
|
27
|
+
http://rubyforge.org
|
28
|
+
|
29
|
+
* Github for hosting git
|
30
|
+
http://github.com
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= dm-mapping 0.
|
1
|
+
= dm-mapping 0.5.0
|
2
2
|
by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
3
3
|
godfat (XD) godfat.org
|
4
4
|
|
@@ -18,9 +18,6 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
18
18
|
require 'dm-mapping'
|
19
19
|
dm = DataMapper.setup :default, 'sqlite3:db/development.sqlite3'
|
20
20
|
|
21
|
-
dm.object_id == DataMapper.repository.adapter.object_id
|
22
|
-
# => true
|
23
|
-
|
24
21
|
class User
|
25
22
|
include DataMapper::Resource
|
26
23
|
# mapping all
|
@@ -45,21 +42,26 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
45
42
|
|
46
43
|
# there's no guarantee of the order in fields array
|
47
44
|
User.fields.sort
|
48
|
-
# => [['created_at', DateTime, {}],
|
49
|
-
['email', String, {:
|
50
|
-
|
51
|
-
['
|
52
|
-
|
45
|
+
# => [['created_at', DateTime, {:nullable => true}],
|
46
|
+
['email', String, {:nullable => true, :size => 255,
|
47
|
+
:default => 'nospam@nospam.tw'}],
|
48
|
+
['id', Integer, {:nullable => false, :serial => true,
|
49
|
+
:key => true}],
|
50
|
+
['salt_first', String, {:nullable => true, :size => 50}],
|
51
|
+
['salt_second', String, {:nullable => true, :size => 50}]]
|
53
52
|
|
54
53
|
dm.fields('users').sort == User.fields.sort
|
55
54
|
# => true
|
56
55
|
|
57
56
|
dm.storages_and_fields
|
58
|
-
# => {'users' => [['id', Integer, {:
|
59
|
-
|
60
|
-
|
61
|
-
['
|
62
|
-
|
57
|
+
# => {'users' => [['id', Integer, {:nullable => false,
|
58
|
+
:serial => true,
|
59
|
+
:key => true}],
|
60
|
+
['email', String, {:nullable => true,
|
61
|
+
:default => 'nospam@nospam.tw'}],
|
62
|
+
['created_at', DateTime, {:nullable => true}],
|
63
|
+
['salt_first', String, {:nullable => true, :size => 50}],
|
64
|
+
['salt_second', String, {:nullable => true, :size => 50}]]}
|
63
65
|
|
64
66
|
# there's no guarantee of the order in returned array
|
65
67
|
dm.auto_genclass!
|
@@ -74,7 +76,7 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
74
76
|
== REQUIREMENTS:
|
75
77
|
|
76
78
|
* dm-core 0.9.3
|
77
|
-
* at least one do_* adapter (currently
|
79
|
+
* at least one do_* adapter (currently supports sqlite3 and mysql)
|
78
80
|
|
79
81
|
== INSTALL:
|
80
82
|
|
data/TODO
CHANGED
data/dm-mapping.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = %q{dm-mapping}
|
4
|
-
s.version = "0.
|
4
|
+
s.version = "0.5.0"
|
5
5
|
|
6
6
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
7
7
|
s.authors = ["Lin Jen-Shin (a.k.a. godfat \347\234\237\345\270\270)"]
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.description = %q{DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.}
|
10
10
|
s.email = %q{godfat (XD) godfat.org}
|
11
11
|
s.extra_rdoc_files = ["CHANGES", "LICENSE", "NOTICE", "README", "TODO", "dm-mapping.gemspec"]
|
12
|
-
s.files = ["CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "dm-mapping.gemspec", "lib/dm-mapping.rb", "lib/dm-mapping/adapters/abstract_adapter.rb", "lib/dm-mapping/adapters/
|
12
|
+
s.files = ["CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "dm-mapping.gemspec", "lib/dm-mapping.rb", "lib/dm-mapping/adapters/abstract_adapter.rb", "lib/dm-mapping/adapters/mysql_adapter.rb", "lib/dm-mapping/adapters/sqlite3_adapter.rb", "lib/dm-mapping/model.rb", "lib/dm-mapping/type_map.rb", "lib/dm-mapping/version.rb", "tasks/ann.rake", "tasks/bones.rake", "tasks/gem.rake", "tasks/git.rake", "tasks/manifest.rake", "tasks/notes.rake", "tasks/post_load.rake", "tasks/rdoc.rake", "tasks/rubyforge.rake", "tasks/setup.rb", "tasks/spec.rake", "tasks/svn.rake", "tasks/test.rake", "test/abstract.rb", "test/test_dm-mapping.rb"]
|
13
13
|
s.has_rdoc = true
|
14
14
|
s.homepage = %q{http://github.com/godfat/dm-mapping}
|
15
15
|
s.rdoc_options = ["--diagram", "--charset=utf-8", "--inline-source", "--line-numbers", "--promiscuous", "--main", "README"]
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.rubyforge_project = %q{ludy}
|
18
18
|
s.rubygems_version = %q{1.2.0}
|
19
19
|
s.summary = %q{DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.}
|
20
|
-
s.test_files = ["test/
|
20
|
+
s.test_files = ["test/test_dm-mapping.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -18,7 +18,12 @@ module DataMapper
|
|
18
18
|
# ['salt_first', String, {}],
|
19
19
|
# ['salt_second', String, {}]]
|
20
20
|
def fields storage
|
21
|
-
|
21
|
+
dmm_query_storage(storage).map{ |field|
|
22
|
+
type, chain = self.class.type_map.
|
23
|
+
lookup_primitive(dmm_primitive(field))
|
24
|
+
|
25
|
+
[dmm_field_name(field), type, dmm_attributes(field)]
|
26
|
+
}
|
22
27
|
end
|
23
28
|
|
24
29
|
# returns a hash with storage names in keys and
|
@@ -58,6 +63,11 @@ module DataMapper
|
|
58
63
|
scope.const_set(Extlib::Inflection.classify(storage), model)
|
59
64
|
}
|
60
65
|
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def dmm_query_storage
|
69
|
+
raise NotImplementError.new("#{self.class}#fields is not implemented.")
|
70
|
+
end
|
61
71
|
end
|
62
72
|
end
|
63
73
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
require 'dm-mapping/adapters/abstract_adapter'
|
3
|
+
require 'dm-mapping/type_map'
|
4
|
+
|
5
|
+
module DataMapper
|
6
|
+
module Adapters
|
7
|
+
class MysqlAdapter < DataObjectsAdapter #:nodoc: all
|
8
|
+
module Migration
|
9
|
+
def storages
|
10
|
+
query 'SHOW TABLES'
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
# construct needed table metadata
|
15
|
+
def dmm_query_storage storage
|
16
|
+
sql = <<-SQL.compress_lines
|
17
|
+
SELECT column_name, column_default, is_nullable, data_type,
|
18
|
+
character_maximum_length, column_key, extra
|
19
|
+
FROM `information_schema`.`columns`
|
20
|
+
WHERE `table_schema` = ? AND `table_name` = ?
|
21
|
+
SQL
|
22
|
+
|
23
|
+
query(sql, db_name, storage)
|
24
|
+
end
|
25
|
+
|
26
|
+
def dmm_field_name field
|
27
|
+
field.column_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def dmm_primitive field
|
31
|
+
field.data_type
|
32
|
+
end
|
33
|
+
|
34
|
+
def dmm_attributes field, attrs = {}
|
35
|
+
attrs[:serial] = true if field.extra == 'auto_increment'
|
36
|
+
attrs[:key] = true if field.column_key == 'PRI'
|
37
|
+
attrs[:nullable] = field.is_nullable == 'YES'
|
38
|
+
attrs[:default] = field.column_default if field.column_default
|
39
|
+
attrs[:size] = field.character_maximum_length if
|
40
|
+
field.character_maximum_length
|
41
|
+
|
42
|
+
attrs
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
require 'dm-mapping/adapters/abstract_adapter'
|
3
|
+
require 'dm-mapping/type_map'
|
4
|
+
|
5
|
+
module DataMapper
|
6
|
+
module Adapters
|
7
|
+
class Sqlite3Adapter < DataObjectsAdapter #:nodoc: all
|
8
|
+
module Migration
|
9
|
+
def storages
|
10
|
+
# activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 177
|
11
|
+
sql = <<-SQL.compress_lines
|
12
|
+
SELECT name
|
13
|
+
FROM sqlite_master
|
14
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
15
|
+
SQL
|
16
|
+
# activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 181
|
17
|
+
|
18
|
+
query sql
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
alias_method :dmm_query_storage, :query_table
|
23
|
+
def dmm_field_name field
|
24
|
+
field.name
|
25
|
+
end
|
26
|
+
|
27
|
+
def dmm_primitive field
|
28
|
+
field.type.gsub(/\(\d+\)/, '')
|
29
|
+
end
|
30
|
+
|
31
|
+
def dmm_attributes field, attrs = {}
|
32
|
+
if field.pk != 0
|
33
|
+
attrs[:key] = true
|
34
|
+
attrs[:serial] = true if supports_serial?
|
35
|
+
end
|
36
|
+
attrs[:nullable] = field.notnull != 99
|
37
|
+
attrs[:default] = field.dflt_value[1..-2] if field.dflt_value
|
38
|
+
|
39
|
+
if field.type.upcase == 'TEXT'
|
40
|
+
attrs[:size] = 65535
|
41
|
+
else
|
42
|
+
ergo = field.type.match(/\((\d+)\)/)
|
43
|
+
size = ergo && ergo[1].to_i
|
44
|
+
attrs[:size] = size if size
|
45
|
+
end
|
46
|
+
|
47
|
+
attrs
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/dm-mapping/type_map.rb
CHANGED
@@ -7,7 +7,7 @@ module DataMapper
|
|
7
7
|
# # => { DateTime => {:auto_validation => true} }
|
8
8
|
def lookup_primitive primitive, type_map = self
|
9
9
|
type_map.chains.find{ |type, chain|
|
10
|
-
primitive == chain.primitive &&
|
10
|
+
primitive.upcase == chain.primitive &&
|
11
11
|
[Integer, Float, BigDecimal,
|
12
12
|
String, TrueClass, FalseClass,
|
13
13
|
DateTime, Date, Time,
|
data/lib/dm-mapping/version.rb
CHANGED
data/lib/dm-mapping.rb
CHANGED
@@ -11,8 +11,9 @@ module DataMapper
|
|
11
11
|
class << self
|
12
12
|
# ensure the using adapter is extended by dm-mapping
|
13
13
|
def ensure_required_dm_mapping_adapter
|
14
|
-
|
15
|
-
|
14
|
+
require 'extlib'
|
15
|
+
adapter_name = repository.adapter.class.to_s.split('::').last
|
16
|
+
require "dm-mapping/adapters/#{Extlib::Inflection.underscore(adapter_name)}"
|
16
17
|
end
|
17
18
|
|
18
19
|
# dirty hack that hook requirement after setup.
|
@@ -1,17 +1,38 @@
|
|
1
1
|
|
2
|
-
require 'test/unit'
|
3
|
-
|
4
2
|
require 'rubygems'
|
5
3
|
require 'data_mapper'
|
6
4
|
require 'dm-mapping'
|
7
5
|
|
8
|
-
|
6
|
+
module Abstract
|
7
|
+
def setup_data_mapper
|
8
|
+
raise 'please provide an clean database because it is a destructive test!!'
|
9
|
+
end
|
10
|
+
|
11
|
+
AttrCommon = {:nullable => true}
|
12
|
+
AttrCommonPK = {:serial => true, :key => true, :nullable => false}
|
13
|
+
AttrText = {:size => 65535}.merge AttrCommon
|
14
|
+
|
15
|
+
def user_fields
|
16
|
+
[['created_at', DateTime, AttrCommon],
|
17
|
+
['id', Integer, AttrCommonPK],
|
18
|
+
['login', String, {:size => 70}.merge(AttrCommon)],
|
19
|
+
['sig', DM::Text, AttrText]]
|
20
|
+
end
|
21
|
+
|
22
|
+
def comment_fields
|
23
|
+
[['body', DM::Text, AttrText],
|
24
|
+
['id', Integer, AttrCommonPK],
|
25
|
+
['title', String, {:size => 50, :default => 'default title'}.
|
26
|
+
merge(AttrCommon)],
|
27
|
+
['user_id', Integer, AttrCommon]]
|
28
|
+
end
|
29
|
+
|
9
30
|
class User
|
10
31
|
include DataMapper::Resource
|
11
32
|
has n, :comments
|
12
33
|
|
13
34
|
property :id, Integer, :serial => true
|
14
|
-
property :login, String
|
35
|
+
property :login, String, :size => 70
|
15
36
|
property :sig, Text
|
16
37
|
property :created_at, DateTime
|
17
38
|
end
|
@@ -21,19 +42,10 @@ class DMMTest < Test::Unit::TestCase
|
|
21
42
|
belongs_to :user
|
22
43
|
|
23
44
|
property :id, Integer, :serial => true
|
24
|
-
property :title, String, :default => 'default title'
|
45
|
+
property :title, String, :size => 50, :default => 'default title'
|
25
46
|
property :body, Text
|
26
47
|
end
|
27
48
|
|
28
|
-
|
29
|
-
# override it to test with another adapter
|
30
|
-
# NOTE:
|
31
|
-
# please provide an clean database because it is a destructive test!!
|
32
|
-
def setup_data_mapper
|
33
|
-
DataMapper.setup(:default, 'sqlite3:tmp.db')
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
49
|
class Model; end
|
38
50
|
|
39
51
|
def create_fake_model
|
@@ -49,23 +61,9 @@ class DMMTest < Test::Unit::TestCase
|
|
49
61
|
Comment.auto_migrate!
|
50
62
|
end
|
51
63
|
|
52
|
-
def user_fields
|
53
|
-
[['created_at', DateTime, {}],
|
54
|
-
['id', Integer, {:serial => true}],
|
55
|
-
['login', String, {:size => 50}],
|
56
|
-
['sig', DM::Text, {}]]
|
57
|
-
end
|
58
|
-
|
59
|
-
def comment_fields
|
60
|
-
[['body', DM::Text, {}],
|
61
|
-
['id', Integer, {:serial => true}],
|
62
|
-
['title', String, {:size => 50, :default => 'default title'}],
|
63
|
-
['user_id', Integer, {}]]
|
64
|
-
end
|
65
|
-
|
66
64
|
def test_storages
|
67
|
-
assert_equal ['
|
68
|
-
assert_equal comment_fields, dm.fields('
|
65
|
+
assert_equal ['abstract_comments', 'abstract_users'], dm.storages.sort
|
66
|
+
assert_equal comment_fields, dm.fields('abstract_comments').sort
|
69
67
|
end
|
70
68
|
|
71
69
|
def test_create_comment
|
@@ -77,10 +75,10 @@ class DMMTest < Test::Unit::TestCase
|
|
77
75
|
def test_mapping_all
|
78
76
|
test_create_comment # for fixtures
|
79
77
|
model, local_dm = create_fake_model
|
80
|
-
model.storage_names[:default] = '
|
78
|
+
model.storage_names[:default] = 'abstract_comments'
|
81
79
|
|
82
|
-
assert_equal ['
|
83
|
-
assert_equal '
|
80
|
+
assert_equal ['abstract_comments', 'abstract_users'], local_dm.storages.sort
|
81
|
+
assert_equal 'abstract_comments', model.storage_name
|
84
82
|
|
85
83
|
assert_equal 1, model.count
|
86
84
|
assert_equal comment_fields, model.fields.sort
|
@@ -92,7 +90,7 @@ class DMMTest < Test::Unit::TestCase
|
|
92
90
|
|
93
91
|
def test_mapping_and_create
|
94
92
|
model, local_dm = create_fake_model
|
95
|
-
model.storage_names[:default] = '
|
93
|
+
model.storage_names[:default] = 'abstract_comments'
|
96
94
|
model.send :mapping
|
97
95
|
|
98
96
|
model.create(:title => 'orz')
|
@@ -104,8 +102,9 @@ class DMMTest < Test::Unit::TestCase
|
|
104
102
|
end
|
105
103
|
|
106
104
|
def test_storages_and_fields
|
107
|
-
assert_equal user_fields, dm.fields('
|
108
|
-
assert_equal( {'
|
105
|
+
assert_equal user_fields, dm.fields('abstract_users').sort
|
106
|
+
assert_equal( {'abstract_users' => user_fields,
|
107
|
+
'abstract_comments' => comment_fields},
|
109
108
|
dm.storages_and_fields.inject({}){ |r, i|
|
110
109
|
key, value = i
|
111
110
|
r[key] = value.sort
|
@@ -115,7 +114,7 @@ class DMMTest < Test::Unit::TestCase
|
|
115
114
|
|
116
115
|
def test_mapping_type
|
117
116
|
model, local_dm = create_fake_model
|
118
|
-
model.storage_names[:default] = '
|
117
|
+
model.storage_names[:default] = 'abstract_comments'
|
119
118
|
model.send :mapping, Integer
|
120
119
|
|
121
120
|
assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
|
@@ -123,7 +122,7 @@ class DMMTest < Test::Unit::TestCase
|
|
123
122
|
|
124
123
|
def test_mapping_multiple
|
125
124
|
model, local_dm = create_fake_model
|
126
|
-
model.storage_names[:default] = '
|
125
|
+
model.storage_names[:default] = 'abstract_users'
|
127
126
|
model.send :mapping, :login, Integer
|
128
127
|
|
129
128
|
assert_equal ['id', 'login'], model.properties.map(&:name).map(&:to_s).sort
|
@@ -131,7 +130,7 @@ class DMMTest < Test::Unit::TestCase
|
|
131
130
|
|
132
131
|
def test_mapping_regexp
|
133
132
|
model, local_dm = create_fake_model
|
134
|
-
model.storage_names[:default] = '
|
133
|
+
model.storage_names[:default] = 'abstract_comments'
|
135
134
|
model.send :mapping, /id$/
|
136
135
|
|
137
136
|
assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
|
@@ -144,16 +143,12 @@ class DMMTest < Test::Unit::TestCase
|
|
144
143
|
end
|
145
144
|
|
146
145
|
def test_auto_genclass
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
def for_test_auto_genclass scope = DataMapper::Mapping
|
152
|
-
assert_equal ["#{scope == Object ? '' : "#{scope}::"}DmmTestComment",
|
153
|
-
"#{scope == Object ? '' : "#{scope}::"}DmmTestUser"],
|
146
|
+
scope = self.class
|
147
|
+
assert_equal ["#{scope == Object ? '' : "#{scope}::"}AbstractComment",
|
148
|
+
"#{scope == Object ? '' : "#{scope}::"}AbstractUser"],
|
154
149
|
dm.auto_genclass!(scope).map(&:to_s).sort
|
155
150
|
|
156
|
-
comment = scope.const_get('
|
151
|
+
comment = scope.const_get('AbstractComment')
|
157
152
|
|
158
153
|
assert_equal comment_fields, comment.fields.sort
|
159
154
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require 'test/abstract'
|
4
|
+
|
5
|
+
require 'dm-core/adapters/sqlite3_adapter'
|
6
|
+
require 'dm-core/adapters/mysql_adapter'
|
7
|
+
require 'dm-core/adapters/postgres_adapter'
|
8
|
+
|
9
|
+
class Sqlite3Test < Test::Unit::TestCase
|
10
|
+
include Abstract
|
11
|
+
|
12
|
+
def setup_data_mapper
|
13
|
+
DataMapper.setup(:default, 'sqlite3:tmp.sqlite3')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class MysqlTest < Test::Unit::TestCase
|
18
|
+
include Abstract
|
19
|
+
|
20
|
+
def setup_data_mapper
|
21
|
+
DataMapper.setup(:default, 'mysql://dm-mapping:godfat@localhost/dm-mapping')
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-mapping
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Lin Jen-Shin (a.k.a. godfat \xE7\x9C\x9F\xE5\xB8\xB8)"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08-
|
12
|
+
date: 2008-08-15 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -55,7 +55,8 @@ files:
|
|
55
55
|
- dm-mapping.gemspec
|
56
56
|
- lib/dm-mapping.rb
|
57
57
|
- lib/dm-mapping/adapters/abstract_adapter.rb
|
58
|
-
- lib/dm-mapping/adapters/
|
58
|
+
- lib/dm-mapping/adapters/mysql_adapter.rb
|
59
|
+
- lib/dm-mapping/adapters/sqlite3_adapter.rb
|
59
60
|
- lib/dm-mapping/model.rb
|
60
61
|
- lib/dm-mapping/type_map.rb
|
61
62
|
- lib/dm-mapping/version.rb
|
@@ -72,7 +73,8 @@ files:
|
|
72
73
|
- tasks/spec.rake
|
73
74
|
- tasks/svn.rake
|
74
75
|
- tasks/test.rake
|
75
|
-
- test/
|
76
|
+
- test/abstract.rb
|
77
|
+
- test/test_dm-mapping.rb
|
76
78
|
has_rdoc: true
|
77
79
|
homepage: http://github.com/godfat/dm-mapping
|
78
80
|
post_install_message:
|
@@ -106,4 +108,4 @@ signing_key:
|
|
106
108
|
specification_version: 2
|
107
109
|
summary: DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.
|
108
110
|
test_files:
|
109
|
-
- test/
|
111
|
+
- test/test_dm-mapping.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'dm-mapping/adapters/abstract_adapter'
|
3
|
-
require 'dm-mapping/type_map'
|
4
|
-
|
5
|
-
module DataMapper
|
6
|
-
module Adapters
|
7
|
-
class Sqlite3Adapter < DataObjectsAdapter #:nodoc: all
|
8
|
-
module Migration
|
9
|
-
def storages
|
10
|
-
# activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 177
|
11
|
-
sql = <<-SQL
|
12
|
-
SELECT name
|
13
|
-
FROM sqlite_master
|
14
|
-
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
15
|
-
SQL
|
16
|
-
# activerecord-2.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb: 181
|
17
|
-
|
18
|
-
query sql
|
19
|
-
end
|
20
|
-
|
21
|
-
def fields table
|
22
|
-
query_table(table).map{ |field|
|
23
|
-
type, chain = self.class.type_map.
|
24
|
-
lookup_primitive(field.type.gsub(/\(\d+\)/, '').upcase)
|
25
|
-
|
26
|
-
attrs = {}
|
27
|
-
attrs[:serial] = true if field.pk != 0
|
28
|
-
attrs[:nullable] = true if field.notnull != 0 && !attrs[:serial]
|
29
|
-
attrs[:default] = field.dflt_value[1..-2] if field.dflt_value
|
30
|
-
|
31
|
-
[field.name, type, attrs.merge(chain.attributes)]
|
32
|
-
}
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|