You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2009/01/08 18:10:21 UTC

svn commit: r732760 - in /qpid/trunk/qpid/python/qpid: connection.py generator.py invoker.py session.py spec.py

Author: rhs
Date: Thu Jan  8 09:10:20 2009
New Revision: 732760

URL: http://svn.apache.org/viewvc?rev=732760&view=rev
Log:
made codegen happen on module import rather than on object instantiation, this makes things like help(Session) much more useful

Added:
    qpid/trunk/qpid/python/qpid/generator.py   (with props)
Removed:
    qpid/trunk/qpid/python/qpid/invoker.py
Modified:
    qpid/trunk/qpid/python/qpid/connection.py
    qpid/trunk/qpid/python/qpid/session.py
    qpid/trunk/qpid/python/qpid/spec.py

Modified: qpid/trunk/qpid/python/qpid/connection.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/connection.py?rev=732760&r1=732759&r2=732760&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/connection.py (original)
+++ qpid/trunk/qpid/python/qpid/connection.py Thu Jan  8 09:10:20 2009
@@ -23,9 +23,8 @@
 from assembler import Assembler, Segment
 from codec010 import StringCodec
 from session import Session
-from invoker import Invoker
-from spec010 import Control, Command, load
-from spec import default
+from generator import control_invoker
+from spec import SPEC
 from exceptions import *
 from logging import getLogger
 import delegates
@@ -63,12 +62,9 @@
 
 class Connection(Assembler):
 
-  def __init__(self, sock, spec=None, delegate=client, **args):
+  def __init__(self, sock, spec=SPEC, delegate=client, **args):
     Assembler.__init__(self, sslwrap(sock))
-    if spec == None:
-      spec = load(default())
     self.spec = spec
-    self.track = self.spec["track"]
 
     self.lock = RLock()
     self.attached = {}
@@ -96,7 +92,7 @@
       else:
         ssn = self.sessions.get(name)
         if ssn is None:
-          ssn = Session(name, self.spec, delegate=delegate)
+          ssn = Session(name, delegate=delegate)
           self.sessions[name] = ssn
         elif ssn.channel is not None:
           if force:
@@ -189,23 +185,16 @@
 
 log = getLogger("qpid.io.ctl")
 
-class Channel(Invoker):
+class Channel(control_invoker(SPEC)):
 
   def __init__(self, connection, id):
     self.connection = connection
     self.id = id
     self.session = None
 
-  def resolve_method(self, name):
-    inst = self.connection.spec.instructions.get(name)
-    if inst is not None and isinstance(inst, Control):
-      return self.METHOD, inst
-    else:
-      return self.ERROR, None
-
   def invoke(self, type, args, kwargs):
     ctl = type.new(args, kwargs)
-    sc = StringCodec(self.connection.spec)
+    sc = StringCodec(self.spec)
     sc.write_control(ctl)
     self.connection.write_segment(Segment(True, True, type.segment_type,
                                           type.track, self.id, sc.encoded))

Added: qpid/trunk/qpid/python/qpid/generator.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/generator.py?rev=732760&view=auto
==============================================================================
--- qpid/trunk/qpid/python/qpid/generator.py (added)
+++ qpid/trunk/qpid/python/qpid/generator.py Thu Jan  8 09:10:20 2009
@@ -0,0 +1,60 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import sys
+
+from spec010 import Control
+
+def METHOD(module, inst):
+  method = lambda self, *args, **kwargs: self.invoke(inst, args, kwargs)
+  if sys.version_info[:2] > (2, 3):
+    method.__name__ = inst.pyname
+    method.__doc__ = inst.pydoc
+    method.__module__ = module
+  return method
+
+def generate(spec, module, predicate=lambda x: True):
+  dict = {"spec": spec}
+
+  for name, enum in spec.enums.items():
+    dict[name] = enum
+
+  for name, st in spec.structs_by_name.items():
+    dict[name] = METHOD(module, st)
+
+  for st in spec.structs.values():
+    dict[st.name] = METHOD(module, st)
+
+  for name, inst in spec.instructions.items():
+    if predicate(inst):
+      dict[name] = METHOD(module, inst)
+
+  return dict
+
+def invoker(name, spec, predicate=lambda x: True):
+  return type("%s_%s_%s" % (name, spec.major, spec.minor),
+              (), generate(spec, invoker.__module__, predicate))
+
+def command_invoker(spec):
+  is_command = lambda cmd: cmd.track == spec["track.command"].value
+  return invoker("CommandInvoker", spec, is_command)
+
+def control_invoker(spec):
+  is_control = lambda inst: isinstance(inst, Control)
+  return invoker("ControlInvoker", spec, is_control)

Propchange: qpid/trunk/qpid/python/qpid/generator.py
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/trunk/qpid/python/qpid/session.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/session.py?rev=732760&r1=732759&r2=732760&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/session.py (original)
+++ qpid/trunk/qpid/python/qpid/session.py Thu Jan  8 09:10:20 2009
@@ -18,7 +18,8 @@
 #
 
 from threading import Condition, RLock, Lock, currentThread
-from invoker import Invoker
+from spec import SPEC
+from generator import command_invoker
 from datatypes import RangedSet, Struct, Future
 from codec010 import StringCodec
 from assembler import Segment
@@ -43,11 +44,10 @@
 
 INCOMPLETE = object()
 
-class Session(Invoker):
+class Session(command_invoker(SPEC)):
 
-  def __init__(self, name, spec, auto_sync=True, timeout=10, delegate=client):
+  def __init__(self, name, auto_sync=True, timeout=10, delegate=client):
     self.name = name
-    self.spec = spec
     self.auto_sync = auto_sync
     self.timeout = timeout
     self.channel = None
@@ -133,21 +133,6 @@
     finally:
       self.lock.release()
 
-  def resolve_method(self, name):
-    cmd = self.spec.instructions.get(name)
-    if cmd is not None and cmd.track == self.spec["track.command"].value:
-      return self.METHOD, cmd
-    else:
-      # XXX
-      for st in self.spec.structs.values():
-        if st.name == name:
-          return self.METHOD, st
-      if self.spec.structs_by_name.has_key(name):
-        return self.METHOD, self.spec.structs_by_name[name]
-      if self.spec.enums.has_key(name):
-        return self.VALUE, self.spec.enums[name]
-      return self.ERROR, None
-
   def invoke(self, type, args, kwargs):
     # XXX
     if not hasattr(type, "track"):

Modified: qpid/trunk/qpid/python/qpid/spec.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/spec.py?rev=732760&r1=732759&r2=732760&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/spec.py (original)
+++ qpid/trunk/qpid/python/qpid/spec.py Thu Jan  8 09:10:20 2009
@@ -57,3 +57,5 @@
     return spec010.load(specfile, *errata)
   else:
     return spec08.load(specfile, *errata)
+
+SPEC = load(default())