lafcadio 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/lafcadio.rb +32 -0
- data/lib/lafcadio.rb~ +32 -0
- data/lib/lafcadio/TestSuite.rb +16 -0
- data/lib/lafcadio/dateTime.rb +2 -0
- data/lib/lafcadio/dateTime/Month.rb +93 -0
- data/lib/lafcadio/domain.rb +119 -0
- data/lib/lafcadio/domain.rb~ +119 -0
- data/lib/lafcadio/domain/DomainObject.rb +375 -0
- data/lib/lafcadio/domain/DomainObject.rb~ +371 -0
- data/lib/lafcadio/domain/MapObject.rb +22 -0
- data/lib/lafcadio/domain/ObjectType.rb +80 -0
- data/lib/lafcadio/includer.rb +18 -0
- data/lib/lafcadio/mock.rb +2 -0
- data/lib/lafcadio/mock/MockDbBridge.rb +78 -0
- data/lib/lafcadio/mock/MockDbBridge.rb~ +74 -0
- data/lib/lafcadio/mock/MockObjectStore.rb +20 -0
- data/lib/lafcadio/objectField.rb +14 -0
- data/lib/lafcadio/objectField/AutoIncrementField.rb +25 -0
- data/lib/lafcadio/objectField/BooleanField.rb +83 -0
- data/lib/lafcadio/objectField/DateField.rb +33 -0
- data/lib/lafcadio/objectField/DateTimeField.rb +25 -0
- data/lib/lafcadio/objectField/DecimalField.rb +41 -0
- data/lib/lafcadio/objectField/EmailField.rb +28 -0
- data/lib/lafcadio/objectField/EnumField.rb +62 -0
- data/lib/lafcadio/objectField/FieldValueError.rb +4 -0
- data/lib/lafcadio/objectField/IntegerField.rb +15 -0
- data/lib/lafcadio/objectField/LinkField.rb +92 -0
- data/lib/lafcadio/objectField/LinkField.rb~ +86 -0
- data/lib/lafcadio/objectField/MoneyField.rb +13 -0
- data/lib/lafcadio/objectField/MonthField.rb +16 -0
- data/lib/lafcadio/objectField/ObjectField.rb +142 -0
- data/lib/lafcadio/objectField/PasswordField.rb +29 -0
- data/lib/lafcadio/objectField/StateField.rb +13 -0
- data/lib/lafcadio/objectField/SubsetLinkField.rb +25 -0
- data/lib/lafcadio/objectField/TextField.rb +23 -0
- data/lib/lafcadio/objectField/TextListField.rb +21 -0
- data/lib/lafcadio/objectField/TimeStampField.rb +15 -0
- data/lib/lafcadio/objectStore.rb +100 -0
- data/lib/lafcadio/objectStore/Cache.rb +81 -0
- data/lib/lafcadio/objectStore/Committer.rb +65 -0
- data/lib/lafcadio/objectStore/CouldntMatchObjectTypeError.rb +4 -0
- data/lib/lafcadio/objectStore/DbBridge.rb +140 -0
- data/lib/lafcadio/objectStore/DbBridge.rb~ +140 -0
- data/lib/lafcadio/objectStore/DomainComparable.rb +25 -0
- data/lib/lafcadio/objectStore/DomainObjectInitError.rb +9 -0
- data/lib/lafcadio/objectStore/DomainObjectNotFoundError.rb +4 -0
- data/lib/lafcadio/objectStore/DomainObjectProxy.rb +62 -0
- data/lib/lafcadio/objectStore/DomainObjectSqlMaker.rb +74 -0
- data/lib/lafcadio/objectStore/ObjectStore.rb +207 -0
- data/lib/lafcadio/objectStore/ObjectStore.rb~ +207 -0
- data/lib/lafcadio/objectStore/SqlValueConverter.rb +30 -0
- data/lib/lafcadio/objectStore/SqlValueConverter.rb~ +30 -0
- data/lib/lafcadio/query.rb +203 -0
- data/lib/lafcadio/query/Compare.rb +55 -0
- data/lib/lafcadio/query/CompoundCondition.rb +39 -0
- data/lib/lafcadio/query/Condition.rb +66 -0
- data/lib/lafcadio/query/Condition.rb~ +66 -0
- data/lib/lafcadio/query/Equals.rb +45 -0
- data/lib/lafcadio/query/In.rb +20 -0
- data/lib/lafcadio/query/Like.rb +48 -0
- data/lib/lafcadio/query/Link.rb +20 -0
- data/lib/lafcadio/query/Max.rb +32 -0
- data/lib/lafcadio/query/Max.rb~ +25 -0
- data/lib/lafcadio/query/Not.rb +21 -0
- data/lib/lafcadio/query/Query.rb +92 -0
- data/lib/lafcadio/schema.rb +2 -0
- data/lib/lafcadio/schema/CreateTableStatement.rb +61 -0
- data/lib/lafcadio/schema/CreateTableStatement.rb~ +59 -0
- data/lib/lafcadio/test.rb +2 -0
- data/lib/lafcadio/test/LafcadioTestCase.rb +17 -0
- data/lib/lafcadio/test/testconfig.dat +13 -0
- data/lib/lafcadio/util.rb +180 -0
- data/lib/lafcadio/util/Context.rb +61 -0
- data/lib/lafcadio/util/ContextualService.rb +33 -0
- data/lib/lafcadio/util/English.rb +117 -0
- data/lib/lafcadio/util/HashOfArrays.rb +48 -0
- data/lib/lafcadio/util/LafcadioConfig.rb +25 -0
- data/lib/lafcadio/util/QueueHash.rb +67 -0
- data/lib/lafcadio/util/UsStates.rb +29 -0
- data/lib/lafcadio/xml.rb +2 -0
- metadata +135 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
class Includer # :nodoc:
|
2
|
+
def Includer.include( subdir )
|
3
|
+
dir = nil
|
4
|
+
$:.each { |includeDir|
|
5
|
+
attemptedDir = includeDir + '/lafcadio/' + subdir
|
6
|
+
begin
|
7
|
+
dir = Dir.open( attemptedDir )
|
8
|
+
rescue Errno::ENOENT
|
9
|
+
# wrong include directory, try again
|
10
|
+
end
|
11
|
+
}
|
12
|
+
if dir
|
13
|
+
dir.entries.each { |entry|
|
14
|
+
require "lafcadio/#{ subdir }/#{ $1 }" if entry =~ /(.*)\.rb/
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Lafcadio
|
2
|
+
class MockDbBridge #:nodoc:
|
3
|
+
attr_reader :lastPkIdInserted, :retrievalsByType, :query_count
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@objects = {}
|
7
|
+
@retrievalsByType = Hash.new 0
|
8
|
+
@query_count = Hash.new( 0 )
|
9
|
+
end
|
10
|
+
|
11
|
+
def addObject(dbObject)
|
12
|
+
commit dbObject
|
13
|
+
end
|
14
|
+
|
15
|
+
def commit(dbObject)
|
16
|
+
objectsByObjectType = @objects[dbObject.objectType]
|
17
|
+
unless objectsByObjectType
|
18
|
+
objectsByObjectType = {}
|
19
|
+
@objects[dbObject.objectType] = objectsByObjectType
|
20
|
+
end
|
21
|
+
if dbObject.delete
|
22
|
+
objectsByObjectType.delete dbObject.pkId
|
23
|
+
else
|
24
|
+
object_pkId = dbObject.pkId
|
25
|
+
unless object_pkId
|
26
|
+
maxpkId = 0
|
27
|
+
objectsByObjectType.keys.each { |pkId|
|
28
|
+
maxpkId = pkId if pkId > maxpkId
|
29
|
+
}
|
30
|
+
@lastPkIdInserted = maxpkId + 1
|
31
|
+
object_pkId = @lastPkIdInserted
|
32
|
+
end
|
33
|
+
objectsByObjectType[object_pkId] = dbObject
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def collection(objectType, objects); objects; end
|
38
|
+
|
39
|
+
def _getAll(objectType)
|
40
|
+
@retrievalsByType[objectType] = @retrievalsByType[objectType] + 1
|
41
|
+
@objects[objectType] ? @objects[objectType].values : []
|
42
|
+
end
|
43
|
+
|
44
|
+
def getCollectionByQuery(query)
|
45
|
+
@query_count[query] += 1
|
46
|
+
objectType = query.objectType
|
47
|
+
condition = query.condition
|
48
|
+
objects = []
|
49
|
+
_getAll( objectType ).each { |dbObj|
|
50
|
+
if condition
|
51
|
+
objects << dbObj if condition.objectMeets(dbObj)
|
52
|
+
else
|
53
|
+
objects << dbObj
|
54
|
+
end
|
55
|
+
}
|
56
|
+
coll = collection( objectType, objects )
|
57
|
+
if (range = query.limit)
|
58
|
+
coll = coll[0..(range.last - range.first)]
|
59
|
+
end
|
60
|
+
if ( order_by = query.orderBy )
|
61
|
+
coll = coll.sort_by { |dobj| dobj.send( order_by ) }
|
62
|
+
coll.reverse! if query.orderByOrder == Query::DESC
|
63
|
+
end
|
64
|
+
coll
|
65
|
+
end
|
66
|
+
|
67
|
+
def group_query( query )
|
68
|
+
if query.class == Query::Max
|
69
|
+
if ( query.field_name == query.objectType.sqlPrimaryKeyName ||
|
70
|
+
query.field_name == 'rate' )
|
71
|
+
query.collect( @objects[query.objectType].values )
|
72
|
+
else
|
73
|
+
raise "Can't handle query with sql '#{ query.toSql }'"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Lafcadio
|
2
|
+
class MockDbBridge #:nodoc:
|
3
|
+
attr_reader :lastPkIdInserted, :retrievalsByType, :query_count
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@objects = {}
|
7
|
+
@retrievalsByType = Hash.new 0
|
8
|
+
@query_count = Hash.new( 0 )
|
9
|
+
end
|
10
|
+
|
11
|
+
def addObject(dbObject)
|
12
|
+
commit dbObject
|
13
|
+
end
|
14
|
+
|
15
|
+
def commit(dbObject)
|
16
|
+
objectsByObjectType = @objects[dbObject.objectType]
|
17
|
+
unless objectsByObjectType
|
18
|
+
objectsByObjectType = {}
|
19
|
+
@objects[dbObject.objectType] = objectsByObjectType
|
20
|
+
end
|
21
|
+
if dbObject.delete
|
22
|
+
objectsByObjectType.delete dbObject.pkId
|
23
|
+
else
|
24
|
+
object_pkId = dbObject.pkId
|
25
|
+
unless object_pkId
|
26
|
+
maxpkId = 0
|
27
|
+
objectsByObjectType.keys.each { |pkId|
|
28
|
+
maxpkId = pkId if pkId > maxpkId
|
29
|
+
}
|
30
|
+
@lastPkIdInserted = maxpkId + 1
|
31
|
+
object_pkId = @lastPkIdInserted
|
32
|
+
end
|
33
|
+
objectsByObjectType[object_pkId] = dbObject
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def collection(objectType, objects); objects; end
|
38
|
+
|
39
|
+
def _getAll(objectType)
|
40
|
+
@retrievalsByType[objectType] = @retrievalsByType[objectType] + 1
|
41
|
+
@objects[objectType] ? @objects[objectType].values : []
|
42
|
+
end
|
43
|
+
|
44
|
+
def getCollectionByQuery(query)
|
45
|
+
@query_count[query] += 1
|
46
|
+
objectType = query.objectType
|
47
|
+
condition = query.condition
|
48
|
+
objects = []
|
49
|
+
_getAll( objectType ).each { |dbObj|
|
50
|
+
if condition
|
51
|
+
objects << dbObj if condition.objectMeets(dbObj)
|
52
|
+
else
|
53
|
+
objects << dbObj
|
54
|
+
end
|
55
|
+
}
|
56
|
+
coll = collection( objectType, objects )
|
57
|
+
if (range = query.limit)
|
58
|
+
coll = coll[0..(range.last - range.first)]
|
59
|
+
end
|
60
|
+
coll
|
61
|
+
end
|
62
|
+
|
63
|
+
def group_query( query )
|
64
|
+
if query.class == Query::Max
|
65
|
+
if ( query.field_name == query.objectType.sqlPrimaryKeyName ||
|
66
|
+
query.field_name == 'rate' )
|
67
|
+
query.collect( @objects[query.objectType].values )
|
68
|
+
else
|
69
|
+
raise "Can't handle query with sql '#{ query.toSql }'"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'lafcadio/objectStore/ObjectStore'
|
2
|
+
require 'lafcadio/mock/MockDbBridge'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# Externally, the MockObjectStore looks and acts exactly like the ObjectStore,
|
6
|
+
# but stores all its data in memory. This makes it very useful for unit
|
7
|
+
# testing, and in fact LafcadioTestCase#setup creates a new instance of
|
8
|
+
# MockObjectStore for each test case.
|
9
|
+
class MockObjectStore < ObjectStore
|
10
|
+
public_class_method :new
|
11
|
+
|
12
|
+
def initialize(context) # :nodoc:
|
13
|
+
super(context, MockDbBridge.new)
|
14
|
+
end
|
15
|
+
|
16
|
+
def addObject(dbObject) # :nodoc:
|
17
|
+
commit dbObject
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'lafcadio/includer'
|
2
|
+
Includer.include( 'objectField' )
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# BlobField stores a string value and expects to store its value in a BLOB
|
6
|
+
# field in the database.
|
7
|
+
class BlobField < ObjectField
|
8
|
+
attr_accessor :size
|
9
|
+
|
10
|
+
def bind_write?; true; end #:nodoc:
|
11
|
+
|
12
|
+
def valueForSQL(value); "?"; end #:nodoc:
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'lafcadio/objectField/IntegerField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
class AutoIncrementField < IntegerField # :nodoc:
|
5
|
+
attr_reader :objectType
|
6
|
+
|
7
|
+
def initialize(objectType, name, englishName = nil)
|
8
|
+
super(objectType, name, englishName)
|
9
|
+
@objectType = objectType
|
10
|
+
end
|
11
|
+
|
12
|
+
def HTMLWidgetValueStr(value)
|
13
|
+
if value != nil
|
14
|
+
super value
|
15
|
+
else
|
16
|
+
highestValue = 0
|
17
|
+
ObjectStore.getObjectStore.getAll(objectType).each { |obj|
|
18
|
+
aValue = obj.send(name).to_i
|
19
|
+
highestValue = aValue if aValue > highestValue
|
20
|
+
}
|
21
|
+
(highestValue + 1).to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'lafcadio/objectField/ObjectField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
# BooleanField represents a boolean value. By default, it assumes that the
|
5
|
+
# table field represents True and False with the integers 1 and 0. There are
|
6
|
+
# two different ways to change this default.
|
7
|
+
#
|
8
|
+
# First, BooleanField includes a few enumerated defaults. Currently there are
|
9
|
+
# only
|
10
|
+
# * BooleanField::ENUMS_ONE_ZERO (the default, uses integers 1 and 0)
|
11
|
+
# * BooleanField::ENUMS_CAPITAL_YES_NO (uses characters 'Y' and 'N')
|
12
|
+
# In the XML class definition, this field would look like
|
13
|
+
# <field name="field_name" class="BooleanField"
|
14
|
+
# enumType="ENUMS_CAPITAL_YES_NO"/>
|
15
|
+
# If you're defining a field in Ruby, simply set BooleanField#enumType to one
|
16
|
+
# of the values.
|
17
|
+
#
|
18
|
+
# For more fine-grained specification you can pass specific values in. Use
|
19
|
+
# this format for the XML class definition:
|
20
|
+
# <field name="field_name" class="BooleanField">
|
21
|
+
# <enums>
|
22
|
+
# <enum key="true">yin</enum>
|
23
|
+
# <enum key="false">tang</enum>
|
24
|
+
# </enums>
|
25
|
+
# </field>
|
26
|
+
# If you're defining the field in Ruby, set BooleanField#enums to a hash.
|
27
|
+
# myBooleanField.enums = { true => 'yin', false => 'yang' }
|
28
|
+
#
|
29
|
+
# +enums+ takes precedence over +enumType+.
|
30
|
+
class BooleanField < ObjectField
|
31
|
+
ENUMS_ONE_ZERO = 0
|
32
|
+
ENUMS_CAPITAL_YES_NO = 1
|
33
|
+
|
34
|
+
attr_accessor :enumType, :enums
|
35
|
+
|
36
|
+
def initialize(objectType, name, englishName = nil)
|
37
|
+
super(objectType, name, englishName)
|
38
|
+
@enumType = ENUMS_ONE_ZERO
|
39
|
+
@enums = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def getEnums( value = nil ) # :nodoc:
|
43
|
+
if @enums
|
44
|
+
@enums
|
45
|
+
elsif @enumType == ENUMS_ONE_ZERO
|
46
|
+
if value.class == String
|
47
|
+
{ true => '1', false => '0' }
|
48
|
+
else
|
49
|
+
{ true => 1, false => 0 }
|
50
|
+
end
|
51
|
+
elsif @enumType == ENUMS_CAPITAL_YES_NO
|
52
|
+
{ true => 'Y', false => 'N' }
|
53
|
+
else
|
54
|
+
raise MissingError
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def trueEnum( value = nil ) # :nodoc:
|
59
|
+
getEnums( value )[true]
|
60
|
+
end
|
61
|
+
|
62
|
+
def falseEnum # :nodoc:
|
63
|
+
getEnums[false]
|
64
|
+
end
|
65
|
+
|
66
|
+
def textEnumType # :nodoc:
|
67
|
+
@enums ? @enums[true].class == String : @enumType == ENUMS_CAPITAL_YES_NO
|
68
|
+
end
|
69
|
+
|
70
|
+
def valueForSQL(value) # :nodoc:
|
71
|
+
if value
|
72
|
+
vfs = trueEnum
|
73
|
+
else
|
74
|
+
vfs = falseEnum
|
75
|
+
end
|
76
|
+
textEnumType ? "'#{vfs}'" : vfs
|
77
|
+
end
|
78
|
+
|
79
|
+
def valueFromSQL(value, lookupLink = true) # :nodoc:
|
80
|
+
value == trueEnum( value )
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'lafcadio/objectField/ObjectField'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# DateField represents a Date.
|
6
|
+
class DateField < ObjectField
|
7
|
+
RANGE_NEAR_FUTURE = 0
|
8
|
+
RANGE_PAST = 1
|
9
|
+
|
10
|
+
def DateField.valueType # :nodoc:
|
11
|
+
Date
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :range
|
15
|
+
|
16
|
+
def initialize(objectType, name = "date", englishName = nil)
|
17
|
+
super(objectType, name, englishName)
|
18
|
+
@range = RANGE_NEAR_FUTURE
|
19
|
+
end
|
20
|
+
|
21
|
+
def valueForSQL(value) # :nodoc:
|
22
|
+
value ? "'#{value.to_s}'" : 'null'
|
23
|
+
end
|
24
|
+
|
25
|
+
def valueFromSQL(dbiDate, lookupLink = true) # :nodoc:
|
26
|
+
begin
|
27
|
+
dbiDate ? dbiDate.to_date : nil
|
28
|
+
rescue ArgumentError
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'lafcadio/util'
|
2
|
+
require 'lafcadio/objectField/ObjectField'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# DateTimeField represents a DateTime.
|
6
|
+
class DateTimeField < ObjectField
|
7
|
+
def valueFromSQL(dbi_value, lookupLink = true) # :nodoc:
|
8
|
+
dbi_value ? dbi_value.to_time : nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def valueForSQL(value) # :nodoc:
|
12
|
+
if value
|
13
|
+
year = value.year
|
14
|
+
month = value.mon.to_s.pad( 2, "0" )
|
15
|
+
day = value.day.to_s.pad( 2, "0" )
|
16
|
+
hour = value.hour.to_s.pad( 2, "0" )
|
17
|
+
minute = value.min.to_s.pad( 2, "0" )
|
18
|
+
second = value.sec.to_s.pad( 2, "0" )
|
19
|
+
"'#{year}-#{month}-#{day} #{hour}:#{minute}:#{second}'"
|
20
|
+
else
|
21
|
+
"null"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'lafcadio/objectField/ObjectField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
# DecimalField represents a decimal value.
|
5
|
+
class DecimalField < ObjectField
|
6
|
+
attr_reader :precision
|
7
|
+
|
8
|
+
def DecimalField.valueType #:nodoc:
|
9
|
+
Numeric
|
10
|
+
end
|
11
|
+
|
12
|
+
def DecimalField.instantiationParameters( fieldElt ) #:nodoc:
|
13
|
+
parameters = super( fieldElt )
|
14
|
+
parameters['precision'] = fieldElt.attributes['precision'].to_i
|
15
|
+
parameters
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.instantiateWithParameters( domainClass, parameters ) #:nodoc:
|
19
|
+
self.new( domainClass, parameters['name'], parameters['precision'],
|
20
|
+
parameters['englishName'] )
|
21
|
+
end
|
22
|
+
|
23
|
+
# [objectType] The domain class that this field belongs to.
|
24
|
+
# [name] The name of this field.
|
25
|
+
# [precision] The expected field precision. (Deprecated)
|
26
|
+
# [englishName] The English name of this field. (Deprecated)
|
27
|
+
def initialize(objectType, name, precision, englishName = nil)
|
28
|
+
super(objectType, name, englishName)
|
29
|
+
@precision = precision
|
30
|
+
end
|
31
|
+
|
32
|
+
def valueFromSQL(string, lookupLink = true) #:nodoc:
|
33
|
+
string != nil ? string.to_f : nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def processBeforeVerify(value) #:nodoc:
|
37
|
+
value = super value
|
38
|
+
value != nil && value != '' ? value.to_f : nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'lafcadio/objectField/TextField'
|
2
|
+
require 'lafcadio/objectField/FieldValueError'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# EmailField takes a text value that is expected to be formatted as a single
|
6
|
+
# valid email address.
|
7
|
+
class EmailField < TextField
|
8
|
+
# Is +address+ a valid email address?
|
9
|
+
def EmailField.validAddress(address)
|
10
|
+
address =~ /^[^ @]+@[^ \.]+\.[^ ,]+$/
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(objectType, name = "email", englishName = nil)
|
14
|
+
super(objectType, name, englishName)
|
15
|
+
end
|
16
|
+
|
17
|
+
def nullErrorMsg #:nodoc:
|
18
|
+
"Please enter an email address."
|
19
|
+
end
|
20
|
+
|
21
|
+
def verify(value, pkId) #:nodoc:
|
22
|
+
super(value, pkId)
|
23
|
+
if !EmailField.validAddress(value)
|
24
|
+
raise FieldValueError, "Please enter a valid email address.", caller
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|