mirror of https://github.com/nucypher/nucypher.git
Auto-detect 'file' uri scheme when an ipc file path is provided without a scheme and exists. This allows for auto-completion for file paths passed as --provider.
parent
5cd909801f
commit
6ece74cb00
|
@ -14,7 +14,7 @@ GNU Affero General Public License for more details.
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with nucypher. If not, see <https://www.gnu.org/licenses/>.
|
along with nucypher. If not, see <https://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
import os
|
||||||
import pprint
|
import pprint
|
||||||
import time
|
import time
|
||||||
from typing import List
|
from typing import List
|
||||||
|
@ -55,8 +55,8 @@ from nucypher.blockchain.eth.providers import (
|
||||||
)
|
)
|
||||||
from nucypher.blockchain.eth.registry import EthereumContractRegistry
|
from nucypher.blockchain.eth.registry import EthereumContractRegistry
|
||||||
from nucypher.blockchain.eth.sol.compile import SolidityCompiler
|
from nucypher.blockchain.eth.sol.compile import SolidityCompiler
|
||||||
from nucypher.crypto.powers import TransactingPower
|
|
||||||
from nucypher.characters.control.emitters import StdoutEmitter
|
from nucypher.characters.control.emitters import StdoutEmitter
|
||||||
|
from nucypher.crypto.powers import TransactingPower
|
||||||
|
|
||||||
Web3Providers = Union[IPCProvider, WebsocketProvider, HTTPProvider, EthereumTester]
|
Web3Providers = Union[IPCProvider, WebsocketProvider, HTTPProvider, EthereumTester]
|
||||||
|
|
||||||
|
@ -334,6 +334,14 @@ class BlockchainInterface:
|
||||||
'https': _get_HTTP_provider,
|
'https': _get_HTTP_provider,
|
||||||
}
|
}
|
||||||
provider_scheme = uri_breakdown.scheme
|
provider_scheme = uri_breakdown.scheme
|
||||||
|
|
||||||
|
# auto-detect for file based ipc
|
||||||
|
if not provider_scheme:
|
||||||
|
if os.path.exists(provider_uri):
|
||||||
|
# file is available - assume ipc/file scheme
|
||||||
|
self.log.info(f"Auto-detecting provider scheme as 'file://' for provider {provider_uri}")
|
||||||
|
provider_scheme = 'file'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._provider = providers[provider_scheme](provider_uri)
|
self._provider = providers[provider_scheme](provider_uri)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from web3 import HTTPProvider, IPCProvider
|
||||||
|
|
||||||
from nucypher.blockchain.eth.clients import (
|
from nucypher.blockchain.eth.clients import (
|
||||||
Web3Client,
|
Web3Client,
|
||||||
|
@ -154,6 +156,26 @@ class BlockchainInterfaceTestBase(BlockchainInterface):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ProviderTypeTestClient(BlockchainInterfaceTestBase):
|
||||||
|
def __init__(self,
|
||||||
|
expected_provider_class,
|
||||||
|
actual_provider_to_attach,
|
||||||
|
*args,
|
||||||
|
**kwargs):
|
||||||
|
BlockchainInterfaceTestBase.__init__(self, *args, **kwargs)
|
||||||
|
self.expected_provider_class = expected_provider_class
|
||||||
|
self.test_provider_to_attach = actual_provider_to_attach
|
||||||
|
|
||||||
|
def _attach_provider(self, *args, **kwargs) -> None:
|
||||||
|
super()._attach_provider(*args, **kwargs)
|
||||||
|
|
||||||
|
if self.expected_provider_class is not None:
|
||||||
|
# check type
|
||||||
|
assert self.expected_provider_class == self.provider.__class__
|
||||||
|
|
||||||
|
super()._attach_provider(provider=self.test_provider_to_attach)
|
||||||
|
|
||||||
|
|
||||||
class InfuraTestClient(BlockchainInterfaceTestBase):
|
class InfuraTestClient(BlockchainInterfaceTestBase):
|
||||||
|
|
||||||
def _attach_provider(self, *args, **kwargs) -> None:
|
def _attach_provider(self, *args, **kwargs) -> None:
|
||||||
|
@ -199,6 +221,55 @@ def test_geth_web3_client():
|
||||||
assert interface.client.chain_id == 5 # Hardcoded above
|
assert interface.client.chain_id == 5 # Hardcoded above
|
||||||
|
|
||||||
|
|
||||||
|
def test_autodetect_provider_type_file(tempfile_path):
|
||||||
|
|
||||||
|
interface = ProviderTypeTestClient(provider_uri=tempfile_path, # existing file for test
|
||||||
|
expected_provider_class=IPCProvider,
|
||||||
|
actual_provider_to_attach=MockGethProvider())
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
assert isinstance(interface.client, GethClient)
|
||||||
|
|
||||||
|
|
||||||
|
def test_autodetect_provider_type_file_none_existent():
|
||||||
|
with pytest.raises(ValueError) as e:
|
||||||
|
interface = BlockchainInterfaceTestBase(provider_uri='/none_existent.ipc.geth')
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
|
||||||
|
assert "invalid or unsupported blockchain provider URI" in str(e)
|
||||||
|
|
||||||
|
|
||||||
|
def test_detect_provider_type_file():
|
||||||
|
interface = ProviderTypeTestClient(provider_uri='file:///ipc.geth',
|
||||||
|
expected_provider_class=IPCProvider,
|
||||||
|
actual_provider_to_attach=MockGethProvider())
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
assert isinstance(interface.client, GethClient)
|
||||||
|
|
||||||
|
|
||||||
|
def test_detect_provider_type_ipc():
|
||||||
|
interface = ProviderTypeTestClient(provider_uri='ipc:///ipc.geth',
|
||||||
|
expected_provider_class=IPCProvider,
|
||||||
|
actual_provider_to_attach=MockGethProvider())
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
assert isinstance(interface.client, GethClient)
|
||||||
|
|
||||||
|
|
||||||
|
def test_detect_provider_type_http():
|
||||||
|
interface = ProviderTypeTestClient(provider_uri='http://ganache:8445',
|
||||||
|
expected_provider_class=HTTPProvider,
|
||||||
|
actual_provider_to_attach=MockGanacheProvider())
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
assert isinstance(interface.client, GanacheClient)
|
||||||
|
|
||||||
|
|
||||||
|
def test_detect_provider_type_https():
|
||||||
|
interface = ProviderTypeTestClient(provider_uri='https://ganache:8445',
|
||||||
|
expected_provider_class=HTTPProvider,
|
||||||
|
actual_provider_to_attach=MockGanacheProvider())
|
||||||
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
assert isinstance(interface.client, GanacheClient)
|
||||||
|
|
||||||
|
|
||||||
def test_infura_web3_client():
|
def test_infura_web3_client():
|
||||||
interface = InfuraTestClient(provider_uri='infura://1234567890987654321abcdef')
|
interface = InfuraTestClient(provider_uri='infura://1234567890987654321abcdef')
|
||||||
interface.connect(fetch_registry=False, sync_now=False)
|
interface.connect(fetch_registry=False, sync_now=False)
|
||||||
|
|
Loading…
Reference in New Issue