From d3929bd53445f41608ee992e7feda85f26652cd0 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Fri, 6 Oct 2023 16:25:52 -0400 Subject: [PATCH 1/3] Relock Porter dependencies to use nucypher dkg-dev-15. --- Pipfile | 4 ++-- Pipfile.lock | 6 +++--- dev-requirements.txt | 4 ++-- requirements.txt | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Pipfile b/Pipfile index 05293eb..dba427a 100644 --- a/Pipfile +++ b/Pipfile @@ -7,12 +7,12 @@ name = "pypi" python_version = "3" [packages] -nucypher = {git = "https://github.com/nucypher/nucypher.git", ref = "dkg-dev-14"} +nucypher = {git = "https://github.com/nucypher/nucypher.git", ref = "dkg-dev-15"} nucypher-core = "==0.12.0" # must be the same as nucypher flask-cors = "*" [dev-packages] -nucypher = {git = "https://github.com/nucypher/nucypher.git", editable = true, ref = "dkg-dev-14", extras = ["dev"]} # needed for testerchain, and must be editable +nucypher = {git = "https://github.com/nucypher/nucypher.git", editable = true, ref = "dkg-dev-15", extras = ["dev"]} # needed for testerchain, and must be editable pytest = "<7" # match with nucypher/nucypher pytest-cov = "*" pytest-mock = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 9c5bb14..0fcf43d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5a78283d498833f09287cb9264c9283b009ca49a0cd380168bf6b34e2f749b55" + "sha256": "e62871d5c144c01492108b21ad223fbb149ac4fc5d7fdfd347375d79896041c8" }, "pipfile-spec": 6, "requires": { @@ -1149,7 +1149,7 @@ }, "nucypher": { "git": "https://github.com/nucypher/nucypher.git", - "ref": "6ea73db2c4585da8b52c51fac071a0bc07f8f406" + "ref": "ff383dc663c7100cf2ae6f899ed268213b6c653d" }, "nucypher-core": { "hashes": [ @@ -3627,7 +3627,7 @@ }, "nucypher": { "git": "https://github.com/nucypher/nucypher.git", - "ref": "6ea73db2c4585da8b52c51fac071a0bc07f8f406" + "ref": "ff383dc663c7100cf2ae6f899ed268213b6c653d" }, "nucypher-core": { "hashes": [ diff --git a/dev-requirements.txt b/dev-requirements.txt index 9d05d6d..eb058f1 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -10,7 +10,7 @@ attrs==23.1.0 ; python_version >= '3.7' autobahn==23.1.2 ; python_version >= '3.7' automat==22.10.0 backcall==0.2.0 -backports.zoneinfo==0.2.1 ; python_version >= '3.6' and python_version < '3.9' +backports.zoneinfo==0.2.1 ; python_version >= '3.6' base58==1.0.3 bitarray==2.8.1 bytestring-splitter==2.4.1 @@ -85,7 +85,7 @@ msgspec==0.18.2 ; python_version >= '3.8' multidict==5.2.0 ; python_version >= '3.6' mypy-extensions==1.0.0 ; python_version >= '3.5' nodeenv==1.8.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6' -git+https://github.com/nucypher/nucypher.git@6ea73db2c4585da8b52c51fac071a0bc07f8f406#egg=nucypher +git+https://github.com/nucypher/nucypher.git@ff383dc663c7100cf2ae6f899ed268213b6c653d#egg=nucypher nucypher-core==0.12.0 numpy==1.24.4 ; python_version >= '3.8' packaging==23.1 ; python_version >= '3.7' diff --git a/requirements.txt b/requirements.txt index b09c019..800cb9b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ async-timeout==4.0.3 ; python_version >= '3.7' attrs==23.1.0 ; python_version >= '3.7' autobahn==23.1.2 ; python_version >= '3.7' automat==22.10.0 -backports.zoneinfo==0.2.1 ; python_version >= '3.6' and python_version < '3.9' +backports.zoneinfo==0.2.1 ; python_version >= '3.6' bitarray==2.8.1 bytestring-splitter==2.4.1 cached-property==1.5.2 @@ -55,7 +55,7 @@ msgpack==1.0.5 msgpack-python==0.5.6 multidict==5.2.0 ; python_version >= '3.6' mypy-extensions==1.0.0 ; python_version >= '3.5' -git+https://github.com/nucypher/nucypher.git@6ea73db2c4585da8b52c51fac071a0bc07f8f406#egg=nucypher +git+https://github.com/nucypher/nucypher.git@ff383dc663c7100cf2ae6f899ed268213b6c653d#egg=nucypher nucypher-core==0.12.0 packaging==23.1 ; python_version >= '3.7' parsimonious==0.9.0 From f7c4161a980dd99815ac87567b8931f30ddbb711 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Fri, 6 Oct 2023 16:26:50 -0400 Subject: [PATCH 2/3] Update eth_provider_uri -> eth_endpoint, network -> domain, use ContractRegistry, update test fixtures. --- deploy/docker/docker-compose.yml | 4 +- deploy/docker/nginx/docker-compose.yml | 4 +- porter/cli/main.py | 125 +++++++++++++++---------- porter/main.py | 42 +++++---- tests/conftest.py | 61 ++++++------ tests/test_porter_cli.py | 101 ++++++++++++-------- 6 files changed, 197 insertions(+), 140 deletions(-) diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index 4ae49be..a077432 100644 --- a/deploy/docker/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -15,6 +15,6 @@ services: - .:/code - ~/.local/share/nucypher:/nucypher command: ["nucypher-porter", "run", - "--eth-provider", "${WEB3_PROVIDER_URI}", - "--network", "${NUCYPHER_NETWORK}", + "--eth-endpoint", "${WEB3_PROVIDER_URI}", + "--domain", "${NUCYPHER_NETWORK}", "--allow-origins", "${PORTER_CORS_ALLOW_ORIGINS}"] # empty string if env var not defined which translates to CORS not enabled by default diff --git a/deploy/docker/nginx/docker-compose.yml b/deploy/docker/nginx/docker-compose.yml index 418c3a0..3834eb3 100644 --- a/deploy/docker/nginx/docker-compose.yml +++ b/deploy/docker/nginx/docker-compose.yml @@ -29,8 +29,8 @@ services: - .:/code - ~/.local/share/nucypher:/nucypher command: [ "nucypher-porter", "run", - "--eth-provider", "${WEB3_PROVIDER_URI}", - "--network", "${NUCYPHER_NETWORK}" ] + "--eth-domain", "${WEB3_PROVIDER_URI}", + "--domain", "${NUCYPHER_NETWORK}" ] environment: - VIRTUAL_HOST=porter.local - VIRTUAL_PORT=9155 diff --git a/porter/cli/main.py b/porter/cli/main.py index 370245c..0fb3a77 100644 --- a/porter/cli/main.py +++ b/porter/cli/main.py @@ -1,24 +1,20 @@ import click -from nucypher.blockchain.eth.networks import NetworksInventory +from nucypher.blockchain.eth.domains import TACoDomain from nucypher.characters.lawful import Ursula from nucypher.cli.config import group_general_config from nucypher.cli.options import ( - option_network, - option_eth_provider_uri, - option_teacher_uri, + option_domain, + option_eth_endpoint, + option_min_stake, option_registry_filepath, - option_min_stake + option_teacher_uri, ) from nucypher.cli.types import NETWORK_PORT -from nucypher.cli.utils import setup_emitter, get_registry -from nucypher.config.constants import TEMPORARY_DOMAIN +from nucypher.cli.utils import get_registry, setup_emitter -from porter.cli.help import echo_version, echo_config_root_path, echo_logging_root_path -from porter.cli.literature import ( - PORTER_CORS_ALLOWED_ORIGINS, - PORTER_RUN_MESSAGE -) -from porter.main import Porter, BANNER +from porter.cli.help import echo_config_root_path, echo_logging_root_path, echo_version +from porter.cli.literature import PORTER_CORS_ALLOWED_ORIGINS, PORTER_RUN_MESSAGE +from porter.main import BANNER, Porter @click.group() @@ -34,53 +30,86 @@ def porter_cli(): @porter_cli.command() @group_general_config -@option_network(default=NetworksInventory.DEFAULT, validate=True, required=False) -@option_eth_provider_uri(required=False) +@option_domain(default=TACoDomain.DEFAULT_DOMAIN_NAME, validate=True, required=False) +@option_eth_endpoint(required=False) @option_teacher_uri @option_registry_filepath @option_min_stake -@click.option('--http-port', help="Porter HTTP/HTTPS port for JSON endpoint", type=NETWORK_PORT, default=Porter.DEFAULT_PORT) -@click.option('--allow-origins', help="The CORS origin(s) comma-delimited list of strings/regexes for origins to allow - no origins allowed by default", type=click.STRING) -@click.option('--dry-run', '-x', help="Execute normally without actually starting Porter", is_flag=True) -@click.option('--eager', help="Start learning and scraping the network before starting up other services", is_flag=True, default=True) -def run(general_config, - network, - eth_provider_uri, - teacher_uri, - registry_filepath, - min_stake, - http_port, - allow_origins, - dry_run, - eager): +@click.option( + "--http-port", + help="Porter HTTP/HTTPS port for JSON endpoint", + type=NETWORK_PORT, + default=Porter.DEFAULT_PORT, +) +@click.option( + "--allow-origins", + help="The CORS origin(s) comma-delimited list of strings/regexes for origins to allow - no origins allowed by default", + type=click.STRING, +) +@click.option( + "--dry-run", + "-x", + help="Execute normally without actually starting Porter", + is_flag=True, +) +@click.option( + "--eager", + help="Start learning and scraping the domain before starting up other services", + is_flag=True, + default=True, +) +def run( + general_config, + domain, + eth_endpoint, + teacher_uri, + registry_filepath, + min_stake, + http_port, + allow_origins, + dry_run, + eager, +): """Start Porter's Web controller.""" emitter = setup_emitter(general_config, banner=BANNER) # HTTP/HTTPS - if not eth_provider_uri: - raise click.BadOptionUsage(option_name='--eth-provider', - message=click.style("--eth-provider is required for decentralized porter.", fg="red")) - if not network: - # should never happen - network defaults to 'mainnet' if not specified - raise click.BadOptionUsage(option_name='--network', - message=click.style("--network is required for decentralized porter.", "red")) + if not eth_endpoint: + raise click.BadOptionUsage( + option_name="--eth-endpoint", + message=click.style( + "--eth-endpoint is required for decentralized porter.", fg="red" + ), + ) + if not domain: + # should never happen - domain defaults to 'mainnet' if not specified + raise click.BadOptionUsage( + option_name="--domain", + message=click.style( + "--domain is required for decentralized porter.", "red" + ), + ) - registry = get_registry(network=network, registry_filepath=registry_filepath) + registry = get_registry(domain=domain, registry_filepath=registry_filepath) teacher = None if teacher_uri: - teacher = Ursula.from_teacher_uri(teacher_uri=teacher_uri, - min_stake=min_stake, - registry=registry, - provider_uri=eth_provider_uri) + teacher = Ursula.from_teacher_uri( + teacher_uri=teacher_uri, + min_stake=min_stake, + registry=registry, + eth_endpoint=eth_endpoint, + ) - PORTER = Porter(domain=network, - known_nodes={teacher} if teacher else None, - registry=registry, - start_learning_now=eager, - eth_provider_uri=eth_provider_uri) + PORTER = Porter( + domain=domain, + known_nodes={teacher} if teacher else None, + registry=registry, + start_learning_now=eager, + eth_endpoint=eth_endpoint, + ) - emitter.message(f"Network: {PORTER.domain.capitalize()}", color='green') - emitter.message(f"ETH Provider URI: {eth_provider_uri}", color='green') + emitter.message(f"TACo Domain: {PORTER.domain.capitalize()}", color="green") + emitter.message(f"ETH Endpoint URI: {eth_endpoint}", color="green") # firm up falsy status (i.e. change specified empty string to None) allow_origins = allow_origins if allow_origins else None diff --git a/porter/main.py b/porter/main.py index 2e4cfac..aaaa725 100644 --- a/porter/main.py +++ b/porter/main.py @@ -7,10 +7,7 @@ from flask import Response, request from nucypher.blockchain.eth.agents import ContractAgency, TACoApplicationAgent from nucypher.blockchain.eth.interfaces import BlockchainInterfaceFactory -from nucypher.blockchain.eth.registry import ( - BaseContractRegistry, - InMemoryContractRegistry, -) +from nucypher.blockchain.eth.registry import ContractRegistry from nucypher.characters.lawful import Ursula from nucypher.crypto.powers import DecryptingPower from nucypher.network.decryption import ThresholdDecryptionClient @@ -39,7 +36,7 @@ | | | |_| | | | |_( (/ /| | |_| \___/|_| \___)____)_| -the Pipe for TACo Application network operations +the Pipe for TACo Application operations """ @@ -83,28 +80,33 @@ class CBDDecryptionOutcome(NamedTuple): ] errors: Dict[ChecksumAddress, str] - def __init__(self, - domain: str = None, - registry: BaseContractRegistry = None, - controller: bool = True, - node_class: object = Ursula, - eth_provider_uri: str = None, - execution_timeout: int = DEFAULT_EXECUTION_TIMEOUT, - *args, **kwargs): - if not eth_provider_uri: + def __init__( + self, + domain: str = None, + registry: ContractRegistry = None, + controller: bool = True, + node_class: object = Ursula, + eth_endpoint: str = None, + execution_timeout: int = DEFAULT_EXECUTION_TIMEOUT, + *args, + **kwargs, + ): + if not eth_endpoint: raise ValueError('ETH Provider URI is required for decentralized Porter.') - if not BlockchainInterfaceFactory.is_interface_initialized(eth_provider_uri=eth_provider_uri): - BlockchainInterfaceFactory.initialize_interface(eth_provider_uri=eth_provider_uri) + if not BlockchainInterfaceFactory.is_interface_initialized( + endpoint=eth_endpoint + ): + BlockchainInterfaceFactory.initialize_interface(endpoint=eth_endpoint) - self.eth_provider_uri = eth_provider_uri - self.registry = registry or InMemoryContractRegistry.from_latest_publication( - network=domain + self.eth_endpoint = eth_endpoint + self.registry = registry or ContractRegistry.from_latest_publication( + domain=domain ) self.application_agent = ContractAgency.get_agent( TACoApplicationAgent, registry=self.registry, - provider_uri=self.eth_provider_uri, + blockchain_endpoint=self.eth_endpoint, ) super().__init__(save_metadata=True, domain=domain, node_class=node_class, *args, **kwargs) diff --git a/tests/conftest.py b/tests/conftest.py index c266d51..6d0bbb6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,9 +13,9 @@ StakingProvidersReservoir, TACoApplicationAgent, ) +from nucypher.blockchain.eth.domains import DomainInfo, TACoDomain from nucypher.blockchain.eth.interfaces import BlockchainInterfaceFactory -from nucypher.blockchain.eth.networks import NetworksInventory -from nucypher.blockchain.eth.registry import InMemoryContractRegistry +from nucypher.blockchain.eth.registry import ContractRegistry from nucypher.blockchain.eth.signers.software import Web3Signer from nucypher.characters.lawful import Enrico, Ursula from nucypher.config.constants import TEMPORARY_DOMAIN @@ -29,9 +29,14 @@ from porter.emitters import WebEmitter from porter.main import Porter -from tests.constants import MOCK_ETH_PROVIDER_URI, TESTERCHAIN_CHAIN_ID +from tests.constants import ( + MOCK_ETH_PROVIDER_URI, + TESTERCHAIN_CHAIN_ID, + TESTERCHAIN_CHAIN_INFO, +) from tests.mock.agents import MockContractAgent -from tests.mock.interfaces import MockBlockchain, mock_registry_source_manager +from tests.mock.interfaces import MockBlockchain +from tests.utils.registry import MockRegistrySource, mock_registry_sources # Crash on server error by default WebEmitter._crash_on_error_default = True @@ -103,27 +108,29 @@ def always_use_mock(*a, **k): return mock_testerchain -@pytest.fixture(scope="session", autouse=True) -def mock_condition_blockchains(session_mocker): +@pytest.fixture(scope="module", autouse=True) +def mock_condition_blockchains(module_mocker): """adds testerchain's chain ID to permitted conditional chains""" - session_mocker.patch.dict( + module_mocker.patch.dict( "nucypher.policy.conditions.evm._CONDITION_CHAINS", {TESTERCHAIN_CHAIN_ID: "eth-tester/pyevm"}, ) - session_mocker.patch.object( - NetworksInventory, "get_polygon_chain_id", return_value=TESTERCHAIN_CHAIN_ID + test_domain_info = DomainInfo( + TEMPORARY_DOMAIN, TESTERCHAIN_CHAIN_INFO, TESTERCHAIN_CHAIN_INFO ) - session_mocker.patch.object( - NetworksInventory, "get_ethereum_chain_id", return_value=TESTERCHAIN_CHAIN_ID + module_mocker.patch.object( + TACoDomain, "get_domain_info", return_value=test_domain_info ) @pytest.fixture(scope='module') -def test_registry(): - registry = InMemoryContractRegistry() - return registry +def test_registry(module_mocker): + with mock_registry_sources(mocker=module_mocker): + mock_source = MockRegistrySource(domain=TEMPORARY_DOMAIN) + registry = ContractRegistry(source=mock_source) + yield registry @pytest.fixture(scope="module", autouse=True) @@ -194,12 +201,6 @@ def mock_substantiate_stamp(module_mocker, monkeymodule): module_mocker.patch.object(Teacher, "validate_operator") -@pytest.fixture(scope='module') -def test_registry_source_manager(test_registry): - with mock_registry_source_manager(test_registry=test_registry) as real_inventory: - yield real_inventory - - @pytest.fixture(scope="module") def mock_signer(get_random_checksum_address): signer = MagicMock(spec=Web3Signer) @@ -211,15 +212,17 @@ def mock_signer(get_random_checksum_address): @pytest.fixture(scope="module") @pytest.mark.usefixtures('testerchain', 'agency') def porter(ursulas, mock_rest_middleware, test_registry): - porter = Porter(domain=TEMPORARY_DOMAIN, - eth_provider_uri=MOCK_ETH_PROVIDER_URI, - registry=test_registry, - abort_on_learning_error=True, - start_learning_now=True, - known_nodes=ursulas, - verify_node_bonding=False, - execution_timeout=2, - network_middleware=mock_rest_middleware) + porter = Porter( + domain=TEMPORARY_DOMAIN, + eth_endpoint=MOCK_ETH_PROVIDER_URI, + registry=test_registry, + abort_on_learning_error=True, + start_learning_now=True, + known_nodes=ursulas, + verify_node_bonding=False, + execution_timeout=2, + network_middleware=mock_rest_middleware, + ) yield porter porter.stop_learning_loop() diff --git a/tests/test_porter_cli.py b/tests/test_porter_cli.py index 10d00c0..eaf9a15 100644 --- a/tests/test_porter_cli.py +++ b/tests/test_porter_cli.py @@ -10,78 +10,101 @@ @pytest.fixture(scope="function") -def teacher_uri(mocker, ursulas, test_registry_source_manager): +def teacher_uri(mocker, ursulas): teacher = list(ursulas)[0] teacher_uri = teacher.seed_node_metadata(as_teacher_uri=True) mocker.patch.object(Ursula, 'from_teacher_uri', return_value=teacher) yield teacher_uri -def test_porter_cli_run_simple(click_runner, teacher_uri, test_registry_source_manager): - porter_run_command = ('run', - '--dry-run', - '--network', TEMPORARY_DOMAIN, - '--eth-provider', TEST_ETH_PROVIDER_URI, - '--teacher', teacher_uri) +def test_porter_cli_run_simple(click_runner, teacher_uri): + porter_run_command = ( + "run", + "--dry-run", + "--domain", + TEMPORARY_DOMAIN, + "--eth-endpoint", + TEST_ETH_PROVIDER_URI, + "--teacher", + teacher_uri, + ) result = click_runner.invoke(porter_cli, porter_run_command, catch_exceptions=False) assert result.exit_code == 0, result.output output = result.output - assert f"Network: {TEMPORARY_DOMAIN}" in output + assert f"Domain: {TEMPORARY_DOMAIN}" in output assert PORTER_RUN_MESSAGE.format(http_port=Porter.DEFAULT_PORT) in output # Non-default port non_default_port = select_test_port() - porter_run_command = ('run', - '--dry-run', - '--network', TEMPORARY_DOMAIN, - '--eth-provider', TEST_ETH_PROVIDER_URI, - '--http-port', non_default_port, - '--teacher', teacher_uri) + porter_run_command = ( + "run", + "--dry-run", + "--domain", + TEMPORARY_DOMAIN, + "--eth-endpoint", + TEST_ETH_PROVIDER_URI, + "--http-port", + non_default_port, + "--teacher", + teacher_uri, + ) result = click_runner.invoke(porter_cli, porter_run_command, catch_exceptions=False) assert result.exit_code == 0, result.output output = result.output - assert f"Network: {TEMPORARY_DOMAIN}" in output + assert f"Domain: {TEMPORARY_DOMAIN}" in output assert PORTER_RUN_MESSAGE.format(http_port=non_default_port) in output -def test_porter_cli_run_eth_provider_must_be_provided(click_runner, teacher_uri, test_registry_source_manager): - porter_run_command = ('run', - '--dry-run', - '--network', TEMPORARY_DOMAIN, - '--teacher', teacher_uri) +def test_porter_cli_run_eth_provider_must_be_provided(click_runner, teacher_uri): + porter_run_command = ( + "run", + "--dry-run", + "--domain", + TEMPORARY_DOMAIN, + "--teacher", + teacher_uri, + ) result = click_runner.invoke(porter_cli, porter_run_command, catch_exceptions=False) assert result.exit_code != 0, result.output - assert f"--eth-provider is required" in result.output + assert f"--eth-endpoint is required" in result.output -def test_cli_run_with_cors_origin(click_runner, - teacher_uri, - test_registry_source_manager): +def test_cli_run_with_cors_origin(click_runner, teacher_uri): allow_origins = ".*\.example\.com,.*\.otherexample\.org" - porter_run_command = ('run', - '--dry-run', - '--network', TEMPORARY_DOMAIN, - '--eth-provider', TEST_ETH_PROVIDER_URI, - '--teacher', teacher_uri, - '--allow-origins', allow_origins) + porter_run_command = ( + "run", + "--dry-run", + "--domain", + TEMPORARY_DOMAIN, + "--eth-endpoint", + TEST_ETH_PROVIDER_URI, + "--teacher", + teacher_uri, + "--allow-origins", + allow_origins, + ) result = click_runner.invoke(porter_cli, porter_run_command, catch_exceptions=False) assert result.exit_code == 0, result.output assert PORTER_RUN_MESSAGE.format(http_port=Porter.DEFAULT_PORT) in result.output assert PORTER_CORS_ALLOWED_ORIGINS.format(allow_origins=allow_origins.split(",")) in result.output -def test_cli_run_with_empty_string_cors_origin(click_runner, - teacher_uri, - test_registry_source_manager): +def test_cli_run_with_empty_string_cors_origin(click_runner, teacher_uri): empty_string_allow_origins = "" - porter_run_command = ('run', - '--dry-run', - '--network', TEMPORARY_DOMAIN, - '--eth-provider', TEST_ETH_PROVIDER_URI, - '--teacher', teacher_uri, - '--allow-origins', empty_string_allow_origins) + porter_run_command = ( + "run", + "--dry-run", + "--domain", + TEMPORARY_DOMAIN, + "--eth-endpoint", + TEST_ETH_PROVIDER_URI, + "--teacher", + teacher_uri, + "--allow-origins", + empty_string_allow_origins, + ) result = click_runner.invoke(porter_cli, porter_run_command, catch_exceptions=False) assert result.exit_code == 0, result.output assert PORTER_RUN_MESSAGE.format(http_port=Porter.DEFAULT_PORT) in result.output From b954791f3305fc8eb86ef9309cf3e72429b72468 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Fri, 6 Oct 2023 16:44:20 -0400 Subject: [PATCH 3/3] Update backports.zoneinfo dependency python restriction. --- dev-requirements.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index eb058f1..66de4fa 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -10,7 +10,7 @@ attrs==23.1.0 ; python_version >= '3.7' autobahn==23.1.2 ; python_version >= '3.7' automat==22.10.0 backcall==0.2.0 -backports.zoneinfo==0.2.1 ; python_version >= '3.6' +backports.zoneinfo==0.2.1 ; python_version >= '3.6' and python_version < '3.9' base58==1.0.3 bitarray==2.8.1 bytestring-splitter==2.4.1 diff --git a/requirements.txt b/requirements.txt index 800cb9b..82e55f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ async-timeout==4.0.3 ; python_version >= '3.7' attrs==23.1.0 ; python_version >= '3.7' autobahn==23.1.2 ; python_version >= '3.7' automat==22.10.0 -backports.zoneinfo==0.2.1 ; python_version >= '3.6' +backports.zoneinfo==0.2.1 ; python_version >= '3.6' and python_version < '3.9' bitarray==2.8.1 bytestring-splitter==2.4.1 cached-property==1.5.2