# This program is free software; you can redistribute it and/or modify
# it under the terms of the (LGPL) GNU Lesser General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library Lesser General Public License for more details at
# ( http://www.gnu.org/licenses/lgpl.html ).
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# written by: Jeff Ortel ( jortel@redhat.com )
"""
The I{sxbuiltin} module provides classes that represent
XSD I{builtin} schema objects.
"""
from logging import getLogger
from suds.compat import basestring
from suds.xsd.sxbase import XBuiltin
import suds.sax.date as dt
import datetime
log = getLogger(__name__)
class XString(XBuiltin):
"""
Represents an (xsd) node
"""
pass
class XAny(XBuiltin):
"""
Represents an (xsd) node
"""
def __init__(self, schema, name):
XBuiltin.__init__(self, schema, name)
self.nillable = False
def get_child(self, name):
child = XAny(self.schema, name)
return (child, [])
def any(self):
return True
class XBoolean(XBuiltin):
"""
Represents an (xsd) boolean builtin type.
"""
translation = (
{
'1': True,
'true': True,
'0': False,
'false': False
},
{
True: 'true',
1: 'true',
False: 'false',
0: 'false'
},
)
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring):
return XBoolean.translation[0].get(value)
else:
return None
else:
if isinstance(value, (bool, int)):
return XBoolean.translation[1].get(value)
else:
return value
class XInteger(XBuiltin):
"""
Represents an (xsd) xs:int builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return int(value)
else:
return None
else:
if isinstance(value, int):
return str(value)
else:
return value
class XLong(XBuiltin):
"""
Represents an (xsd) xs:long builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return int(value)
else:
return None
else:
if isinstance(value, int):
return str(value)
else:
return value
class XFloat(XBuiltin):
"""
Represents an (xsd) xs:float builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return float(value)
else:
return None
else:
if isinstance(value, float):
return str(value)
else:
return value
class XDate(XBuiltin):
"""
Represents an (xsd) xs:date builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return dt.Date(value).value
else:
return None
else:
if isinstance(value, datetime.date):
return str(dt.Date(value))
else:
return value
class XTime(XBuiltin):
"""
Represents an (xsd) xs:time builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return dt.Time(value).value
else:
return None
else:
if isinstance(value, datetime.time):
return str(dt.Time(value))
else:
return value
class XDateTime(XBuiltin):
"""
Represents an (xsd) xs:datetime builtin type.
"""
def translate(self, value, topython=True):
if topython:
if isinstance(value, basestring) and len(value):
return dt.DateTime(value).value
else:
return None
else:
if isinstance(value, datetime.datetime):
return str(dt.DateTime(value))
else:
return value
class Factory:
tags = {
# any
'anyType': XAny,
# strings
'string': XString,
'normalizedString': XString,
'ID': XString,
'Name': XString,
'QName': XString,
'NCName': XString,
'anySimpleType': XString,
'anyURI': XString,
'NOTATION': XString,
'token': XString,
'language': XString,
'IDREFS': XString,
'ENTITIES': XString,
'IDREF': XString,
'ENTITY': XString,
'NMTOKEN': XString,
'NMTOKENS': XString,
# binary
'hexBinary': XString,
'base64Binary': XString,
# integers
'int': XInteger,
'integer': XInteger,
'unsignedInt': XInteger,
'positiveInteger': XInteger,
'negativeInteger': XInteger,
'nonPositiveInteger': XInteger,
'nonNegativeInteger': XInteger,
# longs
'long': XLong,
'unsignedLong': XLong,
# shorts
'short': XInteger,
'unsignedShort': XInteger,
'byte': XInteger,
'unsignedByte': XInteger,
# floats
'float': XFloat,
'double': XFloat,
'decimal': XFloat,
# dates & times
'date': XDate,
'time': XTime,
'dateTime': XDateTime,
'duration': XString,
'gYearMonth': XString,
'gYear': XString,
'gMonthDay': XString,
'gDay': XString,
'gMonth': XString,
# boolean
'boolean': XBoolean,
}
@classmethod
def maptag(cls, tag, fn):
"""
Map (override) tag => I{class} mapping.
@param tag: An xsd tag name.
@type tag: str
@param fn: A function or class.
@type fn: fn|class.
"""
cls.tags[tag] = fn
@classmethod
def create(cls, schema, name):
"""
Create an object based on the root tag name.
@param schema: A schema object.
@type schema: L{schema.Schema}
@param name: The name.
@type name: str
@return: The created object.
@rtype: L{XBuiltin}
"""
fn = cls.tags.get(name)
if fn is not None:
return fn(schema, name)
else:
return XBuiltin(schema, name)