Merge all packages back under 'wormhole'.

After talking to Glyph, I came to my senses:

* There will be just one distribution, pip install "magic-wormhole",
  which will provide both Twisted- and blocking- style libraries. (I was
  looking at separate distributions for each, plus one for the server,
  plus one for the common bits). This involves extra dependencies for
  both (twisted folks will be stuck with 'requests', blocking folks will
  be stuck with 'twisted'), but those aren't huge, and the the
  simplicity is worth it. Blocking users don't have to know anything
  about Twisted to use Wormhole.
* Giving up on multiple distributions means we no longer need multiple
  packages. This makes the import names easier to work with (more
  relative imports).
* This will allow us to provide the blocking flavor with crochet (which
  lets you call twisted code from a blocking world), so we'll have just
  one implementation for both environments, and can get WebSockets and
  Transit in both.
* The server is now part of the main package, as is the test suite.

Fun fact: travis was completely broken while the split was in place (it
wasn't testing the right things).
This commit is contained in:
Brian Warner 2016-04-20 19:20:39 -07:00
commit 29889eb20b
45 changed files with 51 additions and 75 deletions

View File

@ -2,9 +2,6 @@
# only record trace data for wormhole.*
source =
wormhole
txwormhole
wormhole_cli
wormhole_server
# and don't trace the test files themselves, or Versioneer's stuff
omit =
src/wormhole/test/*

View File

@ -16,11 +16,6 @@ User-visible changes in "magic-wormhole":
the CLI tool.
* Twisted-flavor input_code() now does readline-based code entry, with
tab completion.
* The code has been split into four separate importable packages:
* "wormhole", this contains the blocking library and shared code
* "txwormhole": twisted lbirary
* "wormhole_cli": CLI scripts
* "wormhole_server": code for the Rendezvous and Transit Relay servers
* The package now installs two executables: "wormhole" (for send and
receive), and "wormhole-server" (to start and manage the relay
servers).

View File

@ -15,13 +15,15 @@ setup(name="magic-wormhole",
package_dir={"": "src"},
packages=["wormhole",
"wormhole.blocking",
"txwormhole",
"wormhole_cli",
"wormhole_server"],
package_data={"wormhole_server": ["db-schemas/*.sql"]},
"wormhole.cli",
"wormhole.server",
"wormhole.test",
"wormhole.twisted",
],
package_data={"wormhole.server": ["db-schemas/*.sql"]},
entry_points={"console_scripts":
["wormhole = wormhole_cli.runner:entry",
"wormhole-server = wormhole_server.runner:entry",
["wormhole = wormhole.cli.runner:entry",
"wormhole-server = wormhole.server.runner:entry",
]},
install_requires=["spake2==0.3", "pynacl", "requests", "argparse",
"six", "twisted >= 16.1.0", "hkdf",

View File

@ -1,2 +0,0 @@
from wormhole import __version__
__version__ # hush pyflakes

View File

@ -1,7 +1,7 @@
import argparse
from textwrap import dedent
from . import public_relay
from wormhole import __version__
from .. import __version__
parser = argparse.ArgumentParser(
usage="wormhole SUBCOMMAND (subcommand-options)",

View File

@ -2,9 +2,9 @@ from __future__ import print_function
import io, os, sys, json, binascii, six, tempfile, zipfile
from twisted.internet import reactor, defer
from twisted.internet.defer import inlineCallbacks, returnValue
from txwormhole.transcribe import Wormhole, WrongPasswordError
from txwormhole.transit import TransitReceiver
from wormhole.errors import TransferError
from ..twisted.transcribe import Wormhole, WrongPasswordError
from ..twisted.transit import TransitReceiver
from ..errors import TransferError
from .progress import ProgressPrinter
@ -33,7 +33,7 @@ class TwistedReceiver:
tor_manager = None
if self.args.tor:
_start = self.args.timing.add_event("import TorManager")
from txwormhole.tor_manager import TorManager
from ..twisted.tor_manager import TorManager
self.args.timing.finish_event(_start)
tor_manager = TorManager(self._reactor, timing=self.args.timing)
# For now, block everything until Tor has started. Soon: launch

View File

@ -3,10 +3,10 @@ import os, sys, io, json, binascii, six, tempfile, zipfile
from twisted.protocols import basic
from twisted.internet import reactor
from twisted.internet.defer import inlineCallbacks, returnValue
from wormhole.errors import TransferError
from ..errors import TransferError
from .progress import ProgressPrinter
from txwormhole.transcribe import Wormhole, WrongPasswordError
from txwormhole.transit import TransitSender
from ..twisted.transcribe import Wormhole, WrongPasswordError
from ..twisted.transit import TransitSender
APPID = u"lothar.com/wormhole/text-or-file-xfer"
@ -108,7 +108,7 @@ def send_twisted(args, reactor=reactor):
tor_manager = None
if args.tor:
from txwormhole.tor_manager import TorManager
from ..twisted.tor_manager import TorManager
tor_manager = TorManager(reactor, timing=args.timing)
# For now, block everything until Tor has started. Soon: launch tor
# in parallel with everything else, make sure the TorManager can

View File

@ -2,7 +2,7 @@ from __future__ import print_function
import os, sys
from twisted.internet.defer import maybeDeferred
from twisted.internet.task import react
from wormhole.timing import DebugTiming
from ..timing import DebugTiming
from .cli_args import parser
def dispatch(args): # returns Deferred

View File

View File

@ -1,6 +1,6 @@
import argparse
from textwrap import dedent
from wormhole import __version__
from .. import __version__
parser = argparse.ArgumentParser(
usage="wormhole-server SUBCOMMAND (subcommand-options)",

View File

@ -2,7 +2,7 @@ from __future__ import print_function
import os, time
from collections import defaultdict
from .database import get_db
from wormhole.errors import UsageError
from ..errors import UsageError
def abbrev(t):
if t is None:

View File

@ -6,7 +6,7 @@ class DBError(Exception):
pass
def get_schema(version):
schema_bytes = resource_string("wormhole_server",
schema_bytes = resource_string("wormhole.server",
"db-schemas/v%d.sql" % version)
return schema_bytes.decode("utf-8")

View File

@ -5,7 +5,7 @@ from twisted.application import service
from twisted.web import server, static, resource
from autobahn.twisted.resource import WebSocketResource
from .endpoint_service import ServerEndpointService
from wormhole import __version__
from .. import __version__
from .database import get_db
from .rendezvous import Rendezvous
from .rendezvous_web import WebRendezvous

View File

View File

@ -1,9 +1,9 @@
from twisted.application import service
from twisted.internet import reactor, defer
from twisted.python import log
from txwormhole.transit import allocate_tcp_port
from wormhole_server.server import RelayServer
from wormhole import __version__
from ..twisted.transit import allocate_tcp_port
from ..server.server import RelayServer
from .. import __version__
class ServerBase:
def setUp(self):

View File

@ -3,9 +3,9 @@ import json
from twisted.trial import unittest
from twisted.internet.defer import gatherResults, succeed
from twisted.internet.threads import deferToThread
from wormhole.blocking.transcribe import (Wormhole, UsageError, ChannelManager,
WrongPasswordError)
from wormhole.blocking.eventsource import EventSourceFollower
from ..blocking.transcribe import (Wormhole, UsageError, ChannelManager,
WrongPasswordError)
from ..blocking.eventsource import EventSourceFollower
from .common import ServerBase
APPID = u"appid"

View File

@ -2,8 +2,8 @@ from __future__ import print_function
from twisted.trial import unittest
from twisted.internet.defer import gatherResults
from twisted.internet.threads import deferToThread
from txwormhole.transcribe import Wormhole as twisted_Wormhole
from wormhole.blocking.transcribe import Wormhole as blocking_Wormhole
from ..twisted.transcribe import Wormhole as twisted_Wormhole
from ..blocking.transcribe import Wormhole as blocking_Wormhole
from .common import ServerBase
# make sure the two implementations (Twisted-style and blocking-style) can

View File

@ -1,7 +1,7 @@
from __future__ import print_function
import io, time
from twisted.trial import unittest
from wormhole_cli import progress
from ..cli import progress
class Progress(unittest.TestCase):
def test_time(self):

View File

@ -4,12 +4,12 @@ from twisted.trial import unittest
from twisted.python import procutils, log
from twisted.internet.utils import getProcessOutputAndValue
from twisted.internet.defer import inlineCallbacks
from wormhole import __version__
from .. import __version__
from .common import ServerBase
from wormhole_cli import runner, cmd_send, cmd_receive
from wormhole_cli.cmd_send import build_phase1_data
from wormhole.errors import TransferError
from wormhole.timing import DebugTiming
from ..cli import runner, cmd_send, cmd_receive
from ..cli.cmd_send import build_phase1_data
from ..errors import TransferError
from ..timing import DebugTiming
class Phase1Data(unittest.TestCase):
def setUp(self):

View File

@ -10,10 +10,10 @@ from twisted.internet.threads import deferToThread
from twisted.internet.endpoints import clientFromString, connectProtocol
from twisted.web.client import getPage, Agent, readBody
from autobahn.twisted import websocket
from wormhole import __version__
from .. import __version__
from .common import ServerBase
from wormhole_server import rendezvous, transit_server
from txwormhole.eventsource import EventSource
from ..server import rendezvous, transit_server
from ..twisted.eventsource import EventSource
class Reachable(ServerBase, unittest.TestCase):

View File

@ -6,8 +6,8 @@ from twisted.internet import defer, task, endpoints, protocol, address, error
from twisted.internet.defer import gatherResults, inlineCallbacks
from twisted.python import log, failure
from twisted.test import proto_helpers
from txwormhole import transit
from wormhole.errors import UsageError
from ..twisted import transit
from ..errors import UsageError
from nacl.secret import SecretBox
from nacl.exceptions import CryptoError

View File

@ -2,7 +2,7 @@ from __future__ import print_function
import json
from twisted.trial import unittest
from twisted.internet.defer import gatherResults, inlineCallbacks
from txwormhole.transcribe import Wormhole, UsageError, WrongPasswordError
from ..twisted.transcribe import Wormhole, UsageError, WrongPasswordError
from .common import ServerBase
APPID = u"appid"

View File

View File

@ -8,7 +8,7 @@ from twisted.internet.error import ConnectError
from twisted.web import iweb
import txtorcon
import ipaddr
from wormhole.timing import DebugTiming
from ..timing import DebugTiming
from .transit import allocate_tcp_port
# based on twisted.web.client._StandardEndpointFactory

View File

@ -10,10 +10,10 @@ from nacl.secret import SecretBox
from nacl.exceptions import CryptoError
from nacl import utils
from spake2 import SPAKE2_Symmetric
from wormhole import __version__
from wormhole import codes
from wormhole.errors import ServerError, Timeout, WrongPasswordError, UsageError
from wormhole.timing import DebugTiming
from .. import __version__
from .. import codes
from ..errors import ServerError, Timeout, WrongPasswordError, UsageError
from ..timing import DebugTiming
from hkdf import Hkdf
def HKDF(skm, outlen, salt=None, CTXinfo=b""):

View File

@ -9,8 +9,8 @@ from twisted.internet.defer import inlineCallbacks, returnValue
from twisted.protocols import policies
from nacl.secret import SecretBox
from hkdf import Hkdf
from wormhole.errors import UsageError
from wormhole.timing import DebugTiming
from ..errors import UsageError
from ..timing import DebugTiming
from . import ipaddrs
def HKDF(skm, outlen, salt=None, CTXinfo=b""):

View File

@ -1,2 +0,0 @@
from wormhole import __version__
__version__ # hush pyflakes

View File

@ -1,2 +0,0 @@
from wormhole import __version__
__version__ # hush pyflakes

View File

@ -1,12 +0,0 @@
import unittest
class Import(unittest.TestCase):
def test_import(self):
import wormhole
self.assertTrue(len(wormhole.__version__))
import wormhole_server
self.assertTrue(len(wormhole_server.__version__))
import txwormhole
self.assertTrue(len(txwormhole.__version__))
import wormhole_cli
self.assertTrue(len(wormhole_cli.__version__))

View File

@ -21,9 +21,9 @@ deps =
pyflakes
{env:EXTRA_DEPENDENCY:}
commands =
pyflakes setup.py src tests
pyflakes setup.py src
wormhole --version
trial {posargs:tests}
trial {posargs:wormhole.test}
# on windows, trial is installed as venv/bin/trial.py, not .exe, but (at
# least appveyor) adds .PY to $PATHEXT. So "trial wormhole" might work on