diff options
author | Rafael H. Schloming <rhs@apache.org> | 2008-05-16 15:58:12 +0000 |
---|---|---|
committer | Rafael H. Schloming <rhs@apache.org> | 2008-05-16 15:58:12 +0000 |
commit | 7f60fd46d5aad44dad79cdc3cf67c9804fc94e3e (patch) | |
tree | 7e2ab527f6cd802baf57c63c0a15ea784425874f | |
parent | e6bc6ff91d47d1330d2fbbe88005beaf935382a3 (diff) | |
download | qpid-python-7f60fd46d5aad44dad79cdc3cf67c9804fc94e3e.tar.gz |
QPID-947: initialize docstrings for protocol methods from the spec
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@657112 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | python/qpid/invoker.py | 3 | ||||
-rw-r--r-- | python/qpid/spec010.py | 52 | ||||
-rw-r--r-- | python/qpid/spec08.py | 12 | ||||
-rw-r--r-- | python/qpid/util.py | 13 |
4 files changed, 55 insertions, 25 deletions
diff --git a/python/qpid/invoker.py b/python/qpid/invoker.py index 2d9e45179e..190a4ca288 100644 --- a/python/qpid/invoker.py +++ b/python/qpid/invoker.py @@ -23,6 +23,9 @@ class Invoker: def METHOD(self, name, resolved): method = lambda *args, **kwargs: self.invoke(resolved, args, kwargs) + method.__name__ = resolved.pyname + method.__doc__ = resolved.pydoc + method.__module__ = self.__class__.__module__ self.__dict__[name] = method return method diff --git a/python/qpid/spec010.py b/python/qpid/spec010.py index 9db73ae7cf..8c9b9068ac 100644 --- a/python/qpid/spec010.py +++ b/python/qpid/spec010.py @@ -19,7 +19,7 @@ import os, cPickle, datatypes from codec010 import StringCodec -from util import mtime +from util import mtime, fill class Node: @@ -201,9 +201,10 @@ class Choice(Named, Node): class Composite(Type, Coded): - def __init__(self, name, code, size, pack, children): + def __init__(self, name, label, code, size, pack, children): Coded.__init__(self, code) Type.__init__(self, name, children) + self.label = label self.fields = [] self.size = size self.pack = pack @@ -254,11 +255,30 @@ class Composite(Type, Coded): if flags & (0x1 << i): f.type.encode(codec, values[f.name]) + def docstring(self): + docs = [] + if self.label: + docs.append(self.label) + docs += [d.text for d in self.docs] + s = "\n\n".join([fill(t, 2) for t in docs]) + for f in self.fields: + fdocs = [] + if f.label: + fdocs.append(f.label) + else: + fdocs.append("") + fdocs += [d.text for d in f.docs] + s += "\n\n" + "\n\n".join([fill(fdocs[0], 4, f.name)] + + [fill(t, 4) for t in fdocs[1:]]) + return s + + class Field(Named, Node, Lookup): - def __init__(self, name, type, children): + def __init__(self, name, label, type, children): Named.__init__(self, name) Node.__init__(self, children) + self.label = label self.type = type self.exceptions = [] @@ -284,6 +304,8 @@ class Struct(Composite): if self.code is not None: self.spec.structs[self.code] = self self.spec.structs_by_name[self.name] = self + self.pyname = self.name + self.pydoc = self.docstring() def __str__(self): fields = ",\n ".join(["%s: %s" % (f.name, f.type.qname) @@ -303,8 +325,8 @@ class Segment: class Instruction(Composite, Segment): - def __init__(self, name, code, children): - Composite.__init__(self, name, code, 0, 2, children) + def __init__(self, name, label, code, children): + Composite.__init__(self, name, label, code, 0, 2, children) Segment.__init__(self) self.track = None self.handlers = [] @@ -315,12 +337,14 @@ class Instruction(Composite, Segment): def register(self, node): Composite.register(self, node) - self.spec.instructions[self.qname.replace(".", "_")] = self + self.pyname = self.qname.replace(".", "_") + self.pydoc = self.docstring() + self.spec.instructions[self.pyname] = self class Control(Instruction): - def __init__(self, name, code, children): - Instruction.__init__(self, name, code, children) + def __init__(self, name, code, label, children): + Instruction.__init__(self, name, code, label, children) self.response = None def register(self, node): @@ -332,8 +356,8 @@ class Control(Instruction): class Command(Instruction): - def __init__(self, name, code, children): - Instruction.__init__(self, name, code, children) + def __init__(self, name, label, code, children): + Instruction.__init__(self, name, label, code, children) self.result = None self.exceptions = [] self.segments = [] @@ -599,7 +623,7 @@ class Loader: return Role(id(r["@name"]), self.children(r)) def do_control(self, c): - return Control(id(c["@name"]), self.code(c), self.children(c)) + return Control(id(c["@name"]), c["@label"], self.code(c), self.children(c)) def do_rule(self, r): return Rule(id(r["@name"]), self.children(r)) @@ -611,14 +635,14 @@ class Loader: return Response(id(r["@name"]), self.children(r)) def do_field(self, f): - return Field(id(f["@name"]), id(f["@type"]), self.children(f)) + return Field(id(f["@name"]), f["@label"], id(f["@type"]), self.children(f)) def do_struct(self, s): - return Struct(id(s["@name"]), self.code(s), num(s["@size"]), + return Struct(id(s["@name"]), s["@label"], self.code(s), num(s["@size"]), num(s["@pack"]), self.children(s)) def do_command(self, c): - return Command(id(c["@name"]), self.code(c), self.children(c)) + return Command(id(c["@name"]), c["@label"], self.code(c), self.children(c)) def do_segments(self, s): return Anonymous(self.children(s)) diff --git a/python/qpid/spec08.py b/python/qpid/spec08.py index 623b2e9e9f..a0047e7107 100644 --- a/python/qpid/spec08.py +++ b/python/qpid/spec08.py @@ -29,7 +29,8 @@ class so that the generated code can be reused in a variety of situations. """ -import re, textwrap, new, mllib, qpid +import re, new, mllib, qpid +from util import fill class SpecContainer: @@ -449,15 +450,6 @@ def pythonize(name): pass return name -def fill(text, indent, heading = None): - sub = indent * " " - if heading: - init = (indent - 2) * " " + heading + " -- " - else: - init = sub - w = textwrap.TextWrapper(initial_indent = init, subsequent_indent = sub) - return w.fill(" ".join(text.split())) - class Rule(Metadata): PRINT = ["text", "implement", "tests"] diff --git a/python/qpid/util.py b/python/qpid/util.py index d03a9bd7e9..1140cbe5ef 100644 --- a/python/qpid/util.py +++ b/python/qpid/util.py @@ -17,7 +17,7 @@ # under the License. # -import os, socket, time +import os, socket, time, textwrap def connect(host, port): sock = socket.socket() @@ -65,3 +65,14 @@ def notify(condition, action=lambda: None): condition.notifyAll() finally: condition.release() + +def fill(text, indent, heading = None): + sub = indent * " " + if heading: + if not text: + return (indent - 2) * " " + heading + init = (indent - 2) * " " + heading + " -- " + else: + init = sub + w = textwrap.TextWrapper(initial_indent = init, subsequent_indent = sub) + return w.fill(" ".join(text.split())) |