dm-mapping 0.2.1 → 0.3.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 +12 -0
- data/README +20 -15
- data/Rakefile +5 -2
- data/TODO +2 -7
- data/dm-mapping.gemspec +6 -6
- data/lib/dm-mapping.rb +15 -18
- data/lib/dm-mapping/adapters/abstract_adapter.rb +25 -0
- data/lib/dm-mapping/adapters/sqlite3adapter.rb +8 -4
- data/lib/dm-mapping/model.rb +27 -5
- data/lib/dm-mapping/type_map.rb +2 -2
- data/lib/dm-mapping/version.rb +1 -1
- data/test/test_dm-mapping.rb +98 -23
- metadata +4 -3
data/CHANGES
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
= dm-mapper changes history
|
2
2
|
|
3
|
+
== dm-mapping 0.3.0,
|
4
|
+
|
5
|
+
* added support of mapping Integer, DateTime, etc.
|
6
|
+
* renamed some internals.
|
7
|
+
* changed the way requiring adapter. no more setup first.
|
8
|
+
* added Migration#storages_and_fields
|
9
|
+
* added mapping :serial => true for primary key.
|
10
|
+
* added mapping :default, and :nullable.
|
11
|
+
* added support of mapping name. (through passing symbol or string)
|
12
|
+
* added support of multiple arguments.
|
13
|
+
* removed Mapping::All, use /.*/ instead.
|
14
|
+
|
3
15
|
== dm-mapping 0.2.1, 2008-08-03
|
4
16
|
|
5
17
|
* fixed a bug that type map should lookup for parent.
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= dm-mapping 0.
|
1
|
+
= dm-mapping 0.3.0
|
2
2
|
by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
3
3
|
strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org
|
4
4
|
|
@@ -9,10 +9,6 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
9
9
|
DataMapper plugin that helps you manipulate an existing database.
|
10
10
|
It creates mappings between existing columns and model's properties.
|
11
11
|
|
12
|
-
== FEATURES:
|
13
|
-
|
14
|
-
placeholder
|
15
|
-
|
16
12
|
== SYNOPSIS:
|
17
13
|
|
18
14
|
require 'dm-core'
|
@@ -24,36 +20,45 @@ placeholder
|
|
24
20
|
|
25
21
|
class User
|
26
22
|
include DataMapper::Resource
|
23
|
+
# maping all
|
27
24
|
mapping /.*/
|
28
|
-
|
25
|
+
|
26
|
+
# mapping for ended with _at, and started with salt_
|
29
27
|
mapping /_at$/, /^salt_/
|
30
|
-
|
31
|
-
mapping
|
28
|
+
|
29
|
+
# mapping id and email
|
30
|
+
mapping :id, :email
|
31
|
+
|
32
|
+
# mapping all fields with type String, and id
|
33
|
+
mapping String, :id
|
34
|
+
|
35
|
+
# mapping login, and all fields with type Integer
|
36
|
+
mapping :login, Integer
|
32
37
|
end
|
33
38
|
|
34
39
|
DataMapper.repository.adapter.storages
|
35
40
|
# => ['users']
|
36
41
|
|
37
42
|
User.fields
|
38
|
-
# => [['
|
39
|
-
['email', String, {}],
|
43
|
+
# => [['id', Integer, {:serial => true}],
|
44
|
+
['email', String, {:default => 'nospam@nospam.tw'}],
|
40
45
|
['created_at', DateTime, {}],
|
41
46
|
['salt_first', String, {}],
|
42
47
|
['salt_second', String, {}]]
|
43
48
|
|
44
49
|
DataMapper.repository.adapter.fields('users')
|
45
|
-
# => [['
|
46
|
-
['email', String, {}],
|
50
|
+
# => [['id', Integer, {:serial => true}],
|
51
|
+
['email', String, {:default => 'nospam@nospam.tw'}],
|
47
52
|
['created_at', DateTime, {}],
|
48
53
|
['salt_first', String, {}],
|
49
54
|
['salt_second', String, {}]]
|
50
55
|
|
51
56
|
DataMapper.repository.adapter.storages_and_fields
|
52
|
-
# => {'users' => [['
|
53
|
-
['email', String, {}],
|
57
|
+
# => {'users' => [['id', Integer, {:serial => true}],
|
58
|
+
['email', String, {:default => 'nospam@nospam.tw'}],
|
54
59
|
['created_at', DateTime, {}],
|
55
60
|
['salt_first', String, {}],
|
56
|
-
['salt_second', String, {}]]
|
61
|
+
['salt_second', String, {}]]}
|
57
62
|
|
58
63
|
== REQUIREMENTS:
|
59
64
|
|
data/Rakefile
CHANGED
@@ -28,6 +28,9 @@ namespace :git do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
# supress warnings, there's too many warnings in dm-core
|
32
|
+
PROJ.ruby_opts.delete '-w'
|
33
|
+
|
31
34
|
PROJ.name = 'dm-mapping'
|
32
35
|
PROJ.authors = 'Lin Jen-Shin (a.k.a. godfat 真常)'
|
33
36
|
PROJ.email = 'strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org'
|
@@ -35,9 +38,9 @@ PROJ.url = 'http://github.com/godfat/dm-mapping'
|
|
35
38
|
PROJ.description = PROJ.summary = paragraphs_of('README', 'description').join("\n\n")
|
36
39
|
PROJ.changes = paragraphs_of('CHANGES', 0..1).join("\n\n")
|
37
40
|
PROJ.rubyforge.name = 'ludy'
|
38
|
-
PROJ.version = File.open('lib/dm-mapping/version.rb', 0){ |f| f.read.gsub(/.*VERSION =
|
41
|
+
PROJ.version = File.open('lib/dm-mapping/version.rb', 0){ |f| f.read.gsub(/.*VERSION = '(.*)'.*/m, '\1') }
|
39
42
|
|
40
|
-
PROJ.gem.dependencies << 'dm-core'
|
43
|
+
PROJ.gem.dependencies << ['dm-core', '>=0.9.3']
|
41
44
|
# PROJ.gem.executables = []
|
42
45
|
# PROJ.gem.files = []
|
43
46
|
|
data/TODO
CHANGED
data/dm-mapping.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = %q{dm-mapping}
|
4
|
-
s.version = "0.
|
4
|
+
s.version = "0.3.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)"]
|
8
|
-
s.date = %q{2008-08-
|
8
|
+
s.date = %q{2008-08-04}
|
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{strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org}
|
11
11
|
s.extra_rdoc_files = [".gitignore", "CHANGES", "LICENSE", "NOTICE", "README", "TODO", "dm-mapping.gemspec", "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/spec.rake", "tasks/svn.rake", "tasks/test.rake"]
|
12
|
-
s.files = [".gitignore", "CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "dm-mapping.gemspec", "lib/dm-mapping.rb", "lib/dm-mapping/adapters/sqlite3adapter.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/test_dm-mapping.rb"]
|
12
|
+
s.files = [".gitignore", "CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "dm-mapping.gemspec", "lib/dm-mapping.rb", "lib/dm-mapping/adapters/abstract_adapter.rb", "lib/dm-mapping/adapters/sqlite3adapter.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/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"]
|
@@ -24,11 +24,11 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.specification_version = 2
|
25
25
|
|
26
26
|
if current_version >= 3 then
|
27
|
-
s.add_runtime_dependency(%q<dm-core>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<dm-core>, [">= 0.9.3"])
|
28
28
|
else
|
29
|
-
s.add_dependency(%q<dm-core>, [">= 0"])
|
29
|
+
s.add_dependency(%q<dm-core>, [">= 0.9.3"])
|
30
30
|
end
|
31
31
|
else
|
32
|
-
s.add_dependency(%q<dm-core>, [">= 0"])
|
32
|
+
s.add_dependency(%q<dm-core>, [">= 0.9.3"])
|
33
33
|
end
|
34
34
|
end
|
data/lib/dm-mapping.rb
CHANGED
@@ -3,27 +3,24 @@ gem 'dm-core', '=0.9.3'
|
|
3
3
|
require 'dm-core'
|
4
4
|
|
5
5
|
module DataMapper
|
6
|
-
module Mapping
|
7
|
-
All = /.*/
|
8
|
-
end
|
9
|
-
end
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def storages
|
18
|
-
raise NotImplementedError
|
19
|
-
end
|
7
|
+
class << self
|
8
|
+
# ensure the using adapter is extended by dm-mapping
|
9
|
+
def ensure_required_dm_mapping_adapter
|
10
|
+
adapter_name = repository.adapter.class.to_s.split('::').last.downcase
|
11
|
+
require "dm-mapping/adapters/#{adapter_name}"
|
12
|
+
end
|
20
13
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
# dirty hack that hook requirement after setup.
|
15
|
+
alias_method :__setup_alias_by_dm_mapping__, :setup
|
16
|
+
private :__setup_alias_by_dm_mapping__
|
17
|
+
def setup name, uri_or_options
|
18
|
+
adapter = __setup_alias_by_dm_mapping__ name, uri_or_options
|
19
|
+
ensure_required_dm_mapping_adapter
|
20
|
+
adapter
|
25
21
|
end
|
26
22
|
end
|
23
|
+
|
27
24
|
end
|
28
25
|
|
29
|
-
require
|
26
|
+
require 'dm-mapping/model'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module DataMapper
|
3
|
+
module Adapters
|
4
|
+
class AbstractAdapter
|
5
|
+
module Migration
|
6
|
+
# returns all tables in the repository.
|
7
|
+
# e.g. ['comments', 'posts']
|
8
|
+
def storages
|
9
|
+
raise NotImplementedError
|
10
|
+
end
|
11
|
+
|
12
|
+
def fields storage
|
13
|
+
raise NotImplementedError
|
14
|
+
end
|
15
|
+
|
16
|
+
def storages_and_fields
|
17
|
+
storages.inject({}){ |result, storage|
|
18
|
+
result[storage] = fields(storage)
|
19
|
+
result
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
|
2
|
-
require 'dm-mapping'
|
2
|
+
require 'dm-mapping/adapters/abstract_adapter'
|
3
3
|
require 'dm-mapping/type_map'
|
4
|
-
require 'dm-mapping/model'
|
5
4
|
|
6
5
|
module DataMapper
|
7
6
|
module Adapters
|
@@ -22,12 +21,17 @@ module DataMapper
|
|
22
21
|
def fields table
|
23
22
|
query_table(table).map{ |field|
|
24
23
|
type, chain = self.class.type_map.
|
25
|
-
|
24
|
+
lookup_primitive(field.type.gsub(/\(\d+\)/, '').upcase)
|
26
25
|
|
27
26
|
# stupid hack
|
28
27
|
type = String if type == Class
|
29
28
|
|
30
|
-
|
29
|
+
attrs = {}
|
30
|
+
attrs[:serial] = true if field.pk != 0
|
31
|
+
attrs[:nullable] = true if field.notnull != 0 && !attrs[:serial]
|
32
|
+
attrs[:default] = field.dflt_value[1..-2] if field.dflt_value
|
33
|
+
|
34
|
+
[field.name, type, attrs.merge(chain.attributes)]
|
31
35
|
}
|
32
36
|
end
|
33
37
|
end
|
data/lib/dm-mapping/model.rb
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
|
2
2
|
module DataMapper
|
3
3
|
module Model
|
4
|
-
|
4
|
+
# returing all fields, with format [[name, type, attrs]]
|
5
|
+
def fields
|
6
|
+
DataMapper.ensure_required_dm_mapping_adapter
|
7
|
+
DataMapper.repository.adapter.fields storage_name
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
def mapping *targets
|
12
|
+
DataMapper.ensure_required_dm_mapping_adapter
|
13
|
+
targets << /.*/ if targets.empty?
|
14
|
+
|
5
15
|
fields.map{ |field|
|
6
16
|
name, type, attrs = field
|
7
|
-
|
17
|
+
|
18
|
+
targets.each{ |target|
|
19
|
+
case target
|
20
|
+
when Regexp;
|
21
|
+
property name.to_sym, type, attrs if name =~ target
|
22
|
+
|
23
|
+
when Symbol, String;
|
24
|
+
property name.to_sym, type, attrs if name == target.to_s
|
25
|
+
|
26
|
+
when Class;
|
27
|
+
property name.to_sym, type, attrs if type == target
|
28
|
+
|
29
|
+
else
|
30
|
+
raise ArgumentError.new("invalid argument: #{target.inspect}")
|
31
|
+
end
|
32
|
+
}
|
8
33
|
}
|
9
34
|
end
|
10
|
-
def fields
|
11
|
-
DataMapper.repository.adapter.fields storage_name
|
12
|
-
end
|
13
35
|
end
|
14
36
|
end
|
data/lib/dm-mapping/type_map.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
|
2
2
|
module DataMapper
|
3
3
|
class TypeMap
|
4
|
-
def
|
4
|
+
def lookup_primitive primitive, type_map = self
|
5
5
|
type_map.chains.find{ |type, chain|
|
6
6
|
primitive == chain.primitive
|
7
|
-
} or
|
7
|
+
} or lookup_primitive(primitive, type_map.parent)
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
data/lib/dm-mapping/version.rb
CHANGED
data/test/test_dm-mapping.rb
CHANGED
@@ -3,6 +3,7 @@ require 'test/unit'
|
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
5
|
require 'data_mapper'
|
6
|
+
require 'dm-mapping'
|
6
7
|
|
7
8
|
class DMMTest < Test::Unit::TestCase
|
8
9
|
class User
|
@@ -20,43 +21,117 @@ class DMMTest < Test::Unit::TestCase
|
|
20
21
|
belongs_to :user
|
21
22
|
|
22
23
|
property :id, Integer, :serial => true
|
23
|
-
property :title, String
|
24
|
+
property :title, String, :default => 'default title'
|
24
25
|
property :body, Text
|
25
26
|
end
|
26
27
|
|
27
|
-
class
|
28
|
+
class Model; end
|
28
29
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
def create_fake_model
|
31
|
+
[Model.dup.__send__(:include, DataMapper::Resource),
|
32
|
+
DataMapper.setup(:default, 'sqlite3:tmp.db')]
|
33
|
+
end
|
34
|
+
|
35
|
+
@@dm = DataMapper.setup :default, 'sqlite3:tmp.db'
|
36
|
+
def dm; @@dm; end
|
37
|
+
|
38
|
+
def setup
|
39
|
+
User.auto_migrate!
|
40
|
+
Comment.auto_migrate!
|
41
|
+
end
|
42
|
+
|
43
|
+
def user_fields
|
44
|
+
[['created_at', DateTime, {}],
|
45
|
+
['id', Integer, {:serial => true}],
|
46
|
+
['login', String, {}],
|
47
|
+
['sig', DataMapper::Types::Text, {}]]
|
48
|
+
end
|
33
49
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
50
|
+
def comment_fields
|
51
|
+
[['body', DataMapper::Types::Text, {}],
|
52
|
+
['id', Integer , {:serial => true}],
|
53
|
+
['title', String , {:default => 'default title'}],
|
54
|
+
['user_id', Integer , {}]]
|
55
|
+
end
|
39
56
|
|
40
|
-
|
57
|
+
def test_storages
|
58
|
+
assert_equal ['dmm_test_comments', 'dmm_test_users'], dm.storages.sort
|
59
|
+
assert_equal comment_fields, dm.fields('dmm_test_comments').sort
|
60
|
+
end
|
41
61
|
|
62
|
+
def test_create_comment
|
42
63
|
Comment.create(:title => 'XD')
|
43
64
|
assert_equal 1, Comment.first.id
|
44
65
|
assert_equal 'XD', Comment.first.title
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_mapping_all
|
69
|
+
test_create_comment # for fixtures
|
70
|
+
model, local_dm = create_fake_model
|
71
|
+
model.storage_names[:default] = 'dmm_test_comments'
|
72
|
+
|
73
|
+
assert_equal ['dmm_test_comments', 'dmm_test_users'], local_dm.storages.sort
|
74
|
+
assert_equal 'dmm_test_comments', model.storage_name
|
75
|
+
|
76
|
+
assert_equal 1, model.count
|
77
|
+
assert_equal comment_fields, model.fields.sort
|
45
78
|
|
46
|
-
|
79
|
+
model.send :mapping
|
80
|
+
assert_equal 'XD', model.first.title
|
81
|
+
assert_equal 1, model.first.id
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_mapping_and_create
|
85
|
+
model, local_dm = create_fake_model
|
86
|
+
model.storage_names[:default] = 'dmm_test_comments'
|
87
|
+
model.send :mapping
|
88
|
+
|
89
|
+
model.create(:title => 'orz')
|
90
|
+
assert_equal 'orz', model.first.title
|
91
|
+
assert_equal 1, model.first.id
|
92
|
+
|
93
|
+
model.create
|
94
|
+
assert_equal 'default title', model.get(2).title
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_storages_and_fields
|
98
|
+
assert_equal user_fields, dm.fields('dmm_test_users').sort
|
99
|
+
assert_equal( {'dmm_test_users' => user_fields, 'dmm_test_comments' => comment_fields},
|
100
|
+
dm.storages_and_fields.inject({}){ |r, i|
|
101
|
+
key, value = i
|
102
|
+
r[key] = value.sort
|
103
|
+
r
|
104
|
+
} )
|
105
|
+
end
|
47
106
|
|
48
|
-
|
49
|
-
|
50
|
-
|
107
|
+
def test_mapping_type
|
108
|
+
model, local_dm = create_fake_model
|
109
|
+
model.storage_names[:default] = 'dmm_test_comments'
|
110
|
+
model.send :mapping, Integer
|
51
111
|
|
52
|
-
|
53
|
-
|
112
|
+
assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_mapping_multiple
|
116
|
+
model, local_dm = create_fake_model
|
117
|
+
model.storage_names[:default] = 'dmm_test_users'
|
118
|
+
model.send :mapping, :login, Integer
|
119
|
+
|
120
|
+
assert_equal ['id', 'login'], model.properties.map(&:name).map(&:to_s).sort
|
121
|
+
end
|
54
122
|
|
55
|
-
|
56
|
-
|
123
|
+
def test_mapping_regexp
|
124
|
+
model, local_dm = create_fake_model
|
125
|
+
model.storage_names[:default] = 'dmm_test_comments'
|
126
|
+
model.send :mapping, /id$/
|
57
127
|
|
58
|
-
|
59
|
-
assert_equal 'XD', Tmp.first.title
|
60
|
-
assert_equal 1, Tmp.first.id
|
128
|
+
assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
|
61
129
|
end
|
130
|
+
|
131
|
+
def test_invalid_argument
|
132
|
+
assert_raise(ArgumentError){
|
133
|
+
User.send :mapping, 29
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
62
137
|
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.3.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-04 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: 0.9.3
|
24
24
|
version:
|
25
25
|
description: DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.
|
26
26
|
email: "strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org"
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- TODO
|
59
59
|
- dm-mapping.gemspec
|
60
60
|
- lib/dm-mapping.rb
|
61
|
+
- lib/dm-mapping/adapters/abstract_adapter.rb
|
61
62
|
- lib/dm-mapping/adapters/sqlite3adapter.rb
|
62
63
|
- lib/dm-mapping/model.rb
|
63
64
|
- lib/dm-mapping/type_map.rb
|