[Pkg-privacy-commits] [Git][pkg-privacy-team/txtorcon][upstream] New upstream version 22.0.0

Antoine Beaupré (@anarcat) anarcat at debian.org
Mon Mar 21 16:29:41 GMT 2022



Antoine Beaupré pushed to branch upstream at Privacy Maintainers / txtorcon


Commits:
87dd8179 by Antoine Beaupré at 2022-03-21T11:46:01-04:00
New upstream version 22.0.0
- - - - -


25 changed files:

- Makefile
- PKG-INFO
- README.rst
- docs/index.rst
- docs/release-checklist.rst
- docs/releases.rst
- examples/launch_tor_unix_sockets.py
- examples/launch_tor_with_simplehttpd.py
- examples/readme.py
- examples/readme2.py
- examples/stream_circuit_logger.py
- examples/web_client_custom_circuit.py
- examples/web_onion_service_aiohttp.py
- examples/web_onion_service_ephemeral_auth.py
- examples/web_onion_service_ephemeral_nonanon.py
- examples/web_onion_service_ephemeral_unix.py
- examples/web_onion_service_prop224.py
- setup.py
- test/test_endpoints.py
- test/test_util.py
- test/test_web.py
- txtorcon.egg-info/PKG-INFO
- txtorcon/_metadata.py
- txtorcon/socks.py
- txtorcon/torinfo.py


Changes:

=====================================
Makefile
=====================================
@@ -1,6 +1,6 @@
 .PHONY: test html counts coverage sdist clean install doc integration diagrams
 default: test
-VERSION = 20.0.0
+VERSION = 22.0.0
 
 test:
 	PYTHONPATH=. trial --reporter=text test


=====================================
PKG-INFO
=====================================
@@ -1,162 +1,11 @@
 Metadata-Version: 2.1
 Name: txtorcon
-Version: 20.0.0
+Version: 22.0.0
 Summary:      Twisted-based Tor controller client, with state-tracking and     configuration abstractions.     https://txtorcon.readthedocs.org     https://github.com/meejah/txtorcon 
 Home-page: https://github.com/meejah/txtorcon
 Author: meejah
 Author-email: meejah at meejah.ca
 License: MIT
-Description: 
-        
-        
-        
-        
-        .. _NOTE: see docs/index.rst for the starting-point
-        .. _ALSO: https://txtorcon.readthedocs.org for rendered docs
-        
-        
-        
-        
-        
-        
-        .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master
-            :target: https://www.travis-ci.org/meejah/txtorcon
-            :alt: travis
-        
-        .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png
-            :target: https://coveralls.io/r/meejah/txtorcon
-            :alt: coveralls
-        
-        .. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=master
-            :target: http://codecov.io/github/meejah/txtorcon?branch=master
-            :alt: codecov
-        
-        .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
-            :target: https://txtorcon.readthedocs.io/en/stable
-            :alt: ReadTheDocs
-        
-        .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=latest
-            :target: https://txtorcon.readthedocs.io/en/latest
-            :alt: ReadTheDocs
-        
-        .. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat
-            :target: https://landscape.io/github/meejah/txtorcon/master
-            :alt: Code Health
-        
-        
-        txtorcon
-        ========
-        
-        - **docs**: https://txtorcon.readthedocs.org or http://timaq4ygg2iegci7.onion
-        - **code**: https://github.com/meejah/txtorcon
-        - ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
-        - MIT-licensed;
-        - Python 2.7, PyPy 5.0.0+, Python 3.5+;
-        - depends on
-          `Twisted`_,
-          `Automat <https://github.com/glyph/automat>`_,
-          (and the `ipaddress <https://pypi.python.org/pypi/ipaddress>`_ backport for non Python 3)
-        
-        
-        Ten Thousand Feet
-        -----------------
-        
-        txtorcon is an implementation of the `control-spec
-        <https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt>`_
-        for `Tor <https://www.torproject.org/>`_ using the `Twisted`_
-        networking library for `Python <http://python.org/>`_.
-        
-        This is useful for writing utilities to control or make use of Tor in
-        event-based Python programs. If your Twisted program supports
-        endpoints (like ``twistd`` does) your server or client can make use of
-        Tor immediately, with no code changes. Start your own Tor or connect
-        to one and get live stream, circuit, relay updates; read and change
-        config; monitor events; build circuits; create onion services;
-        etcetera (`ReadTheDocs <https://txtorcon.readthedocs.org>`_).
-        
-        
-        Some Possibly Motivational Example Code
-        ---------------------------------------
-        
-        `download <examples/readme.py>`_
-        (also `python2 style <examples/readme2.py>`_)
-        
-        .. code:: python
-        
-            from twisted.internet.task import react
-            from twisted.internet.defer import inlineCallbacks, ensureDeferred
-            from twisted.internet.endpoints import UNIXClientEndpoint
-        
-            import treq
-            import txtorcon
-        
-        
-            async def main(reactor):
-                tor = await txtorcon.connect(
-                    reactor,
-                    UNIXClientEndpoint(reactor, "/var/run/tor/control")
-                )
-        
-                print("Connected to Tor version {}".format(tor.version))
-        
-                url = u'https://www.torproject.org:443'
-                print(u"Downloading {}".format(repr(url)))
-                resp = await treq.get(url, agent=tor.web_agent())
-        
-                print(u"   {} bytes".format(resp.length))
-                data = await resp.text()
-                print(u"Got {} bytes:\n{}\n[...]{}".format(
-                    len(data),
-                    data[:120],
-                    data[-120:],
-                ))
-        
-                print(u"Creating a circuit")
-                state = await tor.create_state()
-                circ = await state.build_circuit()
-                await circ.when_built()
-                print(u"  path: {}".format(" -> ".join([r.ip for r in circ.path])))
-        
-                print(u"Downloading meejah's public key via above circuit...")
-                config = await tor.get_config()
-                resp = await treq.get(
-                    u'https://meejah.ca/meejah.asc',
-                    agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
-                )
-                data = await resp.text()
-                print(data)
-        
-        
-            @react
-            def _main(reactor):
-                return ensureDeferred(main(reactor))
-        
-        
-        
-        Try It Now On Debian/Ubuntu
-        ---------------------------
-        
-        For example, serve some files via an onion service (*aka* hidden
-        service):
-        
-        .. code-block:: shell-session
-        
-            $ sudo apt-get install --install-suggests python3-txtorcon
-            $ twistd -n web --port "onion:80" --path ~/public_html
-        
-        
-        Read More
-        ---------
-        
-        All the documentation starts `in docs/index.rst
-        <docs/index.rst>`_. Also hosted at `txtorcon.rtfd.org
-        <https://txtorcon.readthedocs.io/en/latest/>`_.
-        
-        You'll want to start with `the introductions <docs/introduction.rst>`_ (`hosted at RTD
-        <https://txtorcon.readthedocs.org/en/latest/introduction.html>`_).
-        
-        .. _Twisted: https://twistedmatrix.com/trac
-        
 Keywords: python,twisted,tor,tor controller
 Platform: UNKNOWN
 Classifier: Framework :: Twisted
@@ -176,3 +25,157 @@ Classifier: Topic :: Internet :: Proxy Servers
 Classifier: Topic :: Internet
 Classifier: Topic :: Security
 Provides-Extra: dev
+License-File: LICENSE
+
+
+
+
+
+
+.. _NOTE: see docs/index.rst for the starting-point
+.. _ALSO: https://txtorcon.readthedocs.org for rendered docs
+
+
+
+
+
+
+.. image:: https://github.com/meejah/txtorcon/actions/workflows/python3.yaml/badge.svg
+    :target: https://github.com/meejah/txtorcon/actions
+    :alt: github-actions
+
+.. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png?branch=main
+    :target: https://coveralls.io/github/meejah/txtorcon?branch=main
+    :alt: coveralls
+
+.. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=main
+    :target: http://codecov.io/github/meejah/txtorcon?branch=main
+    :alt: codecov
+
+.. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
+    :target: https://txtorcon.readthedocs.io/en/stable
+    :alt: ReadTheDocs
+
+.. image:: https://readthedocs.org/projects/txtorcon/badge/?version=latest
+    :target: https://txtorcon.readthedocs.io/en/latest
+    :alt: ReadTheDocs
+
+.. image:: https://landscape.io/github/meejah/txtorcon/main/landscape.svg?style=flat
+    :target: https://landscape.io/github/meejah/txtorcon/main
+    :alt: Code Health
+
+
+txtorcon
+========
+
+- **docs**: https://txtorcon.readthedocs.org or http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/
+- **code**: https://github.com/meejah/txtorcon
+- ``torsocks git clone git://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon.git``
+- MIT-licensed;
+- Python 2.7, PyPy 5.0.0+, Python 3.5+;
+- depends on
+  `Twisted`_,
+  `Automat <https://github.com/glyph/automat>`_,
+  (and the `ipaddress <https://pypi.python.org/pypi/ipaddress>`_ backport for non Python 3)
+
+
+Ten Thousand Feet
+-----------------
+
+txtorcon is an implementation of the `control-spec
+<https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt>`_
+for `Tor <https://www.torproject.org/>`_ using the `Twisted`_
+networking library for `Python <http://python.org/>`_.
+
+This is useful for writing utilities to control or make use of Tor in
+event-based Python programs. If your Twisted program supports
+endpoints (like ``twistd`` does) your server or client can make use of
+Tor immediately, with no code changes. Start your own Tor or connect
+to one and get live stream, circuit, relay updates; read and change
+config; monitor events; build circuits; create onion services;
+etcetera (`ReadTheDocs <https://txtorcon.readthedocs.org>`_).
+
+
+Some Possibly Motivational Example Code
+---------------------------------------
+
+`download <examples/readme.py>`_
+(also `python2 style <examples/readme2.py>`_)
+
+.. code:: python
+
+    from twisted.internet.task import react
+    from twisted.internet.defer import inlineCallbacks, ensureDeferred
+    from twisted.internet.endpoints import UNIXClientEndpoint
+
+    import treq
+    import txtorcon
+
+
+    async def main(reactor):
+        tor = await txtorcon.connect(
+            reactor,
+            UNIXClientEndpoint(reactor, "/var/run/tor/control")
+        )
+
+        print("Connected to Tor version {}".format(tor.version))
+
+        url = u'https://www.torproject.org:443'
+        print(u"Downloading {}".format(repr(url)))
+        resp = await treq.get(url, agent=tor.web_agent())
+
+        print(u"   {} bytes".format(resp.length))
+        data = await resp.text()
+        print(u"Got {} bytes:\n{}\n[...]{}".format(
+            len(data),
+            data[:120],
+            data[-120:],
+        ))
+
+        print(u"Creating a circuit")
+        state = await tor.create_state()
+        circ = await state.build_circuit()
+        await circ.when_built()
+        print(u"  path: {}".format(" -> ".join([r.ip for r in circ.path])))
+
+        print(u"Downloading meejah's public key via above circuit...")
+        config = await tor.get_config()
+        resp = await treq.get(
+            u'https://meejah.ca/meejah.asc',
+            agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
+        )
+        data = await resp.text()
+        print(data)
+
+
+    @react
+    def _main(reactor):
+        return ensureDeferred(main(reactor))
+
+
+
+Try It Now On Debian/Ubuntu
+---------------------------
+
+For example, serve some files via an onion service (*aka* hidden
+service):
+
+.. code-block:: shell-session
+
+    $ sudo apt-get install --install-suggests python3-txtorcon
+    $ twistd -n web --port "onion:80" --path ~/public_html
+
+
+Read More
+---------
+
+All the documentation starts `in docs/index.rst
+<docs/index.rst>`_. Also hosted at `txtorcon.rtfd.org
+<https://txtorcon.readthedocs.io/en/latest/>`_.
+
+You'll want to start with `the introductions <docs/introduction.rst>`_ (`hosted at RTD
+<https://txtorcon.readthedocs.org/en/latest/introduction.html>`_).
+
+.. _Twisted: https://twistedmatrix.com/trac
+
+


=====================================
README.rst
=====================================
@@ -11,16 +11,16 @@
 
 
 
-.. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master
-    :target: https://www.travis-ci.org/meejah/txtorcon
-    :alt: travis
+.. image:: https://github.com/meejah/txtorcon/actions/workflows/python3.yaml/badge.svg
+    :target: https://github.com/meejah/txtorcon/actions
+    :alt: github-actions
 
-.. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png
-    :target: https://coveralls.io/r/meejah/txtorcon
+.. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png?branch=main
+    :target: https://coveralls.io/github/meejah/txtorcon?branch=main
     :alt: coveralls
 
-.. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=master
-    :target: http://codecov.io/github/meejah/txtorcon?branch=master
+.. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=main
+    :target: http://codecov.io/github/meejah/txtorcon?branch=main
     :alt: codecov
 
 .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
@@ -31,17 +31,17 @@
     :target: https://txtorcon.readthedocs.io/en/latest
     :alt: ReadTheDocs
 
-.. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat
-    :target: https://landscape.io/github/meejah/txtorcon/master
+.. image:: https://landscape.io/github/meejah/txtorcon/main/landscape.svg?style=flat
+    :target: https://landscape.io/github/meejah/txtorcon/main
     :alt: Code Health
 
 
 txtorcon
 ========
 
-- **docs**: https://txtorcon.readthedocs.org or http://timaq4ygg2iegci7.onion
+- **docs**: https://txtorcon.readthedocs.org or http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/
 - **code**: https://github.com/meejah/txtorcon
-- ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
+- ``torsocks git clone git://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon.git``
 - MIT-licensed;
 - Python 2.7, PyPy 5.0.0+, Python 3.5+;
 - depends on


=====================================
docs/index.rst
=====================================
@@ -10,14 +10,14 @@ txtorcon
    - clearnet: https://txtorcon.readthedocs.org
 - **code**: https://github.com/meejah/txtorcon
 - ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
-- .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master
+- .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=main
       :target: https://www.travis-ci.org/meejah/txtorcon
 
   .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.svg
       :target: https://coveralls.io/r/meejah/txtorcon
 
-  .. image:: https://codecov.io/gh/meejah/txtorcon/branch/master/graphs/badge.svg?branch=master
-      :target: https://codecov.io/github/meejah/txtorcon?branch=master
+  .. image:: https://codecov.io/gh/meejah/txtorcon/branch/main/graphs/badge.svg?branch=main
+      :target: https://codecov.io/github/meejah/txtorcon?branch=main
 
   .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
       :target: https://txtorcon.readthedocs.io/en/stable
@@ -27,8 +27,8 @@ txtorcon
       :target: https://txtorcon.readthedocs.io/en/latest
       :alt: ReadTheDocs
 
-  .. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat
-      :target: https://landscape.io/github/meejah/txtorcon/master
+  .. image:: https://landscape.io/github/meejah/txtorcon/main/landscape.svg?style=flat
+      :target: https://landscape.io/github/meejah/txtorcon/main
       :alt: Code Health
 
 .. container:: first_time


=====================================
docs/release-checklist.rst
=====================================
@@ -1,8 +1,8 @@
 Release Checklist
 =================
 
-* ensure local copy is on master, up-to-date:
-   * git checkout master
+* ensure local copy is on main, up-to-date:
+   * git checkout main
    * git pull
 
 * double-check version updated, sadly in a few places:
@@ -23,7 +23,7 @@ Release Checklist
    * update heading, date
 
 * on both signing-machine and build-machine shells:
-   * export VERSION=20.0.0
+   * export VERSION=22.0.0
 
 * (if on signing machine) "make dist" and "make dist-sigs"
    * creates:
@@ -94,7 +94,7 @@ Release Checklist
 
 * copy release announcement to signing machine, update code
    * (from dev machine: "git push pangea")
-   * git checkout master
+   * git checkout main
    * git pull
 
 * create signed tag
@@ -117,7 +117,7 @@ Release Checklist
       * make sure BOTH the .tar.gz and .tar.gz.asc (ditto for .whl) are in the dist/ directory first!!)
       * ls dist/txtorcon-${VERSION}*
       * note this depends on a ~/.pypirc file with [server-login] section containing "username:" and "password:"
-   * git push origin master
+   * git push origin main
    * git push origin v${VERSION}
    * to github: use web-upload interface to upload the 4 files (both dists, both signature)
 


=====================================
docs/releases.rst
=====================================
@@ -4,7 +4,7 @@ Releases
 ========
 
 There isn't a "release schedule" in any sense. If there is something
-in master your project depends upon, let me know and I'll do a
+in main your project depends upon, let me know and I'll do a
 release.
 
 txtorcon follows `calendar versioning <http://calver.org/>`_ with the
@@ -15,7 +15,36 @@ that will be "19.2.1".
 
 See also :ref:`api_stability`.
 
-`git master <https://github.com/meejah/txtorcon>`_ *will likely become v20.1.0*
+`git main <https://github.com/meejah/txtorcon>`_ *will likely become v21.1.0*
+
+v22.0.0
+-------
+
+March 16, 2022
+
+ * `txtorcon-22.0.0.tar.gz <http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-22.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/22.0.0>`_ (:download:`local-sig </../signatues/txtorcon-22.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-22.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v22.0.0.tar.gz>`_)
+ * Use GitHub Action for CI (instead of Travis)
+ * fix coveralls uploading of coverage
+
+
+v21.1.0
+-------
+
+August 16, 2021
+
+ * `txtorcon-21.1.0.tar.gz <http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-21.1.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/21.1.0>`_ (:download:`local-sig </../signatues/txtorcon-21.1.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-21.1.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v21.1.0.tar.gz>`_)
+ * Fix some incorrect unit-test skipping logic (thanks `@exarkun <https://github.com/exarkun>`, `#354 <https://github.com/meejah/txtorcon/issues/354>`_ and `#352 <https://github.com/meejah/txtorcon/issues/352>`_)
+ * Fix broken tests revealed by previous fixes (thanks `@exarkun <https://github.com/exarkun>`, `#356 <https://github.com/meejah/txtorcon/issues/356>`_
+
+
+v21.0.0
+-------
+
+August 7, 2021
+
+ * `txtorcon-21.0.0.tar.gz <http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-21.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/21.0.0>`_ (:download:`local-sig </../signatues/txtorcon-21.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-21.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v21.0.0.tar.gz>`_)
+ * Use GitHub Actions instead of Travis for CI
+ * fix Python 3.x+ bug with `TorInfo` and `__class__` access (`#350 <https://github.com/meejah/txtorcon/issues/350>`_)
 
 
 v20.0.0
@@ -35,7 +64,7 @@ v19.1.0
 
 September 10, 2019
 
- * `txtorcon-19.1.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-19.1.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/19.1.0>`_ (:download:`local-sig </../signatues/txtorcon-19.1.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-19.1.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v19.1.0.tar.gz>`_)
+ * `txtorcon-19.1.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-19.1.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/19.1.0>`_ (:download:`local-sig </../signatues/txtorcon-19.1.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.1.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v19.1.0.tar.gz>`_)
 
  * `TorControlProtocol.on_disconnect` is deprecated in favour of
    :func:`TorControlProtocol.when_disconnected`
@@ -54,7 +83,7 @@ v19.0.0
 
 January 15, 2019
 
- * `txtorcon-19.0.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-19.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/19.0.0>`_ (:download:`local-sig </../signatues/txtorcon-19.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-19.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v19.0.0.tar.gz>`_)
+ * `txtorcon-19.0.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-19.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/19.0.0>`_ (:download:`local-sig </../signatues/txtorcon-19.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v19.0.0.tar.gz>`_)
  * add :func:`TorControlProtocol.when_disconnected` (will replace `.on_disconnect`)
  * add `detach=` kwarg to :func:`Tor.create_onion_service`
  * add `purpose=` kwarg to :func:`TorState.build_circuit`
@@ -63,14 +92,14 @@ January 15, 2019
 v18.3.0
 -------
 
- * `txtorcon-18.3.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.3.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.3.0>`_ (:download:`local-sig </../signatues/txtorcon-18.3.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.3.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.3.0.tar.gz>`_)
+ * `txtorcon-18.3.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.3.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.3.0>`_ (:download:`local-sig </../signatues/txtorcon-18.3.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.3.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.3.0.tar.gz>`_)
  * add `singleHop={true,false}` for endpoint-strings as well
 
 
 v18.2.0
 -------
 
- * `txtorcon-18.2.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.2.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.2.0>`_ (:download:`local-sig </../signatues/txtorcon-18.2.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.2.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.2.0.tar.gz>`_)
+ * `txtorcon-18.2.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.2.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.2.0>`_ (:download:`local-sig </../signatues/txtorcon-18.2.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.2.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.2.0.tar.gz>`_)
  * add `privateKeyFile=` option to endpoint parser (ticket 313)
  * use `privateKey=` option properly in endpoint parser
  * support `NonAnonymous` mode for `ADD_ONION` via `single_hop=` kwarg
@@ -81,7 +110,7 @@ v18.1.0
 
 September 26, 2018
 
- * `txtorcon-18.1.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.1.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.1.0>`_ (:download:`local-sig </../signatues/txtorcon-18.1.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.1.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.1.0.tar.gz>`_)
+ * `txtorcon-18.1.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.1.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.1.0>`_ (:download:`local-sig </../signatues/txtorcon-18.1.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.1.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.1.0.tar.gz>`_)
  * better error-reporting (include REASON and REMOTE_REASON if
    available) when circuit-builds fail (thanks `David Stainton
    <https://github.com/david415>`_)
@@ -100,7 +129,7 @@ v18.0.2
 
 July 2, 2018
 
- * `txtorcon-18.0.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.2>`_ (:download:`local-sig </../signatues/txtorcon-18.0.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.0.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.2.tar.gz>`_)
+ * `txtorcon-18.0.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.2>`_ (:download:`local-sig </../signatues/txtorcon-18.0.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.2.tar.gz>`_)
  * Python3.4 doesn't support async-def or await
 
 
@@ -109,7 +138,7 @@ v18.0.1
 
 June 30, 2018
 
- * `txtorcon-18.0.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.1>`_ (:download:`local-sig </../signatues/txtorcon-18.0.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.0.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.1.tar.gz>`_)
+ * `txtorcon-18.0.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.1>`_ (:download:`local-sig </../signatues/txtorcon-18.0.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.1.tar.gz>`_)
  * fix a Python2/3 regression when parsing onion services
 
 
@@ -118,7 +147,7 @@ v18.0.0
 
 June 21, 2018
 
- * `txtorcon-18.0.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.0>`_ (:download:`local-sig </../signatues/txtorcon-18.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-18.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.0.tar.gz>`_)
+ * `txtorcon-18.0.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-18.0.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.0>`_ (:download:`local-sig </../signatues/txtorcon-18.0.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v18.0.0.tar.gz>`_)
 
  * `await_all_uploads` options when creating Onions
  * properly re-map progress percentages (including descriptor uploads)
@@ -192,7 +221,7 @@ v0.20.0
 
 February 22, 2018
 
- * `txtorcon-0.20.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.20.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.20.0>`_ (:download:`local-sig </../signatues/txtorcon-0.20.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.20.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.20.0.tar.gz>`_)
+ * `txtorcon-0.20.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.20.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.20.0>`_ (:download:`local-sig </../signatues/txtorcon-0.20.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.20.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.20.0.tar.gz>`_)
 
  * doc fixes from `hotelzululima <https://twitter.com/hotelzululima>`_
  * fix endpoints so `.connect` on them works properly more than once
@@ -213,7 +242,7 @@ v0.19.3
 
 May 24, 2017
 
- * `txtorcon-0.19.3.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.3.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.3>`_ (:download:`local-sig </../signatues/txtorcon-0.19.3.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.19.3.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.3.tar.gz>`_)
+ * `txtorcon-0.19.3.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.3.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.3>`_ (:download:`local-sig </../signatues/txtorcon-0.19.3.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.3.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.3.tar.gz>`_)
 
  * Incorrect parsing of SocksPort options (see `Issue 237 <https://github.com/meejah/txtorcon/issues/237>`_)
 
@@ -223,7 +252,7 @@ v0.19.2
 
 May 11, 2017
 
- * `txtorcon-0.19.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.2>`_ (:download:`local-sig </../signatues/txtorcon-0.19.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.19.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.2.tar.gz>`_)
+ * `txtorcon-0.19.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.2>`_ (:download:`local-sig </../signatues/txtorcon-0.19.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.2.tar.gz>`_)
 
  * Work around a bug in `incremental` (see `Issue 233 <https://github.com/meejah/txtorcon/issues/233>`_)
  * Fix for `Issue 190 <https://github.com/meejah/txtorcon/issues/190>`_ from Felipe Dau.
@@ -235,7 +264,7 @@ v0.19.1
 
 April 26, 2017
 
- * `txtorcon-0.19.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.1>`_ (:download:`local-sig </../signatues/txtorcon-0.19.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.19.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.1.tar.gz>`_)
+ * `txtorcon-0.19.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.1>`_ (:download:`local-sig </../signatues/txtorcon-0.19.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.1.tar.gz>`_)
 
  * Fix a regression in ``launch_tor``, see `Issue 227 <https://github.com/meejah/txtorcon/issues/227>`_
 
@@ -245,7 +274,7 @@ v0.19.0
 
 April 20, 2017
 
- * `txtorcon-0.19.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.0>`_ (:download:`local-sig </../signatues/txtorcon-0.19.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.19.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.0.tar.gz>`_)
+ * `txtorcon-0.19.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.19.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.0>`_ (:download:`local-sig </../signatues/txtorcon-0.19.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.19.0.tar.gz>`_)
 
  * Full Python3 support
  * Drop `txsocksx` and use a custom implementation (this also
@@ -289,7 +318,7 @@ v0.18.0
 
 January 11, 2017
 
- * `txtorcon-0.18.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.18.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.18.0>`_ (:download:`local-sig </../signatues/txtorcon-0.18.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.18.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.18.0.tar.gz>`_)
+ * `txtorcon-0.18.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.18.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.18.0>`_ (:download:`local-sig </../signatues/txtorcon-0.18.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.18.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.18.0.tar.gz>`_)
  * `issue 200 <https://github.com/meejah/txtorcon/issues/200>`_: better feedback if the cookie data can't be read
 
 
@@ -298,7 +327,7 @@ v0.17.0
 
 *October 4, 2016*
 
- * `txtorcon-0.17.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.17.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.17.0>`_ (:download:`local-sig </../signatues/txtorcon-0.17.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.17.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.17.0.tar.gz>`_)
+ * `txtorcon-0.17.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.17.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.17.0>`_ (:download:`local-sig </../signatues/txtorcon-0.17.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.17.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.17.0.tar.gz>`_)
  * `issue 187 <https://github.com/meejah/txtorcon/issues/187>`_: fix unix-socket control endpoints
  * sometimes mapping streams to hostnames wasn't working properly
  * backwards-compatibility API for `socks_hostname` was incorrectly named
@@ -309,7 +338,7 @@ v0.16.1
 
 *August 31, 2016*
 
- * `txtorcon-0.16.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.16.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.16.1>`_ (:download:`local-sig </../signatues/txtorcon-0.16.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.16.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.16.1.tar.gz>`_)
+ * `txtorcon-0.16.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.16.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.16.1>`_ (:download:`local-sig </../signatues/txtorcon-0.16.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.16.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.16.1.tar.gz>`_)
  * `issue 172 <https://github.com/meejah/txtorcon/issues/172>`_: give `TorProcessProtocol` a `.quit` method
  * `issue 181 <https://github.com/meejah/txtorcon/issues/181>`_: enable SOCKS5-over-unix-sockets for TorClientEndpoint (thanks to `david415 <https://github.com/david415>`_
 
@@ -323,7 +352,7 @@ v0.16.0
 v0.15.1
 -------
 
- * `txtorcon-0.15.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.15.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.1>`_ (:download:`local-sig </../signatues/txtorcon-0.15.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.15.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.15.1.tar.gz>`_)
+ * `txtorcon-0.15.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.15.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.1>`_ (:download:`local-sig </../signatues/txtorcon-0.15.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.15.1.tar.gz>`_)
  * fix `issue 179 <https://github.com/meejah/txtorcon/issues/179>`_ with `Circuit.age`.
 
 
@@ -332,7 +361,7 @@ v0.15.0
 
 *July 26, 2016*
 
- * `txtorcon-0.15.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.15.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.0>`_ (:download:`local-sig </../signatues/txtorcon-0.15.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.15.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.15.0.tar.gz>`_)
+ * `txtorcon-0.15.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.15.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.0>`_ (:download:`local-sig </../signatues/txtorcon-0.15.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.15.0.tar.gz>`_)
  * added support for NULL control-port-authentication which is often
    appropriate when used with a UNIX domain socket
  * switched to `ipaddress
@@ -369,7 +398,7 @@ v0.14.2
 
 *December 2, 2015*
 
- * `txtorcon-0.14.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.14.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.2>`_ (:download:`local-sig </../signatues/txtorcon-0.14.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.14.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.14.2.tar.gz>`_)
+ * `txtorcon-0.14.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.14.2.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.2>`_ (:download:`local-sig </../signatues/txtorcon-0.14.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.14.2.tar.gz>`_)
  * compatibility for Twisted 15.5.0 (released on 0.14.x for `OONI <http://ooni.io/>`_)
 
 
@@ -387,7 +416,7 @@ v0.14.0
 
 *September 26, 2015*
 
- * `txtorcon-0.14.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.14.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.0>`_ (:download:`local-sig </../signatues/txtorcon-0.14.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.14.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.14.0.tar.gz>`_)
+ * `txtorcon-0.14.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.14.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.0>`_ (:download:`local-sig </../signatues/txtorcon-0.14.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.14.0.tar.gz>`_)
  * :class:`txtorcon.interface.IStreamAttacher` handling was missing ``None`` and ``DO_NOT_ATTACH`` cases if a Deferred was returned.
  * add ``.is_built`` Deferred to :class:`txtorcon.Circuit` that gets `callback()`d when the circuit becomes BUILT
  * `david415 <https://github.com/david415>`_ ported his ``tor:``
@@ -404,7 +433,7 @@ v0.13.0
 
 *May 10, 2015*
 
- * `txtorcon-0.13.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.13.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.13.0>`_ (:download:`local-sig </../signatues/txtorcon-0.13.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.13.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.13.0.tar.gz>`_)
+ * `txtorcon-0.13.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.13.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.13.0>`_ (:download:`local-sig </../signatues/txtorcon-0.13.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.13.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.13.0.tar.gz>`_)
  * support ``basic`` and ``stealth`` hidden service authorization, and parse ``client_keys`` files.
  * 2x speedup for TorState parsing (mostly by lazy-parsing timestamps)
  * can now parse ~75000 microdescriptors/second per core of 3.4GHz Xeon E3
@@ -421,7 +450,7 @@ v0.12.0
 
 *February 3, 2015*
 
- * `txtorcon-0.12.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.12.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.12.0>`_ (:download:`local-sig </../signatues/txtorcon-0.12.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.12.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.12.0.tar.gz>`_)
+ * `txtorcon-0.12.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.12.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.12.0>`_ (:download:`local-sig </../signatues/txtorcon-0.12.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.12.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.12.0.tar.gz>`_)
  * doc, code and import cleanups from `Kali Kaneko <https://github.com/kalikaneko>`_
  * HiddenServiceDirGroupReadable support
  * Issue #80: honour ``ControlPort 0`` in incoming TorConfig
@@ -448,9 +477,9 @@ v0.11.0
 
 *August 16, 2014*
 
- * September 6, 2015. bugfix release: `txtorcon-0.11.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.11.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.1>`_ (:download:`local-sig </../signatues/txtorcon-0.11.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.11.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.11.1.tar.gz>`_)
+ * September 6, 2015. bugfix release: `txtorcon-0.11.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.11.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.1>`_ (:download:`local-sig </../signatues/txtorcon-0.11.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.11.1.tar.gz>`_)
  * fixed Debian bug `797261 <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=797261>`_ causing 3 tests to fail
- * `txtorcon-0.11.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.11.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.0>`_ (:download:`local-sig </../signatues/txtorcon-0.11.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.11.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.11.0.tar.gz>`_) 
+ * `txtorcon-0.11.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.11.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.0>`_ (:download:`local-sig </../signatues/txtorcon-0.11.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.11.0.tar.gz>`_) 
  * More control for ``launch_tor``: access stdout, stderr in real-time
    and control whether we kill Tor on and stderr output. See issue #79.
  * Warning about ``build_circuit`` being called without a guard first
@@ -465,7 +494,7 @@ v0.10.1
 
 *July 20, 2014*
 
- * `txtorcon-0.10.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.10.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.1>`_ (:download:`local-sig </../signatues/txtorcon-0.10.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.10.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.10.1.tar.gz>`_) 
+ * `txtorcon-0.10.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.10.1.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.1>`_ (:download:`local-sig </../signatues/txtorcon-0.10.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.10.1.tar.gz>`_) 
  * fix bug incorrectly issuing RuntimeError in brief window of time on event-listeners
  * issue #78: Add tox tests and fix for Twisted 12.0.0 (and prior), as this is what Debian squeeze ships
  * issue #77: properly expand relative and tilde paths for ``hiddenServiceDir`` via endpoints
@@ -476,7 +505,7 @@ v0.10.0
 
 *June 15, 2014*
 
- * `txtorcon-0.10.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.10.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.0>`_ (:download:`local-sig </../signatues/txtorcon-0.10.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.10.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.10.0.tar.gz>`_)
+ * `txtorcon-0.10.0.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.10.0.tar.gz>`_ (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.0>`_ (:download:`local-sig </../signatues/txtorcon-0.10.0.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.0.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.10.0.tar.gz>`_)
  * In collaboration with `David Stainton <https://github.com/david415>`_ after a pull-request, we
    have endpoint parser plugins for Twisted! This means code like
    ``serverFromString("onion:80").listen(...)`` is enough to start a
@@ -491,7 +520,7 @@ v0.9.2
 
 *April 23, 2014*
 
- * `txtorcon-0.9.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.9.2.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.9.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.9.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.9.2.tar.gz>`_)
+ * `txtorcon-0.9.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.9.2.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.9.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.9.2.tar.gz>`_)
  * add ``on_disconnect`` callback for TorControlProtocol (no more monkey-patching Protocol API)
  * add ``age()`` method to Circuit
  * add ``time_created`` property to Circuit
@@ -514,7 +543,7 @@ v0.9.1
 
 *January 20, 2014*
 
- * `txtorcon-0.9.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.9.1.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.9.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.9.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.9.1.tar.gz>`_)
+ * `txtorcon-0.9.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.9.1.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.9.1.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.1.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.9.1.tar.gz>`_)
  * put test/ directory at the top level
  * using "`coverage <http://nedbatchelder.com/code/coverage/>`_" tool instead of custom script
  * using `coveralls.io <https://coveralls.io/r/meejah/txtorcon>`_ and `travis-ci <https://travis-ci.org/meejah/txtorcon>`_ for test coverage and continuous integration
@@ -538,7 +567,7 @@ v0.8.2
 
 *November 22, 2013*
 
- * `txtorcon-0.8.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.8.2.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.8.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.8.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.8.2.tar.gz>`_)
+ * `txtorcon-0.8.2.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.8.2.tar.gz>`_ (:download:`local-sig </../signatues/txtorcon-0.8.2.tar.gz.asc>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.2.tar.gz.asc?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.8.2.tar.gz>`_)
  * ensure hidden service server-side endpoints listen only on 127.0.0.1
 
 
@@ -547,7 +576,7 @@ v0.8.1
 
 *May 13, 2013*
 
- * `txtorcon-0.8.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.8.1.tar.gz>`_ (:download:`local-sign </../signatues/txtorcon-0.8.1.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.8.1.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.8.1.tar.gz>`_)
+ * `txtorcon-0.8.1.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.8.1.tar.gz>`_ (:download:`local-sign </../signatues/txtorcon-0.8.1.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.1.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/archive/v0.8.1.tar.gz>`_)
  * fixed improper import in setup.py preventing 0.8.0 from installing
  * signatures with proper subkey this time
  * Proper file-flushing in tests and PyPy fixes from Lukas Lueg
@@ -578,7 +607,7 @@ v0.7
 
 *November 21, 2012*
 
- * `txtorcon-0.7.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.7.tar.gz>`_ (:download:`local-sig <../signatues/txtorcon-0.7.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.7.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/tarball/v0.7>`_)
+ * `txtorcon-0.7.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.7.tar.gz>`_ (:download:`local-sig <../signatues/txtorcon-0.7.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.7.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/tarball/v0.7>`_)
  * `issue #20 <https://github.com/meejah/txtorcon/issues/20>`_ config object now hooked up correctly after launch_tor();
  * `patch <https://github.com/meejah/txtorcon/pull/22>`_ from hellais for properly handling data_dir given to TCPHiddenServiceEndpoint;
  * `.tac example <https://github.com/meejah/txtorcon/pull/19>`_ from mmaker;
@@ -589,7 +618,7 @@ v0.6
 
 *October 10, 2012*
 
- * `txtorcon-0.6.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.6.tar.gz>`_ (:download:`local-sig <../signatues/txtorcon-0.6.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/master/signatues/txtorcon-0.6.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/tarball/v0.6>`_)
+ * `txtorcon-0.6.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.6.tar.gz>`_ (:download:`local-sig <../signatues/txtorcon-0.6.tar.gz.sig>` or `github-sig <https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.6.tar.gz.sig?raw=true>`_) (`source <https://github.com/meejah/txtorcon/tarball/v0.6>`_)
  * debian packaging (mmaker);
  * psutil fully gone;
  * *changed API* for launch_tor() to use TorConfig instead of args;


=====================================
examples/launch_tor_unix_sockets.py
=====================================
@@ -10,7 +10,6 @@ import sys
 import txtorcon
 import tempfile
 import shutil
-from os import mkdir, chmod
 from os.path import join
 from twisted.web.client import readBody
 from twisted.internet.task import react


=====================================
examples/launch_tor_with_simplehttpd.py
=====================================
@@ -94,8 +94,9 @@ def main():
     # Sanitize path and set working directory there (for SimpleHTTPServer)
     serve_directory = os.path.abspath(serve_directory)
     if not os.path.exists(serve_directory):
-        print('Path "%s" does not exists, can\'t serve from there...' % \
-            (serve_directory, ))
+        print(
+            'Path "{}" does not exist, can\'t serve from there...'.format(serve_directory)
+        )
         return 1
     os.chdir(serve_directory)
 


=====================================
examples/readme.py
=====================================
@@ -1,5 +1,5 @@
 from twisted.internet.task import react
-from twisted.internet.defer import inlineCallbacks, ensureDeferred
+from twisted.internet.defer import ensureDeferred
 from twisted.internet.endpoints import UNIXClientEndpoint
 
 import treq


=====================================
examples/readme2.py
=====================================
@@ -5,6 +5,7 @@ from twisted.internet.endpoints import UNIXClientEndpoint
 import treq
 import txtorcon
 
+
 @react
 @inlineCallbacks
 def main(reactor):


=====================================
examples/stream_circuit_logger.py
=====================================
@@ -7,7 +7,6 @@ from __future__ import print_function
 
 import sys
 from twisted.python import log
-from twisted.internet import reactor
 from twisted.internet.task import react
 from twisted.internet.defer import inlineCallbacks, Deferred
 import txtorcon


=====================================
examples/web_client_custom_circuit.py
=====================================
@@ -78,7 +78,7 @@ def main(reactor):
                 print("disconnected: {}".format(reason.value))
                 d.callback(None)
 
-        proto = yield ep.connect(Factory.forProtocol(ToyWebRequestProtocol))
+        yield ep.connect(Factory.forProtocol(ToyWebRequestProtocol))  # returns "proto"
         yield d
         print("All done, closing the circuit")
         yield circ.close()


=====================================
examples/web_onion_service_aiohttp.py
=====================================
@@ -11,7 +11,6 @@
 # note: if run in Python2, there are SyntaxErrors before we can tell
 # the user nicely
 
-import os
 import asyncio
 from twisted.internet import asyncioreactor
 
@@ -25,9 +24,7 @@ from twisted.internet.endpoints import UNIXClientEndpoint
 
 import txtorcon
 try:
-    import aiohttp
     from aiohttp import web
-    from aiosocks.connector import ProxyConnector, ProxyClientRequest
 except ImportError:
     raise Exception(
         "You need aiohttp to run this example:\n  pip install aiohttp"
@@ -61,10 +58,10 @@ async def _main(reactor):
         print("launching tor")
         tor = await txtorcon.launch(reactor, progress_updates=print)
     else:
-        tor = await txtorcon.connect(reactor,
-            UNIXClientEndpoint(reactor, "/var/run/tor/control")
+        tor = await txtorcon.connect(
+            reactor,
+            UNIXClientEndpoint(reactor, "/var/run/tor/control"),
         )
-    config = await tor.get_config()
     print("Connected to tor {}".format(tor.version))
 
     # here, we've just chosen 1234 as the port. We have three other
@@ -105,5 +102,6 @@ def main():
         )
     )
 
+
 if __name__ == '__main__':
     main()


=====================================
examples/web_onion_service_ephemeral_auth.py
=====================================
@@ -16,7 +16,6 @@ from twisted.internet import defer, task, endpoints
 from twisted.web import server, resource
 
 import txtorcon
-from txtorcon.util import default_control_port
 from txtorcon.onion import AuthBasic
 
 


=====================================
examples/web_onion_service_ephemeral_nonanon.py
=====================================
@@ -11,8 +11,6 @@ from twisted.internet import defer, task, endpoints
 from twisted.web import server, resource
 
 import txtorcon
-from txtorcon.util import default_control_port
-from txtorcon.onion import AuthBasic
 
 
 class Simple(resource.Resource):


=====================================
examples/web_onion_service_ephemeral_unix.py
=====================================
@@ -18,8 +18,6 @@ from twisted.internet import defer, task, endpoints
 from twisted.web import server, resource
 
 import txtorcon
-from txtorcon.util import default_control_port
-from txtorcon.onion import AuthBasic
 
 
 class Simple(resource.Resource):
@@ -41,7 +39,7 @@ def main(reactor):
     unix_p = abspath('./web_socket')
 
     ep = endpoints.UNIXServerEndpoint(reactor, unix_p)
-    port = yield ep.listen(server.Site(Simple()))
+    yield ep.listen(server.Site(Simple()))  # ignoring "port" return value
 
     def on_progress(percent, tag, msg):
         print('%03d: %s' % (percent, msg))


=====================================
examples/web_onion_service_prop224.py
=====================================
@@ -16,7 +16,6 @@ from twisted.internet import defer, task, endpoints
 from twisted.web import server, resource
 
 import txtorcon
-from txtorcon.util import default_control_port
 
 
 class Simple(resource.Resource):
@@ -45,7 +44,7 @@ def main(reactor):
     print(dir(hs))
 
     ep = endpoints.TCP4ServerEndpoint(reactor, 8787, interface="localhost")
-    port = yield ep.listen(server.Site(Simple()))
+    yield ep.listen(server.Site(Simple()))  # returns 'port'
     print("Site listening: {}".format(hs.hostname))
     print("Private key:\n{}".format(hs.private_key))
     yield defer.Deferred()  # wait forever


=====================================
setup.py
=====================================
@@ -41,7 +41,7 @@ setup(
     name='txtorcon',
     version=__version__,
     description=description,
-    setup_requires="setuptools>=36.2",
+##    setup_requires="setuptools>=36.2",
     long_description=open('README.rst', 'r').read(),
     keywords=['python', 'twisted', 'tor', 'tor controller'],
     install_requires=open('requirements.txt').readlines(),


=====================================
test/test_endpoints.py
=====================================
@@ -64,6 +64,37 @@ class MockReactor(Mock):
     pass
 
 
+def fake_tor_launcher(config):
+    # exactly match the signature of txtorcon.controller.launch
+    def launch(reactor,
+               progress_updates=None,
+               control_port=None,
+               data_directory=None,
+               socks_port=None,
+               non_anonymous_mode=None,
+               stdout=None,
+               stderr=None,
+               timeout=None,
+               tor_binary=None,
+               user=None,
+               connection_creator=None,
+               kill_on_stderr=True,
+               _tor_config=None,
+               ):
+        return defer.succeed(Tor(reactor, None, config, None, non_anonymous_mode))
+
+    return launch
+
+
+def valid_enough_torconfig():
+    config = TorConfig()
+    # The implementation will probably ask the configuration about the control
+    # port to make sure it agrees with the control port of the global Tor
+    # instance it believes will be used.  Give it an answer.
+    config.ControlPort = 12345
+    return config
+
+
 @patch('txtorcon.controller.find_tor_binary', return_value='/bin/echo')
 class EndpointTests(unittest.TestCase):
 
@@ -72,6 +103,7 @@ class EndpointTests(unittest.TestCase):
         endpoints._global_tor_config = None
         del endpoints._global_tor_lock
         endpoints._global_tor_lock = defer.DeferredLock()
+        endpoints._global_tor = None
         self.reactor = FakeReactorTcp(self)
         self.protocol = FakeControlProtocol([])
         self.protocol.event_happened('INFO', 'something craaaaaaazy')
@@ -103,17 +135,18 @@ class EndpointTests(unittest.TestCase):
     def tearDown(self):
         from txtorcon import endpoints
         endpoints._global_tor_config = None
+        endpoints._global_tor = None
+        assert not endpoints._global_tor_lock.locked, "Should not be locked a teardown"
         del endpoints._global_tor_lock
         endpoints._global_tor_lock = defer.DeferredLock()
+        endpoints._global_tor = None
         self.patcher.stop()
 
     @defer.inlineCallbacks
     def test_global_tor(self, ftb):
-        fake_tor = Mock()
-        fake_tor.get_config = Mock(return_value=self.config)
         config = yield get_global_tor(
             Mock(),
-            _tor_launcher=lambda x, progress_updates=None: fake_tor
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         # XXX this was asserting SOCKSPort == 0 before; why?
         self.assertEqual(['9050'], config.SOCKSPort)
@@ -122,7 +155,7 @@ class EndpointTests(unittest.TestCase):
     def test_global_tor_error(self, ftb):
         yield get_global_tor(
             reactor=FakeReactorTcp(self),
-            _tor_launcher=lambda x, y, progress_updates=None: True
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         # now if we specify a control_port it should be an error since
         # the above should have launched one.
@@ -130,7 +163,7 @@ class EndpointTests(unittest.TestCase):
             yield get_global_tor(
                 reactor=FakeReactorTcp(self),
                 control_port=111,
-                _tor_launcher=lambda x, y, progress_updates=None: True
+                _tor_launcher=fake_tor_launcher(self.config),
             )
             self.fail()
         except RuntimeError:
@@ -545,7 +578,7 @@ class EndpointTests(unittest.TestCase):
         control_ep.connect = Mock(return_value=defer.succeed(None))
         directlyProvides(control_ep, IStreamClientEndpoint)
         ep = TCPHiddenServiceEndpoint.system_tor(self.reactor, control_ep, 1234)
-        ep._tor_progress_update(40, "FOO", "foo to bar")
+        ep._tor_progress_update(40, "FOO", "foo to the bar")
         return ep
 
     def test_single_hop_non_ephemeral(self, ftb):
@@ -701,13 +734,9 @@ class EndpointTests(unittest.TestCase):
     def test_parse_via_plugin(self, ftb):
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -725,13 +754,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -749,13 +774,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -777,13 +798,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -804,13 +821,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
 
         with self.assertRaises(ValueError):
@@ -827,13 +840,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -852,13 +861,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -913,11 +918,12 @@ class EndpointTests(unittest.TestCase):
         )
 
     def test_parse_version_3(self, ftb):
-        ep = serverFromString(
-            self.reactor,
-            'onion:88:version=3:localPort=1234:hiddenServiceDir=~/blam/blarg'
-        )
-        self.assertFalse(ep.ephemeral)
+        with patch('txtorcon.endpoints.get_global_tor_instance'):
+            ep = serverFromString(
+                self.reactor,
+                'onion:88:version=3:localPort=1234:hiddenServiceDir=~/blam/blarg'
+            )
+            self.assertFalse(ep.ephemeral)
 
     def test_parse_user_path(self, ftb):
         # this makes sure we expand users and symlinks in
@@ -925,13 +931,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
         ep = serverFromString(
             self.reactor,
@@ -951,13 +953,9 @@ class EndpointTests(unittest.TestCase):
 
         # make sure we have a valid thing from get_global_tor without
         # actually launching tor
-        config = TorConfig()
-        config.post_bootstrap = defer.succeed(config)
-        from txtorcon import torconfig
-        torconfig._global_tor_config = None
         get_global_tor(
             self.reactor,
-            _tor_launcher=lambda react, config, progress_updates=None: defer.succeed(config)
+            _tor_launcher=fake_tor_launcher(self.config),
         )
 
         orig = os.path.realpath('.')
@@ -988,7 +986,7 @@ class EndpointTests(unittest.TestCase):
         with self.assertRaises(ValueError) as ctx:
             TCPHiddenServiceEndpoint(
                 reactor, config, 80,
-                stealth_auth=['alice', 'bob'],
+                auth=AuthStealth(['alice', 'bob']),
                 ephemeral=True,
             )
         self.assertIn(


=====================================
test/test_util.py
=====================================
@@ -1,9 +1,8 @@
 import os
-import sys
 import tempfile
 import ipaddress
 from mock import patch
-from unittest import skipIf
+from unittest import skip as _skip
 from os.path import exists
 
 from twisted.trial import unittest
@@ -62,7 +61,7 @@ class TestGeoIpDatabaseLoading(unittest.TestCase):
         util.GeoIP = _GeoIP
         self.assertEqual(ret_val, None)
 
-    @skipIf('pypy' in sys.version.lower(), "No GeoIP in PyPy")
+    @_skip("No GeoIP in github-actions")
     def test_return_geoip_object(self):
         # requires a valid GeoIP database to work, so hopefully we're
         # on Debian or similar...


=====================================
test/test_web.py
=====================================
@@ -15,7 +15,8 @@ from txtorcon.circuit import TorCircuitEndpoint
 
 
 class WebAgentTests(unittest.TestCase):
-    skip = not _HAVE_WEB
+    if not _HAVE_WEB:
+        skip = "Missing web"
 
     def test_socks_agent_tcp_port(self):
         reactor = Mock()


=====================================
txtorcon.egg-info/PKG-INFO
=====================================
@@ -1,162 +1,11 @@
 Metadata-Version: 2.1
 Name: txtorcon
-Version: 20.0.0
+Version: 22.0.0
 Summary:      Twisted-based Tor controller client, with state-tracking and     configuration abstractions.     https://txtorcon.readthedocs.org     https://github.com/meejah/txtorcon 
 Home-page: https://github.com/meejah/txtorcon
 Author: meejah
 Author-email: meejah at meejah.ca
 License: MIT
-Description: 
-        
-        
-        
-        
-        .. _NOTE: see docs/index.rst for the starting-point
-        .. _ALSO: https://txtorcon.readthedocs.org for rendered docs
-        
-        
-        
-        
-        
-        
-        .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master
-            :target: https://www.travis-ci.org/meejah/txtorcon
-            :alt: travis
-        
-        .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png
-            :target: https://coveralls.io/r/meejah/txtorcon
-            :alt: coveralls
-        
-        .. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=master
-            :target: http://codecov.io/github/meejah/txtorcon?branch=master
-            :alt: codecov
-        
-        .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
-            :target: https://txtorcon.readthedocs.io/en/stable
-            :alt: ReadTheDocs
-        
-        .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=latest
-            :target: https://txtorcon.readthedocs.io/en/latest
-            :alt: ReadTheDocs
-        
-        .. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat
-            :target: https://landscape.io/github/meejah/txtorcon/master
-            :alt: Code Health
-        
-        
-        txtorcon
-        ========
-        
-        - **docs**: https://txtorcon.readthedocs.org or http://timaq4ygg2iegci7.onion
-        - **code**: https://github.com/meejah/txtorcon
-        - ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
-        - MIT-licensed;
-        - Python 2.7, PyPy 5.0.0+, Python 3.5+;
-        - depends on
-          `Twisted`_,
-          `Automat <https://github.com/glyph/automat>`_,
-          (and the `ipaddress <https://pypi.python.org/pypi/ipaddress>`_ backport for non Python 3)
-        
-        
-        Ten Thousand Feet
-        -----------------
-        
-        txtorcon is an implementation of the `control-spec
-        <https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt>`_
-        for `Tor <https://www.torproject.org/>`_ using the `Twisted`_
-        networking library for `Python <http://python.org/>`_.
-        
-        This is useful for writing utilities to control or make use of Tor in
-        event-based Python programs. If your Twisted program supports
-        endpoints (like ``twistd`` does) your server or client can make use of
-        Tor immediately, with no code changes. Start your own Tor or connect
-        to one and get live stream, circuit, relay updates; read and change
-        config; monitor events; build circuits; create onion services;
-        etcetera (`ReadTheDocs <https://txtorcon.readthedocs.org>`_).
-        
-        
-        Some Possibly Motivational Example Code
-        ---------------------------------------
-        
-        `download <examples/readme.py>`_
-        (also `python2 style <examples/readme2.py>`_)
-        
-        .. code:: python
-        
-            from twisted.internet.task import react
-            from twisted.internet.defer import inlineCallbacks, ensureDeferred
-            from twisted.internet.endpoints import UNIXClientEndpoint
-        
-            import treq
-            import txtorcon
-        
-        
-            async def main(reactor):
-                tor = await txtorcon.connect(
-                    reactor,
-                    UNIXClientEndpoint(reactor, "/var/run/tor/control")
-                )
-        
-                print("Connected to Tor version {}".format(tor.version))
-        
-                url = u'https://www.torproject.org:443'
-                print(u"Downloading {}".format(repr(url)))
-                resp = await treq.get(url, agent=tor.web_agent())
-        
-                print(u"   {} bytes".format(resp.length))
-                data = await resp.text()
-                print(u"Got {} bytes:\n{}\n[...]{}".format(
-                    len(data),
-                    data[:120],
-                    data[-120:],
-                ))
-        
-                print(u"Creating a circuit")
-                state = await tor.create_state()
-                circ = await state.build_circuit()
-                await circ.when_built()
-                print(u"  path: {}".format(" -> ".join([r.ip for r in circ.path])))
-        
-                print(u"Downloading meejah's public key via above circuit...")
-                config = await tor.get_config()
-                resp = await treq.get(
-                    u'https://meejah.ca/meejah.asc',
-                    agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
-                )
-                data = await resp.text()
-                print(data)
-        
-        
-            @react
-            def _main(reactor):
-                return ensureDeferred(main(reactor))
-        
-        
-        
-        Try It Now On Debian/Ubuntu
-        ---------------------------
-        
-        For example, serve some files via an onion service (*aka* hidden
-        service):
-        
-        .. code-block:: shell-session
-        
-            $ sudo apt-get install --install-suggests python3-txtorcon
-            $ twistd -n web --port "onion:80" --path ~/public_html
-        
-        
-        Read More
-        ---------
-        
-        All the documentation starts `in docs/index.rst
-        <docs/index.rst>`_. Also hosted at `txtorcon.rtfd.org
-        <https://txtorcon.readthedocs.io/en/latest/>`_.
-        
-        You'll want to start with `the introductions <docs/introduction.rst>`_ (`hosted at RTD
-        <https://txtorcon.readthedocs.org/en/latest/introduction.html>`_).
-        
-        .. _Twisted: https://twistedmatrix.com/trac
-        
 Keywords: python,twisted,tor,tor controller
 Platform: UNKNOWN
 Classifier: Framework :: Twisted
@@ -176,3 +25,157 @@ Classifier: Topic :: Internet :: Proxy Servers
 Classifier: Topic :: Internet
 Classifier: Topic :: Security
 Provides-Extra: dev
+License-File: LICENSE
+
+
+
+
+
+
+.. _NOTE: see docs/index.rst for the starting-point
+.. _ALSO: https://txtorcon.readthedocs.org for rendered docs
+
+
+
+
+
+
+.. image:: https://github.com/meejah/txtorcon/actions/workflows/python3.yaml/badge.svg
+    :target: https://github.com/meejah/txtorcon/actions
+    :alt: github-actions
+
+.. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png?branch=main
+    :target: https://coveralls.io/github/meejah/txtorcon?branch=main
+    :alt: coveralls
+
+.. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=main
+    :target: http://codecov.io/github/meejah/txtorcon?branch=main
+    :alt: codecov
+
+.. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable
+    :target: https://txtorcon.readthedocs.io/en/stable
+    :alt: ReadTheDocs
+
+.. image:: https://readthedocs.org/projects/txtorcon/badge/?version=latest
+    :target: https://txtorcon.readthedocs.io/en/latest
+    :alt: ReadTheDocs
+
+.. image:: https://landscape.io/github/meejah/txtorcon/main/landscape.svg?style=flat
+    :target: https://landscape.io/github/meejah/txtorcon/main
+    :alt: Code Health
+
+
+txtorcon
+========
+
+- **docs**: https://txtorcon.readthedocs.org or http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/
+- **code**: https://github.com/meejah/txtorcon
+- ``torsocks git clone git://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon.git``
+- MIT-licensed;
+- Python 2.7, PyPy 5.0.0+, Python 3.5+;
+- depends on
+  `Twisted`_,
+  `Automat <https://github.com/glyph/automat>`_,
+  (and the `ipaddress <https://pypi.python.org/pypi/ipaddress>`_ backport for non Python 3)
+
+
+Ten Thousand Feet
+-----------------
+
+txtorcon is an implementation of the `control-spec
+<https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt>`_
+for `Tor <https://www.torproject.org/>`_ using the `Twisted`_
+networking library for `Python <http://python.org/>`_.
+
+This is useful for writing utilities to control or make use of Tor in
+event-based Python programs. If your Twisted program supports
+endpoints (like ``twistd`` does) your server or client can make use of
+Tor immediately, with no code changes. Start your own Tor or connect
+to one and get live stream, circuit, relay updates; read and change
+config; monitor events; build circuits; create onion services;
+etcetera (`ReadTheDocs <https://txtorcon.readthedocs.org>`_).
+
+
+Some Possibly Motivational Example Code
+---------------------------------------
+
+`download <examples/readme.py>`_
+(also `python2 style <examples/readme2.py>`_)
+
+.. code:: python
+
+    from twisted.internet.task import react
+    from twisted.internet.defer import inlineCallbacks, ensureDeferred
+    from twisted.internet.endpoints import UNIXClientEndpoint
+
+    import treq
+    import txtorcon
+
+
+    async def main(reactor):
+        tor = await txtorcon.connect(
+            reactor,
+            UNIXClientEndpoint(reactor, "/var/run/tor/control")
+        )
+
+        print("Connected to Tor version {}".format(tor.version))
+
+        url = u'https://www.torproject.org:443'
+        print(u"Downloading {}".format(repr(url)))
+        resp = await treq.get(url, agent=tor.web_agent())
+
+        print(u"   {} bytes".format(resp.length))
+        data = await resp.text()
+        print(u"Got {} bytes:\n{}\n[...]{}".format(
+            len(data),
+            data[:120],
+            data[-120:],
+        ))
+
+        print(u"Creating a circuit")
+        state = await tor.create_state()
+        circ = await state.build_circuit()
+        await circ.when_built()
+        print(u"  path: {}".format(" -> ".join([r.ip for r in circ.path])))
+
+        print(u"Downloading meejah's public key via above circuit...")
+        config = await tor.get_config()
+        resp = await treq.get(
+            u'https://meejah.ca/meejah.asc',
+            agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
+        )
+        data = await resp.text()
+        print(data)
+
+
+    @react
+    def _main(reactor):
+        return ensureDeferred(main(reactor))
+
+
+
+Try It Now On Debian/Ubuntu
+---------------------------
+
+For example, serve some files via an onion service (*aka* hidden
+service):
+
+.. code-block:: shell-session
+
+    $ sudo apt-get install --install-suggests python3-txtorcon
+    $ twistd -n web --port "onion:80" --path ~/public_html
+
+
+Read More
+---------
+
+All the documentation starts `in docs/index.rst
+<docs/index.rst>`_. Also hosted at `txtorcon.rtfd.org
+<https://txtorcon.readthedocs.io/en/latest/>`_.
+
+You'll want to start with `the introductions <docs/introduction.rst>`_ (`hosted at RTD
+<https://txtorcon.readthedocs.org/en/latest/introduction.html>`_).
+
+.. _Twisted: https://twistedmatrix.com/trac
+
+


=====================================
txtorcon/_metadata.py
=====================================
@@ -1,6 +1,6 @@
-__version__ = '20.0.0'
+__version__ = '22.0.0'
 __author__ = 'meejah'
 __contact__ = 'meejah at meejah.ca'
 __url__ = 'https://github.com/meejah/txtorcon'
 __license__ = 'MIT'
-__copyright__ = 'Copyright 2012-2019'
+__copyright__ = 'Copyright 2012-2022'


=====================================
txtorcon/socks.py
=====================================
@@ -89,7 +89,7 @@ class _SocksMachine(object):
             )
         if not isinstance(host, (bytes, str, six.text_type)):
             raise ValueError(
-                "'host' must be text".format(type(host))
+                "'host' must be text (not {})".format(type(host))
             )
         # XXX what if addr is None?
         self._req_type = req_type


=====================================
txtorcon/torinfo.py
=====================================
@@ -199,8 +199,11 @@ class TorInfo(object):
             return sup.__getattribute__(name)
 
         attrs = sup.__getattribute__('attrs')
+        # are there other "special" attributes we need to consider..?
         if name == '__members__':
             return list(attrs.keys())
+        if name == '__class__':
+            return sup.__class__
 
         else:
             try:



View it on GitLab: https://salsa.debian.org/pkg-privacy-team/txtorcon/-/commit/87dd8179e0d27b591df6c7867d58d56729e0eea4

-- 
View it on GitLab: https://salsa.debian.org/pkg-privacy-team/txtorcon/-/commit/87dd8179e0d27b591df6c7867d58d56729e0eea4
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-privacy-commits/attachments/20220321/019b5d32/attachment-0001.htm>


More information about the Pkg-privacy-commits mailing list