2 # Shared type definitions
4 # Mark Huang <mlhuang@cs.princeton.edu>
5 # Copyright (C) 2006 The Trustees of Princeton University
8 from types import NoneType, IntType, LongType, FloatType, DictType, TupleType, ListType
9 from sfa.util.faults import SfaAPIError
11 from sfa.util.py23 import StringType
16 Typed value wrapper. Use in accepts and returns to document method
17 parameters. Set the optional and default attributes for
18 sub-parameters (i.e., dict fields).
21 def __init__(self, type, doc="",
26 # Basic type of the parameter. Must be a builtin type
27 # that can be marshalled by XML-RPC.
30 # Documentation string for the parameter
33 # Basic value checking. For numeric types, the minimum and
34 # maximum possible values, inclusive. For string types, the
35 # minimum and maximum possible UTF-8 encoded byte lengths.
39 # Whether the sub-parameter is optional or not. If None,
40 # unknown whether it is optional.
41 self.optional = optional
43 # Whether the DB field is read-only.
46 # Whether the DB field can be NULL.
53 return repr(self.type)
58 A list (technically, a tuple) of types. Use in accepts and returns
59 to document method parameters that may return mixed types.
62 def __new__(cls, *types):
63 return tuple.__new__(cls, types)
68 Returns the Python type of the specified argument, which may be a
69 Python type, a typed value, or a Parameter.
72 if isinstance(arg, Parameter):
75 if isinstance(arg, type):
83 Returns the XML-RPC type of the specified argument, which may be a
84 Python type, a typed value, or a Parameter.
87 arg_type = python_type(arg)
89 if arg_type == NoneType:
91 elif arg_type == IntType or arg_type == LongType:
93 elif arg_type == bool:
95 elif arg_type == FloatType:
97 elif issubclass(arg_type, StringType):
99 elif arg_type == ListType or arg_type == TupleType:
101 elif arg_type == DictType:
103 elif arg_type == Mixed:
104 # Not really an XML-RPC type but return "mixed" for
105 # documentation purposes.
108 raise SfaAPIError("XML-RPC cannot marshal %s objects" % arg_type)