Skip to content

Commit

Permalink
Merge pull request #136 from pipermerriam/piper/re-organize-providers…
Browse files Browse the repository at this point in the history
…-and-document-providers

reorganize and document providers
  • Loading branch information
pipermerriam committed Dec 28, 2016
2 parents 5f8f54e + 0304e44 commit df4ea94
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 43 deletions.
6 changes: 4 additions & 2 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import gevent

from web3.providers.tester import EthereumTesterProvider
from web3.providers.rpc import TestRPCProvider
from web3.providers.tester import (
EthereumTesterProvider,
TestRPCProvider,
)
from web3.main import Web3


Expand Down
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Contents
filters
contracts
managers
providers
web3.main
web3.eth
web3.db
Expand Down
54 changes: 54 additions & 0 deletions docs/providers.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
Providers
========

.. py:module:: web3.providers
Providers are in control of the actual interactions with the blockchain.


.. py:currentmodule:: web3.providers.rpc
RPCProvider
-----------

.. py:class:: RPCProvider(host="127.0.0.1", port=8545, path="/", ssl=False, connection_timeout=10, network_timeout=10)
This provider handles interaction with an HTTP or HTTPS based JSON-RPC
server.


.. py:currentmodule:: web3.providers.ipc
IPCProvider
-----------

.. py:class:: IPCProvider(ipc_path=None, testnet=False):
This provider handles interaction with an IPC Socket based JSON-RPC
server.


.. py:currentmodule:: web3.providers.tester
EthereumTesterProvider
----------------------

.. py:class:: EthereumTesterProvider():
This provider can be used for testing. It uses an ephemeral blockchain
backed by the ``ethereum.tester`` module.


TestRPCProvider
---------------

.. py:class:: TestRPCProvider():
This provider can be used for testing. It uses an ephemeral blockchain
backed by the ``ethereum.tester`` module. This provider will be slower
than the ``EthereumTesterProvider`` since it uses an HTTP server for RPC
interactions with.
7 changes: 7 additions & 0 deletions docs/quickstart.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ Web3.py can be installed using ``pip`` as follows.
$ pip install web3
Or to install with support for the ``TestRPCProvider`` and
``EthereumTesterProvider`` you can use this install command.

.. code-block:: shell
$ pip install web3[Tester]
Installation from source can be done from the root of the project with the
following command.

Expand Down
1 change: 0 additions & 1 deletion tests/eth-module/test_eth_sign.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from ethereum.utils import privtoaddr

from web3.providers.rpc import TestRPCProvider
from web3.utils.crypto import (
sha3 as _sha3,
)
Expand Down
9 changes: 8 additions & 1 deletion tests/providers/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@
from gevent import socket

from web3.providers.ipc import IPCProvider
from web3.providers.rpc import TestRPCProvider, RPCProvider, KeepAliveRPCProvider

from web3.providers.rpc import (
RPCProvider,
KeepAliveRPCProvider,
)
from web3.providers.tester import (
TestRPCProvider,
)


def get_open_port():
Expand Down
2 changes: 1 addition & 1 deletion tests/providers/test_testrpc_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from gevent import socket

from web3.providers.manager import RequestManager
from web3.providers.rpc import (
from web3.providers.tester import (
TestRPCProvider,
is_testrpc_available,
)
Expand Down
10 changes: 8 additions & 2 deletions web3/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,23 @@
from web3.providers.rpc import (
RPCProvider,
KeepAliveRPCProvider,
)
from web3.providers.tester import (
TestRPCProvider,
EthereumTesterProvider,
)
from web3.providers.ipc import (
IPCProvider,
)
from web3.providers.ipc import IPCProvider

__version__ = pkg_resources.get_distribution("web3").version

__all__ = [
"__version__",
"Web3",
"RPCProvider",
"TestRPCProvider",
"KeepAliveRPCProvider",
"IPCProvider",
"TestRPCProvider",
"EthereumTesterProvider",
]
8 changes: 7 additions & 1 deletion web3/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,14 @@
from web3.providers.rpc import (
RPCProvider,
KeepAliveRPCProvider,
)
from web3.providers.tester import (
TestRPCProvider,
EthereumTesterProvider,
)
from web3.providers.ipc import (
IPCProvider,
)
from web3.providers.ipc import IPCProvider
from web3.providers.manager import (
RequestManager,
DelegatedSigningManager,
Expand Down Expand Up @@ -55,6 +60,7 @@ class Web3(object):
KeepAliveRPCProvider = KeepAliveRPCProvider
IPCProvider = IPCProvider
TestRPCProvider = TestRPCProvider
EthereumTesterProvider = EthereumTesterProvider

# Managers
RequestManager = RequestManager
Expand Down
35 changes: 0 additions & 35 deletions web3/providers/rpc.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import contextlib
import gevent
from geventhttpclient import HTTPClient
import logging

Expand Down Expand Up @@ -161,37 +160,3 @@ def make_request(self, method, params):
response = self.client.post(self.path, body=request_data)
response_body = response.read()
return response_body


def is_testrpc_available():
try:
import testrpc # noqa: F401
return True
except ImportError:
return False


class TestRPCProvider(RPCProvider):
def __init__(self, host="127.0.0.1", port=8545, *args, **kwargs):
if not is_testrpc_available():
raise Exception("`TestRPCProvider` requires the `eth-testrpc` package to be installed")
from gevent.pywsgi import WSGIServer
from testrpc.server import get_application

try:
logger = kwargs.pop('logger')
except KeyError:
logger = logging.getLogger('testrpc')

application = get_application()

self.server = WSGIServer(
(host, port),
application,
log=logger,
error_log=logger,
)

self.thread = gevent.spawn(self.server.serve_forever)

super(TestRPCProvider, self).__init__(host, str(port), *args, **kwargs)
29 changes: 29 additions & 0 deletions web3/providers/tester.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import logging

import gevent

from testrpc.rpc import RPCMethods

from .base import BaseProvider # noqa: E402
from .rpc import RPCProvider # noqa: E402


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -47,3 +50,29 @@ def make_request(self, method, params):

def isConnected(self):
return True


class TestRPCProvider(RPCProvider):
def __init__(self, host="127.0.0.1", port=8545, *args, **kwargs):
if not is_testrpc_available():
raise Exception("`TestRPCProvider` requires the `eth-testrpc` package to be installed")
from gevent.pywsgi import WSGIServer
from testrpc.server import get_application

try:
logger = kwargs.pop('logger')
except KeyError:
logger = logging.getLogger('testrpc')

application = get_application()

self.server = WSGIServer(
(host, port),
application,
log=logger,
error_log=logger,
)

self.thread = gevent.spawn(self.server.serve_forever)

super(TestRPCProvider, self).__init__(host, str(port), *args, **kwargs)

0 comments on commit df4ea94

Please sign in to comment.