dm-mapping 0.5.0 → 0.6.0

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