lafcadio 0.7.1 → 0.7.2
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/dateTime.rb +3 -3
- data/lib/lafcadio/dateTime.rb~ +93 -0
- data/lib/lafcadio/domain.rb +71 -21
- data/lib/lafcadio/domain.rb~ +53 -17
- data/lib/lafcadio/mock.rb +9 -3
- data/lib/lafcadio/mock.rb~ +7 -3
- data/lib/lafcadio/objectField.rb +9 -6
- data/lib/lafcadio/objectField.rb~ +1 -1
- data/lib/lafcadio/objectStore.rb +7 -1
- data/lib/lafcadio/objectStore.rb~ +5 -1
- data/lib/lafcadio/query.rb +9 -7
- data/lib/lafcadio/query.rb~ +3 -16
- data/lib/lafcadio/test.rb +6 -1
- data/lib/lafcadio/test.rb~ +20 -0
- data/lib/lafcadio/util.rb +22 -20
- data/lib/lafcadio/util.rb~ +11 -9
- metadata +4 -2
data/lib/lafcadio.rb
CHANGED
data/lib/lafcadio.rb~
CHANGED
data/lib/lafcadio/dateTime.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Lafcadio
|
2
|
-
# Represents a specific month in time. With the exception of
|
3
|
-
# (which returns a zero-based array), every usage of the
|
4
|
-
# that 1 equals January and 12 equals December.
|
2
|
+
# Represents a specific month in time. With the exception of
|
3
|
+
# Month.month_names (which returns a zero-based array), every usage of the
|
4
|
+
# month value assumes that 1 equals January and 12 equals December.
|
5
5
|
class Month
|
6
6
|
# Returns an array of the full names of months (in English). Note that
|
7
7
|
# "January" is the 0th element, and "December" is the 11th element.
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Lafcadio
|
2
|
+
# Represents a specific month in time. With the exception of Month.month_names
|
3
|
+
# (which returns a zero-based array), every usage of the month value assumes
|
4
|
+
# that 1 equals January and 12 equals December.
|
5
|
+
class Month
|
6
|
+
# Returns an array of the full names of months (in English). Note that
|
7
|
+
# "January" is the 0th element, and "December" is the 11th element.
|
8
|
+
def Month.month_names
|
9
|
+
[ "January", "February", "March", "April", "May", "June", "July",
|
10
|
+
"August", "September", "October", "November", "December" ]
|
11
|
+
end
|
12
|
+
|
13
|
+
include Comparable
|
14
|
+
|
15
|
+
attr_reader :month, :year
|
16
|
+
|
17
|
+
# A new month can be set to a specific +month+ and +year+, or you can call
|
18
|
+
# Month.new with no arguments to receive the current month.
|
19
|
+
def initialize( year = nil, month = nil )
|
20
|
+
require 'date'
|
21
|
+
if month.nil? || year.nil?
|
22
|
+
date = Date.today
|
23
|
+
month = date.mon unless month
|
24
|
+
year = date.year unless year
|
25
|
+
end
|
26
|
+
fail "invalid month" if month < 1 || month > 12
|
27
|
+
@month = month
|
28
|
+
@year = year
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns a new Month that is +amountToAdd+ months later.
|
32
|
+
def +( amountToAdd )
|
33
|
+
( fullYears, remainingMonths ) = amountToAdd.divmod( 12 )
|
34
|
+
resultYear = @year + fullYears
|
35
|
+
resultMonth = @month + remainingMonths
|
36
|
+
if resultMonth > 12
|
37
|
+
resultMonth -= 12
|
38
|
+
resultYear += 1
|
39
|
+
end
|
40
|
+
Month.new( resultYear, resultMonth )
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a new Month that is +amountToSubtract+ months earlier.
|
44
|
+
def -(amountToSubtract)
|
45
|
+
self + (-amountToSubtract)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Compare this Month to another Month.
|
49
|
+
def <=>(anOther)
|
50
|
+
if @year == anOther.year
|
51
|
+
@month <=> anOther.month
|
52
|
+
else
|
53
|
+
@year <=> anOther.year
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns the last Date of the month.
|
58
|
+
def end_date
|
59
|
+
self.next.start_date - 1
|
60
|
+
end
|
61
|
+
|
62
|
+
# Is this Month equal to +anOther+? +anOther+ must be another Month of the
|
63
|
+
# same value.
|
64
|
+
def eql?(anOther)
|
65
|
+
self == anOther
|
66
|
+
end
|
67
|
+
|
68
|
+
# Calculate a hash value for this Month.
|
69
|
+
def hash
|
70
|
+
"#{@year}#{@month}".to_i
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns the next Month.
|
74
|
+
def next
|
75
|
+
self + 1
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns the previous Month.
|
79
|
+
def prev
|
80
|
+
self - 1
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the first Date of the month.
|
84
|
+
def start_date
|
85
|
+
Date.new( @year, @month, 1 )
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns a string of the format "January 2001".
|
89
|
+
def to_s
|
90
|
+
Month.month_names[@month-1][0..2] + " " + @year.to_s
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/lafcadio/domain.rb
CHANGED
@@ -258,11 +258,15 @@ module Lafcadio
|
|
258
258
|
|
259
259
|
include DomainComparable
|
260
260
|
|
261
|
+
def self.[]( pk_id ); get( pk_id ); end
|
262
|
+
|
261
263
|
def self.abstract_subclasses #:nodoc:
|
262
264
|
require 'lafcadio/domain'
|
263
265
|
[ MapObject ]
|
264
266
|
end
|
265
|
-
|
267
|
+
|
268
|
+
def self.all; ObjectStore.get_object_store.get_all( self ); end
|
269
|
+
|
266
270
|
# Returns an array of all fields defined for this class and all concrete
|
267
271
|
# superclasses.
|
268
272
|
def self.all_fields
|
@@ -282,13 +286,21 @@ module Lafcadio
|
|
282
286
|
class_fields
|
283
287
|
end
|
284
288
|
|
285
|
-
def self.create_field( field_class,
|
289
|
+
def self.create_field( field_class, *args )
|
286
290
|
class_fields = @@class_fields[self]
|
287
291
|
if class_fields.nil?
|
288
292
|
class_fields = [ @@pk_fields[self] ]
|
289
293
|
@@class_fields[self] = class_fields
|
290
294
|
end
|
291
|
-
|
295
|
+
if field_class == LinkField
|
296
|
+
att_hash = args.last.is_a?( Hash ) ? args.last : {}
|
297
|
+
att_hash['linked_type'] = args.first
|
298
|
+
att_hash['name'] = args[1] if args[1] and !args[1].is_a? Hash
|
299
|
+
else
|
300
|
+
att_hash = args[1] || {}
|
301
|
+
name = args.first
|
302
|
+
att_hash['name'] = name == String ? name : name.to_s
|
303
|
+
end
|
292
304
|
field = field_class.instantiate_with_parameters( self, att_hash )
|
293
305
|
att_hash.each { |field_name, value|
|
294
306
|
setter = field_name + '='
|
@@ -312,6 +324,8 @@ module Lafcadio
|
|
312
324
|
}
|
313
325
|
dependent_classes
|
314
326
|
end
|
327
|
+
|
328
|
+
def self.first; all.first; end
|
315
329
|
|
316
330
|
def self.get_class_field(fieldName) #:nodoc:
|
317
331
|
field = nil
|
@@ -330,6 +344,8 @@ module Lafcadio
|
|
330
344
|
def self.get_class_fields
|
331
345
|
if self.methods( false ).include?( 'get_class_fields' )
|
332
346
|
[ @@pk_fields[ self ] ]
|
347
|
+
elsif abstract_subclasses.include?( self )
|
348
|
+
[]
|
333
349
|
else
|
334
350
|
xmlParser = try_load_xml_parser
|
335
351
|
if xmlParser
|
@@ -380,6 +396,12 @@ module Lafcadio
|
|
380
396
|
end
|
381
397
|
end
|
382
398
|
|
399
|
+
def self.get_link_field( linked_domain_class ) # :nodoc:
|
400
|
+
class_fields.find { |field|
|
401
|
+
field.is_a? LinkField and field.linked_type == linked_domain_class
|
402
|
+
}
|
403
|
+
end
|
404
|
+
|
383
405
|
def self.inherited(subclass) #:nodoc:
|
384
406
|
@@subclassHash[subclass] = true
|
385
407
|
end
|
@@ -392,12 +414,29 @@ module Lafcadio
|
|
392
414
|
(self != DomainObject && abstract_subclasses.index(self).nil?)
|
393
415
|
end
|
394
416
|
|
417
|
+
def self.last; all.last; end
|
418
|
+
|
395
419
|
def self.method_missing( methodId, *args ) #:nodoc:
|
396
420
|
method_name = methodId.id2name
|
397
|
-
|
398
|
-
|
399
|
-
|
421
|
+
if method_name == 'get'
|
422
|
+
if block_given?
|
423
|
+
query = Query.infer( self ) { |dobj| yield( dobj ) }
|
424
|
+
ObjectStore.get_object_store.get_subset( query )
|
425
|
+
else
|
426
|
+
ObjectStore.get_object_store.get( self, *args )
|
427
|
+
end
|
428
|
+
else
|
429
|
+
maybe_field_class_name = method_name.underscore_to_camel_case + 'Field'
|
430
|
+
begin
|
431
|
+
field_class = Lafcadio.const_get( maybe_field_class_name )
|
432
|
+
create_field( field_class, *args )
|
433
|
+
rescue NameError
|
434
|
+
super
|
435
|
+
end
|
436
|
+
end
|
400
437
|
end
|
438
|
+
|
439
|
+
def self.only; all.only; end
|
401
440
|
|
402
441
|
def self.domain_class #:nodoc:
|
403
442
|
self
|
@@ -411,10 +450,9 @@ module Lafcadio
|
|
411
450
|
require "#{ domainDir }#{ fileName }"
|
412
451
|
end
|
413
452
|
}
|
414
|
-
if (
|
415
|
-
|
416
|
-
|
417
|
-
}
|
453
|
+
if (domainFiles = LafcadioConfig.new['domainFiles'])
|
454
|
+
domainFiles = domainFiles.split( ',' ) if domainFiles.is_a? String
|
455
|
+
domainFiles.each { |domainFile| require domainFile }
|
418
456
|
end
|
419
457
|
end
|
420
458
|
|
@@ -466,9 +504,7 @@ module Lafcadio
|
|
466
504
|
if (!xmlParser.nil? && table_name = xmlParser.table_name)
|
467
505
|
table_name
|
468
506
|
else
|
469
|
-
|
470
|
-
table_name[0] = table_name[0..0].downcase
|
471
|
-
English.plural table_name
|
507
|
+
English.plural( self.basename.camel_case_to_underscore )
|
472
508
|
end
|
473
509
|
end
|
474
510
|
end
|
@@ -506,6 +542,15 @@ module Lafcadio
|
|
506
542
|
# If you're creating mock objects for unit tests, you can explicitly set
|
507
543
|
# the +pk_id+ to represent objects that already exist in the database.
|
508
544
|
def initialize(fieldHash)
|
545
|
+
if fieldHash.respond_to? :keys
|
546
|
+
fieldHash.keys.each { |key|
|
547
|
+
begin
|
548
|
+
self.class.get_field( key )
|
549
|
+
rescue MissingError
|
550
|
+
raise ArgumentError, "Invalid field name #{ key }"
|
551
|
+
end
|
552
|
+
}
|
553
|
+
end
|
509
554
|
@fieldHash = fieldHash
|
510
555
|
@error_messages = []
|
511
556
|
@fields = {}
|
@@ -568,12 +613,15 @@ module Lafcadio
|
|
568
613
|
set_field( field, args.first )
|
569
614
|
elsif ( field = get_getter_field( methId ) )
|
570
615
|
get_field( field )
|
571
|
-
elsif ( methId.to_s =~ /^get_/ and
|
572
|
-
ObjectStore.get_object_store.respond_to?( methId ) )
|
573
|
-
args = [ self ].concat( args )
|
574
|
-
ObjectStore.get_object_store.send( methId, *args )
|
575
616
|
else
|
576
|
-
|
617
|
+
new_symbol = ( 'get_' + methId.id2name ).to_sym
|
618
|
+
object_store = ObjectStore.get_object_store
|
619
|
+
if object_store.respond_to? new_symbol
|
620
|
+
args = [ self ].concat args
|
621
|
+
object_store.send( 'get_' + methId.id2name, *args )
|
622
|
+
else
|
623
|
+
super( methId, *args )
|
624
|
+
end
|
577
625
|
end
|
578
626
|
end
|
579
627
|
|
@@ -611,9 +659,11 @@ module Lafcadio
|
|
611
659
|
end
|
612
660
|
|
613
661
|
def verify
|
614
|
-
|
615
|
-
|
616
|
-
|
662
|
+
if ObjectStore.get_object_store.mock?
|
663
|
+
self.class.get_class_fields.each { |field|
|
664
|
+
field.verify( self.send( field.name ), self.pk_id )
|
665
|
+
}
|
666
|
+
end
|
617
667
|
end
|
618
668
|
end
|
619
669
|
|
data/lib/lafcadio/domain.rb~
CHANGED
@@ -262,7 +262,7 @@ module Lafcadio
|
|
262
262
|
require 'lafcadio/domain'
|
263
263
|
[ MapObject ]
|
264
264
|
end
|
265
|
-
|
265
|
+
|
266
266
|
# Returns an array of all fields defined for this class and all concrete
|
267
267
|
# superclasses.
|
268
268
|
def self.all_fields
|
@@ -282,13 +282,21 @@ module Lafcadio
|
|
282
282
|
class_fields
|
283
283
|
end
|
284
284
|
|
285
|
-
def self.create_field( field_class,
|
285
|
+
def self.create_field( field_class, *args )
|
286
286
|
class_fields = @@class_fields[self]
|
287
287
|
if class_fields.nil?
|
288
288
|
class_fields = [ @@pk_fields[self] ]
|
289
289
|
@@class_fields[self] = class_fields
|
290
290
|
end
|
291
|
-
|
291
|
+
if field_class == LinkField
|
292
|
+
att_hash = args.last.is_a?( Hash ) ? args.last : {}
|
293
|
+
att_hash['linked_type'] = args.first
|
294
|
+
att_hash['name'] = args[1] if args[1] and !args[1].is_a? Hash
|
295
|
+
else
|
296
|
+
att_hash = args[1] || {}
|
297
|
+
name = args.first
|
298
|
+
att_hash['name'] = name == String ? name : name.to_s
|
299
|
+
end
|
292
300
|
field = field_class.instantiate_with_parameters( self, att_hash )
|
293
301
|
att_hash.each { |field_name, value|
|
294
302
|
setter = field_name + '='
|
@@ -330,6 +338,8 @@ module Lafcadio
|
|
330
338
|
def self.get_class_fields
|
331
339
|
if self.methods( false ).include?( 'get_class_fields' )
|
332
340
|
[ @@pk_fields[ self ] ]
|
341
|
+
elsif abstract_subclasses.include?( self )
|
342
|
+
[]
|
333
343
|
else
|
334
344
|
xmlParser = try_load_xml_parser
|
335
345
|
if xmlParser
|
@@ -380,6 +390,12 @@ module Lafcadio
|
|
380
390
|
end
|
381
391
|
end
|
382
392
|
|
393
|
+
def self.get_link_field( linked_domain_class ) # :nodoc:
|
394
|
+
class_fields.find { |field|
|
395
|
+
field.is_a? LinkField and field.linked_type == linked_domain_class
|
396
|
+
}
|
397
|
+
end
|
398
|
+
|
383
399
|
def self.inherited(subclass) #:nodoc:
|
384
400
|
@@subclassHash[subclass] = true
|
385
401
|
end
|
@@ -394,10 +410,22 @@ module Lafcadio
|
|
394
410
|
|
395
411
|
def self.method_missing( methodId, *args ) #:nodoc:
|
396
412
|
method_name = methodId.id2name
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
413
|
+
if method_name == 'get'
|
414
|
+
if block_given?
|
415
|
+
query = Query.infer( self ) { |dobj| yield( dobj ) }
|
416
|
+
ObjectStore.get_object_store.get_subset( query )
|
417
|
+
else
|
418
|
+
ObjectStore.get_object_store.get( self, *args )
|
419
|
+
end
|
420
|
+
else
|
421
|
+
maybe_field_class_name = method_name.underscore_to_camel_case + 'Field'
|
422
|
+
begin
|
423
|
+
field_class = Lafcadio.const_get( maybe_field_class_name )
|
424
|
+
create_field( field_class, *args )
|
425
|
+
rescue NameError
|
426
|
+
super
|
427
|
+
end
|
428
|
+
end
|
401
429
|
end
|
402
430
|
|
403
431
|
def self.domain_class #:nodoc:
|
@@ -412,10 +440,9 @@ module Lafcadio
|
|
412
440
|
require "#{ domainDir }#{ fileName }"
|
413
441
|
end
|
414
442
|
}
|
415
|
-
if (
|
416
|
-
|
417
|
-
|
418
|
-
}
|
443
|
+
if (domainFiles = LafcadioConfig.new['domainFiles'])
|
444
|
+
domainFiles = domainFiles.split( ',' ) if domainFiles.is_a? String
|
445
|
+
domainFiles.each { |domainFile| require domainFile }
|
419
446
|
end
|
420
447
|
end
|
421
448
|
|
@@ -467,9 +494,7 @@ module Lafcadio
|
|
467
494
|
if (!xmlParser.nil? && table_name = xmlParser.table_name)
|
468
495
|
table_name
|
469
496
|
else
|
470
|
-
|
471
|
-
table_name[0] = table_name[0..0].downcase
|
472
|
-
English.plural table_name
|
497
|
+
English.plural( self.basename.camel_case_to_underscore )
|
473
498
|
end
|
474
499
|
end
|
475
500
|
end
|
@@ -507,6 +532,15 @@ module Lafcadio
|
|
507
532
|
# If you're creating mock objects for unit tests, you can explicitly set
|
508
533
|
# the +pk_id+ to represent objects that already exist in the database.
|
509
534
|
def initialize(fieldHash)
|
535
|
+
if fieldHash.respond_to? :keys
|
536
|
+
fieldHash.keys.each { |key|
|
537
|
+
begin
|
538
|
+
self.class.get_field( key )
|
539
|
+
rescue MissingError
|
540
|
+
raise ArgumentError, "Invalid field name #{ key }"
|
541
|
+
end
|
542
|
+
}
|
543
|
+
end
|
510
544
|
@fieldHash = fieldHash
|
511
545
|
@error_messages = []
|
512
546
|
@fields = {}
|
@@ -612,9 +646,11 @@ module Lafcadio
|
|
612
646
|
end
|
613
647
|
|
614
648
|
def verify
|
615
|
-
|
616
|
-
|
617
|
-
|
649
|
+
if ObjectStore.get_object_store.mock?
|
650
|
+
self.class.get_class_fields.each { |field|
|
651
|
+
field.verify( self.send( field.name ), self.pk_id )
|
652
|
+
}
|
653
|
+
end
|
618
654
|
end
|
619
655
|
end
|
620
656
|
|
data/lib/lafcadio/mock.rb
CHANGED
@@ -40,12 +40,14 @@ module Lafcadio
|
|
40
40
|
objects << dbObj
|
41
41
|
end
|
42
42
|
}
|
43
|
-
if (range = query.limit)
|
44
|
-
objects = objects[0..(range.last - range.first)]
|
45
|
-
end
|
46
43
|
if ( order_by = query.order_by )
|
47
44
|
objects = objects.sort_by { |dobj| dobj.send( order_by ) }
|
48
45
|
objects.reverse! if query.order_by_order == Query::DESC
|
46
|
+
else
|
47
|
+
objects = objects.sort_by { |dobj| dobj.pk_id }
|
48
|
+
end
|
49
|
+
if (range = query.limit)
|
50
|
+
objects = objects[0..(range.last - range.first)]
|
49
51
|
end
|
50
52
|
objects
|
51
53
|
end
|
@@ -94,5 +96,9 @@ module Lafcadio
|
|
94
96
|
def initialize # :nodoc:
|
95
97
|
super( MockDbBridge.new )
|
96
98
|
end
|
99
|
+
|
100
|
+
def mock? # :nodoc:
|
101
|
+
true
|
102
|
+
end
|
97
103
|
end
|
98
104
|
end
|
data/lib/lafcadio/mock.rb~
CHANGED
@@ -40,13 +40,13 @@ module Lafcadio
|
|
40
40
|
objects << dbObj
|
41
41
|
end
|
42
42
|
}
|
43
|
-
if (range = query.limit)
|
44
|
-
objects = objects[0..(range.last - range.first)]
|
45
|
-
end
|
46
43
|
if ( order_by = query.order_by )
|
47
44
|
objects = objects.sort_by { |dobj| dobj.send( order_by ) }
|
48
45
|
objects.reverse! if query.order_by_order == Query::DESC
|
49
46
|
end
|
47
|
+
if (range = query.limit)
|
48
|
+
objects = objects[0..(range.last - range.first)]
|
49
|
+
end
|
50
50
|
objects
|
51
51
|
end
|
52
52
|
|
@@ -94,5 +94,9 @@ module Lafcadio
|
|
94
94
|
def initialize # :nodoc:
|
95
95
|
super( MockDbBridge.new )
|
96
96
|
end
|
97
|
+
|
98
|
+
def mock? # :nodoc:
|
99
|
+
true
|
100
|
+
end
|
97
101
|
end
|
98
102
|
end
|
data/lib/lafcadio/objectField.rb
CHANGED
@@ -390,9 +390,16 @@ module Lafcadio
|
|
390
390
|
|
391
391
|
# A LinkField is used to link from one domain class to another.
|
392
392
|
class LinkField < ObjectField
|
393
|
+
def self.auto_name( linked_type )
|
394
|
+
linked_type.name =~ /::/
|
395
|
+
( $' || linked_type.name ).camel_case_to_underscore
|
396
|
+
end
|
397
|
+
|
393
398
|
def self.instantiate_with_parameters( domain_class, parameters ) #:nodoc:
|
399
|
+
linked_type = parameters['linked_type']
|
394
400
|
instance = self.new(
|
395
|
-
domain_class,
|
401
|
+
domain_class, linked_type,
|
402
|
+
parameters['name'] || auto_name( linked_type ),
|
396
403
|
parameters['delete_cascade']
|
397
404
|
)
|
398
405
|
if parameters['db_field_name']
|
@@ -421,11 +428,7 @@ module Lafcadio
|
|
421
428
|
# as well.
|
422
429
|
def initialize( domain_class, linked_type, name = nil,
|
423
430
|
delete_cascade = false )
|
424
|
-
unless name
|
425
|
-
linked_type.name =~ /::/
|
426
|
-
name = $' || linked_type.name
|
427
|
-
name = name.camel_case_to_underscore
|
428
|
-
end
|
431
|
+
name = self.class.auto_name( linked_type ) unless name
|
429
432
|
super( domain_class, name )
|
430
433
|
( @linked_type, @delete_cascade ) = linked_type, delete_cascade
|
431
434
|
end
|
@@ -424,7 +424,7 @@ module Lafcadio
|
|
424
424
|
unless name
|
425
425
|
linked_type.name =~ /::/
|
426
426
|
name = $' || linked_type.name
|
427
|
-
name = name.
|
427
|
+
name = name.camel_case_to_underscore
|
428
428
|
end
|
429
429
|
super( domain_class, name )
|
430
430
|
( @linked_type, @delete_cascade ) = linked_type, delete_cascade
|
data/lib/lafcadio/objectStore.rb
CHANGED
@@ -450,7 +450,9 @@ module Lafcadio
|
|
450
450
|
domain_class = DomainObject.get_domain_class_from_string(
|
451
451
|
domain_class_name
|
452
452
|
)
|
453
|
-
|
453
|
+
unless fieldName
|
454
|
+
fieldName = domain_class.get_link_field( searchTerm.domain_class ).name
|
455
|
+
end
|
454
456
|
get_subset( Query::Equals.new( fieldName, searchTerm, domain_class ) )
|
455
457
|
end
|
456
458
|
|
@@ -522,6 +524,10 @@ module Lafcadio
|
|
522
524
|
dispatch = MethodDispatch.new( methodId, proc, *args )
|
523
525
|
self.send( dispatch.symbol, *dispatch.args )
|
524
526
|
end
|
527
|
+
|
528
|
+
def mock? #:nodoc:
|
529
|
+
false
|
530
|
+
end
|
525
531
|
|
526
532
|
def respond_to?( symbol, include_private = false )
|
527
533
|
begin
|
@@ -443,7 +443,7 @@ module Lafcadio
|
|
443
443
|
def get_db_bridge; @dbBridge; end
|
444
444
|
|
445
445
|
def get_field_name( domain_object )
|
446
|
-
domain_object.domain_class.basename.
|
446
|
+
domain_object.domain_class.basename.camel_case_to_underscore
|
447
447
|
end
|
448
448
|
|
449
449
|
def get_filtered(domain_class_name, searchTerm, fieldName = nil) #:nodoc:
|
@@ -522,6 +522,10 @@ module Lafcadio
|
|
522
522
|
dispatch = MethodDispatch.new( methodId, proc, *args )
|
523
523
|
self.send( dispatch.symbol, *dispatch.args )
|
524
524
|
end
|
525
|
+
|
526
|
+
def mock? #:nodoc:
|
527
|
+
false
|
528
|
+
end
|
525
529
|
|
526
530
|
def respond_to?( symbol, include_private = false )
|
527
531
|
begin
|
data/lib/lafcadio/query.rb
CHANGED
@@ -298,17 +298,19 @@ module Lafcadio
|
|
298
298
|
AND = 1
|
299
299
|
OR = 2
|
300
300
|
|
301
|
-
def initialize(*
|
302
|
-
if( [ AND, OR ].index(
|
303
|
-
@compound_type =
|
304
|
-
|
301
|
+
def initialize( *args )
|
302
|
+
if( [ AND, OR ].index( args.last) )
|
303
|
+
@compound_type = args.last
|
304
|
+
args.pop
|
305
305
|
else
|
306
306
|
@compound_type = AND
|
307
307
|
end
|
308
|
-
@conditions =
|
309
|
-
|
308
|
+
@conditions = args.map { |arg|
|
309
|
+
arg.respond_to?( :to_condition ) ? arg.to_condition : arg
|
310
|
+
}
|
311
|
+
@domain_class = @conditions[0].domain_class
|
310
312
|
end
|
311
|
-
|
313
|
+
|
312
314
|
def implied_by?( other_condition )
|
313
315
|
@compound_type == OR && @conditions.any? { |cond|
|
314
316
|
cond.implies?( other_condition )
|
data/lib/lafcadio/query.rb~
CHANGED
@@ -147,7 +147,8 @@ module Lafcadio
|
|
147
147
|
|
148
148
|
def order_clause
|
149
149
|
if @order_by
|
150
|
-
|
150
|
+
order_by_field = @domain_class.get_field( @order_by )
|
151
|
+
clause = "order by #{ order_by_field.db_field_name } "
|
151
152
|
clause += @order_by_order == ASC ? 'asc' : 'desc'
|
152
153
|
clause
|
153
154
|
end
|
@@ -234,21 +235,7 @@ module Lafcadio
|
|
234
235
|
other_cond.is_a?( Condition ) and other_cond.to_sql == to_sql
|
235
236
|
end
|
236
237
|
|
237
|
-
def get_field
|
238
|
-
a_domain_class = @domain_class
|
239
|
-
field = nil
|
240
|
-
while ( a_domain_class < DomainObject ) && !field
|
241
|
-
field = a_domain_class.get_class_field( @fieldName )
|
242
|
-
a_domain_class = a_domain_class.superclass
|
243
|
-
end
|
244
|
-
if field
|
245
|
-
field
|
246
|
-
else
|
247
|
-
errStr = "Couldn't find field \"#{ @fieldName }\" in " +
|
248
|
-
"#{ @domain_class } domain class"
|
249
|
-
raise( MissingError, errStr, caller )
|
250
|
-
end
|
251
|
-
end
|
238
|
+
def get_field; @domain_class.get_field( @fieldName ); end
|
252
239
|
|
253
240
|
def query; Query.new( @domain_class, self ); end
|
254
241
|
|
data/lib/lafcadio/test.rb
CHANGED
@@ -13,7 +13,12 @@ class LafcadioTestCase < Test::Unit::TestCase
|
|
13
13
|
context.flush
|
14
14
|
@mockObjectStore = MockObjectStore.new
|
15
15
|
ObjectStore.set_object_store @mockObjectStore
|
16
|
-
LafcadioConfig.
|
16
|
+
LafcadioConfig.set_values(
|
17
|
+
'classDefinitionDir' => '../test/testData', 'dbhost' => 'localhost',
|
18
|
+
'dbname' => 'test', 'dbpassword' => 'password', 'dbuser' => 'test',
|
19
|
+
'domainFiles' => %w( ../test/mock/domain ),
|
20
|
+
'logdir' => '../test/testOutput/', 'logSql' => 'n'
|
21
|
+
)
|
17
22
|
end
|
18
23
|
|
19
24
|
def default_test; end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'lafcadio/depend'
|
2
|
+
require 'lafcadio/mock'
|
3
|
+
require 'lafcadio/util'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
# A test case that sets up a number of mock services. In writing an application
|
7
|
+
# that uses Lafcadio you may find it convenient to inherit from this class.
|
8
|
+
class LafcadioTestCase < Test::Unit::TestCase
|
9
|
+
include Lafcadio
|
10
|
+
|
11
|
+
def setup
|
12
|
+
context = Context.instance
|
13
|
+
context.flush
|
14
|
+
@mockObjectStore = MockObjectStore.new
|
15
|
+
ObjectStore.set_object_store @mockObjectStore
|
16
|
+
LafcadioConfig.set_filename 'lafcadio/test/testConfig.dat'
|
17
|
+
end
|
18
|
+
|
19
|
+
def default_test; end
|
20
|
+
end
|
data/lib/lafcadio/util.rb
CHANGED
@@ -22,28 +22,28 @@ module Lafcadio
|
|
22
22
|
include Singleton
|
23
23
|
|
24
24
|
def initialize
|
25
|
-
|
25
|
+
flush
|
26
26
|
@init_procs = {}
|
27
27
|
end
|
28
28
|
|
29
|
-
def create_instance( service_class ) #:nodoc:
|
29
|
+
def create_instance( service_class, *init_args ) #:nodoc:
|
30
30
|
if ( proc = @init_procs[service_class] )
|
31
|
-
proc.call
|
31
|
+
proc.call( *init_args )
|
32
32
|
else
|
33
|
-
service_class.new
|
33
|
+
service_class.new( *init_args )
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
# Flushes all cached ContextualServices.
|
38
38
|
def flush
|
39
|
-
@
|
39
|
+
@resources_by_class = Hash.new { |hash, key| hash[key] = {} }
|
40
40
|
end
|
41
41
|
|
42
|
-
def get_resource( service_class ) #:nodoc:
|
43
|
-
resource = @
|
42
|
+
def get_resource( service_class, *init_args ) #:nodoc:
|
43
|
+
resource = @resources_by_class[service_class][init_args]
|
44
44
|
unless resource
|
45
|
-
resource = create_instance( service_class )
|
46
|
-
set_resource service_class, resource
|
45
|
+
resource = create_instance( service_class, *init_args )
|
46
|
+
set_resource( service_class, resource, *init_args )
|
47
47
|
end
|
48
48
|
resource
|
49
49
|
end
|
@@ -52,8 +52,8 @@ module Lafcadio
|
|
52
52
|
@init_procs[service_class] = proc
|
53
53
|
end
|
54
54
|
|
55
|
-
def set_resource(service_class, resource) #:nodoc:
|
56
|
-
@
|
55
|
+
def set_resource( service_class, resource, *init_args ) #:nodoc:
|
56
|
+
@resources_by_class[service_class][init_args] = resource
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -65,15 +65,17 @@ module Lafcadio
|
|
65
65
|
# For example: ObjectStore.getObjectStore
|
66
66
|
class ContextualService
|
67
67
|
def self.flush; Context.instance.set_resource( self, nil ); end
|
68
|
-
|
69
|
-
def self.method_missing(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
68
|
+
|
69
|
+
def self.method_missing( symbol, *args )
|
70
|
+
method_name = symbol.id2name
|
71
|
+
target = nil
|
72
|
+
if method_name =~ /^get_(.*)/
|
73
|
+
target = :get_resource if $1.underscore_to_camel_case == basename
|
74
|
+
elsif method_name =~ /^set_(.*)/
|
75
|
+
target = :set_resource if $1.underscore_to_camel_case == basename
|
76
|
+
end
|
77
|
+
if target
|
78
|
+
Context.instance.send( target, self, *args )
|
77
79
|
else
|
78
80
|
super
|
79
81
|
end
|
data/lib/lafcadio/util.rb~
CHANGED
@@ -65,15 +65,17 @@ module Lafcadio
|
|
65
65
|
# For example: ObjectStore.getObjectStore
|
66
66
|
class ContextualService
|
67
67
|
def self.flush; Context.instance.set_resource( self, nil ); end
|
68
|
-
|
69
|
-
def self.method_missing(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
68
|
+
|
69
|
+
def self.method_missing( symbol, *args )
|
70
|
+
method_name = symbol.id2name
|
71
|
+
target = nil
|
72
|
+
if method_name =~ /^get_(.*)/
|
73
|
+
target = :get_resource if $1.underscore_to_camel_case == basename
|
74
|
+
elsif method_name =~ /^set_(.*)/
|
75
|
+
target = :set_resource if $1.underscore_to_camel_case == basename
|
76
|
+
end
|
77
|
+
if target
|
78
|
+
Context.instance.send( target, self, *args )
|
77
79
|
else
|
78
80
|
super
|
79
81
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: lafcadio
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.7.2
|
7
|
+
date: 2005-02-26
|
8
8
|
summary: Lafcadio is an object-relational mapping layer
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/lafcadio.rb
|
35
35
|
- lib/lafcadio.rb~
|
36
36
|
- lib/lafcadio/dateTime.rb
|
37
|
+
- lib/lafcadio/dateTime.rb~
|
37
38
|
- lib/lafcadio/depend.rb
|
38
39
|
- lib/lafcadio/domain.rb
|
39
40
|
- lib/lafcadio/domain.rb~
|
@@ -49,6 +50,7 @@ files:
|
|
49
50
|
- lib/lafcadio/schema.rb
|
50
51
|
- lib/lafcadio/test
|
51
52
|
- lib/lafcadio/test.rb
|
53
|
+
- lib/lafcadio/test.rb~
|
52
54
|
- lib/lafcadio/util.rb
|
53
55
|
- lib/lafcadio/util.rb~
|
54
56
|
- lib/lafcadio/test/testconfig.dat
|