Author: rhs
Date: Fri Sep 14 19:58:52 2012
New Revision: 1384901

URL: http://svn.apache.org/viewvc?rev=1384901&view=rev
Log:
PROTON-23: idomatic API layer for python

Added:
    qpid/proton/trunk/proton-c/bindings/python/proton.py
Modified:
    qpid/proton/trunk/config.sh
    qpid/proton/trunk/examples/messenger/client.py
    qpid/proton/trunk/examples/messenger/recv.py
    qpid/proton/trunk/examples/messenger/send.py
    qpid/proton/trunk/examples/messenger/server.py
    qpid/proton/trunk/proton-c/bindings/python/CMakeLists.txt

Modified: qpid/proton/trunk/config.sh
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/config.sh?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/config.sh (original)
+++ qpid/proton/trunk/config.sh Fri Sep 14 19:58:52 2012
@@ -32,8 +32,9 @@ fi
 
 # Python & Jython
 export PYTHON_BINDINGS=$PROTON_BINDINGS/python
-export PYTHONPATH=$PROTON_HOME/tests:$PROTON_HOME/proton-c:$PYTHON_BINDINGS
-export 
JYTHONPATH=$PROTON_HOME/tests:$PROTON_HOME/proton-j:$PROTON_HOME/proton-j/dist/lib/qpidproton.jar
+export COMMON_PYPATH=$PROTON_HOME/tests:$PROTON_HOME/proton-c/bindings/python
+export PYTHONPATH=$COMMON_PYPATH:$PROTON_HOME/proton-c:$PYTHON_BINDINGS
+export 
JYTHONPATH=$COMMON_PYPATH:$PROTON_HOME/proton-j:$PROTON_HOME/proton-j/dist/lib/qpidproton.jar
 
 # PHP
 export PHP_BINDINGS=$PROTON_BINDINGS/php

Modified: qpid/proton/trunk/examples/messenger/client.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/examples/messenger/client.py?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/examples/messenger/client.py (original)
+++ qpid/proton/trunk/examples/messenger/client.py Fri Sep 14 19:58:52 2012
@@ -18,7 +18,7 @@
 # under the License.
 #
 import sys, optparse
-from xproton import *
+from proton import *
 
 parser = optparse.OptionParser(usage="usage: %prog <addr> <subject>",
                                description="simple message server")
@@ -33,21 +33,23 @@ if len(args) != 2:
 
 address, subject = args
 
-mng = pn_messenger(None)
-pn_messenger_start(mng)
+mng = Messenger()
+mng.start()
 
-msg = pn_message()
-pn_message_set_address(msg, address)
-pn_message_set_subject(msg, subject)
-pn_message_set_reply_to(msg, opts.reply_to)
+msg = Message()
+msg.address = address
+msg.subject = subject
+msg.reply_to = opts.reply_to
 
-if pn_messenger_put(mng, msg): print pn_messenger_error(mng)
-if pn_messenger_send(mng): print pn_messenger_error(mng)
+mng.put(msg)
+mng.send()
 
 if opts.reply_to[:2] != "//":
-  if pn_messenger_recv(mng, 1): print pn_messenger_error(mng)
-  elif pn_messenger_get(mng, msg): print pn_messenger_error(mng)
-  else: print pn_message_get_address(msg), pn_message_get_subject(msg)
+  mng.recv(1)
+  try:
+    mng.get(msg)
+    print msg.address, msg.subject
+  except Exception, e:
+    print e
 
-pn_messenger_stop(mng)
-pn_messenger_free(mng)
+mng.stop()

Modified: qpid/proton/trunk/examples/messenger/recv.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/examples/messenger/recv.py?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/examples/messenger/recv.py (original)
+++ qpid/proton/trunk/examples/messenger/recv.py Fri Sep 14 19:58:52 2012
@@ -18,7 +18,7 @@
 # under the License.
 #
 import sys, optparse
-from xproton import *
+from proton import *
 
 parser = optparse.OptionParser(usage="usage: %prog [options] <addr_1> ... 
<addr_n>",
                                description="simple message receiver")
@@ -28,30 +28,26 @@ opts, args = parser.parse_args()
 if not args:
   args = ["//~0.0.0.0"]
 
-mng = pn_messenger(None)
-pn_messenger_start(mng)
+mng = Messenger()
+mng.start()
 
 for a in args:
-  if pn_messenger_subscribe(mng, a):
-    print pn_messenger_error(mng)
-    break
+  mng.subscribe(a)
 
-msg = pn_message()
+msg = Message()
 while True:
-  if pn_messenger_recv(mng, 10):
-    print pn_messenger_error(mng)
-    break
-  while pn_messenger_incoming(mng):
-    if pn_messenger_get(mng, msg):
-      print pn_messenger_error(mng)
+  mng.recv(10)
+  while mng.incoming:
+    try:
+      mng.get(msg)
+    except Exception, e:
+      print e
     else:
-      cd, body = pn_message_save(msg, 1024)
-      if cd:
-        print pn_message_error(msg)
+      try:
+        body = msg.save()
+      except Exception, e:
+        print e
       else:
-        print pn_message_get_address(msg), \
-            pn_message_get_subject(msg) or "(no subject)", \
-            body
+        print msg.address, msg.subject or "(no subject)", body
 
-pn_messenger_stop(mng)
-pn_messenger_free(mng)
+mng.stop()

Modified: qpid/proton/trunk/examples/messenger/send.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/examples/messenger/send.py?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/examples/messenger/send.py (original)
+++ qpid/proton/trunk/examples/messenger/send.py Fri Sep 14 19:58:52 2012
@@ -18,7 +18,7 @@
 # under the License.
 #
 import sys, optparse
-from xproton import *
+from proton import *
 
 parser = optparse.OptionParser(usage="usage: %prog [options] <msg_1> ... 
<msg_n>",
                                description="simple message sender")
@@ -29,21 +29,16 @@ opts, args = parser.parse_args()
 if not args:
   args = ["Hello World!"]
 
-mng = pn_messenger(None)
-pn_messenger_start(mng)
+mng = Messenger()
+mng.start()
 
-msg = pn_message()
+msg = Message()
 for m in args:
-  pn_message_set_address(msg, opts.address)
-  pn_message_load(msg, m)
-  if pn_messenger_put(mng, msg):
-    print pn_messenger_error(mng)
-    break
-
-if pn_messenger_send(mng):
-  print pn_messenger_error(mng)
-else:
-  print "sent:", ", ".join(args)
+  msg.address = opts.address
+  msg.load(m)
+  mng.put(msg)
 
-pn_messenger_stop(mng)
-pn_messenger_free(mng)
+mng.send()
+print "sent:", ", ".join(args)
+
+mng.stop()

Modified: qpid/proton/trunk/examples/messenger/server.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/examples/messenger/server.py?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/examples/messenger/server.py (original)
+++ qpid/proton/trunk/examples/messenger/server.py Fri Sep 14 19:58:52 2012
@@ -18,7 +18,7 @@
 # under the License.
 #
 import sys, optparse
-from xproton import *
+from proton import *
 
 parser = optparse.OptionParser(usage="usage: %prog <addr_1> ... <addr_n>",
                                description="simple message server")
@@ -28,42 +28,30 @@ opts, args = parser.parse_args()
 if not args:
   args = ["//~0.0.0.0"]
 
-mng = pn_messenger(None)
-pn_messenger_start(mng)
+mng = Messenger()
+mng.start()
 
 for a in args:
-  if pn_messenger_subscribe(mng, a):
-    print pn_messenger_error(mng)
-    break
+  mng.subscribe(a)
 
 def dispatch(request, response):
-  subject = pn_message_get_subject(request)
-  pn_message_set_subject(response, "Re: %s" % subject)
-  print "Dispatched %s" % subject
+  response.subject = "Re: %s" % request.subject
+  print "Dispatched %s" % request.subject
 
-msg = pn_message()
-reply = pn_message()
+msg = Message()
+reply = Message()
 
 while True:
-  if pn_messenger_incoming(mng) < 10:
-    if pn_messenger_recv(mng, 10):
-      print pn_messenger_error(mng)
-      break
-  if pn_messenger_incoming(mng) > 0:
-    if pn_messenger_get(mng, msg):
-      print pn_messenger_error(mng)
-    else:
-      reply_to = pn_message_get_reply_to(msg)
-      cid = pn_message_get_correlation_id(msg)
-      if reply_to:
-        pn_message_set_address(reply, reply_to)
-      if cid:
-        pn_message_set_correlation_id(reply, cid)
-      dispatch(msg, reply)
-      if pn_messenger_put(mng, reply):
-        print pn_messenger_error(mng)
-      if pn_messenger_send(mng):
-        print pn_messenger_error(mng)
+  if mng.incoming < 10:
+    mng.recv(10)
 
-pn_messenger_stop(mng)
-pn_messenger_free(mng)
+  if mng.incoming > 0:
+    mng.get(msg)
+    if msg.reply_to:
+      reply.address = msg.reply_to
+      reply.correlation_id = msg.correlation_id
+    dispatch(msg, reply)
+    mng.put(reply)
+    mng.send()
+
+mng.stop()

Modified: qpid/proton/trunk/proton-c/bindings/python/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/CMakeLists.txt?rev=1384901&r1=1384900&r2=1384901&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/CMakeLists.txt (original)
+++ qpid/proton/trunk/proton-c/bindings/python/CMakeLists.txt Fri Sep 14 
19:58:52 2012
@@ -15,9 +15,16 @@ install(CODE "execute_process(COMMAND ${
                               WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
 install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -O -m py_compile 
cproton.py
                               WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
+install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m py_compile 
proton.py
+                              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})")
+install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -O -m py_compile 
proton.py
+                              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})")
 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cproton.py
               ${CMAKE_CURRENT_BINARY_DIR}/cproton.pyc
               ${CMAKE_CURRENT_BINARY_DIR}/cproton.pyo
+              ${CMAKE_CURRENT_SOURCE_DIR}/proton.py
+              ${CMAKE_CURRENT_SOURCE_DIR}/proton.pyc
+              ${CMAKE_CURRENT_SOURCE_DIR}/proton.pyo
         DESTINATION ${PYTHON_SITEARCH_PACKAGES}
         COMPONENT Python)
 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/_cproton.so

Added: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1384901&view=auto
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (added)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Fri Sep 14 19:58:52 
2012
@@ -0,0 +1,272 @@
+from xproton import *
+
+class ProtonException(Exception):
+  pass
+
+class Timeout(ProtonException):
+  pass
+
+class MessengerException(ProtonException):
+  pass
+
+class MessageException(ProtonException):
+  pass
+
+EXCEPTIONS = {
+  PN_TIMEOUT: Timeout
+  }
+
+class Messenger(object):
+
+  def __init__(self, name=None):
+    self._mng = pn_messenger(name);
+
+  def __del__(self):
+    if hasattr(self, "_mng"):
+      pn_messenger_free(self._mng)
+      del self._mng
+
+  def _check(self, err):
+    if err < 0:
+      exc = EXCEPTIONS.get(err, MessengerException)
+      raise exc("[%s]: %s" % (err, pn_messenger_error(self._mng)))
+    else:
+      return err
+
+  @property
+  def name(self):
+    return pn_messenger_name(self._mng)
+
+  @property
+  def timeout(self):
+    return pn_messenger_get_timeout(self._mng)
+
+  @timeout.setter
+  def timeout(self, value):
+    self._check(pn_messenger_set_timeout(self._mng, value))
+
+  def start(self):
+    self._check(pn_messenger_start(self._mng))
+
+  def stop(self):
+    self._check(pn_messenger_stop(self._mng))
+
+  def subscribe(self, source):
+    self._check(pn_messenger_subscribe(self._mng, source))
+
+  def put(self, msg):
+    self._check(pn_messenger_put(self._mng, msg._msg))
+
+  def send(self):
+    self._check(pn_messenger_send(self._mng))
+
+  def recv(self, n):
+    self._check(pn_messenger_recv(self._mng, n))
+
+  def get(self, msg):
+    self._check(pn_messenger_get(self._mng, msg._msg))
+
+  @property
+  def outgoing(self):
+    return pn_messenger_outgoing(self._mng)
+
+  @property
+  def incoming(self):
+    return pn_messenger_incoming(self._mng)
+
+class Message(object):
+
+  DATA = PN_DATA
+  TEXT = PN_TEXT
+  AMQP = PN_AMQP
+  JSON = PN_JSON
+
+  def __init__(self):
+    self._msg = pn_message()
+
+  def __del__(self):
+    if hasattr(self, "_msg"):
+      pn_message_free(self._msg)
+      del self._msg
+
+  def _check(self, err):
+    if err < 0:
+      exc = EXCEPTIONS.get(err, MessageException)
+      raise exc("[%s]: %s" % (err, pn_message_error(self._msg)))
+    else:
+      return err
+
+  def clear(self):
+    pn_message_clear(self._msg)
+
+  @property
+  def durable(self):
+    return pn_message_is_durable(self._msg)
+
+  @durable.setter
+  def durable(self, value):
+    self._check(pn_message_set_durable(self._msg, bool(value)))
+
+  @property
+  def priority(self):
+    return pn_message_get_priority(self._msg)
+
+  @priority.setter
+  def priority(self, value):
+    self._check(pn_message_set_priority(self._msg, value))
+
+  @property
+  def ttl(self):
+    return pn_message_get_ttl(self._msg)
+
+  @ttl.setter
+  def ttl(self, value):
+    self._check(pn_message_set_ttl(self._msg, value))
+
+  @property
+  def first_acquirer(self):
+    return pn_message_is_first_acquirer(self._msg)
+
+  @first_acquirer.setter
+  def first_acquirer(self, value):
+    self._check(pn_message_set_first_acquirer(self._msg, bool(value)))
+
+  @property
+  def delivery_count(self):
+    return pn_message_get_delivery_count(self._msg)
+
+  @delivery_count.setter
+  def delivery_count(self, value):
+    self._check(pn_message_set_delivery_count(self._msg, value))
+
+  # XXX
+  @property
+  def id(self):
+    return pn_message_get_id(self._msg)
+
+  @id.setter
+  def id(self, value):
+    self._check(pn_message_set_id(self._msg, value))
+
+  @property
+  def user_id(self):
+    return pn_message_get_user_id(self._msg)
+
+  @user_id.setter
+  def user_id(self, value):
+    self._check(pn_message_set_user_id(self._msg, value))
+
+  @property
+  def address(self):
+    return pn_message_get_address(self._msg)
+
+  @address.setter
+  def address(self, value):
+    self._check(pn_message_set_address(self._msg, value))
+
+  @property
+  def subject(self):
+    return pn_message_get_subject(self._msg)
+
+  @subject.setter
+  def subject(self, value):
+    self._check(pn_message_set_subject(self._msg, value))
+
+  @property
+  def reply_to(self):
+    return pn_message_get_reply_to(self._msg)
+
+  @reply_to.setter
+  def reply_to(self, value):
+    self._check(pn_message_set_reply_to(self._msg, value))
+
+  # XXX
+  @property
+  def correlation_id(self):
+    return pn_message_get_correlation_id(self._msg)
+
+  @correlation_id.setter
+  def correlation_id(self, value):
+    self._check(pn_message_set_correlation_id(self._msg, value))
+
+  @property
+  def content_type(self):
+    return pn_message_get_content_type(self._msg)
+
+  @content_type.setter
+  def content_type(self, value):
+    self._check(pn_message_set_content_type(self._msg, value))
+
+  @property
+  def content_encoding(self):
+    return pn_message_get_content_encoding(self._msg)
+
+  @content_encoding.setter
+  def content_encoding(self, value):
+    self._check(pn_message_set_content_encoding(self._msg, value))
+
+  @property
+  def expiry_time(self):
+    return pn_message_get_expiry_time(self._msg)
+
+  @expiry_time.setter
+  def expiry_time(self, value):
+    self._check(pn_message_set_expiry_time(self._msg, value))
+
+  @property
+  def creation_time(self):
+    return pn_message_get_creation_time(self._msg)
+
+  @creation_time.setter
+  def creation_time(self, value):
+    self._check(pn_message_set_creation_time(self._msg, value))
+
+  @property
+  def group_id(self):
+    return pn_message_get_group_id(self._msg)
+
+  @group_id.setter
+  def group_id(self, value):
+    self._check(pn_message_set_group_id(self._msg, value))
+
+  @property
+  def group_sequence(self):
+    return pn_message_get_group_sequence(self._msg)
+
+  @group_sequence.setter
+  def group_sequence(self, value):
+    self._check(pn_message_set_group_sequence(self._msg, value))
+
+  @property
+  def reply_to_group_id(self):
+    return pn_message_get_reply_to_group_id(self._msg)
+
+  @reply_to_group_id.setter
+  def reply_to_group_id(self, value):
+    self._check(pn_message_set_reply_to_group_id(self._msg, value))
+
+  # XXX
+  @property
+  def format(self):
+    return pn_message_get_format(self._msg)
+
+  @format.setter
+  def format(self, value):
+    self._check(pn_message_set_format(self._msg, value))
+
+  def load(self, data):
+    self._check(pn_message_load(self._msg, data))
+
+  def save(self):
+    sz = 16
+    while True:
+      err, data = pn_message_save(self._msg, sz)
+      if err == PN_OVERFLOW:
+        sz *= 2
+        continue
+      else:
+        self._check(err)
+        return data
+
+__all__ = ["Messenger", "Message", "ProtonException", "MessengerException",
+           "MessageException", "Timeout"]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to