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]