Skip to content

Commit 34a5012

Browse files
authored
Merge pull request #1200 from njgheorghita/update-manager-providers-to-single-provider
Change manager.providers from list to single manager.provider (V5 beta)
2 parents a21145d + d6d3509 commit 34a5012

24 files changed

+72
-128
lines changed

conftest.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,15 @@ def sleep_interval():
4040
return PollDelayCounter()
4141

4242

43-
def is_all_testrpc_providers(providers):
44-
return all(
45-
isinstance(provider, EthereumTesterProvider)
46-
for provider
47-
in providers
48-
)
43+
def is_testrpc_provider(provider):
44+
return isinstance(provider, EthereumTesterProvider)
4945

5046

5147
@pytest.fixture()
5248
def skip_if_testrpc():
5349

5450
def _skip_if_testrpc(web3):
55-
if is_all_testrpc_providers(web3.providers):
51+
if is_testrpc_provider(web3.provider):
5652
pytest.skip()
5753
return _skip_if_testrpc
5854

docs/providers.rst

-26
Original file line numberDiff line numberDiff line change
@@ -316,29 +316,3 @@ AutoProvider
316316
:class:`~web3.providers.auto.AutoProvider` is the default used when initializing
317317
:class:`web3.Web3` without any providers. There's rarely a reason to use it
318318
explicitly.
319-
320-
321-
Using Multiple Providers
322-
------------------------
323-
324-
Web3 supports the use of multiple providers. This is useful for cases where
325-
you wish to delegate requests across different providers. To use this feature,
326-
simply instantiate your web3 instance with an iterable of provider instances.
327-
328-
329-
.. code-block:: python
330-
331-
>>> from web3 import Web3, HTTPProvider
332-
>>> from . import MySpecialProvider
333-
>>> special_provider = MySpecialProvider()
334-
>>> infura_provider = HTTPProvider('https://ropsten.infura.io')
335-
>>> w3 = Web3([special_provider, infura_provider])
336-
337-
338-
When web3 has multiple providers it will iterate over them in order, trying the
339-
RPC request and returning the first response it receives. Any provider which
340-
*cannot* respond to a request **must** throw a
341-
``web3.exceptions.CannotHandleRequest`` exception.
342-
343-
If none of the configured providers are able to handle the request, then a
344-
``web3.exceptions.UnhandledRequest`` exception will be thrown.

ens/main.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ class ENS:
4848
is_valid_name = staticmethod(is_valid_name)
4949
reverse_domain = staticmethod(address_to_reverse_domain)
5050

51-
def __init__(self, providers=default, addr=None):
51+
def __init__(self, provider=default, addr=None):
5252
'''
53-
:param providers: a list or single provider used to connect to Ethereum
54-
:type providers: instance of `web3.providers.base.BaseProvider`
53+
:param provider: a single provider used to connect to Ethereum
54+
:type provider: instance of `web3.providers.base.BaseProvider`
5555
:param hex-string addr: the address of the ENS registry on-chain. If not provided,
5656
ENS.py will default to the mainnet ENS registry address.
5757
'''
58-
self.web3 = init_web3(providers)
58+
self.web3 = init_web3(provider)
5959

6060
ens_addr = addr if addr else ENS_MAINNET_ADDR
6161
self.ens = self.web3.eth.contract(abi=abis.ENS, address=ens_addr)
@@ -70,7 +70,7 @@ def fromWeb3(cls, web3, addr=None):
7070
:param hex-string addr: the address of the ENS registry on-chain. If not provided,
7171
ENS.py will default to the mainnet ENS registry address.
7272
'''
73-
return cls(web3.manager.providers, addr=addr)
73+
return cls(web3.manager.provider, addr=addr)
7474

7575
def address(self, name, guess_tld=True):
7676
'''

tests/core/contracts/test_contract_call_interface.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -412,13 +412,13 @@ def test_call_fallback_function(fallback_function_contract):
412412

413413

414414
def test_throws_error_if_block_out_of_range(web3, math_contract):
415-
web3.providers[0].make_request(method='evm_mine', params=[20])
415+
web3.provider.make_request(method='evm_mine', params=[20])
416416
with pytest.raises(BlockNumberOutofRange):
417417
math_contract.functions.counter().call(block_identifier=-50)
418418

419419

420420
def test_accepts_latest_block(web3, math_contract):
421-
web3.providers[0].make_request(method='evm_mine', params=[5])
421+
web3.provider.make_request(method='evm_mine', params=[5])
422422
math_contract.functions.increment().transact()
423423

424424
late = math_contract.functions.counter().call(block_identifier='latest')
@@ -429,9 +429,9 @@ def test_accepts_latest_block(web3, math_contract):
429429

430430

431431
def test_accepts_block_hash_as_identifier(web3, math_contract):
432-
blocks = web3.providers[0].make_request(method='evm_mine', params=[5])
432+
blocks = web3.provider.make_request(method='evm_mine', params=[5])
433433
math_contract.functions.increment().transact()
434-
more_blocks = web3.providers[0].make_request(method='evm_mine', params=[5])
434+
more_blocks = web3.provider.make_request(method='evm_mine', params=[5])
435435

436436
old = math_contract.functions.counter().call(block_identifier=blocks['result'][2])
437437
new = math_contract.functions.counter().call(block_identifier=more_blocks['result'][2])
@@ -441,10 +441,10 @@ def test_accepts_block_hash_as_identifier(web3, math_contract):
441441

442442

443443
def test_neg_block_indexes_from_the_end(web3, math_contract):
444-
web3.providers[0].make_request(method='evm_mine', params=[5])
444+
web3.provider.make_request(method='evm_mine', params=[5])
445445
math_contract.functions.increment().transact()
446446
math_contract.functions.increment().transact()
447-
web3.providers[0].make_request(method='evm_mine', params=[5])
447+
web3.provider.make_request(method='evm_mine', params=[5])
448448

449449
output1 = math_contract.functions.counter().call(block_identifier=-7)
450450
output2 = math_contract.functions.counter().call(block_identifier=-6)
@@ -455,7 +455,7 @@ def test_neg_block_indexes_from_the_end(web3, math_contract):
455455

456456
def test_returns_data_from_specified_block(web3, math_contract):
457457
start_num = web3.eth.getBlock('latest').number
458-
web3.providers[0].make_request(method='evm_mine', params=[5])
458+
web3.provider.make_request(method='evm_mine', params=[5])
459459
math_contract.functions.increment().transact()
460460
math_contract.functions.increment().transact()
461461

tests/core/filtering/conftest.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
@pytest.fixture()
2121
def tester_snapshot(web3):
22-
return web3.providers[0].ethereum_tester.take_snapshot()
22+
return web3.provider.ethereum_tester.take_snapshot()
2323

2424

2525
@pytest.fixture(

tests/core/filtering/test_contract_data_filters.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def clear_chain_state(web3, snapshot):
6161
Hypothesis doesn't allow function scoped fixtures to re-run between test runs
6262
so chain state needs to be explicitly cleared
6363
"""
64-
web3.providers[0].ethereum_tester.revert_to_snapshot(snapshot)
64+
web3.provider.ethereum_tester.revert_to_snapshot(snapshot)
6565

6666

6767
@pytest.mark.parametrize('api_style', ('v4', 'build_filter'))

tests/core/filtering/test_contract_topic_filters.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def clear_chain_state(web3, snapshot):
6363
Hypothesis doesn't allow function scoped fixtures to re-run between test runs
6464
so chain state needs to be explicitly cleared
6565
"""
66-
web3.providers[0].ethereum_tester.revert_to_snapshot(snapshot)
66+
web3.provider.ethereum_tester.revert_to_snapshot(snapshot)
6767

6868

6969
@pytest.mark.parametrize('api_style', ('v4', 'build_filter'))

tests/core/filtering/test_existing_filter_instance.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
@pytest.fixture()
1212
def filter_id(web3):
13-
if EthereumTesterProvider not in map(type, web3.providers):
14-
web3.providers = EthereumTesterProvider()
13+
if not isinstance(web3.provider, EthereumTesterProvider):
14+
web3.provider = EthereumTesterProvider()
1515

1616
block_filter = web3.eth.filter("latest")
1717
return block_filter.filter_id

tests/core/filtering/test_filter_against_latest_blocks.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88

99
def test_sync_filter_against_latest_blocks(web3, sleep_interval, wait_for_block):
10-
if EthereumTesterProvider not in map(type, web3.providers):
11-
web3.providers = EthereumTesterProvider()
10+
if not isinstance(web3.provider, EthereumTesterProvider):
11+
web3.provider = EthereumTesterProvider()
1212

1313
txn_filter = web3.eth.filter("latest")
1414

tests/core/gas-strategies/test_time_based_gas_price_strategy.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def test_time_based_gas_price_strategy(strategy_params, expected):
141141
})
142142

143143
w3 = Web3(
144-
providers=[BaseProvider()],
144+
provider=BaseProvider(),
145145
middlewares=[fixture_middleware],
146146
)
147147

@@ -195,7 +195,7 @@ def test_time_based_gas_price_strategy_zero_sample(strategy_params_zero,
195195
})
196196

197197
w3 = Web3(
198-
providers=[BaseProvider()],
198+
provider=BaseProvider(),
199199
middlewares=[fixture_middleware],
200200
)
201201
time_based_gas_price_strategy_zero = construct_time_based_gas_price_strategy(

tests/core/manager/test_provider_property.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ def test_provider_property_setter_and_getter():
1313
assert provider_a is not provider_b
1414

1515
manager = RequestManager(None, provider_a)
16-
assert manager.providers[0] is provider_a
16+
assert manager.provider is provider_a
1717

18-
manager.providers = provider_b
18+
manager.provider = provider_b
1919

20-
assert manager.providers[0] is provider_b
20+
assert manager.provider is provider_b

tests/core/middleware/test_filter_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def result_generator_middleware(iter_block_number):
4747

4848
@pytest.fixture(scope='function')
4949
def w3_base():
50-
return Web3(providers=[DummyProvider()], middlewares=[])
50+
return Web3(provider=DummyProvider(), middlewares=[])
5151

5252

5353
@pytest.fixture(scope='function')

tests/core/middleware/test_fixture_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def make_request(self, method, params):
2121

2222
@pytest.fixture
2323
def w3():
24-
return Web3(providers=[DummyProvider()], middlewares=[])
24+
return Web3(provider=DummyProvider(), middlewares=[])
2525

2626

2727
@pytest.mark.parametrize(

tests/core/middleware/test_latest_block_based_cache_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
@pytest.fixture
2727
def w3_base():
28-
return Web3(providers=[BaseProvider()], middlewares=[])
28+
return Web3(provider=BaseProvider(), middlewares=[])
2929

3030

3131
def _mk_block(n, timestamp):

tests/core/middleware/test_name_to_address_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def address(self, name, guess_tld=True):
2929

3030
@pytest.fixture
3131
def w3():
32-
w3 = Web3(providers=[BaseProvider()], middlewares=[])
32+
w3 = Web3(provider=BaseProvider(), middlewares=[])
3333
w3.ens = TempENS({NAME: ADDRESS})
3434
w3.middleware_stack.add(name_to_address_middleware(w3))
3535
return w3

tests/core/middleware/test_request_param_normalizer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
@pytest.fixture
1414
def w3_base():
15-
return Web3(providers=[BaseProvider()], middlewares=[])
15+
return Web3(provider=BaseProvider(), middlewares=[])
1616

1717

1818
@pytest.fixture

tests/core/middleware/test_simple_cache_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
@pytest.fixture
2020
def w3_base():
21-
return Web3(providers=[BaseProvider()], middlewares=[])
21+
return Web3(provider=BaseProvider(), middlewares=[])
2222

2323

2424
@pytest.fixture

tests/core/middleware/test_time_based_cache_middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
@pytest.fixture
2121
def w3_base():
22-
return Web3(providers=[BaseProvider()], middlewares=[])
22+
return Web3(provider=BaseProvider(), middlewares=[])
2323

2424

2525
@pytest.fixture

tests/core/middleware/test_transaction_signing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def result_generator_middleware():
8989

9090
@pytest.fixture()
9191
def w3_base():
92-
return Web3(providers=[DummyProvider()], middlewares=[])
92+
return Web3(provider=DummyProvider(), middlewares=[])
9393

9494

9595
@pytest.fixture()

tests/core/providers/test_auto_provider.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def test_web3_auto_infura_empty_key(monkeypatch, caplog, environ_name):
4545
assert level == logging.WARNING
4646

4747
w3 = infura.w3
48-
assert isinstance(w3.providers[0], HTTPProvider)
49-
assert getattr(w3.providers[0], 'endpoint_uri') == 'https://mainnet.infura.io/'
48+
assert isinstance(w3.provider, HTTPProvider)
49+
assert getattr(w3.provider, 'endpoint_uri') == 'https://mainnet.infura.io/'
5050

5151

5252
@pytest.mark.parametrize('environ_name', ['INFURA_API_KEY', 'WEB3_INFURA_API_KEY'])
@@ -61,8 +61,8 @@ def test_web3_auto_infura_deleted_key(monkeypatch, caplog, environ_name):
6161
assert level == logging.WARNING
6262

6363
w3 = infura.w3
64-
assert isinstance(w3.providers[0], HTTPProvider)
65-
assert getattr(w3.providers[0], 'endpoint_uri') == 'https://mainnet.infura.io/'
64+
assert isinstance(w3.provider, HTTPProvider)
65+
assert getattr(w3.provider, 'endpoint_uri') == 'https://mainnet.infura.io/'
6666

6767

6868
@pytest.mark.parametrize('environ_name', ['INFURA_API_KEY', 'WEB3_INFURA_API_KEY'])
@@ -76,14 +76,14 @@ def test_web3_auto_infura(monkeypatch, caplog, environ_name):
7676
assert len(caplog.record_tuples) == 0
7777

7878
w3 = infura.w3
79-
assert isinstance(w3.providers[0], HTTPProvider)
80-
assert getattr(w3.providers[0], 'endpoint_uri') == expected_url
79+
assert isinstance(w3.provider, HTTPProvider)
80+
assert getattr(w3.provider, 'endpoint_uri') == expected_url
8181

8282

8383
def test_web3_auto_infura_websocket_default(caplog):
8484
importlib.reload(infura)
8585
assert len(caplog.record_tuples) == 0
8686

8787
w3 = infura.w3
88-
assert isinstance(w3.providers[0], WebsocketProvider)
89-
assert getattr(w3.providers[0], 'endpoint_uri') == 'wss://mainnet.infura.io/ws'
88+
assert isinstance(w3.provider, WebsocketProvider)
89+
assert getattr(w3.provider, 'endpoint_uri') == 'wss://mainnet.infura.io/ws'

tests/core/providers/test_ipc_provider.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_sync_waits_for_full_result(jsonrpc_ipc_pipe_path, serve_empty_result):
8181

8282

8383
def test_web3_auto_gethdev():
84-
assert isinstance(w3.providers[0], IPCProvider)
84+
assert isinstance(w3.provider, IPCProvider)
8585
return_block_with_long_extra_data = construct_fixture_middleware({
8686
'eth_getBlockByNumber': {'extraData': '0x' + 'ff' * 33},
8787
})

tests/core/web3-module/test_providers.py

+5-13
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,12 @@
77
)
88

99

10-
def test_set_providers(web3):
11-
providers = [EthereumTesterProvider()]
10+
def test_set_provider(web3):
11+
provider = EthereumTesterProvider()
1212

13-
web3.providers = providers
13+
web3.provider = provider
1414

15-
assert web3.providers == providers
16-
17-
18-
def test_set_providers_single(web3):
19-
providers = [EthereumTesterProvider()]
20-
21-
web3.providers = providers[0]
22-
23-
assert web3.providers == providers
15+
assert web3.provider == provider
2416

2517

2618
def test_auto_provider_none():
@@ -30,4 +22,4 @@ def test_auto_provider_none():
3022
# non-node requests succeed
3123
w3.toHex(0) == '0x0'
3224

33-
type(w3.providers[0]) == AutoProvider
25+
type(w3.provider) == AutoProvider

0 commit comments

Comments
 (0)