dm-mapping 0.5.0 → 0.6.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 CHANGED
@@ -1,5 +1,16 @@
1
1
  = dm-mapper changes history
2
2
 
3
+ === dm-mapping 0.6.0, 2008-08-16
4
+ * mapping returns an array of properties indicating fields it mapped.
5
+ * performance boosted by refactored mapping implementation.
6
+ * changed the way using auto_genclass!, now accepts args like mapping!
7
+ * changed fields to return field name with Symbol instead of String.
8
+ this would make it be more consistent with DataMapper.
9
+ * storage names remain String.
10
+ * added more mysql data type to map
11
+ * use Extlib::Hook to setup dm-mapping instead of stupid alias_method.
12
+ * removed ensure_require in model. always setup DataMapper before define model.
13
+
3
14
  === dm-mapping 0.5.0, 2008-08-14
4
15
  * feature added
5
16
  - added mysql support.
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = dm-mapping 0.5.0
1
+ = dm-mapping 0.6.0
2
2
  by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
3
3
  godfat (XD) godfat.org
4
4
 
@@ -15,15 +15,21 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
15
15
 
16
16
  == SYNOPSIS:
17
17
 
18
- require 'dm-mapping'
18
+ require 'dm-mapping' # this would require 'dm-core'
19
19
  dm = DataMapper.setup :default, 'sqlite3:db/development.sqlite3'
20
20
 
21
21
  class User
22
22
  include DataMapper::Resource
23
- # mapping all
24
- mapping /.*/
23
+ # mapping all, returns an array of properties indicating fields it mapped
24
+ mapping /.*/ # e.g. => [#<Property:#<Class:0x18f89b8>:id>,
25
+ # #<Property:#<Class:0x18f89b8>:title>,
26
+ # #<Property:#<Class:0x18f89b8>:body>,
27
+ # #<Property:#<Class:0x18f89b8>:user_id>]
25
28
 
26
- # mapping for ended with _at, and started with salt_
29
+ # mapping all (with no argument at all)
30
+ mapping
31
+
32
+ # mapping for field name ended with _at, and started with salt_
27
33
  mapping /_at$/, /^salt_/
28
34
 
29
35
  # mapping id and email
@@ -41,27 +47,28 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
41
47
  # => ['users']
42
48
 
43
49
  # there's no guarantee of the order in fields array
44
- User.fields.sort
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}]]
52
-
53
- dm.fields('users').sort == User.fields.sort
50
+ User.fields
51
+ # => [[:created_at, DateTime, {:nullable => true}],
52
+ [:email, String, {:nullable => true, :size => 255,
53
+ :default => 'nospam@nospam.tw'}],
54
+ [:id, Integer, {:nullable => false, :serial => true,
55
+ :key => true}],
56
+ [:salt_first, String, {:nullable => true, :size => 50}],
57
+ [:salt_second, String, {:nullable => true, :size => 50}]]
58
+
59
+ dm.fields('users').sort_by{ |field| field.first.to_s } ==
60
+ User.fields.sort_by{ |field| field.first.to_s }
54
61
  # => true
55
62
 
56
63
  dm.storages_and_fields
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}]]}
64
+ # => {'users' => [[:id, Integer, {:nullable => false,
65
+ :serial => true,
66
+ :key => true}],
67
+ [:email, String, {:nullable => true,
68
+ :default => 'nospam@nospam.tw'}],
69
+ [:created_at, DateTime, {:nullable => true}],
70
+ [:salt_first, String, {:nullable => true, :size => 50}],
71
+ [:salt_second, String, {:nullable => true, :size => 50}]]}
65
72
 
66
73
  # there's no guarantee of the order in returned array
67
74
  dm.auto_genclass!
@@ -70,9 +77,21 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
70
77
  DataMapper::Mapping::Session]
71
78
 
72
79
  # you can change the scope of generated models:
73
- dm.auto_genclass! Object
80
+ dm.auto_genclass! :scope => Object
74
81
  # => [User, SchemaInfo, Session]
75
82
 
83
+ # you can generate classes for tables you specified only:
84
+ dm.auto_genclass! :scope => Object, :storages => /^phpbb_/
85
+ # => [PhpbbUser, PhpbbPost, PhpbbConfig]
86
+
87
+ # you can generate classes with String too:
88
+ dm.auto_genclass! :storages => ['users', 'config'], :scope => Object
89
+ # => [User, Config]
90
+
91
+ # you can generate a class only:
92
+ dm.auto_genclass! :storages => 'users'
93
+ # => [DataMapper::Mapping::User]
94
+
76
95
  == REQUIREMENTS:
77
96
 
78
97
  * dm-core 0.9.3
data/TODO CHANGED
@@ -1,4 +1,5 @@
1
1
  = dm-mapping todo list
2
2
 
3
- * 0.6 postgresql adapter
4
- * 0.7 automatic determine model relationship
3
+ * better doc...
4
+ * 0.7 postgresql adapter
5
+ * 0.8 automatic determine model relationship
data/dm-mapping.gemspec CHANGED
@@ -1,11 +1,11 @@
1
1
 
2
2
  Gem::Specification.new do |s|
3
3
  s.name = %q{dm-mapping}
4
- s.version = "0.5.0"
4
+ s.version = "0.6.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-14}
8
+ s.date = %q{2008-08-16}
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"]
data/lib/dm-mapping.rb CHANGED
@@ -1,31 +1,17 @@
1
1
 
2
2
  gem 'dm-core', '=0.9.3'
3
3
  require 'dm-core'
4
+ require 'extlib'
4
5
 
5
6
  module DataMapper
6
-
7
- # default scope for Migration#auto_genclass!.
8
- module Mapping # namespace
7
+ include Extlib::Hook
8
+ after_class_method :setup do
9
+ adapter_name = repository.adapter.class.to_s.split('::').last
10
+ require "dm-mapping/adapters/#{Extlib::Inflection.underscore(adapter_name)}"
9
11
  end
10
12
 
11
- class << self
12
- # ensure the using adapter is extended by dm-mapping
13
- def ensure_required_dm_mapping_adapter
14
- require 'extlib'
15
- adapter_name = repository.adapter.class.to_s.split('::').last
16
- require "dm-mapping/adapters/#{Extlib::Inflection.underscore(adapter_name)}"
17
- end
18
-
19
- # dirty hack that hook requirement after setup.
20
- alias_method :__setup_alias_by_dm_mapping__, :setup
21
- private :__setup_alias_by_dm_mapping__
22
- # dirty hack that hook requirement after setup.
23
- # usage is the same as original setup.
24
- def setup name, uri_or_options
25
- adapter = __setup_alias_by_dm_mapping__ name, uri_or_options
26
- ensure_required_dm_mapping_adapter
27
- adapter
28
- end
13
+ # default scope for Migration#auto_genclasses! series.
14
+ module Mapping # namespace
29
15
  end
30
16
 
31
17
  end
@@ -12,27 +12,33 @@ module DataMapper
12
12
 
13
13
  # returns all fields, with format [[name, type, attrs]]
14
14
  # e.g.
15
- # [['created_at', DateTime, {}],
16
- # ['email', String, {:default => 'nospam@nospam.tw'}],
17
- # ['id', Integer, {:serial => true}],
18
- # ['salt_first', String, {}],
19
- # ['salt_second', String, {}]]
15
+ # [[:created_at, DateTime, {:nullable => true}],
16
+ # [:email, String, {:nullable => true, :size => 255,
17
+ # :default => 'nospam@nospam.tw'}],
18
+ # [:id, Integer, {:nullable => false, :serial => true,
19
+ # :key => true}],
20
+ # [:salt_first, String, {:nullable => true, :size => 50}],
21
+ # [:salt_second, String, {:nullable => true, :size => 50}]]
20
22
  def fields storage
21
23
  dmm_query_storage(storage).map{ |field|
22
- type, chain = self.class.type_map.
23
- lookup_primitive(dmm_primitive(field))
24
+ primitive = dmm_primitive(field)
25
+ type, chain = self.class.type_map.lookup_primitive(primitive) ||
26
+ dmm_lookup_primitive(primitive)
24
27
 
25
- [dmm_field_name(field), type, dmm_attributes(field)]
28
+ [dmm_field_name(field).to_sym, type, dmm_attributes(field)]
26
29
  }
27
30
  end
28
31
 
29
32
  # returns a hash with storage names in keys and
30
33
  # corresponded fields in values. e.g.
31
- # {'users' => [['id', Integer, {:serial => true}],
32
- # ['email', String, {:default => 'nospam@nospam.tw'}],
33
- # ['created_at', DateTime, {}],
34
- # ['salt_first', String, {}],
35
- # ['salt_second', String, {}]]}
34
+ # {'users' => [[:id, Integer, {:nullable => false,
35
+ # :serial => true,
36
+ # :key => true}],
37
+ # [:email, String, {:nullable => true,
38
+ # :default => 'nospam@nospam.tw'}],
39
+ # [:created_at, DateTime, {:nullable => true}],
40
+ # [:salt_first, String, {:nullable => true, :size => 50}],
41
+ # [:salt_second, String, {:nullable => true, :size => 50}]]}
36
42
  # see Migration#storages and Migration#fields for detail
37
43
  def storages_and_fields
38
44
  storages.inject({}){ |result, storage|
@@ -41,7 +47,7 @@ module DataMapper
41
47
  }
42
48
  end
43
49
 
44
- # automaticly generate all model classes and mapping
50
+ # automaticly generate model class(es) and mapping
45
51
  # all fields with mapping /.*/ for you.
46
52
  # e.g.
47
53
  # dm.auto_genclass!
@@ -51,23 +57,63 @@ module DataMapper
51
57
  #
52
58
  # you can change the scope of generated models:
53
59
  # e.g.
54
- # dm.auto_genclass! Object
60
+ # dm.auto_genclass! :scope => Object
55
61
  # # => [User, SchemaInfo, Session]
56
- def auto_genclass! scope = DataMapper::Mapping
57
- require 'extlib'
58
- storages_and_fields.map{ |storage, fields|
59
- model = Class.new
60
- model.__send__ :include, DataMapper::Resource
61
- model.storage_names[:default] = storage
62
- model.__send__ :mapping, /.*/
63
- scope.const_set(Extlib::Inflection.classify(storage), model)
64
- }
62
+ #
63
+ # you can generate classes for tables you specified only:
64
+ # e.g.
65
+ # dm.auto_genclass! :scope => Object, :storages => /^phpbb_/
66
+ # # => [PhpbbUser, PhpbbPost, PhpbbConfig]
67
+ #
68
+ # you can generate classes with String too:
69
+ # e.g.
70
+ # dm.auto_genclass! :storages => ['users', 'config'], :scope => Object
71
+ # # => [User, Config]
72
+ #
73
+ # you can generate a class only:
74
+ # e.g.
75
+ # dm.auto_genclass! :storages => 'users'
76
+ # # => [DataMapper::Mapping::User]
77
+ def auto_genclass! opts = {}
78
+ opts[:scope] ||= DataMapper::Mapping
79
+ opts[:storages] ||= /.*/
80
+ opts[:storages] = [opts[:storages]].flatten
81
+
82
+ storages.map{ |storage|
83
+
84
+ mapped = opts[:storages].each{ |target|
85
+ case target
86
+ when Regexp;
87
+ break storage if storage =~ target
88
+
89
+ when Symbol, String;
90
+ break storage if storage == target.to_s
91
+
92
+ else
93
+ raise ArgumentError.new("invalid argument: #{target.inspect}")
94
+ end
95
+ }
96
+
97
+ dmm_genclass mapped, opts[:scope] if mapped.kind_of?(String)
98
+ }.compact
65
99
  end
66
100
 
67
101
  private
68
102
  def dmm_query_storage
69
103
  raise NotImplementError.new("#{self.class}#fields is not implemented.")
70
104
  end
105
+
106
+ def dmm_genclass storage, scope
107
+ model = Class.new
108
+ model.__send__ :include, DataMapper::Resource
109
+ model.storage_names[:default] = storage
110
+ model.__send__ :mapping, /.*/
111
+ scope.const_set(Extlib::Inflection.classify(storage), model)
112
+ end
113
+
114
+ def dmm_lookup_primitive primitive
115
+ raise TypeError.new("#{primitive} not found for #{self.class}")
116
+ end
71
117
  end
72
118
  end
73
119
  end
@@ -41,6 +41,18 @@ module DataMapper
41
41
 
42
42
  attrs
43
43
  end
44
+
45
+ def dmm_lookup_primitive primitive
46
+ case primitive.upcase
47
+ when 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'BIGINT', 'YEAR'; Integer
48
+ when 'DOUBLE'; BigDecimal
49
+ when 'BOOL'; TrueClass
50
+ when 'CHAR', 'ENUM', 'SET', 'TINYBLOB', 'MEDIUMBLOB',
51
+ 'BLOB', 'LONGBLOB', 'BINARY', 'VARBINARY'; String
52
+ when 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT'; DM::Text
53
+ else super(primitive)
54
+ end
55
+ end
44
56
  end
45
57
  end
46
58
  end
@@ -5,7 +5,6 @@ module DataMapper
5
5
  # e.g.
6
6
  # DataMapper.repository.adapter.fields storage_name
7
7
  def fields
8
- DataMapper.ensure_required_dm_mapping_adapter
9
8
  DataMapper.repository.adapter.fields storage_name
10
9
  end
11
10
 
@@ -16,13 +15,20 @@ module DataMapper
16
15
  # you can pass it Regexp to map any field it matched, or just
17
16
  # the field name in Symbol or String, or a Class telling it
18
17
  # map any field which type equals to the Class.
18
+ # returned value is an array of properties indicating fields it mapped
19
19
  # e.g.
20
20
  # class User
21
21
  # include DataMapper::Resource
22
- # # maping all
23
- # mapping /.*/
22
+ # # mapping all
23
+ # mapping /.*/ # e.g. => [#<Property:#<Class:0x18f89b8>:id>,
24
+ # # #<Property:#<Class:0x18f89b8>:title>,
25
+ # # #<Property:#<Class:0x18f89b8>:body>,
26
+ # # #<Property:#<Class:0x18f89b8>:user_id>]
24
27
  #
25
- # # mapping for ended with _at, and started with salt_
28
+ # # mapping all (with no argument at all)
29
+ # mapping
30
+ #
31
+ # # mapping for field name ended with _at, and started with salt_
26
32
  # mapping /_at$/, /^salt_/
27
33
  #
28
34
  # # mapping id and email
@@ -35,28 +41,29 @@ module DataMapper
35
41
  # mapping :login, Integer
36
42
  # end
37
43
  def mapping *targets
38
- DataMapper.ensure_required_dm_mapping_adapter
39
44
  targets << /.*/ if targets.empty?
40
45
 
41
46
  fields.map{ |field|
42
47
  name, type, attrs = field
43
48
 
44
- targets.each{ |target|
49
+ mapped = targets.each{ |target|
45
50
  case target
46
51
  when Regexp;
47
- property name.to_sym, type, attrs if name =~ target
52
+ break name if name.to_s =~ target
48
53
 
49
54
  when Symbol, String;
50
- property name.to_sym, type, attrs if name == target.to_s
55
+ break name if name == target.to_sym
51
56
 
52
57
  when Class;
53
- property name.to_sym, type, attrs if type == target
58
+ break name if type == target
54
59
 
55
60
  else
56
61
  raise ArgumentError.new("invalid argument: #{target.inspect}")
57
62
  end
58
63
  }
59
- }
64
+
65
+ property mapped, type, attrs if mapped.kind_of?(Symbol)
66
+ }.compact
60
67
  end
61
68
  end
62
69
  end
@@ -4,8 +4,10 @@ module DataMapper
4
4
  # reversed lookup for primitive type to ruby type.
5
5
  # e.g.
6
6
  # lookup_primitive('DATETIME')
7
- # # => { DateTime => {:auto_validation => true} }
7
+ # # => [DateTime, #<DataMapper::TypeMap::TypeChain:0x830b8>]
8
8
  def lookup_primitive primitive, type_map = self
9
+ return nil unless type_map
10
+
9
11
  type_map.chains.find{ |type, chain|
10
12
  primitive.upcase == chain.primitive &&
11
13
  [Integer, Float, BigDecimal,
@@ -1,5 +1,5 @@
1
1
  module DataMapper
2
2
  module Mapping
3
- VERSION = '0.5.0' unless defined?(DataMapper::Mapping::VERSION)
3
+ VERSION = '0.6.0' unless defined?(DataMapper::Mapping::VERSION)
4
4
  end
5
5
  end
data/test/abstract.rb CHANGED
@@ -5,7 +5,7 @@ require 'dm-mapping'
5
5
 
6
6
  module Abstract
7
7
  def setup_data_mapper
8
- raise 'please provide an clean database because it is a destructive test!!'
8
+ raise 'please provide a clean database because it is a destructive test!!'
9
9
  end
10
10
 
11
11
  AttrCommon = {:nullable => true}
@@ -13,18 +13,22 @@ module Abstract
13
13
  AttrText = {:size => 65535}.merge AttrCommon
14
14
 
15
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]]
16
+ [[:created_at, DateTime, AttrCommon],
17
+ [:id, Integer, AttrCommonPK],
18
+ [:login, String, {:size => 70}.merge(AttrCommon)],
19
+ [:sig, DM::Text, AttrText]]
20
20
  end
21
21
 
22
22
  def comment_fields
23
- [['body', DM::Text, AttrText],
24
- ['id', Integer, AttrCommonPK],
25
- ['title', String, {:size => 50, :default => 'default title'}.
23
+ [[:body, DM::Text, AttrText],
24
+ [:id, Integer, AttrCommonPK],
25
+ [:title, String, {:size => 50, :default => 'default title'}.
26
26
  merge(AttrCommon)],
27
- ['user_id', Integer, AttrCommon]]
27
+ [:user_id, Integer, AttrCommon]]
28
+ end
29
+
30
+ def super_user_fields
31
+ [[:id, Integer, AttrCommonPK]]
28
32
  end
29
33
 
30
34
  class User
@@ -37,6 +41,11 @@ module Abstract
37
41
  property :created_at, DateTime
38
42
  end
39
43
 
44
+ class SuperUser
45
+ include DataMapper::Resource
46
+ property :id, Integer, :serial => true
47
+ end
48
+
40
49
  class Comment
41
50
  include DataMapper::Resource
42
51
  belongs_to :user
@@ -48,6 +57,14 @@ module Abstract
48
57
 
49
58
  class Model; end
50
59
 
60
+ Tables = ['abstract_comments', 'abstract_super_users', 'abstract_users']
61
+
62
+ def sort_fields fields
63
+ fields.sort_by{ |field|
64
+ field.first.to_s
65
+ }
66
+ end
67
+
51
68
  def create_fake_model
52
69
  [ Model.dup.__send__(:include, DataMapper::Resource),
53
70
  setup_data_mapper ]
@@ -59,11 +76,16 @@ module Abstract
59
76
  # this is significant faster than DataMapper.auto_migrate!
60
77
  User.auto_migrate!
61
78
  Comment.auto_migrate!
79
+ SuperUser.auto_migrate!
80
+ end
81
+
82
+ def new_scope
83
+ self.class.const_set("Scope#{object_id.object_id}", Module.new)
62
84
  end
63
85
 
64
86
  def test_storages
65
- assert_equal ['abstract_comments', 'abstract_users'], dm.storages.sort
66
- assert_equal comment_fields, dm.fields('abstract_comments').sort
87
+ assert_equal Tables, dm.storages.sort
88
+ assert_equal comment_fields, sort_fields(dm.fields('abstract_comments'))
67
89
  end
68
90
 
69
91
  def test_create_comment
@@ -72,16 +94,25 @@ module Abstract
72
94
  assert_equal 'XD', Comment.first.title
73
95
  end
74
96
 
97
+ def test_create_user
98
+ now = Time.now
99
+ User.create(:created_at => now)
100
+ assert_equal 1, User.first.id
101
+ assert_equal now.asctime, User.first.created_at.asctime
102
+
103
+ return now
104
+ end
105
+
75
106
  def test_mapping_all
76
107
  test_create_comment # for fixtures
77
108
  model, local_dm = create_fake_model
78
109
  model.storage_names[:default] = 'abstract_comments'
79
110
 
80
- assert_equal ['abstract_comments', 'abstract_users'], local_dm.storages.sort
111
+ assert_equal Tables, local_dm.storages.sort
81
112
  assert_equal 'abstract_comments', model.storage_name
82
113
 
83
114
  assert_equal 1, model.count
84
- assert_equal comment_fields, model.fields.sort
115
+ assert_equal comment_fields, sort_fields(model.fields)
85
116
 
86
117
  model.send :mapping
87
118
  assert_equal 'XD', model.first.title
@@ -102,12 +133,13 @@ module Abstract
102
133
  end
103
134
 
104
135
  def test_storages_and_fields
105
- assert_equal user_fields, dm.fields('abstract_users').sort
136
+ assert_equal user_fields, sort_fields(dm.fields('abstract_users'))
106
137
  assert_equal( {'abstract_users' => user_fields,
107
- 'abstract_comments' => comment_fields},
138
+ 'abstract_comments' => comment_fields,
139
+ 'abstract_super_users' => super_user_fields},
108
140
  dm.storages_and_fields.inject({}){ |r, i|
109
141
  key, value = i
110
- r[key] = value.sort
142
+ r[key] = value.sort_by{ |v| v.first.to_s }
111
143
  r
112
144
  } )
113
145
  end
@@ -142,15 +174,16 @@ module Abstract
142
174
  }
143
175
  end
144
176
 
145
- def test_auto_genclass
146
- scope = self.class
177
+ def test_auto_genclasses
178
+ scope = new_scope
147
179
  assert_equal ["#{scope == Object ? '' : "#{scope}::"}AbstractComment",
148
- "#{scope == Object ? '' : "#{scope}::"}AbstractUser"],
149
- dm.auto_genclass!(scope).map(&:to_s).sort
180
+ "#{scope}::AbstractSuperUser",
181
+ "#{scope}::AbstractUser"],
182
+ dm.auto_genclass!(:scope => scope).map(&:to_s).sort
150
183
 
151
184
  comment = scope.const_get('AbstractComment')
152
185
 
153
- assert_equal comment_fields, comment.fields.sort
186
+ assert_equal comment_fields, sort_fields(comment.fields)
154
187
 
155
188
  test_create_comment
156
189
 
@@ -159,4 +192,38 @@ module Abstract
159
192
  assert_equal 'dm-mapping', comment.get(2).body
160
193
  end
161
194
 
195
+ def test_auto_genclass
196
+ scope = new_scope
197
+ assert_equal ["#{scope}::AbstractUser"],
198
+ dm.auto_genclass!(:scope => scope,
199
+ :storages => 'abstract_users').map(&:to_s)
200
+
201
+ user = scope.const_get('AbstractUser')
202
+ assert_equal user_fields, sort_fields(user.fields)
203
+
204
+ now = test_create_user
205
+
206
+ assert_equal now.asctime, user.first.created_at.asctime
207
+ user.create(:login => 'godfat')
208
+ assert_equal 'godfat', user.get(2).login
209
+ end
210
+
211
+ def test_auto_genclass_with_regexp
212
+ scope = new_scope
213
+ assert_equal ["#{scope}::AbstractSuperUser", "#{scope}::AbstractUser"],
214
+ dm.auto_genclass!(:scope => scope,
215
+ :storages => /_users$/).map(&:to_s).sort
216
+
217
+ user = scope.const_get('AbstractSuperUser')
218
+ assert_equal sort_fields(SuperUser.fields), sort_fields(user.fields)
219
+ end
220
+
221
+ def test_mapping_return_value
222
+ model, local_dm = create_fake_model
223
+ model.storage_names[:default] = 'abstract_comments'
224
+ mapped = model.send :mapping, /.*/
225
+
226
+ assert_equal model.properties.map(&:object_id).sort, mapped.map(&:object_id).sort
227
+ end
228
+
162
229
  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.5.0
4
+ version: 0.6.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-15 00:00:00 +08:00
12
+ date: 2008-08-17 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency