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
15 Typed value wrapper. Use in accepts and returns to document method
16 parameters. Set the optional and default attributes for
17 sub-parameters (i.e., dict fields).
20 def __init__(self, type, doc = "",
21 min = None, max = None,
25 # Basic type of the parameter. Must be a builtin type
26 # that can be marshalled by XML-RPC.
29 # Documentation string for the parameter
32 # Basic value checking. For numeric types, the minimum and
33 # maximum possible values, inclusive. For string types, the
34 # minimum and maximum possible UTF-8 encoded byte lengths.
38 # Whether the sub-parameter is optional or not. If None,
39 # unknown whether it is optional.
40 self.optional = optional
42 # Whether the DB field is read-only.
45 # Whether the DB field can be NULL.
52 return repr(self.type)
56 A list (technically, a tuple) of types. Use in accepts and returns
57 to document method parameters that may return mixed types.
60 def __new__(cls, *types):
61 return tuple.__new__(cls, types)
66 Returns the Python type of the specified argument, which may be a
67 Python type, a typed value, or a Parameter.
70 if isinstance(arg, Parameter):
73 if isinstance(arg, type):
80 Returns the XML-RPC type of the specified argument, which may be a
81 Python type, a typed value, or a Parameter.
84 arg_type = python_type(arg)
86 if arg_type == NoneType:
88 elif arg_type == IntType or arg_type == LongType:
90 elif arg_type == bool:
92 elif arg_type == FloatType:
94 elif issubclass(arg_type, StringType):
96 elif arg_type == ListType or arg_type == TupleType:
98 elif arg_type == DictType:
100 elif arg_type == Mixed:
101 # Not really an XML-RPC type but return "mixed" for
102 # documentation purposes.
105 raise SfaAPIError("XML-RPC cannot marshal %s objects" % arg_type)