godfat-dm-is-reflective 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ module DataMapper
2
+ module Is
3
+ module Reflective
4
+ VERSION = '0.8.0'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module DataMapper
2
+ module Is
3
+ module Reflective
4
+ VERSION = '0.8.0'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,250 @@
1
+
2
+ require 'rubygems'
3
+ require 'dm-core'
4
+ require 'dm-is-reflective'
5
+
6
+ module Abstract
7
+ def setup_data_mapper
8
+ raise 'please provide a 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 = {:length => 65535}.merge(AttrCommon)
14
+
15
+ def user_fields
16
+ [[:created_at, DateTime, AttrCommon],
17
+ [:id, DataMapper::Types::Serial, AttrCommonPK],
18
+ [:login, String, {:length => 70}.merge(AttrCommon)],
19
+ [:sig, DataMapper::Types::Text, AttrText]]
20
+ end
21
+
22
+ def comment_fields
23
+ [[:body, DataMapper::Types::Text, AttrText],
24
+ [:id, DataMapper::Types::Serial, AttrCommonPK],
25
+ [:title, String, {:length => 50, :default => 'default title'}.
26
+ merge(AttrCommon)],
27
+ [:user_id, Integer, AttrCommon]]
28
+ end
29
+
30
+ # there's differences between adapters
31
+ def super_user_fields
32
+ case self
33
+ when MysqlTest # Mysql couldn't tell it's boolean or tinyint
34
+ [[:bool, Integer, AttrCommon],
35
+ [:id, DataMapper::Types::Serial, AttrCommonPK]]
36
+
37
+ else
38
+ [[:bool, DataMapper::Types::Boolean, AttrCommon],
39
+ [:id, DataMapper::Types::Serial, AttrCommonPK]]
40
+
41
+ end
42
+ end
43
+
44
+ class User
45
+ include DataMapper::Resource
46
+ has n, :comments
47
+
48
+ property :id, Serial
49
+ property :login, String, :length => 70
50
+ property :sig, Text
51
+ property :created_at, DateTime
52
+
53
+ is :reflective
54
+ end
55
+
56
+ class SuperUser
57
+ include DataMapper::Resource
58
+ property :id, Serial
59
+ property :bool, Boolean
60
+
61
+ is :reflective
62
+ end
63
+
64
+ class Comment
65
+ include DataMapper::Resource
66
+ belongs_to :user, :nullable => true
67
+
68
+ property :id, Serial
69
+ property :title, String, :length => 50, :default => 'default title'
70
+ property :body, Text
71
+
72
+ is :reflective
73
+ end
74
+
75
+ class Model; end
76
+
77
+ Tables = ['abstract_comments', 'abstract_super_users', 'abstract_users']
78
+
79
+ def sort_fields fields
80
+ fields.sort_by{ |field|
81
+ field.first.to_s
82
+ }
83
+ end
84
+
85
+ def create_fake_model
86
+ model = Model.dup.send(:include, DataMapper::Resource)
87
+ model.is :reflective
88
+ [ model, setup_data_mapper ]
89
+ end
90
+
91
+ attr_reader :dm
92
+ def setup
93
+ @dm = setup_data_mapper
94
+ # this is significant faster than DataMapper.auto_migrate!
95
+ User.auto_migrate!
96
+ Comment.auto_migrate!
97
+ SuperUser.auto_migrate!
98
+ end
99
+
100
+ def new_scope
101
+ self.class.const_set("Scope#{object_id.object_id}", Module.new)
102
+ end
103
+
104
+ def test_storages
105
+ assert_equal Tables, dm.storages.sort
106
+ assert_equal comment_fields, sort_fields(dm.fields('abstract_comments'))
107
+ end
108
+
109
+ def test_create_comment
110
+ Comment.create(:title => 'XD')
111
+ assert_equal 1, Comment.first.id
112
+ assert_equal 'XD', Comment.first.title
113
+ end
114
+
115
+ def test_create_user
116
+ now = Time.now
117
+ User.create(:created_at => now)
118
+ assert_equal 1, User.first.id
119
+ assert_equal now.asctime, User.first.created_at.asctime
120
+
121
+ return now
122
+ end
123
+
124
+ def test_mapping_all
125
+ test_create_comment # for fixtures
126
+ model, local_dm = create_fake_model
127
+ model.storage_names[:default] = 'abstract_comments'
128
+
129
+ assert_equal Tables, local_dm.storages.sort
130
+ assert_equal 'abstract_comments', model.storage_name
131
+
132
+ model.send :mapping
133
+ assert_equal 1, model.all.size
134
+ assert_equal comment_fields, sort_fields(model.fields)
135
+
136
+ assert_equal 'XD', model.first.title
137
+ assert_equal 1, model.first.id
138
+ end
139
+
140
+ def test_mapping_and_create
141
+ model, local_dm = create_fake_model
142
+ model.storage_names[:default] = 'abstract_comments'
143
+ model.send :mapping
144
+
145
+ model.create(:title => 'orz')
146
+ assert_equal 'orz', model.first.title
147
+ assert_equal 1, model.first.id
148
+
149
+ model.create
150
+ assert_equal 'default title', model.get(2).title
151
+ end
152
+
153
+ def test_storages_and_fields
154
+ assert_equal user_fields, sort_fields(dm.fields('abstract_users'))
155
+ assert_equal( {'abstract_users' => user_fields,
156
+ 'abstract_comments' => comment_fields,
157
+ 'abstract_super_users' => super_user_fields},
158
+ dm.storages_and_fields.inject({}){ |r, i|
159
+ key, value = i
160
+ r[key] = value.sort_by{ |v| v.first.to_s }
161
+ r
162
+ } )
163
+ end
164
+
165
+ def test_mapping_type
166
+ model, local_dm = create_fake_model
167
+ model.storage_names[:default] = 'abstract_comments'
168
+
169
+ model.send :mapping, DataMapper::Types::Serial
170
+ assert_equal ['id'], model.properties.map(&:name).map(&:to_s).sort
171
+
172
+ model.send :mapping, Integer
173
+ assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
174
+ end
175
+
176
+ def test_mapping_multiple
177
+ model, local_dm = create_fake_model
178
+ model.storage_names[:default] = 'abstract_users'
179
+ model.send :mapping, :login, DataMapper::Types::Serial
180
+
181
+ assert_equal ['id', 'login'], model.properties.map(&:name).map(&:to_s).sort
182
+ end
183
+
184
+ def test_mapping_regexp
185
+ model, local_dm = create_fake_model
186
+ model.storage_names[:default] = 'abstract_comments'
187
+ model.send :mapping, /id$/
188
+
189
+ assert_equal ['id', 'user_id'], model.properties.map(&:name).map(&:to_s).sort
190
+ end
191
+
192
+ def test_invalid_argument
193
+ assert_raises(ArgumentError){
194
+ User.send :mapping, 29
195
+ }
196
+ end
197
+
198
+ def test_auto_genclasses
199
+ scope = new_scope
200
+ assert_equal ["#{scope == Object ? '' : "#{scope}::"}AbstractComment",
201
+ "#{scope}::AbstractSuperUser",
202
+ "#{scope}::AbstractUser"],
203
+ dm.auto_genclass!(:scope => scope).map(&:to_s).sort
204
+
205
+ comment = scope.const_get('AbstractComment')
206
+
207
+ assert_equal comment_fields, sort_fields(comment.fields)
208
+
209
+ test_create_comment
210
+
211
+ assert_equal 'XD', comment.first.title
212
+ comment.create(:title => 'orz', :body => 'dm-mapping')
213
+ assert_equal 'dm-mapping', comment.get(2).body
214
+ end
215
+
216
+ def test_auto_genclass
217
+ scope = new_scope
218
+ assert_equal ["#{scope}::AbstractUser"],
219
+ dm.auto_genclass!(:scope => scope,
220
+ :storages => 'abstract_users').map(&:to_s)
221
+
222
+ user = scope.const_get('AbstractUser')
223
+ assert_equal user_fields, sort_fields(user.fields)
224
+
225
+ now = test_create_user
226
+
227
+ assert_equal now.asctime, user.first.created_at.asctime
228
+ user.create(:login => 'godfat')
229
+ assert_equal 'godfat', user.get(2).login
230
+ end
231
+
232
+ def test_auto_genclass_with_regexp
233
+ scope = new_scope
234
+ assert_equal ["#{scope}::AbstractSuperUser", "#{scope}::AbstractUser"],
235
+ dm.auto_genclass!(:scope => scope,
236
+ :storages => /_users$/).map(&:to_s).sort
237
+
238
+ user = scope.const_get('AbstractSuperUser')
239
+ assert_equal sort_fields(SuperUser.fields), sort_fields(user.fields)
240
+ end
241
+
242
+ def test_mapping_return_value
243
+ model, local_dm = create_fake_model
244
+ model.storage_names[:default] = 'abstract_comments'
245
+ mapped = model.send :mapping, /.*/
246
+
247
+ assert_equal model.properties.map(&:object_id).sort, mapped.map(&:object_id).sort
248
+ end
249
+
250
+ end
@@ -0,0 +1,48 @@
1
+
2
+ require 'test/abstract'
3
+
4
+ TestCase = begin
5
+ require 'minitest/unit'
6
+ MiniTest::Unit.autorun
7
+ MiniTest::Unit::TestCase
8
+ rescue LoadError
9
+ require 'test/unit'
10
+ Test::Unit::TestCase
11
+ end
12
+
13
+ %w[sqlite3 mysql postgres].each{ |adapter|
14
+ begin
15
+ require "dm-core/adapters/#{adapter}_adapter"
16
+ rescue LoadError
17
+ puts "skip #{adapter} test since it's not installed"
18
+ end
19
+ }
20
+
21
+ # cost 1 second to run
22
+ class Sqlite3Test < TestCase
23
+ include Abstract
24
+
25
+ def setup_data_mapper
26
+ DataMapper.setup(:default, 'sqlite3::memory:')
27
+ end
28
+ end if defined?(DataObjects::Sqlite3)
29
+
30
+
31
+ # cost 2 seconds to run
32
+ class MysqlTest < TestCase
33
+ include Abstract
34
+
35
+ def setup_data_mapper
36
+ DataMapper.setup(:default, 'mysql://dm-mapping:godfat@localhost/dm-mapping')
37
+ end
38
+ end if defined?(DataObjects::Mysql)
39
+
40
+
41
+ # cost 3 seconds to run
42
+ class PostgresTest < TestCase
43
+ include Abstract
44
+
45
+ def setup_data_mapper
46
+ DataMapper.setup(:default, 'postgres://dm-mapping:godfat@localhost/dm-mapping')
47
+ end
48
+ end if defined?(DataObjects::Postgres)
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: godfat-dm-is-reflective
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ platform: ruby
6
+ authors:
7
+ - "Lin Jen-Shin (aka godfat \xE7\x9C\x9F\xE5\xB8\xB8)"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-21 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: dm-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.10.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: extlib
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.13
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: bones
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.5.1
44
+ version:
45
+ description: DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.
46
+ email: godfat (XD) godfat.org
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - CHANGES
53
+ - LICENSE
54
+ - NOTICE
55
+ - README
56
+ - TODO
57
+ files:
58
+ - CHANGES
59
+ - LICENSE
60
+ - NOTICE
61
+ - README
62
+ - Rakefile
63
+ - TODO
64
+ - lib/dm-is-reflective.rb
65
+ - lib/dm-is-reflective/is/adapters/abstract_adapter.rb
66
+ - lib/dm-is-reflective/is/adapters/mysql_adapter.rb
67
+ - lib/dm-is-reflective/is/adapters/postgres_adapter.rb
68
+ - lib/dm-is-reflective/is/adapters/sqlite3_adapter.rb
69
+ - lib/dm-is-reflective/is/reflective.rb
70
+ - lib/dm-is-reflective/is/version.rb
71
+ - lib/dm-is-reflective/version.rb
72
+ - test/abstract.rb
73
+ - test/test_dm-is-reflexible.rb
74
+ has_rdoc: false
75
+ homepage: http://github.com/godfat/dm-is-reflective
76
+ post_install_message:
77
+ rdoc_options:
78
+ - --charset=utf-8
79
+ - --inline-source
80
+ - --line-numbers
81
+ - --promiscuous
82
+ - --main
83
+ - README
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: "0"
97
+ version:
98
+ requirements: []
99
+
100
+ rubyforge_project: ludy
101
+ rubygems_version: 1.2.0
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.
105
+ test_files:
106
+ - test/test_dm-is-reflexible.rb