[tor-commits] [bridgedb/develop] Make new bridgedb.distributors package and put distributor code there.

isis at torproject.org isis at torproject.org
Wed Nov 15 22:24:50 UTC 2017


commit fca25fc8d9295ab50cb2a1be39199c213ddf8751
Author: Isis Lovecruft <isis at torproject.org>
Date:   Wed Nov 1 20:44:24 2017 +0000

    Make new bridgedb.distributors package and put distributor code there.
---
 bridgedb/Bridges.py                                |   2 +-
 bridgedb/Main.py                                   |  16 ++++----
 bridgedb/distributors/__init__.py                  |   5 +++
 bridgedb/distributors/email/__init__.py            |   8 ++++
 bridgedb/{ => distributors}/email/autoresponder.py |  24 +++++------
 bridgedb/{ => distributors}/email/distributor.py   |  10 ++---
 bridgedb/{ => distributors}/email/dkim.py          |   6 +--
 bridgedb/{ => distributors}/email/request.py       |  12 +++---
 bridgedb/{ => distributors}/email/server.py        |  30 +++++++-------
 bridgedb/{ => distributors}/email/templates.py     |   6 +--
 bridgedb/{ => distributors}/https/__init__.py      |   4 ++
 bridgedb/{ => distributors}/https/distributor.py   |   8 ++--
 bridgedb/{ => distributors}/https/request.py       |   8 ++--
 bridgedb/{ => distributors}/https/server.py        |   8 ++--
 .../https/templates/assets/css/bootstrap.min.css   |   0
 .../https/templates/assets/css/error.css           |   0
 .../templates/assets/css/font-awesome-ie7.min.css  |   0
 .../templates/assets/css/font-awesome.min.css      |   0
 .../https/templates/assets/css/main.css            |   0
 .../https/templates/assets/css/rtl.css             |   0
 .../templates/assets/font/fontawesome-webfont.eot  | Bin
 .../templates/assets/font/fontawesome-webfont.svg  |   0
 .../templates/assets/font/fontawesome-webfont.ttf  | Bin
 .../templates/assets/font/fontawesome-webfont.woff | Bin
 .../https/templates/assets/font/lato-bold.woff     | Bin
 .../https/templates/assets/font/lato-italic.woff   | Bin
 .../https/templates/assets/font/lato-regular.woff  | Bin
 .../templates/assets/images/404-excavator.svg      |   0
 .../templates/assets/images/404-hills-left.svg     |   0
 .../templates/assets/images/404-hills-right.svg    |   0
 .../assets/images/500-hills-left-shade.svg         |   0
 .../templates/assets/images/500-hills-left.svg     |   0
 .../assets/images/500-hills-right-shade.svg        |   0
 .../templates/assets/images/500-hills-right.svg    |   0
 .../https/templates/assets/images/500-road.svg     |   0
 .../assets/images/maintenance-hills-left-shade.svg |   0
 .../assets/images/maintenance-hills-left.svg       |   0
 .../images/maintenance-hills-right-shade.svg       |   0
 .../assets/images/maintenance-hills-right.svg      |   0
 .../assets/images/maintenance-tractor.svg          |   0
 .../https/templates/assets/js/bridges.js           |   0
 .../https/templates/assets/tor-roots-blue.svg      |   0
 .../https/templates/assets/tor.svg                 |   0
 .../{ => distributors}/https/templates/base.html   |   0
 .../https/templates/bridges.html                   |   0
 .../https/templates/captcha.html                   |   0
 .../https/templates/error-404.html                 |   0
 .../https/templates/error-500.html                 |   0
 .../https/templates/error-503.html                 |   0
 .../{ => distributors}/https/templates/howto.html  |   0
 .../{ => distributors}/https/templates/index.html  |   0
 .../https/templates/options.html                   |   0
 .../{ => distributors}/https/templates/robots.txt  |   0
 bridgedb/email/__init__.py                         |   1 -
 bridgedb/parse/addr.py                             |   4 +-
 bridgedb/persistent.py                             |   4 +-
 bridgedb/strings.py                                |   4 +-
 bridgedb/test/email_helpers.py                     |  14 +++----
 bridgedb/test/https_helpers.py                     |   4 +-
 bridgedb/test/legacy_Tests.py                      |   6 +--
 bridgedb/test/test_email_autoresponder.py          |  14 +++----
 bridgedb/test/test_email_distributor.py            |  12 +++---
 bridgedb/test/test_email_dkim.py                   |   4 +-
 bridgedb/test/test_email_request.py                |   4 +-
 bridgedb/test/test_email_server.py                 |  20 +++++-----
 bridgedb/test/test_email_templates.py              |   4 +-
 bridgedb/test/test_https_distributor.py            |   6 +--
 bridgedb/test/test_https_request.py                |   4 +-
 bridgedb/test/test_https_server.py                 |  44 ++++++++++-----------
 doc/sphinx/source/conf.py                          |  22 +++++------
 setup.py                                           |   9 +++--
 71 files changed, 172 insertions(+), 155 deletions(-)

diff --git a/bridgedb/Bridges.py b/bridgedb/Bridges.py
index ac403b6..50d70ae 100644
--- a/bridgedb/Bridges.py
+++ b/bridgedb/Bridges.py
@@ -541,7 +541,7 @@ class FilteredBridgeSplitter(object):
         :ivar bridges: DOCDOC
         :type distributorName: str
         :ivar distributorName: The name of this splitter's distributor. See
-             :meth:`~bridgedb.https.distributor.HTTPSDistributor.setDistributorName`.
+             :meth:`~bridgedb.distributors.https.distributor.HTTPSDistributor.setDistributorName`.
         """
         self.key = key
         self.filterRings = {}
diff --git a/bridgedb/Main.py b/bridgedb/Main.py
index 4273653..53b70c2 100644
--- a/bridgedb/Main.py
+++ b/bridgedb/Main.py
@@ -31,8 +31,8 @@ from bridgedb.bridges import ServerDescriptorDigestMismatch
 from bridgedb.bridges import ServerDescriptorWithoutNetworkstatus
 from bridgedb.bridges import Bridge
 from bridgedb.configure import loadConfig
-from bridgedb.email.distributor import EmailDistributor
-from bridgedb.https.distributor import HTTPSDistributor
+from bridgedb.distributors.email.distributor import EmailDistributor
+from bridgedb.distributors.https.distributor import HTTPSDistributor
 from bridgedb.parse import descriptors
 from bridgedb.parse.blacklist import parseBridgeBlacklistFile
 
@@ -216,8 +216,8 @@ def createBridgeRings(cfg, proxyList, key):
     :param bytes key: Hashring master key
     :rtype: tuple
     :returns: A BridgeSplitter hashring, an
-        :class:`~bridgedb.https.distributor.HTTPSDistributor` or None, and an
-        :class:`~bridgedb.email.distributor.EmailDistributor` or None.
+        :class:`~bridgedb.distributors.https.distributor.HTTPSDistributor` or None, and an
+        :class:`~bridgedb.distributors.email.distributor.EmailDistributor` or None.
     """
     # Create a BridgeSplitter to assign the bridges to the different
     # distributors.
@@ -316,8 +316,8 @@ def run(options, reactor=reactor):
 
     state = persistent.State(config=config)
 
-    from bridgedb.email.server import addServer as addSMTPServer
-    from bridgedb.https.server import addWebServer
+    from bridgedb.distributors.email.server import addServer as addSMTPServer
+    from bridgedb.distributors.https.server import addWebServer
 
     # Load the master key, or create a new one.
     key = crypto.getKey(config.MASTER_KEY_FILE)
@@ -352,9 +352,9 @@ def run(options, reactor=reactor):
         :ivar proxyList: The container for the IP addresses of any currently
             known open proxies.
         :ivar ipDistributor: A
-            :class:`~bridgedb.https.distributor.HTTPSDistributor`.
+            :class:`~bridgedb.distributors.https.distributor.HTTPSDistributor`.
         :ivar emailDistributor: A
-            :class:`~bridgedb.email.distributor.EmailDistributor`.
+            :class:`~bridgedb.distributors.email.distributor.EmailDistributor`.
         :ivar dict tasks: A dictionary of ``{name: task}``, where name is a
             string to associate with the ``task``, and ``task`` is some
             scheduled event, repetitive or otherwise, for the :class:`reactor
diff --git a/bridgedb/distributors/__init__.py b/bridgedb/distributors/__init__.py
new file mode 100644
index 0000000..951ef44
--- /dev/null
+++ b/bridgedb/distributors/__init__.py
@@ -0,0 +1,5 @@
+"""Methods for distributing bridges."""
+
+import email
+import https
+#import moat
diff --git a/bridgedb/distributors/email/__init__.py b/bridgedb/distributors/email/__init__.py
new file mode 100644
index 0000000..8f9ed03
--- /dev/null
+++ b/bridgedb/distributors/email/__init__.py
@@ -0,0 +1,8 @@
+"""Servers for BridgeDB's email bridge distributor."""
+
+import autoresponder
+import distributor
+import dkim
+import request
+import server
+import templates
diff --git a/bridgedb/email/autoresponder.py b/bridgedb/distributors/email/autoresponder.py
similarity index 97%
rename from bridgedb/email/autoresponder.py
rename to bridgedb/distributors/email/autoresponder.py
index 430a50c..ff65a73 100644
--- a/bridgedb/email/autoresponder.py
+++ b/bridgedb/distributors/email/autoresponder.py
@@ -13,10 +13,10 @@
 #_____________________________________________________________________________
 
 """
-.. py:module:: bridgedb.email.autoresponder
+.. py:module:: bridgedb.distributors.email.autoresponder
     :synopsis: Functionality for autoresponding to incoming emails.
 
-bridgedb.email.autoresponder
+bridgedb.distributors.email.autoresponder
 ============================
 
 Functionality for autoresponding to incoming emails.
@@ -26,7 +26,7 @@ Functionality for autoresponding to incoming emails.
 
 ::
 
-  bridgedb.email.autoresponder
+  bridgedb.distributors.email.autoresponder
    | |_ createResponseBody - Parse lines from an incoming email and determine
    | |                       how to respond.
    | |_ generateResponse - Create an email response.
@@ -50,13 +50,13 @@ from twisted.python import failure
 
 from bridgedb import safelog
 from bridgedb.crypto import NEW_BUFFER_INTERFACE
-from bridgedb.email import dkim
-from bridgedb.email import request
-from bridgedb.email import templates
-from bridgedb.email.distributor import EmailRequestedHelp
-from bridgedb.email.distributor import EmailRequestedKey
-from bridgedb.email.distributor import TooSoonEmail
-from bridgedb.email.distributor import IgnoreEmail
+from bridgedb.distributors.email import dkim
+from bridgedb.distributors.email import request
+from bridgedb.distributors.email import templates
+from bridgedb.distributors.email.distributor import EmailRequestedHelp
+from bridgedb.distributors.email.distributor import EmailRequestedKey
+from bridgedb.distributors.email.distributor import TooSoonEmail
+from bridgedb.distributors.email.distributor import IgnoreEmail
 from bridgedb.parse import addr
 from bridgedb.parse.addr import canonicalizeEmailDomain
 from bridgedb.util import levenshteinDistance
@@ -69,7 +69,7 @@ def createResponseBody(lines, context, client, lang='en'):
 
     :param list lines: The list of lines from the original request sent by the
         client.
-    :type context: :class:`bridgedb.email.server.MailServerContext`
+    :type context: :class:`bridgedb.distributors.email.server.MailServerContext`
     :param context: The context which contains settings for the email server.
     :type client: :api:`twisted.mail.smtp.Address`
     :param client: The client's email address which should be in the
@@ -614,7 +614,7 @@ class SMTPAutoresponder(smtp.SMTPClient):
         3. Check that those canonical domains match.
 
         4. If the incoming message is from a domain which supports DKIM
-        signing, then run :func:`bridgedb.email.dkim.checkDKIM` as well.
+        signing, then run :func:`bridgedb.distributors.email.dkim.checkDKIM` as well.
 
         .. note:: Calling this method sets the
             :attr:`incoming.canonicalFromEmail` and
diff --git a/bridgedb/email/distributor.py b/bridgedb/distributors/email/distributor.py
similarity index 96%
rename from bridgedb/email/distributor.py
rename to bridgedb/distributors/email/distributor.py
index c6e45d5..06a0c50 100644
--- a/bridgedb/email/distributor.py
+++ b/bridgedb/distributors/email/distributor.py
@@ -11,10 +11,10 @@
 # :license: see LICENSE for licensing information
 
 """
-.. py:module:: bridgedb.email.distributor
+.. py:module:: bridgedb.distributors.email.distributor
     :synopsis: A Distributor which hands out Bridges via an email interface.
 
-bridgedb.email.autoresponder
+bridgedb.distributors.email.autoresponder
 ============================
 
 A :class:`~bridgedb.distribute.Distributor` which hands out :class:`bridges
@@ -117,11 +117,11 @@ class EmailDistributor(Distributor):
         .. hint:: All checks on the email address (which should be stored in
             the ``bridgeRequest.client`` attribute), such as checks for
             whitelisting and canonicalization of domain name, are done in
-            :meth:`bridgedb.email.autoresponder.getMailTo` and
-            :meth:`bridgedb.email.autoresponder.SMTPAutoresponder.runChecks`.
+            :meth:`bridgedb.distributors.email.autoresponder.getMailTo` and
+            :meth:`bridgedb.distributors.email.autoresponder.SMTPAutoresponder.runChecks`.
 
         :type bridgeRequest:
-            :class:`~bridgedb.email.request.EmailBridgeRequest`
+            :class:`~bridgedb.distributors.email.request.EmailBridgeRequest`
         :param bridgeRequest: A
             :class:`~bridgedb.bridgerequest.BridgeRequestBase` with the
             :data:`~bridgedb.bridgerequest.BridgeRequestBase.client` attribute
diff --git a/bridgedb/email/dkim.py b/bridgedb/distributors/email/dkim.py
similarity index 95%
rename from bridgedb/email/dkim.py
rename to bridgedb/distributors/email/dkim.py
index c851c5c..be33d59 100644
--- a/bridgedb/email/dkim.py
+++ b/bridgedb/distributors/email/dkim.py
@@ -13,18 +13,18 @@
 #_____________________________________________________________________________
 
 """
-.. py:module:: bridgedb.email.dkim
+.. py:module:: bridgedb.distributors.email.dkim
     :synopsis: Functions for checking DKIM verification results in email
                headers.
 
-bridgedb.email.dkim
+bridgedb.distributors.email.dkim
 ===================
 
 Functions for checking DKIM verification results in email headers.
 
 ::
 
- bridgedb.email.dkim
+ bridgedb.distributors.email.dkim
   |_ checkDKIM - Check the DKIM verification results header.
 
 ..
diff --git a/bridgedb/email/request.py b/bridgedb/distributors/email/request.py
similarity index 94%
rename from bridgedb/email/request.py
rename to bridgedb/distributors/email/request.py
index 71167c7..a490e56 100644
--- a/bridgedb/email/request.py
+++ b/bridgedb/distributors/email/request.py
@@ -13,11 +13,11 @@
 #_____________________________________________________________________________
 
 """
-.. py:module:: bridgedb.email.request
+.. py:module:: bridgedb.distributors.email.request
     :synopsis: Classes for parsing and storing information about requests for
                bridges which are sent to the email distributor.
 
-bridgedb.email.request
+bridgedb.distributors.email.request
 ======================
 
 Classes for parsing and storing information about requests for bridges
@@ -28,7 +28,7 @@ which are sent to the email distributor.
 
 ::
 
-  bridgedb.email.request
+  bridgedb.distributors.email.request
    | |_ determineBridgeRequestOptions - Figure out which filters to apply, or
    |                                    offer help.
    |_ EmailBridgeRequest - A request for bridges which was received through
@@ -44,8 +44,8 @@ import logging
 import re
 
 from bridgedb import bridgerequest
-from bridgedb.email.distributor import EmailRequestedHelp
-from bridgedb.email.distributor import EmailRequestedKey
+from bridgedb.distributors.email.distributor import EmailRequestedHelp
+from bridgedb.distributors.email.distributor import EmailRequestedKey
 
 
 #: A regular expression for matching the Pluggable Transport method TYPE in
@@ -109,7 +109,7 @@ class EmailBridgeRequest(bridgerequest.BridgeRequestBase):
 
     def __init__(self):
         """Process a new bridge request received through the
-        :class:`~bridgedb.email.distributor.EmailDistributor`.
+        :class:`~bridgedb.distributors.email.distributor.EmailDistributor`.
         """
         super(EmailBridgeRequest, self).__init__()
         self._wantsKey = False
diff --git a/bridgedb/email/server.py b/bridgedb/distributors/email/server.py
similarity index 95%
rename from bridgedb/email/server.py
rename to bridgedb/distributors/email/server.py
index 41862e7..229f118 100644
--- a/bridgedb/email/server.py
+++ b/bridgedb/distributors/email/server.py
@@ -14,11 +14,11 @@
 
 
 """
-.. py:module:: bridgedb.email.server
+.. py:module:: bridgedb.distributors.email.server
     :synopsis: Servers which interface with clients and distribute bridges
                over SMTP.
 
-bridgedb.email.server
+bridgedb.distributors.email.server
 =====================
 
 Servers which interface with clients and distribute bridges over SMTP.
@@ -28,7 +28,7 @@ Servers which interface with clients and distribute bridges over SMTP.
 
 ::
 
-  bridgedb.email.server
+  bridgedb.distributors.email.server
    | |_ addServer - Set up a SMTP server which listens on the configured
    |                EMAIL_PORT for incoming connections, and responds as
    |                necessary to requests for bridges.
@@ -66,9 +66,9 @@ from zope.interface import implements
 from bridgedb import __version__
 from bridgedb import safelog
 from bridgedb.crypto import initializeGnuPG
-from bridgedb.email import autoresponder
-from bridgedb.email import templates
-from bridgedb.email import request
+from bridgedb.distributors.email import autoresponder
+from bridgedb.distributors.email import templates
+from bridgedb.distributors.email import request
 from bridgedb.parse import addr
 from bridgedb.parse.addr import UnsupportedDomain
 from bridgedb.parse.addr import canonicalizeEmailDomain
@@ -109,7 +109,7 @@ class MailServerContext(object):
         """Create a context for storing configs for email bridge distribution.
 
         :type config: :class:`bridgedb.persistent.Conf`
-        :type distributor: :class:`~bridgedb.email.distributor.EmailDistributor`
+        :type distributor: :class:`~bridgedb.distributors.email.distributor.EmailDistributor`
         :param distributor: The distributor will handle getting the correct
             bridges (or none) for a client for us.
         :type schedule: :class:`bridgedb.schedule.ScheduledInterval`
@@ -172,18 +172,18 @@ class SMTPMessage(object):
     :var bool ignoring: If ``True``, we're ignoring the rest of this message
         because it exceeded :data:`MailServerContext.maximumSize`.
     :var canonicalFromSMTP: See
-        :meth:`~bridgedb.email.autoresponder.SMTPAutoresponder.runChecks`.
+        :meth:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder.runChecks`.
     :var canonicalFromEmail: See
-        :meth:`~bridgedb.email.autoresponder.SMTPAutoresponder.runChecks`.
+        :meth:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder.runChecks`.
     :var canonicalDomainRules: See
-        :meth:`~bridgedb.email.autoresponder.SMTPAutoresponder.runChecks`.
+        :meth:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder.runChecks`.
     :var message: (:api:`twisted.mail.smtp.rfc822.Message` or ``None``) The
         incoming email message.
-    :var responder: A :class:`~bridgedb.email.autoresponder.SMTPAutoresponder`
+    :var responder: A :class:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder`
         which parses and checks the incoming :data:`message`. If it decides to
         do so, it will build a
-        :meth:`~bridgedb.email.autoresponder.SMTPAutoresponder.reply` email
-        and :meth:`~bridgedb.email.autoresponder.SMTPAutoresponder.send` it.
+        :meth:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder.reply` email
+        and :meth:`~bridgedb.distributors.email.autoresponder.SMTPAutoresponder.send` it.
     """
     implements(smtp.IMessage)
 
@@ -432,7 +432,7 @@ class SMTPIncomingServerFactory(smtp.SMTPFactory):
     automation whenever we get a incoming connection on the SMTP port.
 
     .. warning::
-        My :attr:`~bridgedb.email.server.SMTPIncomingServerFactory.context`
+        My :attr:`~bridgedb.distributors.email.server.SMTPIncomingServerFactory.context`
         isn't an OpenSSL context, as is used for the
         :api:`twisted.mail.smtp.ESMTPSender`.
 
@@ -477,7 +477,7 @@ def addServer(config, distributor):
 
     :type config: :class:`bridgedb.configure.Conf`
     :param config: A configuration object.
-    :type distributor: :class:`bridgedb.email.distributor.EmailDistributor`
+    :type distributor: :class:`bridgedb.distributors.email.distributor.EmailDistributor`
     :param dist: A distributor which will handle database interactions, and
         will decide which bridges to give to who and when.
     """
diff --git a/bridgedb/email/templates.py b/bridgedb/distributors/email/templates.py
similarity index 97%
rename from bridgedb/email/templates.py
rename to bridgedb/distributors/email/templates.py
index 014881e..85dd105 100644
--- a/bridgedb/email/templates.py
+++ b/bridgedb/distributors/email/templates.py
@@ -11,11 +11,11 @@
 #_____________________________________________________________________________
 
 """
-.. py:module:: bridgedb.email.templates
+.. py:module:: bridgedb.distributors.email.templates
     :synopsis: Templates for formatting emails sent out by the email
                distributor.
 
-bridgedb.email.templates
+bridgedb.distributors.email.templates
 ========================
 
 Templates for formatting emails sent out by the email distributor.
@@ -30,7 +30,7 @@ import os
 from datetime import datetime
 
 from bridgedb import strings
-from bridgedb.email.distributor import MAX_EMAIL_RATE
+from bridgedb.distributors.email.distributor import MAX_EMAIL_RATE
 
 
 def addCommands(template):
diff --git a/bridgedb/https/__init__.py b/bridgedb/distributors/https/__init__.py
similarity index 52%
rename from bridgedb/https/__init__.py
rename to bridgedb/distributors/https/__init__.py
index f1210ec..6c51a5f 100644
--- a/bridgedb/https/__init__.py
+++ b/bridgedb/distributors/https/__init__.py
@@ -1 +1,5 @@
 """Servers for BridgeDB's HTTPS bridge distributor."""
+
+import distributor
+import request
+import server
diff --git a/bridgedb/https/distributor.py b/bridgedb/distributors/https/distributor.py
similarity index 98%
rename from bridgedb/https/distributor.py
rename to bridgedb/distributors/https/distributor.py
index 4e980b7..791229b 100644
--- a/bridgedb/https/distributor.py
+++ b/bridgedb/distributors/https/distributor.py
@@ -11,7 +11,7 @@
 # :license: see LICENSE for licensing information
 
 """
-bridgedb.https.distributor
+bridgedb.distributors.https.distributor
 ==========================
 
 A Distributor that hands out bridges through a web interface.
@@ -119,7 +119,7 @@ class HTTPSDistributor(Distributor):
         ``1.2.178.234``) are placed within the same cluster, but Carol (with
         address ``1.3.11.33``) *might* end up in a different cluster.
 
-        >>> from bridgedb.https.distributor import HTTPSDistributor
+        >>> from bridgedb.distributors.https.distributor import HTTPSDistributor
         >>> HTTPSDistributor.getSubnet('1.2.3.4')
         '1.2.0.0/16'
         >>> HTTPSDistributor.getSubnet('1.2.211.154')
@@ -274,7 +274,7 @@ class HTTPSDistributor(Distributor):
     def getBridges(self, bridgeRequest, interval):
         """Return a list of bridges to give to a user.
 
-        :type bridgeRequest: :class:`bridgedb.https.request.HTTPSBridgeRequest`
+        :type bridgeRequest: :class:`bridgedb.distributors.https.request.HTTPSBridgeRequest`
         :param bridgeRequest: A :class:`~bridgedb.bridgerequest.BridgeRequestBase`
             with the :data:`~bridgedb.bridgerequest.BridgeRequestBase.client`
             attribute set to a string containing the client's IP address.
@@ -283,7 +283,7 @@ class HTTPSDistributor(Distributor):
         :rtype: list
         :return: A list of :class:`~bridgedb.Bridges.Bridge`s to include in
             the response. See
-            :meth:`bridgedb.https.server.WebResourceBridges.getBridgeRequestAnswer`
+            :meth:`bridgedb.distributors.https.server.WebResourceBridges.getBridgeRequestAnswer`
             for an example of how this is used.
         """
         logging.info("Attempting to get bridges for %s..." % bridgeRequest.client)
diff --git a/bridgedb/https/request.py b/bridgedb/distributors/https/request.py
similarity index 96%
rename from bridgedb/https/request.py
rename to bridgedb/distributors/https/request.py
index fd80809..3236bee 100644
--- a/bridgedb/https/request.py
+++ b/bridgedb/distributors/https/request.py
@@ -10,11 +10,11 @@
 #_____________________________________________________________________________
 
 """
-.. py:module:: bridgedb.https.request
+.. py:module:: bridgedb.distributors.https.request
     :synopsis: Classes for parsing and storing information about requests for
                bridges which are sent to the HTTPS distributor.
 
-bridgedb.https.request
+bridgedb.distributors.https.request
 ======================
 
 Classes for parsing and storing information about requests for bridges
@@ -24,7 +24,7 @@ which are sent to the HTTPS distributor.
 
 ::
 
-  bridgedb.https.request
+  bridgedb.distributors.https.request
    |
    |_ HTTPSBridgeRequest - A request for bridges which was received through
                            the HTTPS distributor.
@@ -58,7 +58,7 @@ class HTTPSBridgeRequest(bridgerequest.BridgeRequestBase):
 
     def __init__(self, addClientCountryCode=True):
         """Process a new bridge request received through the
-        :class:`~bridgedb.https.distributor.HTTPSDistributor`.
+        :class:`~bridgedb.distributors.https.distributor.HTTPSDistributor`.
 
         :param bool addClientCountryCode: If ``True``, then calling
             :meth:`withoutBlockInCountry` will attempt to add the client's own
diff --git a/bridgedb/https/server.py b/bridgedb/distributors/https/server.py
similarity index 99%
rename from bridgedb/https/server.py
rename to bridgedb/distributors/https/server.py
index c785450..3e4284f 100644
--- a/bridgedb/https/server.py
+++ b/bridgedb/distributors/https/server.py
@@ -8,11 +8,11 @@
 # :license: see LICENSE for licensing information
 
 """
-.. py:module:: bridgedb.https.server
+.. py:module:: bridgedb.distributors.https.server
     :synopsis: Servers which interface with clients and distribute bridges
                over HTTP(S).
 
-bridgedb.https.server
+bridgedb.distributors.https.server
 =====================
 
 Servers which interface with clients and distribute bridges over HTTP(S).
@@ -50,7 +50,7 @@ from bridgedb import crypto
 from bridgedb import strings
 from bridgedb import translations
 from bridgedb import txrecaptcha
-from bridgedb.https.request import HTTPSBridgeRequest
+from bridgedb.distributors.https.request import HTTPSBridgeRequest
 from bridgedb.parse import headers
 from bridgedb.parse.addr import isIPAddress
 from bridgedb.qrcodes import generateQR
@@ -1032,7 +1032,7 @@ def addWebServer(config, distributor):
              CSP_ENABLED
              CSP_REPORT_ONLY
              CSP_INCLUDE_SELF
-    :type distributor: :class:`bridgedb.https.distributor.HTTPSDistributor`
+    :type distributor: :class:`bridgedb.distributors.https.distributor.HTTPSDistributor`
     :param distributor: A bridge distributor.
     :raises SystemExit: if the servers cannot be started.
     :rtype: :api:`twisted.web.server.Site`
diff --git a/bridgedb/https/templates/assets/css/bootstrap.min.css b/bridgedb/distributors/https/templates/assets/css/bootstrap.min.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/bootstrap.min.css
rename to bridgedb/distributors/https/templates/assets/css/bootstrap.min.css
diff --git a/bridgedb/https/templates/assets/css/error.css b/bridgedb/distributors/https/templates/assets/css/error.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/error.css
rename to bridgedb/distributors/https/templates/assets/css/error.css
diff --git a/bridgedb/https/templates/assets/css/font-awesome-ie7.min.css b/bridgedb/distributors/https/templates/assets/css/font-awesome-ie7.min.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/font-awesome-ie7.min.css
rename to bridgedb/distributors/https/templates/assets/css/font-awesome-ie7.min.css
diff --git a/bridgedb/https/templates/assets/css/font-awesome.min.css b/bridgedb/distributors/https/templates/assets/css/font-awesome.min.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/font-awesome.min.css
rename to bridgedb/distributors/https/templates/assets/css/font-awesome.min.css
diff --git a/bridgedb/https/templates/assets/css/main.css b/bridgedb/distributors/https/templates/assets/css/main.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/main.css
rename to bridgedb/distributors/https/templates/assets/css/main.css
diff --git a/bridgedb/https/templates/assets/css/rtl.css b/bridgedb/distributors/https/templates/assets/css/rtl.css
similarity index 100%
rename from bridgedb/https/templates/assets/css/rtl.css
rename to bridgedb/distributors/https/templates/assets/css/rtl.css
diff --git a/bridgedb/https/templates/assets/font/fontawesome-webfont.eot b/bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.eot
similarity index 100%
rename from bridgedb/https/templates/assets/font/fontawesome-webfont.eot
rename to bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.eot
diff --git a/bridgedb/https/templates/assets/font/fontawesome-webfont.svg b/bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.svg
similarity index 100%
rename from bridgedb/https/templates/assets/font/fontawesome-webfont.svg
rename to bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.svg
diff --git a/bridgedb/https/templates/assets/font/fontawesome-webfont.ttf b/bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.ttf
similarity index 100%
rename from bridgedb/https/templates/assets/font/fontawesome-webfont.ttf
rename to bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.ttf
diff --git a/bridgedb/https/templates/assets/font/fontawesome-webfont.woff b/bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.woff
similarity index 100%
rename from bridgedb/https/templates/assets/font/fontawesome-webfont.woff
rename to bridgedb/distributors/https/templates/assets/font/fontawesome-webfont.woff
diff --git a/bridgedb/https/templates/assets/font/lato-bold.woff b/bridgedb/distributors/https/templates/assets/font/lato-bold.woff
similarity index 100%
rename from bridgedb/https/templates/assets/font/lato-bold.woff
rename to bridgedb/distributors/https/templates/assets/font/lato-bold.woff
diff --git a/bridgedb/https/templates/assets/font/lato-italic.woff b/bridgedb/distributors/https/templates/assets/font/lato-italic.woff
similarity index 100%
rename from bridgedb/https/templates/assets/font/lato-italic.woff
rename to bridgedb/distributors/https/templates/assets/font/lato-italic.woff
diff --git a/bridgedb/https/templates/assets/font/lato-regular.woff b/bridgedb/distributors/https/templates/assets/font/lato-regular.woff
similarity index 100%
rename from bridgedb/https/templates/assets/font/lato-regular.woff
rename to bridgedb/distributors/https/templates/assets/font/lato-regular.woff
diff --git a/bridgedb/https/templates/assets/images/404-excavator.svg b/bridgedb/distributors/https/templates/assets/images/404-excavator.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/404-excavator.svg
rename to bridgedb/distributors/https/templates/assets/images/404-excavator.svg
diff --git a/bridgedb/https/templates/assets/images/404-hills-left.svg b/bridgedb/distributors/https/templates/assets/images/404-hills-left.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/404-hills-left.svg
rename to bridgedb/distributors/https/templates/assets/images/404-hills-left.svg
diff --git a/bridgedb/https/templates/assets/images/404-hills-right.svg b/bridgedb/distributors/https/templates/assets/images/404-hills-right.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/404-hills-right.svg
rename to bridgedb/distributors/https/templates/assets/images/404-hills-right.svg
diff --git a/bridgedb/https/templates/assets/images/500-hills-left-shade.svg b/bridgedb/distributors/https/templates/assets/images/500-hills-left-shade.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/500-hills-left-shade.svg
rename to bridgedb/distributors/https/templates/assets/images/500-hills-left-shade.svg
diff --git a/bridgedb/https/templates/assets/images/500-hills-left.svg b/bridgedb/distributors/https/templates/assets/images/500-hills-left.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/500-hills-left.svg
rename to bridgedb/distributors/https/templates/assets/images/500-hills-left.svg
diff --git a/bridgedb/https/templates/assets/images/500-hills-right-shade.svg b/bridgedb/distributors/https/templates/assets/images/500-hills-right-shade.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/500-hills-right-shade.svg
rename to bridgedb/distributors/https/templates/assets/images/500-hills-right-shade.svg
diff --git a/bridgedb/https/templates/assets/images/500-hills-right.svg b/bridgedb/distributors/https/templates/assets/images/500-hills-right.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/500-hills-right.svg
rename to bridgedb/distributors/https/templates/assets/images/500-hills-right.svg
diff --git a/bridgedb/https/templates/assets/images/500-road.svg b/bridgedb/distributors/https/templates/assets/images/500-road.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/500-road.svg
rename to bridgedb/distributors/https/templates/assets/images/500-road.svg
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-left-shade.svg b/bridgedb/distributors/https/templates/assets/images/maintenance-hills-left-shade.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/maintenance-hills-left-shade.svg
rename to bridgedb/distributors/https/templates/assets/images/maintenance-hills-left-shade.svg
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-left.svg b/bridgedb/distributors/https/templates/assets/images/maintenance-hills-left.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/maintenance-hills-left.svg
rename to bridgedb/distributors/https/templates/assets/images/maintenance-hills-left.svg
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-right-shade.svg b/bridgedb/distributors/https/templates/assets/images/maintenance-hills-right-shade.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/maintenance-hills-right-shade.svg
rename to bridgedb/distributors/https/templates/assets/images/maintenance-hills-right-shade.svg
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-right.svg b/bridgedb/distributors/https/templates/assets/images/maintenance-hills-right.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/maintenance-hills-right.svg
rename to bridgedb/distributors/https/templates/assets/images/maintenance-hills-right.svg
diff --git a/bridgedb/https/templates/assets/images/maintenance-tractor.svg b/bridgedb/distributors/https/templates/assets/images/maintenance-tractor.svg
similarity index 100%
rename from bridgedb/https/templates/assets/images/maintenance-tractor.svg
rename to bridgedb/distributors/https/templates/assets/images/maintenance-tractor.svg
diff --git a/bridgedb/https/templates/assets/js/bridges.js b/bridgedb/distributors/https/templates/assets/js/bridges.js
similarity index 100%
rename from bridgedb/https/templates/assets/js/bridges.js
rename to bridgedb/distributors/https/templates/assets/js/bridges.js
diff --git a/bridgedb/https/templates/assets/tor-roots-blue.svg b/bridgedb/distributors/https/templates/assets/tor-roots-blue.svg
similarity index 100%
rename from bridgedb/https/templates/assets/tor-roots-blue.svg
rename to bridgedb/distributors/https/templates/assets/tor-roots-blue.svg
diff --git a/bridgedb/https/templates/assets/tor.svg b/bridgedb/distributors/https/templates/assets/tor.svg
similarity index 100%
rename from bridgedb/https/templates/assets/tor.svg
rename to bridgedb/distributors/https/templates/assets/tor.svg
diff --git a/bridgedb/https/templates/base.html b/bridgedb/distributors/https/templates/base.html
similarity index 100%
rename from bridgedb/https/templates/base.html
rename to bridgedb/distributors/https/templates/base.html
diff --git a/bridgedb/https/templates/bridges.html b/bridgedb/distributors/https/templates/bridges.html
similarity index 100%
rename from bridgedb/https/templates/bridges.html
rename to bridgedb/distributors/https/templates/bridges.html
diff --git a/bridgedb/https/templates/captcha.html b/bridgedb/distributors/https/templates/captcha.html
similarity index 100%
rename from bridgedb/https/templates/captcha.html
rename to bridgedb/distributors/https/templates/captcha.html
diff --git a/bridgedb/https/templates/error-404.html b/bridgedb/distributors/https/templates/error-404.html
similarity index 100%
rename from bridgedb/https/templates/error-404.html
rename to bridgedb/distributors/https/templates/error-404.html
diff --git a/bridgedb/https/templates/error-500.html b/bridgedb/distributors/https/templates/error-500.html
similarity index 100%
rename from bridgedb/https/templates/error-500.html
rename to bridgedb/distributors/https/templates/error-500.html
diff --git a/bridgedb/https/templates/error-503.html b/bridgedb/distributors/https/templates/error-503.html
similarity index 100%
rename from bridgedb/https/templates/error-503.html
rename to bridgedb/distributors/https/templates/error-503.html
diff --git a/bridgedb/https/templates/howto.html b/bridgedb/distributors/https/templates/howto.html
similarity index 100%
rename from bridgedb/https/templates/howto.html
rename to bridgedb/distributors/https/templates/howto.html
diff --git a/bridgedb/https/templates/index.html b/bridgedb/distributors/https/templates/index.html
similarity index 100%
rename from bridgedb/https/templates/index.html
rename to bridgedb/distributors/https/templates/index.html
diff --git a/bridgedb/https/templates/options.html b/bridgedb/distributors/https/templates/options.html
similarity index 100%
rename from bridgedb/https/templates/options.html
rename to bridgedb/distributors/https/templates/options.html
diff --git a/bridgedb/https/templates/robots.txt b/bridgedb/distributors/https/templates/robots.txt
similarity index 100%
rename from bridgedb/https/templates/robots.txt
rename to bridgedb/distributors/https/templates/robots.txt
diff --git a/bridgedb/email/__init__.py b/bridgedb/email/__init__.py
deleted file mode 100644
index 604c648..0000000
--- a/bridgedb/email/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Servers for BridgeDB's email bridge distributor."""
diff --git a/bridgedb/parse/addr.py b/bridgedb/parse/addr.py
index cd512d1..bf5a8a5 100644
--- a/bridgedb/parse/addr.py
+++ b/bridgedb/parse/addr.py
@@ -217,7 +217,7 @@ def canonicalizeEmailDomain(domain, domainmap):
     :param str domain: The domain portion of an email address to validate. It
         will be checked that it is one of the domains allowed to email
         requests for bridges to the
-        :class:`~bridgedb.email.distributor.EmailDistributor`.
+        :class:`~bridgedb.distributors.email.distributor.EmailDistributor`.
     :param dict domainmap: A map of permitted alternate domains (in lowercase)
         to their canonical domain names (in lowercase). This can be configured
         with the ``EMAIL_DOMAIN_MAP`` option in ``bridgedb.conf``, for
@@ -442,7 +442,7 @@ def normalizeEmail(emailaddr, domainmap, domainrules, ignorePlus=True):
     The email address, **emailaddr**, will be parsed and validated, and then
     checked that it originated from one of the domains allowed to email
     requests for bridges to the
-    :class:`~bridgedb.email.distributor.EmailDistributor` via the
+    :class:`~bridgedb.distributors.email.distributor.EmailDistributor` via the
     :func:`canonicaliseEmailDomain` function.
 
     :param str emailaddr: An email address to normalise.
diff --git a/bridgedb/persistent.py b/bridgedb/persistent.py
index 4410b9b..c46c4a5 100644
--- a/bridgedb/persistent.py
+++ b/bridgedb/persistent.py
@@ -25,8 +25,8 @@ from twisted.spread import jelly
 
 from bridgedb import Bridges
 from bridgedb import filters
-from bridgedb.email import distributor as emailDistributor
-from bridgedb.https import distributor as httpsDistributor
+from bridgedb.distributors.email import distributor as emailDistributor
+from bridgedb.distributors.https import distributor as httpsDistributor
 from bridgedb.configure import Conf
 #from bridgedb.proxy import ProxySet
 
diff --git a/bridgedb/strings.py b/bridgedb/strings.py
index 7d4b99e..1c40695 100644
--- a/bridgedb/strings.py
+++ b/bridgedb/strings.py
@@ -92,7 +92,7 @@ help to circumvent internet censorship in many cases.\n\n"""),
 }
 """These strings should go on the first "Welcome" email sent by the
 :mod:`~bridgedb.EmailServer`, as well as on the ``index.html`` template used
-by the :mod:`~bridgedb.https.server`. They are used as an introduction to
+by the :mod:`~bridgedb.distributors.https.server`. They are used as an introduction to
 explain what Tor bridges are, what bridges do, and why someone might want to
 use bridges.
 """
@@ -278,7 +278,7 @@ contain format specifiers (i.e. ``%s``) to what those format specifiers should
 be replaced with in a given template system.
 
 For example, a string which needs a pair of HTML ``("<a href=''">, "</a>")``
-tags (for the templates used by :mod:`bridgedb.https.server`) would need some
+tags (for the templates used by :mod:`bridgedb.distributors.https.server`) would need some
 alternative replacements for the :mod:`EmailServer`, because the latter uses
 templates with a ``text/plain`` mimetype instead of HTML. For the
 ``EmailServer``, the format strings specifiers are replaced with an empty
diff --git a/bridgedb/test/email_helpers.py b/bridgedb/test/email_helpers.py
index 55b8033..645fc93 100644
--- a/bridgedb/test/email_helpers.py
+++ b/bridgedb/test/email_helpers.py
@@ -14,9 +14,9 @@
 import io
 
 from bridgedb.persistent import Conf
-from bridgedb.email.distributor import IgnoreEmail
-from bridgedb.email.distributor import TooSoonEmail
-from bridgedb.email.server import MailServerContext
+from bridgedb.distributors.email.distributor import IgnoreEmail
+from bridgedb.distributors.email.distributor import TooSoonEmail
+from bridgedb.distributors.email.server import MailServerContext
 from bridgedb.schedule import Unscheduled
 
 from . import util
@@ -121,7 +121,7 @@ def _createMailServerContext(config=None, distributor=None):
 
 
 class DummyEmailDistributor(object):
-    """A mocked :class:`bridgedb.email.distributor.EmailDistributor` which is used
+    """A mocked :class:`bridgedb.distributors.email.distributor.EmailDistributor` which is used
     to test :class:`bridgedb.EmailServer`.
     """
 
@@ -145,9 +145,9 @@ class DummyEmailDistributor(object):
 
 
 class DummyEmailDistributorWithState(DummyEmailDistributor):
-    """A mocked :class:`bridgedb.email.distributor.EmailDistributor` which raises
-    :exc:`bridgedb.email.distributor.TooSoonEmail` on the second email and
-    :exc:`bridgedb.email.distributor.IgnoreEmail` on the third.
+    """A mocked :class:`bridgedb.distributors.email.distributor.EmailDistributor` which raises
+    :exc:`bridgedb.distributors.email.distributor.TooSoonEmail` on the second email and
+    :exc:`bridgedb.distributors.email.distributor.IgnoreEmail` on the third.
 
     Note that the state tracking is done in a really dumb way. For example, we
     currently don't consider requests for help text or GnuPG keys to be a
diff --git a/bridgedb/test/https_helpers.py b/bridgedb/test/https_helpers.py
index 5c1c838..d54e544 100644
--- a/bridgedb/test/https_helpers.py
+++ b/bridgedb/test/https_helpers.py
@@ -113,8 +113,8 @@ def _createConfig(configFile=TEST_CONFIG_FILE):
 
 
 class DummyHTTPSDistributor(object):
-    """A mocked :class:`bridgedb.https.distributor.HTTPSDistributor` which is
-    used to test :class:`bridgedb.https.server.BridgesResource`.
+    """A mocked :class:`bridgedb.distributors.https.distributor.HTTPSDistributor` which is
+    used to test :class:`bridgedb.distributors.https.server.BridgesResource`.
     """
     _bridge_class = util.DummyBridge
     _bridgesPerResponseMin = 3
diff --git a/bridgedb/test/legacy_Tests.py b/bridgedb/test/legacy_Tests.py
index 22b2e13..77409b4 100644
--- a/bridgedb/test/legacy_Tests.py
+++ b/bridgedb/test/legacy_Tests.py
@@ -26,9 +26,9 @@ import ipaddr
 
 from bridgedb.Stability import BridgeHistory
 
-from bridgedb.email.distributor import EmailDistributor
-from bridgedb.email.distributor import IgnoreEmail
-from bridgedb.email.distributor import TooSoonEmail
+from bridgedb.distributors.email.distributor import EmailDistributor
+from bridgedb.distributors.email.distributor import IgnoreEmail
+from bridgedb.distributors.email.distributor import TooSoonEmail
 from bridgedb.parse import addr
 
 from .util import bracketIPv6
diff --git a/bridgedb/test/test_email_autoresponder.py b/bridgedb/test/test_email_autoresponder.py
index 6bdac9e..a1e376f 100644
--- a/bridgedb/test/test_email_autoresponder.py
+++ b/bridgedb/test/test_email_autoresponder.py
@@ -9,7 +9,7 @@
 #             (c) 2007-2013, all entities within the AUTHORS file
 # :license: 3-Clause BSD, see LICENSE for licensing information
 
-"""Unittests for the :mod:`bridgedb.email.autoresponder` module."""
+"""Unittests for the :mod:`bridgedb.distributors.email.autoresponder` module."""
 
 from __future__ import print_function
 
@@ -23,9 +23,9 @@ from twisted.python.failure import Failure
 from twisted.trial import unittest
 from twisted.test import proto_helpers
 
-from bridgedb.email import autoresponder
-from bridgedb.email.server import SMTPMessage
-from bridgedb.email.distributor import TooSoonEmail
+from bridgedb.distributors.email import autoresponder
+from bridgedb.distributors.email.server import SMTPMessage
+from bridgedb.distributors.email.distributor import TooSoonEmail
 
 from bridgedb.test.email_helpers import _createConfig
 from bridgedb.test.email_helpers import _createMailServerContext
@@ -33,7 +33,7 @@ from bridgedb.test.email_helpers import DummyEmailDistributorWithState
 
 
 class CreateResponseBodyTests(unittest.TestCase):
-    """Tests for :func:`bridgedb.email.autoresponder.createResponseBody`."""
+    """Tests for :func:`bridgedb.distributors.email.autoresponder.createResponseBody`."""
 
     def _moveGPGTestKeyfile(self):
         here          = os.getcwd()
@@ -289,7 +289,7 @@ a ball of timey-wimey, wibbly-warbly... stuff."""
 
 
 class SMTPAutoresponderTests(unittest.TestCase):
-    """Unittests for :class:`bridgedb.email.autoresponder.SMTPAutoresponder`."""
+    """Unittests for :class:`bridgedb.distributors.email.autoresponder.SMTPAutoresponder`."""
 
     timeout = 10
 
@@ -322,7 +322,7 @@ class SMTPAutoresponderTests(unittest.TestCase):
         self.responder = self.message.responder
         # The following are needed to provide client disconnection methods for
         # the call to ``twisted.mail.smtp.SMTPClient.sendError`` in
-        # ``bridgedb.email.autoresponder.SMTPAutoresponder.sendError``:
+        # ``bridgedb.distributors.email.autoresponder.SMTPAutoresponder.sendError``:
         #protocol = proto_helpers.AccumulatingProtocol()
         #transport = proto_helpers.StringTransportWithDisconnection()
         self.tr = proto_helpers.StringTransportWithDisconnection()
diff --git a/bridgedb/test/test_email_distributor.py b/bridgedb/test/test_email_distributor.py
index 0d727b8..d95370f 100644
--- a/bridgedb/test/test_email_distributor.py
+++ b/bridgedb/test/test_email_distributor.py
@@ -7,7 +7,7 @@
 #             (c) 2007-2017, The Tor Project, Inc.
 # :license: see included LICENSE for information
 
-"""Tests for :mod:`bridgedb.email.distributor`."""
+"""Tests for :mod:`bridgedb.distributors.email.distributor`."""
 
 from __future__ import print_function
 
@@ -21,10 +21,10 @@ from twisted.trial import unittest
 import bridgedb.Storage
 
 from bridgedb.bridges import Bridge
-from bridgedb.email.distributor import EmailDistributor
-from bridgedb.email.distributor import IgnoreEmail
-from bridgedb.email.distributor import TooSoonEmail
-from bridgedb.email.request import EmailBridgeRequest
+from bridgedb.distributors.email.distributor import EmailDistributor
+from bridgedb.distributors.email.distributor import IgnoreEmail
+from bridgedb.distributors.email.distributor import TooSoonEmail
+from bridgedb.distributors.email.request import EmailBridgeRequest
 from bridgedb.parse.addr import BadEmail
 from bridgedb.parse.addr import UnsupportedDomain
 from bridgedb.parse.addr import normalizeEmail
@@ -38,7 +38,7 @@ BRIDGES = generateFakeBridges()
 
 
 class EmailDistributorTests(unittest.TestCase):
-    """Tests for :class:`bridgedb.email.distributor.EmailDistributor`."""
+    """Tests for :class:`bridgedb.distributors.email.distributor.EmailDistributor`."""
 
     # Fail any tests which take longer than 15 seconds.
     timeout = 15
diff --git a/bridgedb/test/test_email_dkim.py b/bridgedb/test/test_email_dkim.py
index 499a3c1..dc4c53b 100644
--- a/bridgedb/test/test_email_dkim.py
+++ b/bridgedb/test/test_email_dkim.py
@@ -9,14 +9,14 @@
 #             (c) 2007-2013, all entities within the AUTHORS file
 # :license: 3-Clause BSD, see LICENSE for licensing information
 
-"""Unittests for the :mod:`bridgedb.email.dkim` module."""
+"""Unittests for the :mod:`bridgedb.distributors.email.dkim` module."""
 
 import io
 
 from twisted.mail.smtp import rfc822
 from twisted.trial import unittest
 
-from bridgedb.email import dkim
+from bridgedb.distributors.email import dkim
 
 
 class CheckDKIMTests(unittest.TestCase):
diff --git a/bridgedb/test/test_email_request.py b/bridgedb/test/test_email_request.py
index 745ea71..0c87d36 100644
--- a/bridgedb/test/test_email_request.py
+++ b/bridgedb/test/test_email_request.py
@@ -9,7 +9,7 @@
 #             (c) 2007-2013, all entities within the AUTHORS file
 # :license: 3-Clause BSD, see LICENSE for licensing information
 
-"""Unittests for the :mod:`bridgedb.email.request` module."""
+"""Unittests for the :mod:`bridgedb.distributors.email.request` module."""
 
 from __future__ import print_function
 
@@ -17,7 +17,7 @@ import ipaddr
 
 from twisted.trial import unittest
 
-from bridgedb.email import request
+from bridgedb.distributors.email import request
 
 
 class DetermineBridgeRequestOptionsTests(unittest.TestCase):
diff --git a/bridgedb/test/test_email_server.py b/bridgedb/test/test_email_server.py
index 946133c..edf2539 100644
--- a/bridgedb/test/test_email_server.py
+++ b/bridgedb/test/test_email_server.py
@@ -9,7 +9,7 @@
 #             (c) 2007-2013, all entities within the AUTHORS file
 # :license: 3-Clause BSD, see LICENSE for licensing information
 
-"""Unittests for the :mod:`bridgedb.email.server` module."""
+"""Unittests for the :mod:`bridgedb.distributors.email.server` module."""
 
 from __future__ import print_function
 
@@ -31,9 +31,9 @@ from twisted.trial import unittest
 
 from zope.interface import implementedBy
 
-from bridgedb.email import server
-from bridgedb.email.distributor import EmailDistributor
-from bridgedb.email.distributor import TooSoonEmail
+from bridgedb.distributors.email import server
+from bridgedb.distributors.email.distributor import EmailDistributor
+from bridgedb.distributors.email.distributor import TooSoonEmail
 from bridgedb.parse.addr import BadEmail
 from bridgedb.schedule import Unscheduled
 
@@ -43,7 +43,7 @@ from bridgedb.test.email_helpers import _createMailServerContext
 
 
 class SMTPMessageTests(unittest.TestCase):
-    """Unittests for :class:`bridgedb.email.server.SMTPMessage`."""
+    """Unittests for :class:`bridgedb.distributors.email.server.SMTPMessage`."""
 
     def setUp(self):
         self.config = _createConfig()
@@ -59,7 +59,7 @@ class SMTPMessageTests(unittest.TestCase):
     def test_SMTPMessage_init(self):
         """Our ``message`` attribute should be a ``SMTPMessage`` object, and
         ``message.responder`` should be a
-        :class:`bridgedb.email.autoresponder.SMTPAutoresponder`.
+        :class:`bridgedb.distributors.email.autoresponder.SMTPAutoresponder`.
         """
         self.assertIsInstance(self.message, server.SMTPMessage)
         self.assertIsInstance(self.message.responder,
@@ -320,7 +320,7 @@ class SMTPTestCaseMixin(util.TestCaseMixin):
          segment. Includes the SMTP DATA EOM command ('.') at the end. If no
          keyword arguments are given, the defaults are fairly sane.
 
-        Suitable for testing a :class:`bridgedb.email.server.SMTPIncomingServerFactory`.
+        Suitable for testing a :class:`bridgedb.distributors.email.server.SMTPIncomingServerFactory`.
 
         :param str fromAddr: An email address for the 'From:' header.
         :param str toAddr: An email address for the 'To:' header.
@@ -382,7 +382,7 @@ class SMTPTestCaseMixin(util.TestCaseMixin):
 
 
 class SMTPIncomingServerFactoryTests(SMTPTestCaseMixin, unittest.TestCase):
-    """Unittests for :class:`bridgedb.email.server.SMTPIncomingServerFactory`."""
+    """Unittests for :class:`bridgedb.distributors.email.server.SMTPIncomingServerFactory`."""
 
     def setUp(self):
         """Set up a localhost SMTPIncomingServerFactory handler incoming SMTP
@@ -502,7 +502,7 @@ class SMTPIncomingServerFactoryTests(SMTPTestCaseMixin, unittest.TestCase):
 
 
 class EmailServerServiceTests(SMTPTestCaseMixin, unittest.TestCase):
-    """Unittests for :func:`bridgedb.email.server.addServer`."""
+    """Unittests for :func:`bridgedb.distributors.email.server.addServer`."""
 
     def setUp(self):
         """Create a MailServerContext and EmailDistributor."""
@@ -523,7 +523,7 @@ class EmailServerServiceTests(SMTPTestCaseMixin, unittest.TestCase):
         reactor.runUntilCurrent()
 
     def test_addServer(self):
-        """Call :func:`bridgedb.email.server.addServer` to test startup."""
+        """Call :func:`bridgedb.distributors.email.server.addServer` to test startup."""
         factory = server.addServer(self.config, self.dist)
         factory.timeout = None
         factory.protocol.timeout = None  # Or else the reactor gets dirty
diff --git a/bridgedb/test/test_email_templates.py b/bridgedb/test/test_email_templates.py
index 0c74377..8464fe9 100644
--- a/bridgedb/test/test_email_templates.py
+++ b/bridgedb/test/test_email_templates.py
@@ -9,7 +9,7 @@
 #             (c) 2007-2013, all entities within the AUTHORS file
 # :license: 3-Clause BSD, see LICENSE for licensing information
 
-"""Unittests for the :mod:`bridgedb.email.templates` module."""
+"""Unittests for the :mod:`bridgedb.distributors.email.templates` module."""
 
 from __future__ import print_function
 from __future__ import unicode_literals
@@ -20,7 +20,7 @@ from gettext import NullTranslations
 from twisted.mail.smtp import Address
 from twisted.trial import unittest
 
-from bridgedb.email import templates
+from bridgedb.distributors.email import templates
 
 
 class EmailTemplatesTests(unittest.TestCase):
diff --git a/bridgedb/test/test_https_distributor.py b/bridgedb/test/test_https_distributor.py
index 0d20960..791a940 100644
--- a/bridgedb/test/test_https_distributor.py
+++ b/bridgedb/test/test_https_distributor.py
@@ -9,7 +9,7 @@
 #             (c) 2007-2017, all entities within the AUTHORS file
 # :license: 3-clause BSD, see included LICENSE for information
 
-"""Tests for :mod:`bridgedb.https.distributor`."""
+"""Tests for :mod:`bridgedb.distributors.https.distributor`."""
 
 from __future__ import print_function
 
@@ -23,8 +23,8 @@ from bridgedb.Bridges import BridgeRing
 from bridgedb.Bridges import BridgeRingParameters
 from bridgedb.filters import byIPv4
 from bridgedb.filters import byIPv6
-from bridgedb.https import distributor
-from bridgedb.https.request import HTTPSBridgeRequest
+from bridgedb.distributors.https import distributor
+from bridgedb.distributors.https.request import HTTPSBridgeRequest
 from bridgedb.proxy import ProxySet
 
 from bridgedb.test.util import randomValidIPv4String
diff --git a/bridgedb/test/test_https_request.py b/bridgedb/test/test_https_request.py
index c262aef..2ea3fe6 100644
--- a/bridgedb/test/test_https_request.py
+++ b/bridgedb/test/test_https_request.py
@@ -14,7 +14,7 @@
 from twisted.trial import unittest
 
 from bridgedb.bridgerequest import IRequestBridges
-from bridgedb.https import request 
+from bridgedb.distributors.https import request 
 
 
 class MockRequest(object):
@@ -23,7 +23,7 @@ class MockRequest(object):
 
 
 class HTTPSBridgeRequestTests(unittest.TestCase):
-    """Unittests for :class:`bridgedb.https.request.HTTPSBridgeRequest`."""
+    """Unittests for :class:`bridgedb.distributors.https.request.HTTPSBridgeRequest`."""
 
     def setUp(self):
         """Setup test run."""
diff --git a/bridgedb/test/test_https_server.py b/bridgedb/test/test_https_server.py
index 3827bfe..2c41359 100644
--- a/bridgedb/test/test_https_server.py
+++ b/bridgedb/test/test_https_server.py
@@ -9,7 +9,7 @@
 # :license: see LICENSE for licensing information
 #_____________________________________________________________________________
 
-"""Unittests for :mod:`bridgedb.https.server`."""
+"""Unittests for :mod:`bridgedb.distributors.https.server`."""
 
 from __future__ import print_function
 
@@ -27,7 +27,7 @@ from twisted.trial import unittest
 from twisted.web.resource import Resource
 from twisted.web.test import requesthelper
 
-from bridgedb.https import server
+from bridgedb.distributors.https import server
 from bridgedb.schedule import ScheduledInterval
 
 from bridgedb.test.https_helpers import _createConfig
@@ -44,8 +44,8 @@ logging.disable(50)
 
 
 class SetFQDNTests(unittest.TestCase):
-    """Tests for :func:`bridgedb.https.server.setFQDN` and
-    :func:`bridgedb.https.server.setFQDN`.
+    """Tests for :func:`bridgedb.distributors.https.server.setFQDN` and
+    :func:`bridgedb.distributors.https.server.setFQDN`.
     """
 
     def setUp(self):
@@ -72,7 +72,7 @@ class SetFQDNTests(unittest.TestCase):
 
 
 class GetClientIPTests(unittest.TestCase):
-    """Tests for :func:`bridgedb.https.server.getClientIP`."""
+    """Tests for :func:`bridgedb.distributors.https.server.getClientIP`."""
 
     def createRequestWithIPs(self):
         """Set the IP address returned from ``request.getClientIP()`` to
@@ -114,7 +114,7 @@ class GetClientIPTests(unittest.TestCase):
 
 
 class ReplaceErrorPageTests(unittest.TestCase):
-    """Tests for :func:`bridgedb.https.server.replaceErrorPage`."""
+    """Tests for :func:`bridgedb.distributors.https.server.replaceErrorPage`."""
 
     def setUp(self):
         self.resource500 = server.resource500
@@ -152,7 +152,7 @@ class ReplaceErrorPageTests(unittest.TestCase):
                              errorPage)
 
 class ErrorResourceTests(unittest.TestCase):
-    """Tests for :class:`bridgedb.https.server.ErrorResource`."""
+    """Tests for :class:`bridgedb.distributors.https.server.ErrorResource`."""
 
     def setUp(self):
         self.request = DummyRequest([''])
@@ -174,7 +174,7 @@ class ErrorResourceTests(unittest.TestCase):
 
 
 class CustomErrorHandlingResourceTests(unittest.TestCase):
-    """Tests for :class:`bridgedb.https.server.CustomErrorHandlingResource`."""
+    """Tests for :class:`bridgedb.distributors.https.server.CustomErrorHandlingResource`."""
 
     def test_getChild(self):
         """``CustomErrorHandlingResource.getChild`` should return a rendered
@@ -258,7 +258,7 @@ class CSPResourceTests(unittest.TestCase):
 
 
 class IndexResourceTests(unittest.TestCase):
-    """Test for :class:`bridgedb.https.server.IndexResource`."""
+    """Test for :class:`bridgedb.distributors.https.server.IndexResource`."""
 
     def setUp(self):
         self.pagename = ''
@@ -283,7 +283,7 @@ class IndexResourceTests(unittest.TestCase):
 
 
 class HowtoResourceTests(unittest.TestCase):
-    """Test for :class:`bridgedb.https.server.HowtoResource`."""
+    """Test for :class:`bridgedb.distributors.https.server.HowtoResource`."""
 
     def setUp(self):
         self.pagename = 'howto.html'
@@ -308,7 +308,7 @@ class HowtoResourceTests(unittest.TestCase):
 
 
 class CaptchaProtectedResourceTests(unittest.TestCase):
-    """Tests for :class:`bridgedb.https.server.CaptchaProtectedResource`."""
+    """Tests for :class:`bridgedb.distributors.https.server.CaptchaProtectedResource`."""
 
     def setUp(self):
         self.dist = None
@@ -391,7 +391,7 @@ class CaptchaProtectedResourceTests(unittest.TestCase):
 
 
 class GimpCaptchaProtectedResourceTests(unittest.TestCase):
-    """Tests for :mod:`bridgedb.https.server.GimpCaptchaProtectedResource`."""
+    """Tests for :mod:`bridgedb.distributors.https.server.GimpCaptchaProtectedResource`."""
 
     def setUp(self):
         """Create a :class:`server.BridgesResource` and protect it with
@@ -518,7 +518,7 @@ class GimpCaptchaProtectedResourceTests(unittest.TestCase):
 
 
 class ReCaptchaProtectedResourceTests(unittest.TestCase):
-    """Tests for :mod:`bridgedb.https.server.ReCaptchaProtectedResource`."""
+    """Tests for :mod:`bridgedb.distributors.https.server.ReCaptchaProtectedResource`."""
 
     def setUp(self):
         """Create a :class:`server.BridgesResource` and protect it with
@@ -947,7 +947,7 @@ class BridgesResourceTests(unittest.TestCase):
 
 
 class OptionsResourceTests(unittest.TestCase):
-    """Tests for :class:`bridgedb.https.server.OptionsResource`."""
+    """Tests for :class:`bridgedb.distributors.https.server.OptionsResource`."""
 
     def setUp(self):
         """Create a :class:`server.OptionsResource`."""
@@ -973,7 +973,7 @@ class OptionsResourceTests(unittest.TestCase):
 
 
 class HTTPSServerServiceTests(unittest.TestCase):
-    """Unittests for :func:`bridgedb.email.server.addWebServer`."""
+    """Unittests for :func:`bridgedb.distributors.email.server.addWebServer`."""
 
     def setUp(self):
         """Create a config and an HTTPSDistributor."""
@@ -998,29 +998,29 @@ class HTTPSServerServiceTests(unittest.TestCase):
         reactor.runUntilCurrent()
 
     def test_addWebServer_GIMP_CAPTCHA_ENABLED(self):
-        """Call :func:`bridgedb.https.server.addWebServer` to test startup."""
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` to test startup."""
         server.addWebServer(self.config, self.distributor)
 
     def test_addWebServer_RECAPTCHA_ENABLED(self):
-        """Call :func:`bridgedb.https.server.addWebServer` to test startup."""
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` to test startup."""
         config = self.config
         config.RECAPTCHA_ENABLED = True
         server.addWebServer(config, self.distributor)
 
     def test_addWebServer_no_captchas(self):
-        """Call :func:`bridgedb.https.server.addWebServer` to test startup."""
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` to test startup."""
         config = self.config
         config.GIMP_CAPTCHA_ENABLED = False
         server.addWebServer(config, self.distributor)
 
     def test_addWebServer_no_HTTPS_ROTATION_PERIOD(self):
-        """Call :func:`bridgedb.https.server.addWebServer` to test startup."""
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` to test startup."""
         config = self.config
         config.HTTPS_ROTATION_PERIOD = None
         server.addWebServer(config, self.distributor)
 
     def test_addWebServer_CSP_ENABLED_False(self):
-        """Call :func:`bridgedb.https.server.addWebServer` with
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` with
         ``CSP_ENABLED=False`` to test startup.
         """
         config = self.config
@@ -1028,7 +1028,7 @@ class HTTPSServerServiceTests(unittest.TestCase):
         server.addWebServer(config, self.distributor)
 
     def test_addWebServer_CSP_REPORT_ONLY_False(self):
-        """Call :func:`bridgedb.https.server.addWebServer` with
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` with
         ``CSP_REPORT_ONLY=False`` to test startup.
         """
         config = self.config
@@ -1036,7 +1036,7 @@ class HTTPSServerServiceTests(unittest.TestCase):
         server.addWebServer(config, self.distributor)
 
     def test_addWebServer_CSP_INCLUDE_SELF_False(self):
-        """Call :func:`bridgedb.https.server.addWebServer` with
+        """Call :func:`bridgedb.distributors.https.server.addWebServer` with
         ``CSP_INCLUDE_SELF=False`` to test startup.
         """
         config = self.config
diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py
index f1f5fa4..906d5fe 100644
--- a/doc/sphinx/source/conf.py
+++ b/doc/sphinx/source/conf.py
@@ -34,19 +34,19 @@ import bridgedb.Bridges
 import bridgedb.Bucket
 import bridgedb.crypto
 import bridgedb.distribute
-import bridgedb.email
-import bridgedb.email.autoresponder
-import bridgedb.email.distributor
-import bridgedb.email.dkim
-import bridgedb.email.request
-import bridgedb.email.server
-import bridgedb.email.templates
+import bridgedb.distributors.email
+import bridgedb.distributors.email.autoresponder
+import bridgedb.distributors.email.distributor
+import bridgedb.distributors.email.dkim
+import bridgedb.distributors.email.request
+import bridgedb.distributors.email.server
+import bridgedb.distributors.email.templates
 import bridgedb.filters
 import bridgedb.geo
-import bridgedb.https
-import bridgedb.https.distributor
-import bridgedb.https.request
-import bridgedb.https.server
+import bridgedb.distributors.https
+import bridgedb.distributors.https.distributor
+import bridgedb.distributors.https.request
+import bridgedb.distributors.https.server
 import bridgedb.Main
 import bridgedb.parse
 import bridgedb.parse.addr
diff --git a/setup.py b/setup.py
index 955a720..a133424 100644
--- a/setup.py
+++ b/setup.py
@@ -44,7 +44,7 @@ repo_langs = os.path.join(pkgpath, '_langs.py')
 
 # The directory containing template files and other resources to serve on the
 # web server:
-repo_templates = os.path.join(pkgpath, 'https', 'templates')
+repo_templates = os.path.join(pkgpath, 'distributors', 'https', 'templates')
 
 # The directories to install non-sourcecode resources into should always be
 # given as relative paths, in order to force distutils to install relative to
@@ -375,8 +375,9 @@ setuptools.setup(
     download_url='https://gitweb.torproject.org/bridgedb.git',
     package_dir={'bridgedb': 'bridgedb'},
     packages=['bridgedb',
-              'bridgedb.email',
-              'bridgedb.https',
+              'bridgedb.distributors',
+              'bridgedb.distributors.email',
+              'bridgedb.distributors.https',
               'bridgedb.parse',
               'bridgedb.test',
           ],
@@ -395,7 +396,7 @@ setuptools.setup(
     message_extractors={
         pkgpath: [
             ('**.py', 'python', None),
-            ('https/templates/**.html', 'mako', None),
+            ('distributors/https/templates/**.html', 'mako', None),
         ]
     },
 )





More information about the tor-commits mailing list