def param_text(name, param, indent, step): """ Format a method parameter. """ text = indent # Print parameter name if name: param_offset = 32 text += name.ljust(param_offset - len(indent)) else: param_offset = len(indent) # Print parameter type param_type = python_type(param) text += xmlrpc_type(param_type) + "\n" # Print parameter documentation right below type if isinstance(param, Parameter): wrapper = textwrap.TextWrapper(width = 70, initial_indent = " " * param_offset, subsequent_indent = " " * param_offset) text += "\n".join(wrapper.wrap(param.doc)) + "\n" param = param.type text += "\n" # Indent struct fields and mixed types if isinstance(param, dict): for name, subparam in param.iteritems(): text += param_text(name, subparam, indent + step, step) elif isinstance(param, Mixed): for subparam in param: text += param_text(name, subparam, indent + step, step) elif isinstance(param, (list, tuple, set)): for subparam in param: text += param_text("", subparam, indent + step, step) return text
def help(self, indent = " "): """ Text documentation for the method. """ (min_args, max_args, defaults) = self.args() text = "%s(%s) -> %s\n\n" % (self.name, ", ".join(max_args), xmlrpc_type(self.returns)) text += "Description:\n\n" lines = [indent + line.strip() for line in self.__doc__.strip().split("\n")] text += "\n".join(lines) + "\n\n" def param_text(name, param, indent, step): """ Format a method parameter. """ text = indent # Print parameter name if name: param_offset = 32 text += name.ljust(param_offset - len(indent)) else: param_offset = len(indent) # Print parameter type param_type = python_type(param) text += xmlrpc_type(param_type) + "\n" # Print parameter documentation right below type if isinstance(param, Parameter): wrapper = textwrap.TextWrapper(width = 70, initial_indent = " " * param_offset, subsequent_indent = " " * param_offset) text += "\n".join(wrapper.wrap(param.doc)) + "\n" param = param.type text += "\n" # Indent struct fields and mixed types if isinstance(param, dict): for name, subparam in param.iteritems(): text += param_text(name, subparam, indent + step, step) elif isinstance(param, Mixed): for subparam in param: text += param_text(name, subparam, indent + step, step) elif isinstance(param, (list, tuple, set)): for subparam in param: text += param_text("", subparam, indent + step, step) return text text += "Parameters:\n\n" for name, param in zip(max_args, self.accepts): text += param_text(name, param, indent, indent) text += "Returns:\n\n" text += param_text("", self.returns, indent, indent) return text
if value is None and nullok: return # Strings are a special case. Accept either unicode or str # types if a string is expected. if expected_type in StringTypes and isinstance(value, StringTypes): pass # Integers and long integers are also special types. Accept # either int or long types if an int or long is expected. elif expected_type in (IntType, LongType) and isinstance(value, (IntType, LongType)): pass elif not isinstance(value, expected_type): raise SfaInvalidArgument("expected %s, got %s" % \ (xmlrpc_type(expected_type), xmlrpc_type(type(value))), name) # If a minimum or maximum (length, value) has been specified if expected_type in StringTypes: if min is not None and \ len(value.encode(self.api.encoding)) < min: raise SfaInvalidArgument, "%s must be at least %d bytes long" % (name, min) if max is not None and \ len(value.encode(self.api.encoding)) > max: raise SfaInvalidArgument, "%s must be at most %d bytes long" % (name, max) elif expected_type in (list, tuple, set): if min is not None and len(value) < min: raise SfaInvalidArgument, "%s must contain at least %d items" % (name, min) if max is not None and len(value) > max: