Author: gsim
Date: Tue May 26 15:10:12 2015
New Revision: 1681771

URL: http://svn.apache.org/r1681771
Log:
Added tutorial for python binding in 0.9.1 release

Added:
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/.buildinfo
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/index.txt
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/overview.txt
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/reference.txt
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/tutorial.txt
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/ajax-loader.gif
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/basic.css
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-bright.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-close.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/contents.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/doctools.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down-pressed.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/file.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/jquery.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/minus.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/navigation.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/plus.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/pygments.css
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/searchtools.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/sphinxdoc.css
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/underscore.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/up-pressed.png
   (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/up.png 
  (with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/websupport.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/genindex.html
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/index.html
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/objects.inv   
(with props)
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/overview.html
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/reference.html
    qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/search.html
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/searchindex.js
    
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/tutorial.html

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/.buildinfo
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/.buildinfo?rev=1681771&view=auto
==============================================================================
--- qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/.buildinfo 
(added)
+++ qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/.buildinfo 
Tue May 26 15:10:12 2015
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it 
is not found, a full rebuild will be done.
+config: c28d42903b953706bec928f16f1746ff
+tags: fbb0d17656682115ca4d033fb2f83ba1

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/index.txt
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/index.txt?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/index.txt
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/index.txt
 Tue May 26 15:10:12 2015
@@ -0,0 +1,24 @@
+.. Apache Qpid Proton documentation master file, created by
+   sphinx-quickstart on Mon Feb 16 14:13:09 2015.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to Apache Qpid Proton's documentation!
+==============================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   tutorial
+   overview
+   reference
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/overview.txt
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/overview.txt?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/overview.txt
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/overview.txt
 Tue May 26 15:10:12 2015
@@ -0,0 +1,161 @@
+############
+API Overview
+############
+
+=========================
+An overview of the model
+=========================
+
+Messages are transferred between connected peers over 'links'. At the
+sending peer the link is called a sender. At the receiving peer it is
+called a receiver. Messages are sent by senders and received by
+receivers. Links may have named 'source' and 'target' addresses (for
+example to identify the queue from which message were to be received
+or to which they were to be sent).
+
+Links are established over sessions. Sessions are established over
+connections. Connections are (generally) established between two
+uniquely identified containers. Though a connection can have multiple
+sessions, often this is not needed. The container API allows you to
+ignore sessions unless you actually require them.
+
+The sending of a message over a link is called a delivery. The message
+is the content sent, including all meta-data such as headers and
+annotations. The delivery is the protocol exchange associated with the
+transfer of that content.
+
+To indicate that a delivery is complete, either the sender or the
+receiver 'settles' it. When the other side learns that it has been
+settled, they will no longer communicate about that delivery. The
+receiver can also indicate whether they accept or reject the
+message.
+
+Three different delivery levels or 'guarantees' can be achieved:
+at-most-once, at-least-once or exactly-once. See
+:ref:`delivery-guarantees` for more detail.
+
+=======================================================
+A summary of the most commonly used classes and members
+=======================================================
+
+A brief summary of some of the key classes follows. A more complete
+reference is available in :doc:`reference`.
+
+The :py:class:`~proton.reactor.Container` class is a convenient entry
+point into the API, allowing connections and links to be
+established. Applications are structured as one or more event
+handlers. Handlers can be set at Container, Connection, or Link
+scope. Messages are sent by establishing an approprate sender and
+invoking its :py:meth:`~proton.Sender.send()` method. This is
+typically done when the sender is sendable, a condition indicated by
+the :py:meth:`~proton.handlers.MessagingHandler.on_sendable()` event, to
+avoid execessive build up of messages. Messages can be received by
+establishing an appropriate receiver and handling the
+:py:meth:`~proton.handlers.MessagingHandler.on_message()` event.
+
+.. autoclass:: proton.reactor.Container
+    :show-inheritance: proton.reactor.Reactor
+    :members: connect, create_receiver, create_sender, run, schedule
+    :undoc-members:
+
+    .. py:attribute:: container_id
+
+       The identifier used to identify this container in any
+       connections it establishes. Container names should be
+       unique. By default a UUID will be used.
+
+    The :py:meth:`~proton.reactor.Container.connect()` method returns
+    an instance of :py:class:`~proton.Connection`, the
+    :py:meth:`~proton.reactor.Container.create_receiver()` method
+    returns an instance of :py:class:`~proton.Receiver` and the
+    :py:meth:`~proton.reactor.Container.create_sender()` method
+    returns an instance of :py:class:`~proton.Sender`.
+
+.. autoclass:: proton.Connection
+    :members: open, close, state, session, hostname, container,
+              remote_container, remote_desired_capabilities, remote_hostname, 
remote_offered_capabilities , remote_properties
+    :undoc-members:
+
+.. autoclass:: proton.Receiver
+    :show-inheritance: proton.Link
+    :members: flow, recv, drain, draining
+    :undoc-members:
+
+.. autoclass:: proton.Sender
+    :show-inheritance: proton.Link
+    :members: offered, send
+    :undoc-members:
+
+.. autoclass:: proton.Link
+    :members: name, state, is_sender, is_receiver,
+              credit, queued, session, connection,
+              source, target, remote_source, remote_target
+    :undoc-members:
+
+    The :py:meth:`~proton.Link.source()`,
+    :py:meth:`~proton.Link.target()`,
+    :py:meth:`~proton.Link.remote_source()` and
+    :py:meth:`~proton.Link.remote_target()` methods all return an
+    instance of :py:class:`~proton.Terminus`.
+
+
+.. autoclass:: proton.Delivery
+    :members: update, settle, settled, remote_state, local_state, partial, 
readable, writable,
+              link, session, connection
+    :undoc-members:
+
+.. autoclass:: proton.handlers.MessagingHandler
+    :members: on_start, on_reactor_init,
+              on_message,
+              on_accepted,
+              on_rejected,
+              on_settled,
+              on_sendable,
+              on_connection_error,
+              on_link_error,
+              on_session_error,
+              on_disconnected,
+              accept, reject, release, settle
+    :undoc-members:
+
+.. autoclass:: proton.Event
+    :members: delivery, link, receiver, sender, session, connection, reactor, 
context
+    :undoc-members:
+
+.. autoclass:: proton.Message
+    :members: address, id, priority, subject, ttl, reply_to, correlation_id, 
durable, user_id,
+              content_type, content_encoding, creation_time, expiry_time, 
delivery_count, first_acquirer,
+              group_id, group_sequence, reply_to_group_id,
+              send, recv, encode, decode
+    :undoc-members:
+
+.. autoclass:: proton.Terminus
+    :members: address, dynamic, properties, capabilities, filter
+    :undoc-members:
+
+.. _delivery-guarantees:
+
+===================
+Delivery guarantees
+===================
+
+For at-most-once, the sender settles the message as soon as it sends
+it. If the connection is lost before the message is received by the
+receiver, the message will not be delivered.
+
+For at-least-once, the receiver accepts and settles the message on
+receipt. If the connection is lost before the sender is informed of
+the settlement, then the delivery is considered in-doubt and should be
+retried. This will ensure it eventually gets delivered (provided of
+course the connection and link can be reestablished). It may mean that
+it is delivered multiple times though.
+
+Finally, for exactly-once, the receiver accepts the message but
+doesn't settle it. The sender settles once it is aware that the
+receiver accepted it. In this way the receiver retains knowledge of an
+accepted message until it is sure the sender knows it has been
+accepted. If the connection is lost before settlement, the receiver
+informs the sender of all the unsettled deliveries it knows about, and
+from this the sender can deduce which need to be redelivered. The
+sender likewise informs the receiver which deliveries it knows about,
+from which the receiver can deduce which have already been settled.

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/reference.txt
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/reference.txt?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/reference.txt
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/reference.txt
 Tue May 26 15:10:12 2015
@@ -0,0 +1,44 @@
+#############
+API Reference
+#############
+
+proton Package
+==============
+
+:mod:`proton` Package
+---------------------
+
+.. automodule:: proton.__init__
+    :noindex:
+    :members:
+    :undoc-members:
+    :show-inheritance:
+    :exclude-members: Messenger, Url
+
+:mod:`reactor` Module
+---------------------
+
+.. automodule:: proton.reactor
+    :noindex:
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+:mod:`handlers` Module
+----------------------
+
+.. automodule:: proton.handlers
+    :noindex:
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+:mod:`utils` Module
+-------------------
+
+.. automodule:: proton.utils
+    :noindex:
+    :members:
+    :undoc-members:
+    :show-inheritance:
+

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/tutorial.txt
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/tutorial.txt?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/tutorial.txt
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_sources/tutorial.txt
 Tue May 26 15:10:12 2015
@@ -0,0 +1,301 @@
+########
+Tutorial
+########
+
+============
+Hello World!
+============
+
+Tradition dictates that we start with hello world! However rather than
+simply striving for the shortest program possible, we'll aim for a
+more illustrative example while still restricting the functionality to
+sending and receiving a single message.
+
+.. literalinclude:: ../../../../../examples/python/helloworld.py
+   :lines: 21-
+   :linenos:
+
+You can see the import of :py:class:`~proton.reactor.Container` from 
``proton.reactor`` on the
+second line. This is a class that makes programming with proton a
+little easier for the common cases. It includes within it an event
+loop, and programs written using this utility are generally structured
+to react to various events. This reactive style is particularly suited
+to messaging applications.
+
+To be notified of a particular event, you define a class with the
+appropriately name method on it. That method is then called by the
+event loop when the event occurs.
+
+We define a class here, ``HelloWorld``, which handles the key events of
+interest in sending and receiving a message.
+
+The ``on_start()`` method is called when the event loop first
+starts. We handle that by establishing our connection (line 12), a
+sender over which to send the message (line 13) and a receiver over
+which to receive it back again (line 14).
+
+The ``on_sendable()`` method is called when message can be transferred
+over the associated sender link to the remote peer. We send out our
+``Hello World!`` message (line 17), then close the sender (line 18) as
+we only want to send one message. The closing of the sender will
+prevent further calls to ``on_sendable()``.
+
+The ``on_message()`` method is called when a message is
+received. Within that we simply print the body of the message (line
+21) and then close the connection (line 22).
+
+Now that we have defined the logic for handling these events, we
+create an instance of a :py:class:`~proton.reactor.Container`, pass it
+our handler and then enter the event loop by calling
+:py:meth:`~proton.reactor.Container.run()`. At this point control
+passes to the container instance, which will make the appropriate
+callbacks to any defined handlers.
+
+To run the example you will need to have a broker (or similar)
+accepting connections on that url either with a queue (or topic)
+matching the given address or else configured to create such a queue
+(or topic) dynamically. There is a simple broker.py script included
+alongside the examples that can be used for this purpose if
+desired. (It is also written using the API described here, and as such
+gives an example of a slightly more involved application).
+
+====================
+Hello World, Direct!
+====================
+
+Though often used in conjunction with a broker, AMQP does not
+*require* this. It also allows senders and receivers can communicate
+directly if desired.
+
+Let's modify our example to demonstrate this.
+
+.. literalinclude:: ../../../../../examples/python/helloworld_direct.py
+   :lines: 21-
+   :emphasize-lines: 11,21-22,24-25
+   :linenos:
+
+The first difference, on line 11, is that rather than creating a
+receiver on the same connection as our sender, we listen for incoming
+connections by invoking the
+:py:meth:`~proton.reactor.Container.listen()` method on the
+container.
+
+As we only need then to initiate one link, the sender, we can do that
+by passing in a url rather than an existing connection, and the
+connection will also be automatically established for us.
+
+We send the message in response to the ``on_sendable()`` callback and
+print the message out in response to the ``on_message()`` callback
+exactly as before.
+
+However we also handle two new events. We now close the connection
+from the senders side once the message has been accepted (line
+22). The acceptance of the message is an indication of successful
+transfer to the peer. We are notified of that event through the
+``on_accepted()`` callback. Then, once the connection has been closed,
+of which we are notified through the ``on_closed()`` callback, we stop
+accepting incoming connections (line 25) at which point there is no
+work to be done and the event loop exits, and the run() method will
+return.
+
+So now we have our example working without a broker involved!
+
+=============================
+Asynchronous Send and Receive
+=============================
+
+Of course, these ``HelloWorld!`` examples are very artificial,
+communicating as they do over a network connection but with the same
+process. A more realistic example involves communication between
+separate processes (which could indeed be running on completely
+separate machines).
+
+Let's separate the sender from the receiver, and let's transfer more than
+a single message between them.
+
+We'll start with a simple sender.
+
+.. literalinclude:: ../../../../../examples/python/simple_send.py
+   :lines: 21-
+   :linenos:
+
+As with the previous example, we define the application logic in a
+class that handles various events. As before, we use the
+``on_start()`` event to establish our sender link over which we will
+transfer messages and the ``on_sendable()`` event to know when we can
+transfer our messages.
+
+Because we are transferring more than one message, we need to keep
+track of how many we have sent. We'll use a ``sent`` member variable
+for that. The ``total`` member variable will hold the number of
+messages we want to send.
+
+AMQP defines a credit-based flow control mechanism. Flow control
+allows the receiver to control how many messages it is prepared to
+receive at a given time and thus prevents any component being
+overwhelmed by the number of messages it is sent.
+
+In the ``on_sendable()`` callback, we check that our sender has credit
+before sending messages. We also check that we haven't already sent
+the required number of messages.
+
+The ``send()`` call on line 20 is of course asynchronous. When it
+returns the message has not yet actually been transferred across the
+network to the receiver. By handling the ``on_accepted()`` event, we
+can get notified when the receiver has received and accepted the
+message. In our example we use this event to track the confirmation of
+the messages we have sent. We only close the connection and exit when
+the receiver has received all the messages we wanted to send.
+
+If we are disconnected after a message is sent and before it has been
+confirmed by the receiver, it is said to be ``in doubt``. We don't
+know whether or not it was received. In this example, we will handle
+that by resending any in-doubt messages. This is known as an
+'at-least-once' guarantee, since each message should eventually be
+received at least once, though a given message may be received more
+than once (i.e. duplicates are possible). In the ``on_disconnected()``
+callback, we reset the sent count to reflect only those that have been
+confirmed. The library will automatically try to reconnect for us, and
+when our sender is sendable again, we can restart from the point we
+know the receiver got to.
+
+Now let's look at the corresponding receiver:
+
+.. literalinclude:: ../../../../../examples/python/simple_recv.py
+   :lines: 21-
+   :linenos:
+
+Here we handle the ``on_start()`` by creating our receiver, much like
+we did for the sender. We also handle the ``on_message()`` event for
+received messages and print the message out as in the ``Hello World!``
+examples. However we add some logic to allow the receiver to wait for
+a given number of messages, then to close the connection and exit. We
+also add some logic to check for and ignore duplicates, using a simple
+sequential id scheme.
+
+Again, though sending between these two examples requires some sort of
+intermediary process (e.g. a broker), AMQP allows us to send messages
+directly between two processes without this if we so wish. In that
+case one or other of the processes needs to accept incoming socket
+connections. Let's create a modified version of the receiving example
+that does this:
+
+.. literalinclude:: ../../../../../examples/python/direct_recv.py
+   :lines: 21-
+   :emphasize-lines: 13,25
+   :linenos:
+
+There are only two differences here. On line 13, instead of initiating
+a link (and implicitly a connection), we listen for incoming
+connections. On line 25, when we have received all the expected
+messages, we then stop listening for incoming connections by closing
+the acceptor object.
+
+You can use the original send example now to send to this receiver
+directly. (Note: you will need to stop any broker that is listening on
+the 5672 port, or else change the port used by specifying a different
+address to each example via the -a command line switch).
+
+We could equally well modify the original sender to allow the original
+receiver to connect to it. Again that just requires two modifications:
+
+.. literalinclude:: ../../../../../examples/python/direct_send.py
+   :lines: 21-
+   :emphasize-lines: 15,28
+   :linenos:
+
+As with the modified receiver, instead of initiating establishment of
+a link, we listen for incoming connections on line 15 and then on line
+28, when we have received confirmation of all the messages we sent, we
+can close the acceptor in order to exit. The symmetry in the
+underlying AMQP that enables this is quite unique and elegant, and in
+reflecting this the proton API provides a flexible toolkit for
+implementing all sorts of interesting intermediaries (the broker.py
+script provided as a simple broker for testing purposes provides an
+example of this).
+
+To try this modified sender, run the original receiver against it.
+
+================
+Request/Response
+================
+
+A common pattern is to send a request message and expect a response
+message in return. AMQP has special support for this pattern. Let's
+have a look at a simple example. We'll start with the 'server',
+i.e. the program that will process the request and send the
+response. Note that we are still using a broker in this example.
+
+Our server will provide a very simple service: it will respond with
+the body of the request converted to uppercase.
+
+.. literalinclude:: ../../../../../examples/python/server.py
+   :lines: 21-
+   :linenos:
+
+The code here is not too different from the simple receiver
+example. When we receive a request however, we look at the
+:py:attr:`~proton.Message.reply_to` address on the
+:py:class:`~proton.Message` and create a sender for that over which to
+send the response. We'll cache the senders incase we get further
+requests with the same reply_to.
+
+Now let's create a simple client to test this service out.
+
+.. literalinclude:: ../../../../../examples/python/client.py
+   :lines: 21-
+   :linenos:
+
+As well as sending requests, we need to be able to get back the
+responses. We create a receiver for that (see line 14), but we don't
+specify an address, we set the dynamic option which tells the broker
+we are connected to to create a temporary address over which we can
+receive our responses.
+
+We need to use the address allocated by the broker as the reply_to
+address of our requests, so we can't send them until the broker has
+confirmed our receiving link has been set up (at which point we will
+have our allocated address). To do that, we add an
+``on_link_opened()`` method to our handler class, and if the link
+associated with event is the receiver, we use that as the trigger to
+send our first request.
+
+Again, we could avoid having any intermediary process here if we
+wished. The following code implementas a server to which the client
+above could connect directly without any need for a broker or similar.
+
+.. literalinclude:: ../../../../../examples/python/server_direct.py
+   :lines: 21-
+   :linenos:
+
+Though this requires some more extensive changes than the simple
+sending and receiving examples, the essence of the program is still
+the same. Here though, rather than the server establishing a link for
+the response, it relies on the link that the client established, since
+that now comes in directly to the server process.
+
+Miscellaneous
+=============
+
+Many brokers offer the ability to consume messages based on a
+'selector' that defines which messages are of interest based on
+particular values of the headers. The following example shows how that
+can be achieved:
+
+.. literalinclude:: ../../../../../examples/python/selected_recv.py
+   :lines: 21-
+   :emphasize-lines: 10
+   :linenos:
+
+When creating the receiver, we specify a Selector object as an
+option. The options argument can take a single object or a
+list. Another option that is sometimes of interest when using a broker
+is the ability to 'browse' the messages on a queue, rather than
+consumig them. This is done in AMQP by specifying a distribution mode
+of 'copy' (instead of 'move' which is the expected default for
+queues). An example of that is shown next:
+
+.. literalinclude:: ../../../../../examples/python/queue_browser.py
+   :lines: 21-
+   :emphasize-lines: 10
+   :linenos:

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/ajax-loader.gif
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/ajax-loader.gif?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/ajax-loader.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/basic.css
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/basic.css?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/basic.css
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/basic.css
 Tue May 26 15:10:12 2015
@@ -0,0 +1,540 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- 
*/
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- 
*/
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- 
*/
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    width: 30px;
+}
+
+img {
+    border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- 
*/
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ 
*/
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- 
*/
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- 
*/
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- 
*/
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- 
*/
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- 
*/
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- 
*/
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- 
*/
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlighted {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.refcount {
+    color: #060;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- 
*/
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- 
*/
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- 
*/
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-bright.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-bright.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-bright.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-close.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-close.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment-close.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/comment.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/contents.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/contents.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/contents.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/doctools.js
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/doctools.js?rev=1681771&view=auto
==============================================================================
--- 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/doctools.js
 (added)
+++ 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/doctools.js
 Tue May 26 15:10:12 2015
@@ -0,0 +1,247 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+    "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+};
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, 
text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this);
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initIndexTable();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + 
')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlighted');
+        });
+      }, 10);
+      $('<p class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+          .appendTo($('#searchbox'));
+    }
+  },
+
+  /**
+   * init the domain index toggle buttons
+   */
+  initIndexTable : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      $('tr.cg-' + idnum).toggle();
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('#searchbox .highlight-link').fadeOut(300);
+    $('span.highlighted').removeClass('highlighted');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down-pressed.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down-pressed.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down-pressed.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/down.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/file.png
URL: 
http://svn.apache.org/viewvc/qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/file.png?rev=1681771&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
qpid/site/docs/releases/qpid-proton-0.9.1/proton/python/tutorial/_static/file.png
------------------------------------------------------------------------------
    svn:mime-type = image/png



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to