lafcadio 0.4.3
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.
- 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,62 @@ | |
| 1 | 
            +
            require 'lafcadio/objectField/TextField'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lafcadio
         | 
| 4 | 
            +
            	# EnumField represents an enumerated field that can only be set to one of a
         | 
| 5 | 
            +
            	# set range of string values. To set the enumeration in the class definition
         | 
| 6 | 
            +
            	# XML, use the following format:
         | 
| 7 | 
            +
            	#   <field name="flavor" class="EnumField">
         | 
| 8 | 
            +
            	#     <enums>
         | 
| 9 | 
            +
            	#       <enum>Vanilla</enum>
         | 
| 10 | 
            +
            	#       <enum>Chocolate</enum>
         | 
| 11 | 
            +
            	#       <enum>Lychee</enum>
         | 
| 12 | 
            +
            	#     </enums>
         | 
| 13 | 
            +
            	#   </field>
         | 
| 14 | 
            +
            	# If you're defining the field in Ruby, you can simply pass in an array of
         | 
| 15 | 
            +
            	# enums as the +enums+ argument.
         | 
| 16 | 
            +
            	#
         | 
| 17 | 
            +
            	class EnumField < TextField
         | 
| 18 | 
            +
            		def EnumField.instantiationParameters( fieldElt ) #:nodoc:
         | 
| 19 | 
            +
            			parameters = super( fieldElt )
         | 
| 20 | 
            +
            			if fieldElt.elements['enums'][1].attributes['key']
         | 
| 21 | 
            +
            				enumValues = []
         | 
| 22 | 
            +
            				fieldElt.elements.each( 'enums/enum' ) { |enumElt|
         | 
| 23 | 
            +
            					enumValues << enumElt.attributes['key']
         | 
| 24 | 
            +
            					enumValues << enumElt.text.to_s
         | 
| 25 | 
            +
            				}
         | 
| 26 | 
            +
            				parameters['enums'] = QueueHash.new( *enumValues )
         | 
| 27 | 
            +
            			else
         | 
| 28 | 
            +
            				parameters['enums'] = []
         | 
| 29 | 
            +
            				fieldElt.elements.each( 'enums/enum' ) { |enumElt|
         | 
| 30 | 
            +
            					parameters['enums'] << enumElt.text.to_s
         | 
| 31 | 
            +
            				}
         | 
| 32 | 
            +
            			end
         | 
| 33 | 
            +
            			parameters
         | 
| 34 | 
            +
            		end
         | 
| 35 | 
            +
            		
         | 
| 36 | 
            +
            		def EnumField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
         | 
| 37 | 
            +
            			self.new( domainClass, parameters['name'], parameters['enums'],
         | 
| 38 | 
            +
            								parameters['englishName'] )
         | 
| 39 | 
            +
            		end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            		attr_reader :enums
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            		# [objectType]  The domain class that this field belongs to.
         | 
| 44 | 
            +
            		# [name]        The name of this domain class.
         | 
| 45 | 
            +
            		# [enums]       An array of Strings representing the possible choices for
         | 
| 46 | 
            +
            		#               this field.
         | 
| 47 | 
            +
            		# [englishName] The English name of this field. (Deprecated)
         | 
| 48 | 
            +
            		def initialize(objectType, name, enums, englishName = nil)
         | 
| 49 | 
            +
            			require 'lafcadio/util/QueueHash'
         | 
| 50 | 
            +
            			super objectType, name, englishName
         | 
| 51 | 
            +
            			if enums.class == Array 
         | 
| 52 | 
            +
            				@enums = QueueHash.newFromArray enums
         | 
| 53 | 
            +
            			else
         | 
| 54 | 
            +
            				@enums = enums
         | 
| 55 | 
            +
            			end
         | 
| 56 | 
            +
            		end
         | 
| 57 | 
            +
            		
         | 
| 58 | 
            +
            		def valueForSQL(value) #:nodoc:
         | 
| 59 | 
            +
            			value != '' ?(super(value)) : 'null'
         | 
| 60 | 
            +
            		end
         | 
| 61 | 
            +
            	end
         | 
| 62 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'lafcadio/objectField/ObjectField'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lafcadio
         | 
| 4 | 
            +
            	# IntegerField represents an integer.
         | 
| 5 | 
            +
            	class IntegerField < ObjectField
         | 
| 6 | 
            +
            		def textBoxSize #:nodoc:
         | 
| 7 | 
            +
            			5
         | 
| 8 | 
            +
            		end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            		def valueFromSQL(string) #:nodoc:
         | 
| 11 | 
            +
            			value = super
         | 
| 12 | 
            +
            			value ? value.to_i : nil
         | 
| 13 | 
            +
            		end
         | 
| 14 | 
            +
            	end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,92 @@ | |
| 1 | 
            +
            require 'lafcadio/util'
         | 
| 2 | 
            +
            require 'lafcadio/objectField/ObjectField'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Lafcadio
         | 
| 5 | 
            +
            	# A LinkField is used to link from one domain class to another.
         | 
| 6 | 
            +
            	class LinkField < ObjectField
         | 
| 7 | 
            +
            		def LinkField.instantiationParameters( fieldElt ) #:nodoc:
         | 
| 8 | 
            +
            			parameters = super( fieldElt )
         | 
| 9 | 
            +
            			linkedTypeStr = fieldElt.attributes['linkedType']
         | 
| 10 | 
            +
            			linkedType = DomainObject.getObjectTypeFromString( linkedTypeStr )
         | 
| 11 | 
            +
            			parameters['linkedType'] = linkedType
         | 
| 12 | 
            +
            			parameters['deleteCascade'] = fieldElt.attributes['deleteCascade'] == 'y'
         | 
| 13 | 
            +
            			parameters
         | 
| 14 | 
            +
            		end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            		def LinkField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
         | 
| 17 | 
            +
            			instance = self.new(
         | 
| 18 | 
            +
            				domainClass, parameters['linkedType'], parameters['name'],
         | 
| 19 | 
            +
            				parameters['englishName'], parameters['deleteCascade']
         | 
| 20 | 
            +
            			)
         | 
| 21 | 
            +
            			if parameters['dbFieldName']
         | 
| 22 | 
            +
            				instance.dbFieldName = parameters['dbFieldName']
         | 
| 23 | 
            +
            			end
         | 
| 24 | 
            +
            			instance
         | 
| 25 | 
            +
            		end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            		attr_reader :linkedType
         | 
| 28 | 
            +
            		attr_accessor :listener, :objectStore, :newDuringEdit, :sortField,
         | 
| 29 | 
            +
            		              :deleteCascade
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            		# [objectType]    The domain class that this field belongs to.
         | 
| 32 | 
            +
            		# [linkedType]    The domain class that this field points to.
         | 
| 33 | 
            +
            		# [name]          The name of this field.
         | 
| 34 | 
            +
            		# [englishName]   The English name of this field. (Deprecated)
         | 
| 35 | 
            +
            		# [deleteCascade] If this is true, deleting the domain object that is linked
         | 
| 36 | 
            +
            		#                 to will cause this domain object to be deleted as well.
         | 
| 37 | 
            +
            		def initialize( objectType, linkedType, name = nil, englishName = nil,
         | 
| 38 | 
            +
            		                deleteCascade = false )
         | 
| 39 | 
            +
            			unless name
         | 
| 40 | 
            +
            				linkedType.name =~ /::/
         | 
| 41 | 
            +
            				name = $' || linkedType.name
         | 
| 42 | 
            +
            				name = name.decapitalize
         | 
| 43 | 
            +
            			end
         | 
| 44 | 
            +
            			super(objectType, name, englishName)
         | 
| 45 | 
            +
            			( @linkedType, @deleteCascade ) = linkedType, deleteCascade
         | 
| 46 | 
            +
            			@listener = nil
         | 
| 47 | 
            +
            			@newDuringEdit = true
         | 
| 48 | 
            +
            		end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            		def valueForSQL(value) #:nodoc:
         | 
| 51 | 
            +
            			require 'lafcadio/objectStore/DomainObjectInitError'
         | 
| 52 | 
            +
            			if !value
         | 
| 53 | 
            +
            				"null"
         | 
| 54 | 
            +
            			elsif value.pkId
         | 
| 55 | 
            +
            				value.pkId
         | 
| 56 | 
            +
            			else
         | 
| 57 | 
            +
            				raise( DomainObjectInitError, "Can't commit #{name} without pkId", 
         | 
| 58 | 
            +
            				       caller )
         | 
| 59 | 
            +
            			end
         | 
| 60 | 
            +
            		end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            		def valueFromSQL(string) #:nodoc:
         | 
| 63 | 
            +
            			require 'lafcadio/objectStore/DomainObjectProxy'
         | 
| 64 | 
            +
            			string != nil ? DomainObjectProxy.new(@linkedType, string.to_i) : nil
         | 
| 65 | 
            +
            		end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            		def verify(value, pkId) #:nodoc:
         | 
| 68 | 
            +
            			super
         | 
| 69 | 
            +
            			if @linkedType != @objectType && pkId
         | 
| 70 | 
            +
            				subsetLinkField = nil
         | 
| 71 | 
            +
            				@linkedType.classFields.each { |field|
         | 
| 72 | 
            +
            					if field.class == SubsetLinkField && field.subsetField == @name
         | 
| 73 | 
            +
            						subsetLinkField = field
         | 
| 74 | 
            +
            					end
         | 
| 75 | 
            +
            				}
         | 
| 76 | 
            +
            				if subsetLinkField
         | 
| 77 | 
            +
            					begin
         | 
| 78 | 
            +
            						prevObj = ObjectStore.getObjectStore.get(objectType, pkId)
         | 
| 79 | 
            +
            						prevObjLinkedTo = prevObj.send(name)
         | 
| 80 | 
            +
            						possiblyMyObj = prevObjLinkedTo.send(subsetLinkField.name)
         | 
| 81 | 
            +
            						if possiblyMyObj && possiblyMyObj.pkId == pkId
         | 
| 82 | 
            +
            							cantChangeMsg = "You can't change that."
         | 
| 83 | 
            +
            							raise FieldValueError, cantChangeMsg, caller
         | 
| 84 | 
            +
            						end
         | 
| 85 | 
            +
            					rescue DomainObjectNotFoundError
         | 
| 86 | 
            +
            						# no previous value, so nothing to check for
         | 
| 87 | 
            +
            					end
         | 
| 88 | 
            +
            				end
         | 
| 89 | 
            +
            			end
         | 
| 90 | 
            +
            		end
         | 
| 91 | 
            +
            	end
         | 
| 92 | 
            +
            end
         | 
| @@ -0,0 +1,86 @@ | |
| 1 | 
            +
            require 'lafcadio/util'
         | 
| 2 | 
            +
            require 'lafcadio/objectField/ObjectField'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Lafcadio
         | 
| 5 | 
            +
            	# A LinkField is used to link from one domain class to another.
         | 
| 6 | 
            +
            	class LinkField < ObjectField
         | 
| 7 | 
            +
            		def LinkField.instantiationParameters( fieldElt ) #:nodoc:
         | 
| 8 | 
            +
            			parameters = super( fieldElt )
         | 
| 9 | 
            +
            			linkedTypeStr = fieldElt.attributes['linkedType']
         | 
| 10 | 
            +
            			linkedType = DomainObject.getObjectTypeFromString( linkedTypeStr )
         | 
| 11 | 
            +
            			parameters['linkedType'] = linkedType
         | 
| 12 | 
            +
            			parameters['deleteCascade'] = fieldElt.attributes['deleteCascade'] == 'y'
         | 
| 13 | 
            +
            			parameters
         | 
| 14 | 
            +
            		end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            		def LinkField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
         | 
| 17 | 
            +
            			self.new( domainClass, parameters['linkedType'], parameters['name'],
         | 
| 18 | 
            +
            								parameters['englishName'], parameters['deleteCascade'] )
         | 
| 19 | 
            +
            		end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            		attr_reader :linkedType
         | 
| 22 | 
            +
            		attr_accessor :listener, :objectStore, :newDuringEdit, :sortField,
         | 
| 23 | 
            +
            		              :deleteCascade
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            		# [objectType]    The domain class that this field belongs to.
         | 
| 26 | 
            +
            		# [linkedType]    The domain class that this field points to.
         | 
| 27 | 
            +
            		# [name]          The name of this field.
         | 
| 28 | 
            +
            		# [englishName]   The English name of this field. (Deprecated)
         | 
| 29 | 
            +
            		# [deleteCascade] If this is true, deleting the domain object that is linked
         | 
| 30 | 
            +
            		#                 to will cause this domain object to be deleted as well.
         | 
| 31 | 
            +
            		def initialize( objectType, linkedType, name = nil, englishName = nil,
         | 
| 32 | 
            +
            		                deleteCascade = false )
         | 
| 33 | 
            +
            			unless name
         | 
| 34 | 
            +
            				linkedType.name =~ /::/
         | 
| 35 | 
            +
            				name = $' || linkedType.name
         | 
| 36 | 
            +
            				name = name.decapitalize
         | 
| 37 | 
            +
            			end
         | 
| 38 | 
            +
            			super(objectType, name, englishName)
         | 
| 39 | 
            +
            			( @linkedType, @deleteCascade ) = linkedType, deleteCascade
         | 
| 40 | 
            +
            			@listener = nil
         | 
| 41 | 
            +
            			@newDuringEdit = true
         | 
| 42 | 
            +
            		end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            		def valueForSQL(value) #:nodoc:
         | 
| 45 | 
            +
            			require 'lafcadio/objectStore/DomainObjectInitError'
         | 
| 46 | 
            +
            			if !value
         | 
| 47 | 
            +
            				"null"
         | 
| 48 | 
            +
            			elsif value.pkId
         | 
| 49 | 
            +
            				value.pkId
         | 
| 50 | 
            +
            			else
         | 
| 51 | 
            +
            				raise( DomainObjectInitError, "Can't commit #{name} without pkId", 
         | 
| 52 | 
            +
            				       caller )
         | 
| 53 | 
            +
            			end
         | 
| 54 | 
            +
            		end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            		def valueFromSQL(string) #:nodoc:
         | 
| 57 | 
            +
            			require 'lafcadio/objectStore/DomainObjectProxy'
         | 
| 58 | 
            +
            			string != nil ? DomainObjectProxy.new(@linkedType, string.to_i) : nil
         | 
| 59 | 
            +
            		end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            		def verify(value, pkId) #:nodoc:
         | 
| 62 | 
            +
            			super
         | 
| 63 | 
            +
            			if @linkedType != @objectType && pkId
         | 
| 64 | 
            +
            				subsetLinkField = nil
         | 
| 65 | 
            +
            				@linkedType.classFields.each { |field|
         | 
| 66 | 
            +
            					if field.class == SubsetLinkField && field.subsetField == @name
         | 
| 67 | 
            +
            						subsetLinkField = field
         | 
| 68 | 
            +
            					end
         | 
| 69 | 
            +
            				}
         | 
| 70 | 
            +
            				if subsetLinkField
         | 
| 71 | 
            +
            					begin
         | 
| 72 | 
            +
            						prevObj = ObjectStore.getObjectStore.get(objectType, pkId)
         | 
| 73 | 
            +
            						prevObjLinkedTo = prevObj.send(name)
         | 
| 74 | 
            +
            						possiblyMyObj = prevObjLinkedTo.send(subsetLinkField.name)
         | 
| 75 | 
            +
            						if possiblyMyObj && possiblyMyObj.pkId == pkId
         | 
| 76 | 
            +
            							cantChangeMsg = "You can't change that."
         | 
| 77 | 
            +
            							raise FieldValueError, cantChangeMsg, caller
         | 
| 78 | 
            +
            						end
         | 
| 79 | 
            +
            					rescue DomainObjectNotFoundError
         | 
| 80 | 
            +
            						# no previous value, so nothing to check for
         | 
| 81 | 
            +
            					end
         | 
| 82 | 
            +
            				end
         | 
| 83 | 
            +
            			end
         | 
| 84 | 
            +
            		end
         | 
| 85 | 
            +
            	end
         | 
| 86 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            require 'lafcadio/objectField/DecimalField'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lafcadio
         | 
| 4 | 
            +
            	class MoneyField < DecimalField #:nodoc:
         | 
| 5 | 
            +
            		def MoneyField.instantiateWithParameters( domainClass, parameters )
         | 
| 6 | 
            +
            			self.new( domainClass, parameters['name'], parameters['englishName'] )
         | 
| 7 | 
            +
            		end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            		def initialize(objectType, name, englishName = nil)
         | 
| 10 | 
            +
            			super(objectType, name, 2, englishName)
         | 
| 11 | 
            +
            		end
         | 
| 12 | 
            +
            	end
         | 
| 13 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'lafcadio/objectField/DateField'
         | 
| 2 | 
            +
            require 'lafcadio/dateTime/Month'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Lafcadio
         | 
| 5 | 
            +
            	# Accepts a Month as a value. This field automatically saves in MySQL as a 
         | 
| 6 | 
            +
            	# date corresponding to the first day of the month.
         | 
| 7 | 
            +
            	class MonthField < DateField
         | 
| 8 | 
            +
            		def MonthField.valueType #:nodoc:
         | 
| 9 | 
            +
            			Month
         | 
| 10 | 
            +
            		end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            		def valueForSQL(value) #:nodoc:
         | 
| 13 | 
            +
            			"'#{value.year}-#{value.month}-01'"
         | 
| 14 | 
            +
            		end
         | 
| 15 | 
            +
            	end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,142 @@ | |
| 1 | 
            +
            require 'lafcadio/util/English'
         | 
| 2 | 
            +
            require 'lafcadio/objectField/FieldValueError'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Lafcadio
         | 
| 5 | 
            +
            	# ObjectField is the abstract base class of any field for domain objects.
         | 
| 6 | 
            +
            	class ObjectField
         | 
| 7 | 
            +
            		include Comparable
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            		attr_reader :name, :defaultFieldName, :objectType
         | 
| 10 | 
            +
            		attr_accessor :notNull, :hideLabel, :writeOnce, :unique, :hideDisplay,
         | 
| 11 | 
            +
            				:default, :dbFieldName, :notUniqueMsg
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            		def ObjectField.valueType #:nodoc:
         | 
| 14 | 
            +
            			Object
         | 
| 15 | 
            +
            		end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            		def ObjectField.instantiationParameters( fieldElt ) #:nodoc:
         | 
| 18 | 
            +
            			parameters = {}
         | 
| 19 | 
            +
            			parameters['name'] = fieldElt.attributes['name']
         | 
| 20 | 
            +
            			parameters['englishName'] = fieldElt.attributes['englishName']
         | 
| 21 | 
            +
            			parameters['dbFieldName'] = fieldElt.attributes['dbFieldName']
         | 
| 22 | 
            +
            			parameters
         | 
| 23 | 
            +
            		end
         | 
| 24 | 
            +
            		
         | 
| 25 | 
            +
            		def ObjectField.instantiateFromXml( domainClass, fieldElt ) #:nodoc:
         | 
| 26 | 
            +
            			parameters = instantiationParameters( fieldElt )
         | 
| 27 | 
            +
            			instantiateWithParameters( domainClass, parameters )
         | 
| 28 | 
            +
            		end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            		def self.instantiateWithParameters( domainClass, parameters ) #:nodoc:
         | 
| 31 | 
            +
            			instance = self.new( domainClass, parameters['name'],
         | 
| 32 | 
            +
            			                     parameters['englishName'] )
         | 
| 33 | 
            +
            			if ( dbFieldName = parameters['dbFieldName'] )
         | 
| 34 | 
            +
            				instance.dbFieldName = dbFieldName
         | 
| 35 | 
            +
            			end
         | 
| 36 | 
            +
            			instance
         | 
| 37 | 
            +
            		end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            		# [objectType]  The domain class that this object field belongs to.
         | 
| 40 | 
            +
            		# [name]        The name of this field.
         | 
| 41 | 
            +
            		# [englishName] The descriptive English name of this field. (Deprecated)
         | 
| 42 | 
            +
            		def initialize(objectType, name, englishName = nil )
         | 
| 43 | 
            +
            			@objectType = objectType
         | 
| 44 | 
            +
            			@name = name
         | 
| 45 | 
            +
            			@dbFieldName = name
         | 
| 46 | 
            +
            			@notNull = true
         | 
| 47 | 
            +
            			@unique = false
         | 
| 48 | 
            +
            			( @default, @notUniqueMsg ) = [ nil, nil ]
         | 
| 49 | 
            +
            			@englishNameOrNil = englishName
         | 
| 50 | 
            +
            		end
         | 
| 51 | 
            +
            		
         | 
| 52 | 
            +
            		def bind_write?; false; end #:nodoc:
         | 
| 53 | 
            +
            		
         | 
| 54 | 
            +
            		def db_table_and_field_name
         | 
| 55 | 
            +
            			"#{ objectType.tableName }.#{ dbFieldName }"
         | 
| 56 | 
            +
            		end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            		def englishName #:nodoc:
         | 
| 59 | 
            +
            			@englishNameOrNil || English.camelCaseToEnglish(name).capitalize
         | 
| 60 | 
            +
            		end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            		def nullErrorMsg #:nodoc:
         | 
| 63 | 
            +
            			English.sentence "Please enter %a %nam.", englishName.downcase
         | 
| 64 | 
            +
            		end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            		def verify(value, pkId) #:nodoc:
         | 
| 67 | 
            +
            			if value.nil? && notNull
         | 
| 68 | 
            +
            				raise FieldValueError, nullErrorMsg, caller
         | 
| 69 | 
            +
            			end
         | 
| 70 | 
            +
            			if value
         | 
| 71 | 
            +
            				valueType = self.class.valueType
         | 
| 72 | 
            +
            				unless value.class <= valueType
         | 
| 73 | 
            +
            					raise FieldValueError, 
         | 
| 74 | 
            +
            							"#{name} needs an object of type #{valueType.name}", caller
         | 
| 75 | 
            +
            				end
         | 
| 76 | 
            +
            				verifyUniqueness(value, pkId) if unique
         | 
| 77 | 
            +
            			end
         | 
| 78 | 
            +
            		end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            		def verifyUniqueness(value, pkId) #:nodoc:
         | 
| 81 | 
            +
            			inferrer = Query::Inferrer.new( @objectType ) { |domain_obj|
         | 
| 82 | 
            +
            				Query.And( domain_obj.send( self.name ).equals( value ),
         | 
| 83 | 
            +
            									 domain_obj.pkId.equals( pkId ).not )
         | 
| 84 | 
            +
            			}
         | 
| 85 | 
            +
            			collisions = ObjectStore.getObjectStore.getSubset( inferrer.execute )
         | 
| 86 | 
            +
            			if collisions.size > 0
         | 
| 87 | 
            +
            				if @notUniqueMsg
         | 
| 88 | 
            +
            					notUniqueMsg = @notUniqueMsg
         | 
| 89 | 
            +
            				else
         | 
| 90 | 
            +
            					notUniqueMsg = "That #{englishName.downcase} is already taken. " +
         | 
| 91 | 
            +
            							"Please choose another."
         | 
| 92 | 
            +
            				end
         | 
| 93 | 
            +
            				raise FieldValueError, notUniqueMsg, caller
         | 
| 94 | 
            +
            			end
         | 
| 95 | 
            +
            		end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
            		# Returns the name that this field is referenced by in the MySQL table. By 
         | 
| 98 | 
            +
            		# default this is the same as the name; to override it, set 
         | 
| 99 | 
            +
            		# ObjectField#dbFieldName.
         | 
| 100 | 
            +
            		def nameForSQL
         | 
| 101 | 
            +
            			dbFieldName
         | 
| 102 | 
            +
            		end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            		# Returns a string value suitable for committing this field's value to 
         | 
| 105 | 
            +
            		# MySQL.
         | 
| 106 | 
            +
            		def valueForSQL(value)
         | 
| 107 | 
            +
            			value || 'null'
         | 
| 108 | 
            +
            		end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            		def firstTime(fieldManager) #:nodoc:
         | 
| 111 | 
            +
            			pkId = fieldManager.getpkId
         | 
| 112 | 
            +
            			pkId == nil
         | 
| 113 | 
            +
            		end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            		def prevValue(pkId) #:nodoc:
         | 
| 116 | 
            +
            			prevObject = ObjectStore.getObjectStore.get(@objectType, pkId)
         | 
| 117 | 
            +
            			prevObject.send(name)
         | 
| 118 | 
            +
            		end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            		def processBeforeVerify(value) #:nodoc:
         | 
| 121 | 
            +
            			value = @default if value == nil
         | 
| 122 | 
            +
            			value
         | 
| 123 | 
            +
            		end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            		# Given the SQL value string, returns a Ruby-native value.
         | 
| 126 | 
            +
            		def valueFromSQL(string)
         | 
| 127 | 
            +
            			string
         | 
| 128 | 
            +
            		end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
            		def <=>(other)
         | 
| 131 | 
            +
            			if @objectType == other.objectType && name == other.name
         | 
| 132 | 
            +
            				0
         | 
| 133 | 
            +
            			else
         | 
| 134 | 
            +
            				object_id <=> other.object_id
         | 
| 135 | 
            +
            			end
         | 
| 136 | 
            +
            		end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            		def dbWillAutomaticallyWrite #:nodoc:
         | 
| 139 | 
            +
            			false
         | 
| 140 | 
            +
            		end
         | 
| 141 | 
            +
            	end
         | 
| 142 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require 'lafcadio/objectField/TextField'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lafcadio
         | 
| 4 | 
            +
            	# A PasswordField is simply a TextField that is expected to contain a password
         | 
| 5 | 
            +
            	# value. It can be set to auto-generate a password at random.
         | 
| 6 | 
            +
            	class PasswordField < TextField
         | 
| 7 | 
            +
            		# Returns a random 8-letter alphanumeric password.
         | 
| 8 | 
            +
            		def PasswordField.randomPassword
         | 
| 9 | 
            +
            			chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".
         | 
| 10 | 
            +
            					split(//)
         | 
| 11 | 
            +
            			value = ""
         | 
| 12 | 
            +
            			0.upto(8) { |i| value += chars[rand(chars.size)] }
         | 
| 13 | 
            +
            			value
         | 
| 14 | 
            +
            		end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            		attr_reader :maxLength
         | 
| 17 | 
            +
            		attr_accessor :autoGenerate
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            		# [objectType]  The domain class that this object field belongs to.
         | 
| 20 | 
            +
            		# [name]        The name of this field.
         | 
| 21 | 
            +
            		# [maxLength]   The maximum length of the password. (Deprecated)
         | 
| 22 | 
            +
            		# [englishName] The descriptive English name of this field. (Deprecated)
         | 
| 23 | 
            +
            		def initialize(objectType, maxLength, name = "password", englishName = nil)
         | 
| 24 | 
            +
            			super(objectType, name, englishName)
         | 
| 25 | 
            +
            			@maxLength = maxLength
         | 
| 26 | 
            +
            			@autoGenerate = true
         | 
| 27 | 
            +
            		end
         | 
| 28 | 
            +
            	end
         | 
| 29 | 
            +
            end
         |