godfat-dm-is-reflective 0.8.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.
@@ -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