lafcadio 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/lafcadio.rb +1 -1
- data/lib/lafcadio.rb~ +1 -1
- data/lib/lafcadio/domain.rb +363 -255
- data/lib/lafcadio/domain.rb~ +201 -230
- data/lib/lafcadio/mock.rb +64 -70
- data/lib/lafcadio/mock.rb~ +48 -49
- data/lib/lafcadio/objectField.rb +137 -127
- data/lib/lafcadio/objectField.rb~ +7 -7
- data/lib/lafcadio/objectStore.rb +560 -586
- data/lib/lafcadio/objectStore.rb~ +495 -536
- data/lib/lafcadio/query.rb +320 -213
- data/lib/lafcadio/query.rb~ +129 -131
- data/lib/lafcadio/schema.rb +10 -14
- data/lib/lafcadio/schema.rb~ +1 -1
- data/lib/lafcadio/test.rb +174 -75
- data/lib/lafcadio/test.rb~ +191 -0
- data/lib/lafcadio/util.rb +1 -32
- data/lib/lafcadio/util.rb~ +1 -6
- metadata +2 -2
data/lib/lafcadio/schema.rb
CHANGED
@@ -3,8 +3,11 @@ require 'lafcadio/objectField'
|
|
3
3
|
module Lafcadio
|
4
4
|
class CreateTableStatement #:nodoc:
|
5
5
|
@@simple_field_clauses = {
|
6
|
-
|
7
|
-
|
6
|
+
BooleanField => 'bool', BlobField => 'blob', DateField => 'date',
|
7
|
+
DomainObjectField => 'int', FloatField => 'float',
|
8
|
+
DateTimeField => 'datetime', IntegerField => 'int',
|
9
|
+
StringField => 'varchar(255)', TextListField => 'varchar(255)',
|
10
|
+
TimeStampField => 'timestamp'
|
8
11
|
}
|
9
12
|
|
10
13
|
def initialize( domain_class )
|
@@ -15,15 +18,16 @@ module Lafcadio
|
|
15
18
|
definitionTerms = []
|
16
19
|
definitionTerms << field.db_field_name
|
17
20
|
definitionTerms << type_clause( field )
|
18
|
-
definitionTerms << 'not null' if field.
|
21
|
+
definitionTerms << 'not null' if field.not_nil
|
19
22
|
definitionTerms.join( ' ' )
|
20
23
|
end
|
21
24
|
|
22
25
|
def to_sql
|
23
26
|
createDefinitions = []
|
24
|
-
createDefinitions <<
|
25
|
-
|
26
|
-
createDefinitions <<
|
27
|
+
createDefinitions <<
|
28
|
+
"#{ @domain_class.sql_primary_key_name } int not null auto_increment"
|
29
|
+
createDefinitions <<
|
30
|
+
"primary key (#{ @domain_class.sql_primary_key_name })"
|
27
31
|
@domain_class.class_fields.each { |field|
|
28
32
|
createDefinitions << definition_terms( field )
|
29
33
|
}
|
@@ -42,14 +46,6 @@ module Lafcadio
|
|
42
46
|
"'#{ enumValue }'"
|
43
47
|
}
|
44
48
|
"enum( #{ singleQuotedValues.join( ', ' ) } )"
|
45
|
-
elsif ( field.class <= StringField || field.class <= TextListField )
|
46
|
-
'varchar(255)'
|
47
|
-
elsif ( field.class <= DomainObjectField || field.class <= IntegerField )
|
48
|
-
'int'
|
49
|
-
elsif ( field.class <= FloatField )
|
50
|
-
'float(10, 2)'
|
51
|
-
elsif ( field.class <= BlobField )
|
52
|
-
'blob'
|
53
49
|
end
|
54
50
|
end
|
55
51
|
end
|
data/lib/lafcadio/schema.rb~
CHANGED
@@ -4,7 +4,7 @@ module Lafcadio
|
|
4
4
|
class CreateTableStatement #:nodoc:
|
5
5
|
@@simple_field_clauses = {
|
6
6
|
FloatField => 'float', DateField => 'date', BooleanField => 'bool',
|
7
|
-
TimeStampField => 'timestamp',
|
7
|
+
TimeStampField => 'timestamp', DateTimeField => 'datetime'
|
8
8
|
}
|
9
9
|
|
10
10
|
def initialize( domain_class )
|
data/lib/lafcadio/test.rb
CHANGED
@@ -21,28 +21,37 @@ class LafcadioTestCase < Test::Unit::TestCase
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
# Asserts that for each key-value pair in +att_values+, sending the key to
|
25
|
+
# +object+ will return the value.
|
26
|
+
# u = User.new( 'fname' => 'Francis', 'lname' => 'Hwang' )
|
27
|
+
# assert_attributes( u, { 'fname' => 'Francis', 'lname' => 'Hwang' } )
|
28
|
+
def assert_attributes( object, att_values )
|
29
|
+
att_values.each { |method, expected|
|
30
|
+
assert_equal( expected, object.send( method ), method.to_s )
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_test #:nodoc:
|
35
|
+
end
|
25
36
|
end
|
26
37
|
|
27
38
|
module Lafcadio
|
28
|
-
def BooleanField.mock_value
|
39
|
+
def BooleanField.mock_value #:nodoc:
|
40
|
+
true
|
41
|
+
end
|
29
42
|
|
30
|
-
def DateField.mock_value
|
43
|
+
def DateField.mock_value #:nodoc:
|
44
|
+
Date.today
|
45
|
+
end
|
31
46
|
|
32
|
-
def DateTimeField.mock_value
|
47
|
+
def DateTimeField.mock_value #:nodoc:
|
48
|
+
Time.now
|
49
|
+
end
|
33
50
|
|
34
|
-
module DomainMock
|
51
|
+
module DomainMock #:nodoc:
|
35
52
|
Version = '0.1.0'
|
36
53
|
|
37
54
|
def self.included( includer )
|
38
|
-
def includer.setup_procs
|
39
|
-
unless defined? @@all_setup_procs
|
40
|
-
@@all_setup_procs = Hash.new { |hash, domain_class|
|
41
|
-
hash[domain_class] = []
|
42
|
-
}
|
43
|
-
end
|
44
|
-
@@all_setup_procs[self]
|
45
|
-
end
|
46
55
|
def includer.setup_mock_dobjs( *domain_classes_or_symbol_names )
|
47
56
|
domain_classes = DomainClassSymbolMapper.new
|
48
57
|
domain_classes_or_symbol_names.each { |domain_class_or_symbol_name|
|
@@ -58,6 +67,15 @@ module Lafcadio
|
|
58
67
|
setup_procs << proc
|
59
68
|
}
|
60
69
|
end
|
70
|
+
|
71
|
+
def includer.setup_procs
|
72
|
+
unless defined? @@all_setup_procs
|
73
|
+
@@all_setup_procs = Hash.new { |hash, domain_class|
|
74
|
+
hash[domain_class] = []
|
75
|
+
}
|
76
|
+
end
|
77
|
+
@@all_setup_procs[self]
|
78
|
+
end
|
61
79
|
end
|
62
80
|
|
63
81
|
def commit_domain_object( domain_class, non_default_values = {} )
|
@@ -82,7 +100,7 @@ module Lafcadio
|
|
82
100
|
self.class.setup_procs.each { |proc| proc.call( self ) }
|
83
101
|
end
|
84
102
|
|
85
|
-
class DomainClassSymbolMapper < Hash
|
103
|
+
class DomainClassSymbolMapper < Hash #:nodoc:
|
86
104
|
def initialize; @last_domain_class = nil; end
|
87
105
|
|
88
106
|
def default_symbol_name( domain_class )
|
@@ -119,26 +137,73 @@ module Lafcadio
|
|
119
137
|
hash[a_class] = default_args
|
120
138
|
}
|
121
139
|
|
122
|
-
def self.commit_mock( args, caller = nil )
|
140
|
+
def self.commit_mock( args, caller = nil ) #:nodoc:
|
123
141
|
dobj = self.new( args )
|
124
142
|
link_fields = all_fields.select { |field| field.is_a? DomainObjectField }
|
125
143
|
link_fields.each do |field|
|
126
144
|
val = dobj.send( field.name )
|
127
|
-
if val and val.pk_id == 1
|
128
|
-
linked_type = field.linked_type
|
129
|
-
begin
|
130
|
-
ObjectStore.get_object_store.get( linked_type, 1 )
|
131
|
-
rescue DomainObjectNotFoundError
|
132
|
-
unless linked_type == caller
|
133
|
-
linked_type.send( 'default_mock', self )
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
145
|
+
maybe_call_default_mock( field, caller ) if ( val and val.pk_id == 1 )
|
137
146
|
end
|
138
147
|
dobj.commit
|
139
148
|
dobj
|
140
149
|
end
|
141
150
|
|
151
|
+
# Commits and returns a custom mock object of the given domain class. All
|
152
|
+
# the field values are set to defaults, except for the fields passed in
|
153
|
+
# through +custom_args+. This mock object will have a +pk_id+ greater than
|
154
|
+
# 1, and each successive call to DomainObject.custom_mock will return an
|
155
|
+
# object with a unique +pk_id+.
|
156
|
+
#
|
157
|
+
# This class method is only visible if you include
|
158
|
+
# <tt>lafcadio/test.rb</tt>.
|
159
|
+
#
|
160
|
+
# class User < Lafcadio::DomainObject
|
161
|
+
# string :fname, :lname, :email
|
162
|
+
# end
|
163
|
+
# u1 = User.custom_mock
|
164
|
+
# u1.fname # => 'test text'
|
165
|
+
# u1.lname # => 'test text'
|
166
|
+
# u1.email # => 'test text'
|
167
|
+
# u1.pk_id # => probably 2, guaranteed to be greater than 1
|
168
|
+
# u2 = User.custom_mock( 'fname' => 'Francis', 'lname' => 'Hwang' )
|
169
|
+
# u2.fname # => 'Francis'
|
170
|
+
# u2.lname # => 'Hwang'
|
171
|
+
# u2.email # => 'test text'
|
172
|
+
# u2.pk_id # => probably 3, guaranteed to not be u1.pk_id and to be
|
173
|
+
# # greater than 1
|
174
|
+
def self.custom_mock( custom_args = nil )
|
175
|
+
dobj_args = default_args
|
176
|
+
object_store = ObjectStore.get_object_store
|
177
|
+
dbb = object_store.db_bridge
|
178
|
+
dbb.set_next_pk_id( self, 2 ) if dbb.next_pk_id( self ) == 1
|
179
|
+
dobj_args['pk_id'] = nil
|
180
|
+
if custom_args.is_a? Hash
|
181
|
+
custom_args.each do |k, v| dobj_args[k.to_s] = v; end
|
182
|
+
end
|
183
|
+
commit_mock( dobj_args )
|
184
|
+
end
|
185
|
+
|
186
|
+
# Returns a hash of default arguments for mock instances of this domain
|
187
|
+
# class. DomainObject.default_mock uses exactly these arguments to create
|
188
|
+
# the default mock for a given domain class, and DomainObject.custom_mock
|
189
|
+
# overrides some of the field arguments based on its custom arguments.
|
190
|
+
#
|
191
|
+
# By default this will retrieve simple values based on the field type:
|
192
|
+
# * BooleanField: +true+
|
193
|
+
# * DateField: Date.today
|
194
|
+
# * DateTimeField: Time.now
|
195
|
+
# * DomainObjectField: The instance of the domain class with +pk_id+ 1
|
196
|
+
# * EmailField: "john.doe@email.com"
|
197
|
+
# * FloatField: 0.0
|
198
|
+
# * IntegerField: 1
|
199
|
+
# * StringField: "test text"
|
200
|
+
# * TextListField: [ 'a', 'b', 'c' ]
|
201
|
+
#
|
202
|
+
# You can override this method, if you like. However, it will probably be
|
203
|
+
# simpler just to call DomainObject.mock_value.
|
204
|
+
#
|
205
|
+
# This class method is only visible if you include
|
206
|
+
# <tt>lafcadio/test.rb</tt>.
|
142
207
|
def self.default_args
|
143
208
|
default_args = {}
|
144
209
|
@@default_arg_directives[self].each do |name, value_or_proc|
|
@@ -151,23 +216,29 @@ module Lafcadio
|
|
151
216
|
default_args
|
152
217
|
end
|
153
218
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
219
|
+
# Commits and returns a mock object of the given domain class. All
|
220
|
+
# the field values are set to defaults. This mock object will have a
|
221
|
+
# +pk_id+ of 1. Successive calls to DomainObject.default_mock will always
|
222
|
+
# return the same mock object.
|
223
|
+
#
|
224
|
+
# This class method is only visible if you include
|
225
|
+
# <tt>lafcadio/test.rb</tt>.
|
226
|
+
#
|
227
|
+
# class User < Lafcadio::DomainObject
|
228
|
+
# string :fname, :lname, :email
|
229
|
+
# end
|
230
|
+
# u1 = User.default_mock
|
231
|
+
# u1.fname # => 'test text'
|
232
|
+
# u1.lname # => 'test text'
|
233
|
+
# u1.email # => 'test text'
|
234
|
+
# u1.pk_id # => 1
|
164
235
|
def self.default_mock( calling_class = nil )
|
165
236
|
if @@default_mock_available[self]
|
166
237
|
begin
|
167
238
|
dobj = ObjectStore.get_object_store.get( self, 1 )
|
168
239
|
dobj
|
169
240
|
rescue DomainObjectNotFoundError
|
170
|
-
dbb = ObjectStore.get_object_store.
|
241
|
+
dbb = ObjectStore.get_object_store.db_bridge
|
171
242
|
dbb.set_next_pk_id( self, 1 ) if dbb.next_pk_id( self ) > 1
|
172
243
|
commit_mock( default_args, calling_class )
|
173
244
|
end
|
@@ -176,68 +247,96 @@ module Lafcadio
|
|
176
247
|
end
|
177
248
|
end
|
178
249
|
|
179
|
-
def self.default_mock_available( is_avail )
|
250
|
+
def self.default_mock_available( is_avail ) #:nodoc:
|
180
251
|
@@default_mock_available[self] = is_avail
|
181
252
|
end
|
253
|
+
|
254
|
+
def self.maybe_call_default_mock( field, caller ) #:nodoc:
|
255
|
+
linked_type = field.linked_type
|
256
|
+
begin
|
257
|
+
ObjectStore.get_object_store.get( linked_type, 1 )
|
258
|
+
rescue DomainObjectNotFoundError
|
259
|
+
unless linked_type == caller
|
260
|
+
linked_type.send( 'default_mock', self )
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
182
264
|
|
265
|
+
# Sets the mock value for the given field. These mock values are used in
|
266
|
+
# DomainObject.default_mock and DomainObject.custom_mock
|
267
|
+
#
|
268
|
+
# This class method is only visible if you include
|
269
|
+
# <tt>lafcadio/test.rb</tt>.
|
270
|
+
#
|
271
|
+
# class User < Lafcadio::DomainObject
|
272
|
+
# string :fname, :lname, :email
|
273
|
+
# end
|
274
|
+
# User.mock_value :fname, 'Bill'
|
275
|
+
# User.mock_value :lname, 'Smith'
|
276
|
+
# u1 = User.default_mock
|
277
|
+
# u1.fname # => 'Bill'
|
278
|
+
# u1.lname # => 'Smith'
|
279
|
+
# u1.email # => 'test text'
|
280
|
+
# u1.pk_id # => 1
|
183
281
|
def self.mock_value( field_sym, value )
|
184
282
|
@@default_arg_directives[self][field_sym.id2name] = value
|
185
283
|
end
|
186
284
|
|
285
|
+
# Sets the mock value for the fields in +hash+. These mock values are used
|
286
|
+
# in DomainObject.default_mock and DomainObject.custom_mock
|
287
|
+
#
|
288
|
+
# This class method is only visible if you include
|
289
|
+
# <tt>lafcadio/test.rb</tt>.
|
290
|
+
#
|
291
|
+
# class User < Lafcadio::DomainObject
|
292
|
+
# string :fname, :lname, :email
|
293
|
+
# end
|
294
|
+
# User.mock_values { :fname => 'Bill', :lname => 'Smith' }
|
295
|
+
# u1 = User.default_mock
|
296
|
+
# u1.fname # => 'Bill'
|
297
|
+
# u1.lname # => 'Smith'
|
298
|
+
# u1.email # => 'test text'
|
299
|
+
# u1.pk_id # => 1
|
187
300
|
def self.mock_values( hash )
|
188
301
|
hash.each do |field_sym, value| mock_value( field_sym, value ); end
|
189
302
|
end
|
190
303
|
end
|
191
304
|
|
192
305
|
class DomainObjectField < ObjectField
|
193
|
-
def default_mock_value
|
306
|
+
def default_mock_value #:nodoc:
|
307
|
+
DomainObjectProxy.new( linked_type, 1 )
|
308
|
+
end
|
194
309
|
end
|
195
310
|
|
196
|
-
def EmailField.mock_value
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
def IntegerField.mock_value; 1; end
|
311
|
+
def EmailField.mock_value #:nodoc:
|
312
|
+
'john.doe@email.com'
|
313
|
+
end
|
201
314
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
:orig_get_pk_id_before_committing, :get_pk_id_before_committing
|
206
|
-
)
|
207
|
-
|
208
|
-
def get_pk_id_before_committing( domain_object )
|
209
|
-
@next_pk_ids = {} unless @next_pk_ids
|
210
|
-
orig_pk_id = orig_get_pk_id_before_committing domain_object
|
211
|
-
if (next_pk_id = @next_pk_ids[domain_object.domain_class])
|
212
|
-
@last_pk_id_inserted = next_pk_id
|
213
|
-
@next_pk_ids[domain_object.domain_class] = nil
|
214
|
-
next_pk_id
|
215
|
-
else
|
216
|
-
orig_pk_id
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
def next_pk_id( domain_class )
|
222
|
-
dobjs = get_objects_by_domain_class( domain_class ).values
|
223
|
-
dobjs.inject( 0 ) { |memo, obj| memo > obj.pk_id ? memo : obj.pk_id } + 1
|
224
|
-
end
|
315
|
+
def FloatField.mock_value #:nodoc:
|
316
|
+
0.0
|
317
|
+
end
|
225
318
|
|
226
|
-
|
227
|
-
|
228
|
-
@next_pk_ids[ domain_class ] = npi
|
229
|
-
end
|
319
|
+
def IntegerField.mock_value #:nodoc:
|
320
|
+
1
|
230
321
|
end
|
231
|
-
|
322
|
+
|
232
323
|
class ObjectField
|
233
324
|
attr_writer :mock_value
|
234
325
|
|
235
|
-
def default_mock_value
|
326
|
+
def default_mock_value #:nodoc:
|
327
|
+
self.class.mock_value
|
328
|
+
end
|
236
329
|
end
|
237
330
|
|
238
|
-
def PrimaryKeyField.mock_value
|
331
|
+
def PrimaryKeyField.mock_value #:nodoc:
|
332
|
+
nil
|
333
|
+
end
|
239
334
|
|
240
|
-
def StringField.mock_value
|
335
|
+
def StringField.mock_value #:nodoc:
|
336
|
+
'test text'
|
337
|
+
end
|
241
338
|
|
242
|
-
def TextListField.mock_value
|
339
|
+
def TextListField.mock_value #:nodoc:
|
340
|
+
%w( a b c )
|
341
|
+
end
|
243
342
|
end
|
data/lib/lafcadio/test.rb~
CHANGED
@@ -23,3 +23,194 @@ class LafcadioTestCase < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
def default_test; end
|
25
25
|
end
|
26
|
+
|
27
|
+
module Lafcadio
|
28
|
+
def BooleanField.mock_value; true; end
|
29
|
+
|
30
|
+
def DateField.mock_value; Date.today; end
|
31
|
+
|
32
|
+
def DateTimeField.mock_value; Time.now; end
|
33
|
+
|
34
|
+
module DomainMock
|
35
|
+
Version = '0.1.0'
|
36
|
+
|
37
|
+
def self.included( includer )
|
38
|
+
def includer.setup_mock_dobjs( *domain_classes_or_symbol_names )
|
39
|
+
domain_classes = DomainClassSymbolMapper.new
|
40
|
+
domain_classes_or_symbol_names.each { |domain_class_or_symbol_name|
|
41
|
+
domain_classes.process( domain_class_or_symbol_name )
|
42
|
+
}
|
43
|
+
domain_classes.finish
|
44
|
+
domain_classes.each { |my_domain_class, my_symbol_name|
|
45
|
+
proc = Proc.new { |test_case|
|
46
|
+
test_case.instance_variable_set(
|
47
|
+
my_symbol_name, my_domain_class.default_mock
|
48
|
+
)
|
49
|
+
}
|
50
|
+
setup_procs << proc
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def includer.setup_procs
|
55
|
+
unless defined? @@all_setup_procs
|
56
|
+
@@all_setup_procs = Hash.new { |hash, domain_class|
|
57
|
+
hash[domain_class] = []
|
58
|
+
}
|
59
|
+
end
|
60
|
+
@@all_setup_procs[self]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def commit_domain_object( domain_class, non_default_values = {} )
|
65
|
+
self.class.mock_domain_files.each do |file| require file; end
|
66
|
+
dobj = domain_class.send( :custom_mock, non_default_values )
|
67
|
+
dobj.commit
|
68
|
+
end
|
69
|
+
|
70
|
+
def method_missing( sym, *args )
|
71
|
+
method_name = sym.id2name
|
72
|
+
if method_name =~ /^custom_mock_(.*)/
|
73
|
+
domain_class = Module.by_name( $1.underscore_to_camel_case )
|
74
|
+
commit_domain_object( domain_class, *args )
|
75
|
+
elsif method_name =~ /^default_mock_(.*)/
|
76
|
+
Module.by_name( $1.underscore_to_camel_case ).default_mock
|
77
|
+
else
|
78
|
+
super
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def setup
|
83
|
+
self.class.setup_procs.each { |proc| proc.call( self ) }
|
84
|
+
end
|
85
|
+
|
86
|
+
class DomainClassSymbolMapper < Hash
|
87
|
+
def initialize; @last_domain_class = nil; end
|
88
|
+
|
89
|
+
def default_symbol_name( domain_class )
|
90
|
+
"@#{ domain_class.name.camel_case_to_underscore }"
|
91
|
+
end
|
92
|
+
|
93
|
+
def finish
|
94
|
+
if @last_domain_class
|
95
|
+
self[@last_domain_class] = default_symbol_name( @last_domain_class )
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def process( domain_class_or_symbol_name )
|
100
|
+
if domain_class_or_symbol_name.class == Class
|
101
|
+
if @last_domain_class
|
102
|
+
self[@last_domain_class] = default_symbol_name( @last_domain_class )
|
103
|
+
end
|
104
|
+
@last_domain_class = domain_class_or_symbol_name
|
105
|
+
else
|
106
|
+
self[@last_domain_class] = domain_class_or_symbol_name
|
107
|
+
@last_domain_class = nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class DomainObject
|
114
|
+
@@default_mock_available = Hash.new true
|
115
|
+
@@default_arg_directives = Hash.new { |hash, a_class|
|
116
|
+
default_args = {}
|
117
|
+
a_class.all_fields.each do |field|
|
118
|
+
default_args[field.name] = field.default_mock_value
|
119
|
+
end
|
120
|
+
hash[a_class] = default_args
|
121
|
+
}
|
122
|
+
|
123
|
+
def self.commit_mock( args, caller = nil )
|
124
|
+
dobj = self.new( args )
|
125
|
+
link_fields = all_fields.select { |field| field.is_a? DomainObjectField }
|
126
|
+
link_fields.each do |field|
|
127
|
+
val = dobj.send( field.name )
|
128
|
+
maybe_call_default_mock( field, caller ) if ( val and val.pk_id == 1 )
|
129
|
+
end
|
130
|
+
dobj.commit
|
131
|
+
dobj
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.custom_mock( custom_args = nil )
|
135
|
+
dobj_args = default_args
|
136
|
+
object_store = ObjectStore.get_object_store
|
137
|
+
dbb = object_store.get_db_bridge
|
138
|
+
dbb.set_next_pk_id( self, 2 ) if dbb.next_pk_id( self ) == 1
|
139
|
+
dobj_args['pk_id'] = nil
|
140
|
+
dobj_args = dobj_args.merge( custom_args ) if custom_args.is_a?( Hash )
|
141
|
+
commit_mock( dobj_args )
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.default_args
|
145
|
+
default_args = {}
|
146
|
+
@@default_arg_directives[self].each do |name, value_or_proc|
|
147
|
+
if value_or_proc.is_a? Proc
|
148
|
+
default_args[name] = value_or_proc.call
|
149
|
+
else
|
150
|
+
default_args[name] = value_or_proc
|
151
|
+
end
|
152
|
+
end
|
153
|
+
default_args
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.default_mock( calling_class = nil )
|
157
|
+
if @@default_mock_available[self]
|
158
|
+
begin
|
159
|
+
dobj = ObjectStore.get_object_store.get( self, 1 )
|
160
|
+
dobj
|
161
|
+
rescue DomainObjectNotFoundError
|
162
|
+
dbb = ObjectStore.get_object_store.get_db_bridge
|
163
|
+
dbb.set_next_pk_id( self, 1 ) if dbb.next_pk_id( self ) > 1
|
164
|
+
commit_mock( default_args, calling_class )
|
165
|
+
end
|
166
|
+
else
|
167
|
+
raise( TypeError, self.name + ".default_mock not allowed", caller )
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.default_mock_available( is_avail )
|
172
|
+
@@default_mock_available[self] = is_avail
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.maybe_call_default_mock( field, caller )
|
176
|
+
linked_type = field.linked_type
|
177
|
+
begin
|
178
|
+
ObjectStore.get_object_store.get( linked_type, 1 )
|
179
|
+
rescue DomainObjectNotFoundError
|
180
|
+
unless linked_type == caller
|
181
|
+
linked_type.send( 'default_mock', self )
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.mock_value( field_sym, value )
|
187
|
+
@@default_arg_directives[self][field_sym.id2name] = value
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.mock_values( hash )
|
191
|
+
hash.each do |field_sym, value| mock_value( field_sym, value ); end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class DomainObjectField < ObjectField
|
196
|
+
def default_mock_value; DomainObjectProxy.new( linked_type, 1 ); end
|
197
|
+
end
|
198
|
+
|
199
|
+
def EmailField.mock_value; 'john.doe@email.com'; end
|
200
|
+
|
201
|
+
def FloatField.mock_value; 0.0; end
|
202
|
+
|
203
|
+
def IntegerField.mock_value; 1; end
|
204
|
+
|
205
|
+
class ObjectField
|
206
|
+
attr_writer :mock_value
|
207
|
+
|
208
|
+
def default_mock_value; self.class.mock_value; end
|
209
|
+
end
|
210
|
+
|
211
|
+
def PrimaryKeyField.mock_value; nil; end
|
212
|
+
|
213
|
+
def StringField.mock_value; 'test text'; end
|
214
|
+
|
215
|
+
def TextListField.mock_value; %w( a b c ); end
|
216
|
+
end
|