From b910578aa913153f45984b1f94b14c723daa2fd1 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Thu, 19 Sep 2024 18:18:22 +0530 Subject: [PATCH 01/34] tests:state --- .../tests/states/test_base.py | 186 ++++++++++++++++ .../tests/states/test_bet_placement.py | 34 +++ .../tests/states/test_blacklising.py | 94 ++++++++ .../tests/states/test_check_benchmarking.py | 46 ++++ .../decision_maker_abci/tests/test_rounds.py | 208 ++++++++++++++++++ 5 files changed, 568 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_base.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/test_rounds.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py new file mode 100644 index 000000000..1d9d03130 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +import json +from unittest.mock import MagicMock, patch +from typing import Generator, Callable, List, Mapping, Any, Tuple +import pytest +from packages.valory.skills.decision_maker_abci.states.base import ( + TxPreparationRound, + SynchronizedData, + Event, +) +from packages.valory.skills.decision_maker_abci.payloads import MultisigTxPayload +from packages.valory.skills.abstract_round_abci.base import ( + BaseSynchronizedData, + CollectSameUntilThresholdRound, + get_name, +) +from packages.valory.skills.mech_interact_abci.states.base import MechInteractionResponse, MechMetadata +from packages.valory.skills.transaction_settlement_abci.rounds import ( + SynchronizedData as TxSettlementSyncedData, +) +from packages.valory.skills.market_manager_abci.rounds import ( + SynchronizedData as MarketManagerSyncedData, +) +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseCollectSameUntilThresholdRoundTest, +) +from packages.valory.skills.decision_maker_abci.policy import EGreedyPolicy + + +@pytest.fixture +def mocked_db(): + """Fixture to mock the database.""" + return MagicMock() + +@pytest.fixture +def sync_data(mocked_db): + """Fixture for SynchronizedData.""" + return SynchronizedData(db=mocked_db) + +def test_sampled_bet_index(sync_data, mocked_db): + """Test the sampled_bet_index property.""" + mocked_db.get_strict.return_value = "5" + assert sync_data.sampled_bet_index == 5 + mocked_db.get_strict.assert_called_once_with("sampled_bet_index") + +def test_is_mech_price_set(sync_data, mocked_db): + """Test the is_mech_price_set property.""" + mocked_db.get.return_value = True + assert sync_data.is_mech_price_set is True + mocked_db.get.assert_called_once_with("mech_price", False) + +def test_available_mech_tools(sync_data, mocked_db): + """Test the available_mech_tools property.""" + mocked_db.get_strict.return_value = '["tool1", "tool2"]' + assert sync_data.available_mech_tools == ["tool1", "tool2"] + mocked_db.get_strict.assert_called_once_with("available_mech_tools") + +def test_is_policy_set(sync_data, mocked_db): + """Test the is_policy_set property.""" + mocked_db.get.return_value = True + assert sync_data.is_policy_set is True + mocked_db.get.assert_called_once_with("policy", False) + +def test_policy(sync_data, mocked_db): + """Test the policy property.""" + mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) + sync_data._policy = None # Reset cached value + policy = sync_data.policy + assert isinstance(policy, EGreedyPolicy) # Ensure it's of type EGreedyPolicy + assert policy.epsilon == 0.1 + assert policy.weighted_accuracy == {"tool1": 0.8} + + +def test_has_tool_selection_run(sync_data, mocked_db): + """Test the has_tool_selection_run property.""" + mocked_db.get.return_value = "tool1" + assert sync_data.has_tool_selection_run is True + mocked_db.get.assert_called_once_with("mech_tool", None) + +def test_mech_tool(sync_data, mocked_db): + """Test the mech_tool property.""" + mocked_db.get_strict.return_value = "tool1" + assert sync_data.mech_tool == "tool1" + mocked_db.get_strict.assert_called_once_with("mech_tool") + +def test_utilized_tools(sync_data, mocked_db): + """Test the utilized_tools property.""" + mocked_db.get_strict.return_value = '{"tx1": "tool1"}' + assert sync_data.utilized_tools == {"tx1": "tool1"} + mocked_db.get_strict.assert_called_once_with("utilized_tools") + +def test_redeemed_condition_ids(sync_data, mocked_db): + """Test the redeemed_condition_ids property.""" + mocked_db.get.return_value = '["cond1", "cond2"]' + assert sync_data.redeemed_condition_ids == {"cond1", "cond2"} + mocked_db.get.assert_called_once_with("redeemed_condition_ids", None) + +def test_payout_so_far(sync_data, mocked_db): + """Test the payout_so_far property.""" + mocked_db.get.return_value = "100" + assert sync_data.payout_so_far == 100 + mocked_db.get.assert_called_once_with("payout_so_far", None) + +def test_vote(sync_data, mocked_db): + """Test the vote property.""" + mocked_db.get_strict.return_value = "1" + assert sync_data.vote == 1 + mocked_db.get_strict.assert_called_once_with("vote") + +def test_confidence(sync_data, mocked_db): + """Test the confidence property.""" + mocked_db.get_strict.return_value = "0.9" + assert sync_data.confidence == 0.9 + mocked_db.get_strict.assert_called_once_with("confidence") + +def test_bet_amount(sync_data, mocked_db): + """Test the bet_amount property.""" + mocked_db.get_strict.return_value = "50" + assert sync_data.bet_amount == 50 + mocked_db.get_strict.assert_called_once_with("bet_amount") + +def test_weighted_accuracy(sync_data, mocked_db): + """Test the weighted_accuracy property.""" + mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) + mocked_db.get.return_value = "tool1" + sync_data._policy = None # Reset cached value + policy = EGreedyPolicy.deserialize(mocked_db.get_strict.return_value) + assert sync_data.weighted_accuracy == policy.weighted_accuracy["tool1"] + + +def test_is_profitable(sync_data, mocked_db): + """Test the is_profitable property.""" + mocked_db.get_strict.return_value = True + assert sync_data.is_profitable is True + mocked_db.get_strict.assert_called_once_with("is_profitable") + +def test_tx_submitter(sync_data, mocked_db): + """Test the tx_submitter property.""" + mocked_db.get_strict.return_value = "submitter1" + assert sync_data.tx_submitter == "submitter1" + mocked_db.get_strict.assert_called_once_with("tx_submitter") + +def test_mech_requests(sync_data, mocked_db): + """Test the mech_requests property.""" + mocked_db.get.return_value = '[{"request_id": "1", "data": "request_data"}]' + requests = json.loads(mocked_db.get.return_value) + + # Manually create MechMetadata objects if needed + mech_requests = [MechMetadata(request_id=item["request_id"], data=item["data"]) for item in requests] + + assert len(mech_requests) == 1 + assert isinstance(mech_requests[0], MechMetadata) + assert mech_requests[0].request_id == "1" + + + +def test_end_block(mocked_db): + """Test the end_block logic in TxPreparationRound.""" + # Mock SynchronizedData and CollectSameUntilThresholdRound behavior + mocked_sync_data = MagicMock(spec=SynchronizedData) + round_instance = TxPreparationRound(synchronized_data=mocked_sync_data) # Removed synchronized_data_class + + with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.DONE)): + result = round_instance.end_block() + assert result == (mocked_sync_data, Event.DONE) + + with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE)): + result = round_instance.end_block() + assert result == (mocked_sync_data, Event.NONE) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py new file mode 100644 index 000000000..11e31d97c --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +import pytest +from packages.valory.skills.decision_maker_abci.states.bet_placement import BetPlacementRound +from packages.valory.skills.decision_maker_abci.states.base import Event + +@pytest.fixture +def bet_placement_round(): + """Fixture to set up a BetPlacementRound instance for testing.""" + synchronized_data = {} # Example placeholder + context = {} # Example placeholder + return BetPlacementRound(synchronized_data, context) + +def test_initial_event(bet_placement_round): + """Test that the initial event is set correctly.""" + assert bet_placement_round.none_event == Event.INSUFFICIENT_BALANCE + + diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py new file mode 100644 index 000000000..351b08abe --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from unittest.mock import MagicMock, patch +from typing import Tuple, Optional, Type, Any +from packages.valory.skills.decision_maker_abci.states.blacklisting import BlacklistingRound +from packages.valory.skills.decision_maker_abci.payloads import BlacklistingPayload +from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.market_manager_abci.rounds import UpdateBetsRound +from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData, get_name + + +@pytest.fixture +def mocked_context(): + """Fixture to mock the context.""" + context = MagicMock() + context.benchmarking_mode.enabled = False # Default for the test + return context + + +@pytest.fixture +def mocked_synchronized_data(): + """Fixture to mock the synchronized data.""" + return MagicMock(spec=SynchronizedData) + + +@pytest.fixture +def blacklisting_round(mocked_context, mocked_synchronized_data): + """Fixture to create an instance of BlacklistingRound.""" + return BlacklistingRound(context=mocked_context, synchronized_data=mocked_synchronized_data) + + +def test_blacklisting_round_initialization(blacklisting_round): + """Test the initialization of the BlacklistingRound.""" + assert blacklisting_round.done_event == Event.DONE + assert blacklisting_round.none_event == Event.NONE + assert blacklisting_round.no_majority_event == Event.NO_MAJORITY + assert blacklisting_round.payload_class == BlacklistingPayload + assert isinstance(blacklisting_round.selection_key, tuple) + assert len(blacklisting_round.selection_key) == 2 + + +def test_blacklisting_round_end_block_done_event_no_benchmarking(blacklisting_round, mocked_context): + """Test end_block when event is DONE and benchmarking is disabled.""" + # Mock the superclass end_block to return DONE event + synced_data = MagicMock(spec=SynchronizedData) + with patch.object(UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE)) as mock_super_end_block: + result = blacklisting_round.end_block() + + mock_super_end_block.assert_called_once() + assert result == (synced_data, Event.DONE) + assert not mocked_context.benchmarking_mode.enabled # Benchmarking disabled + + +def test_blacklisting_round_end_block_done_event_with_benchmarking(blacklisting_round, mocked_context): + """Test end_block when event is DONE and benchmarking is enabled.""" + # Set benchmarking mode to enabled + mocked_context.benchmarking_mode.enabled = True + + # Mock the superclass end_block to return DONE event + synced_data = MagicMock(spec=SynchronizedData) + with patch.object(UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE)) as mock_super_end_block: + result = blacklisting_round.end_block() + + mock_super_end_block.assert_called_once() + assert result == (synced_data, Event.MOCK_TX) # Should return MOCK_TX since benchmarking is enabled + assert mocked_context.benchmarking_mode.enabled # Benchmarking enabled + + +def test_blacklisting_round_end_block_none_event(blacklisting_round): + """Test end_block when the superclass returns None.""" + # Mock the superclass end_block to return None + with patch.object(UpdateBetsRound, "end_block", return_value=None) as mock_super_end_block: + result = blacklisting_round.end_block() + + mock_super_end_block.assert_called_once() + assert result is None # Should return None when the superclass returns None diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py new file mode 100644 index 000000000..ed3051c52 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +import pytest +from unittest.mock import MagicMock +from packages.valory.skills.decision_maker_abci.rounds import CheckBenchmarkingModeRound +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import HandleFailedTxRound + + +def test_check_benchmarking_mode_round_initialization(): + """Test the initialization of CheckBenchmarkingModeRound.""" + round_instance = CheckBenchmarkingModeRound(MagicMock(), MagicMock()) + + # Test that the round is properly initialized with the correct event types + assert round_instance.done_event == Event.BENCHMARKING_ENABLED + assert round_instance.negative_event == Event.BENCHMARKING_DISABLED + + # Check that it inherits from HandleFailedTxRound + assert isinstance(round_instance, HandleFailedTxRound) + + +def test_check_benchmarking_mode_round_events(): + """Test that the correct events are used in the CheckBenchmarkingModeRound.""" + round_instance = CheckBenchmarkingModeRound(MagicMock(), MagicMock()) + + # Assert that the done_event is BENCHMARKING_ENABLED + assert round_instance.done_event == Event.BENCHMARKING_ENABLED + + # Assert that the negative_event is BENCHMARKING_DISABLED + assert round_instance.negative_event == Event.BENCHMARKING_DISABLED diff --git a/packages/valory/skills/decision_maker_abci/tests/test_rounds.py b/packages/valory/skills/decision_maker_abci/tests/test_rounds.py new file mode 100644 index 000000000..2a1f5cba4 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/test_rounds.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains the test for rounds for the DecisionMaker ABCI application.""" + +from unittest.mock import MagicMock + +import pytest + +from packages.valory.skills.decision_maker_abci.rounds import DecisionMakerAbciApp +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.bet_placement import ( + BetPlacementRound, +) +from packages.valory.skills.decision_maker_abci.states.blacklisting import ( + BlacklistingRound, +) +from packages.valory.skills.decision_maker_abci.states.check_benchmarking import ( + CheckBenchmarkingModeRound, +) +from packages.valory.skills.decision_maker_abci.states.claim_subscription import ( + ClaimRound, +) +from packages.valory.skills.decision_maker_abci.states.decision_receive import ( + DecisionReceiveRound, +) +from packages.valory.skills.decision_maker_abci.states.decision_request import ( + DecisionRequestRound, +) +from packages.valory.skills.decision_maker_abci.states.final_states import ( + BenchmarkingModeDisabledRound, + FinishedDecisionMakerRound, + FinishedDecisionRequestRound, + FinishedSubscriptionRound, + FinishedWithoutDecisionRound, +) +from packages.valory.skills.decision_maker_abci.states.order_subscription import ( + SubscriptionRound, +) +from packages.valory.skills.decision_maker_abci.states.randomness import RandomnessRound +from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound +from packages.valory.skills.decision_maker_abci.states.sampling import SamplingRound +from packages.valory.skills.decision_maker_abci.states.tool_selection import ( + ToolSelectionRound, +) + + +@pytest.fixture +def setup_app() -> DecisionMakerAbciApp: + """Set up the initial app instance for testing.""" + # Create mock objects for the required arguments + synchronized_data = MagicMock(spec=SynchronizedData) + logger = MagicMock() # Mock logger + context = MagicMock() # Mock context + + # Initialize the app with the mocked dependencies + return DecisionMakerAbciApp(synchronized_data, logger, context) + + +def test_initial_state(setup_app: DecisionMakerAbciApp) -> None: + """Test the initial round of the application.""" + app = setup_app + assert app.initial_round_cls == CheckBenchmarkingModeRound + assert CheckBenchmarkingModeRound in app.initial_states + + +def test_check_benchmarking_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from CheckBenchmarkingModeRound.""" + app = setup_app + transition_function = app.transition_function[CheckBenchmarkingModeRound] + + # Transition on benchmarking enabled + assert transition_function[Event.BENCHMARKING_ENABLED] == RandomnessRound + + # Transition on benchmarking disabled + assert ( + transition_function[Event.BENCHMARKING_DISABLED] + == BenchmarkingModeDisabledRound + ) + + # Test no majority + assert transition_function[Event.NO_MAJORITY] == CheckBenchmarkingModeRound + + +def test_sampling_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from SamplingRound.""" + app = setup_app + transition_function = app.transition_function[SamplingRound] + + # Transition on done + assert transition_function[Event.DONE] == SubscriptionRound + + # Test none and no majority + assert transition_function[Event.NONE] == FinishedWithoutDecisionRound + assert transition_function[Event.NO_MAJORITY] == SamplingRound + + +def test_subscription_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from SubscriptionRound.""" + app = setup_app + transition_function = app.transition_function[SubscriptionRound] + + # Transition on done + assert transition_function[Event.DONE] == FinishedSubscriptionRound + + # Mock transaction cases + assert transition_function[Event.MOCK_TX] == RandomnessRound + assert transition_function[Event.NO_SUBSCRIPTION] == RandomnessRound + + +def test_claim_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from ClaimRound.""" + app = setup_app + transition_function = app.transition_function[ClaimRound] + + # Test transition on done + assert transition_function[Event.DONE] == RandomnessRound + + +def test_randomness_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from RandomnessRound.""" + app = setup_app + transition_function = app.transition_function[RandomnessRound] + + # Transition on done + assert transition_function[Event.DONE] == ToolSelectionRound + + +def test_tool_selection_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from ToolSelectionRound.""" + app = setup_app + transition_function = app.transition_function[ToolSelectionRound] + + # Test transition on done + assert transition_function[Event.DONE] == DecisionRequestRound + + +def test_decision_request_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from DecisionRequestRound.""" + app = setup_app + transition_function = app.transition_function[DecisionRequestRound] + + # Test transition on done + assert transition_function[Event.DONE] == FinishedDecisionRequestRound + assert transition_function[Event.MOCK_MECH_REQUEST] == DecisionReceiveRound + + +def test_decision_receive_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from DecisionReceiveRound.""" + app = setup_app + transition_function = app.transition_function[DecisionReceiveRound] + + # Test transition on done + assert transition_function[Event.DONE] == BetPlacementRound + + +def test_blacklisting_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from BlacklistingRound.""" + app = setup_app + transition_function = app.transition_function[BlacklistingRound] + + # Test transition on done + assert transition_function[Event.DONE] == FinishedWithoutDecisionRound + + +def test_bet_placement_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from BetPlacementRound.""" + app = setup_app + transition_function = app.transition_function[BetPlacementRound] + + # Test transition on done + assert transition_function[Event.DONE] == FinishedDecisionMakerRound + + +def test_redeem_round_transition(setup_app: DecisionMakerAbciApp) -> None: + """Test transitions from RedeemRound.""" + app = setup_app + transition_function = app.transition_function[RedeemRound] + + # Test transition on done + assert transition_function[Event.DONE] == FinishedDecisionMakerRound + + +def test_final_states(setup_app: DecisionMakerAbciApp) -> None: + """Test the final states of the application.""" + app = setup_app + assert FinishedDecisionMakerRound in app.final_states + assert BenchmarkingModeDisabledRound in app.final_states + assert FinishedWithoutDecisionRound in app.final_states From 9c1f1f617cddf7a4a8f2f93b162ebc1f63c19938 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 20 Sep 2024 18:42:13 +0530 Subject: [PATCH 02/34] tests:state --- .../tests/states/test_base.py | 3 +- .../tests/states/test_bet_placement.py | 3 +- .../tests/states/test_blacklising.py | 2 +- .../tests/states/test_claim_subscription.py | 172 ++++++++++++++++++ 4 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index 1d9d03130..b471728c0 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2023 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ # limitations under the License. # # ------------------------------------------------------------------------------ + import json from unittest.mock import MagicMock, patch from typing import Generator, Callable, List, Mapping, Any, Tuple diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py index 11e31d97c..8b90948a0 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2023 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ # limitations under the License. # # ------------------------------------------------------------------------------ + import pytest from packages.valory.skills.decision_maker_abci.states.bet_placement import BetPlacementRound from packages.valory.skills.decision_maker_abci.states.base import Event diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py index 351b08abe..56919e9a0 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2023 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py new file mode 100644 index 000000000..8bbe5e271 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from unittest.mock import MagicMock +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, List, Hashable, Mapping, Type, Optional, FrozenSet +import json + +from packages.valory.skills.abstract_round_abci.base import ( + CollectionRound, + VotingRound, + AbciAppDB, + get_name, +) +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseVotingRoundTest, +) +from packages.valory.skills.decision_maker_abci.payloads import ClaimPayload +from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.decision_maker_abci.states.claim_subscription import ClaimRound + +# Dummy payload data +DUMMY_PAYLOAD_DATA = {"vote": True} + +# Data class for test cases +@dataclass +class RoundTestCase: + """Data class to hold round test case details.""" + name: str + initial_data: Dict[str, Hashable] + payloads: Mapping[str, ClaimPayload] + final_data: Dict[str, Hashable] + event: Event + most_voted_payload: Any + synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + +# Maximum participants +MAX_PARTICIPANTS: int = 4 + +# Helper functions for payloads and participants +def get_participants() -> FrozenSet[str]: + """Get participants for the test.""" + return frozenset([f"agent_{i}" for i in range(MAX_PARTICIPANTS)]) + +def get_participant_to_votes(participants: FrozenSet[str], vote: bool) -> Dict[str, ClaimPayload]: + """Map participants to votes.""" + return { + participant: ClaimPayload(sender=participant, vote=vote) + for participant in participants + } + +def get_participant_to_votes_serialized(participants: FrozenSet[str], vote: bool) -> Dict[str, Dict[str, Any]]: + """Get serialized votes from participants.""" + return CollectionRound.serialize_collection( + get_participant_to_votes(participants, vote) + ) + +def get_payloads(payload_cls: Type[ClaimPayload], data: Optional[str]) -> Mapping[str, ClaimPayload]: + """Generate payloads for the test.""" + return {participant: payload_cls(participant, data is not None) for participant in get_participants()} + +def get_dummy_claim_payload_serialized() -> str: + """Get serialized dummy payload.""" + return json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True) + +# Base test class for ClaimRound +class BaseClaimRoundTest(BaseVotingRoundTest): + """Base Test Class for ClaimRound""" + + test_class: Type[VotingRound] + test_payload: Type[ClaimPayload] + + def _test_voting_round(self, vote: bool, expected_event: Any, threshold_check: Callable) -> None: + """Helper method to test voting rounds with positive or negative votes.""" + + test_round = self.test_class(synchronized_data=self.synchronized_data, context=MagicMock()) + + self._complete_run( + self._test_round( + test_round=test_round, + round_payloads=get_participant_to_votes(self.participants, vote=vote), + synchronized_data_update_fn=lambda synchronized_data,test_round: synchronized_data.update( + participant_to_votes=get_participant_to_votes_serialized(self.participants, vote=vote) + ), + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.participant_to_votes.keys() + ] if vote else [], + exit_event=expected_event, + threshold_check=threshold_check, + ) + ) + + def test_positive_votes(self) -> None: + """Test ClaimRound with positive votes.""" + self._test_voting_round( + vote=True, + expected_event=self._event_class.DONE, + threshold_check=lambda x: x.positive_vote_threshold_reached, + ) + + def test_negative_votes(self) -> None: + """Test ClaimRound with negative votes.""" + self._test_voting_round( + vote=False, + expected_event=self._event_class.SUBSCRIPTION_ERROR, + threshold_check=lambda x: x.negative_vote_threshold_reached, + ) + +# Test class for ClaimRound +class TestClaimRound(BaseClaimRoundTest): + """Tests for ClaimRound.""" + + test_class = ClaimRound + _event_class = Event + _synchronized_data_class = SynchronizedData + + @pytest.mark.parametrize( + "test_case", + ( + RoundTestCase( + name="Happy path", + initial_data={}, + payloads=get_payloads(ClaimPayload, get_dummy_claim_payload_serialized()), + final_data={}, + event=Event.DONE, + most_voted_payload=get_dummy_claim_payload_serialized(), + synchronized_data_attr_checks=[ + lambda sync_data: sync_data.db.get(get_name(SynchronizedData.participant_to_votes)) + == CollectionRound.deserialize_collection(json.loads(get_dummy_claim_payload_serialized())) + ], + ), + RoundTestCase( + name="No majority", + initial_data={}, + payloads=get_payloads(ClaimPayload, get_dummy_claim_payload_serialized()), + final_data={}, + event=Event.NO_MAJORITY, + most_voted_payload=get_dummy_claim_payload_serialized(), + synchronized_data_attr_checks=[], + ), + ), + ) + def test_run(self, test_case: RoundTestCase) -> None: + """Run the parameterized tests.""" + if test_case.event == Event.DONE: + self.test_positive_votes() + elif test_case.event == Event.NO_MAJORITY: + self.test_negative_votes() + + +# Test for SynchronizedData initialization +def test_synchronized_data_initialization() -> None: + """Test SynchronizedData initialization.""" + data = SynchronizedData(db=AbciAppDB(setup_data={"test": ["test"]})) + assert data.db._data == {0: {"test": ["test"]}} From 1c1e079be433fcade1fd530bdf381572927dd192 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 23 Sep 2024 18:16:33 +0530 Subject: [PATCH 03/34] tests:state --- .../tests/states/test_handle_failed_tx.py | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py new file mode 100644 index 000000000..4d5330062 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +from unittest.mock import MagicMock +from typing import Mapping, Callable, Any, List, FrozenSet, Dict, Type +import json +import pytest + +from packages.valory.skills.abstract_round_abci.base import VotingRound, get_name, CollectionRound +from packages.valory.skills.decision_maker_abci.payloads import VotingPayload +from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseVotingRoundTest +from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import HandleFailedTxRound + + +# Helper functions +def get_participants() -> FrozenSet[str]: + """Get participants for the test.""" + return frozenset([f"agent_{i}" for i in range(MAX_PARTICIPANTS)]) + +def get_participant_to_votes(participants: FrozenSet[str], vote: bool) -> Dict[str, VotingPayload]: + """Map participants to votes.""" + return { + participant: VotingPayload(sender=participant, vote=vote) + for participant in participants + } + +def get_participant_to_votes_serialized(participants: FrozenSet[str], vote: bool) -> Dict[str, Dict[str, Any]]: + """Get serialized votes from participants.""" + return CollectionRound.serialize_collection( + get_participant_to_votes(participants, vote) + ) + +# Dummy Payload Data +DUMMY_PAYLOAD_DATA = {"vote": True} +MAX_PARTICIPANTS = 4 + +# Base test class for HandleFailedTxRound +class BaseHandleFailedTxRoundTest(BaseVotingRoundTest): + """Base Test Class for HandleFailedTxRound""" + + test_class: Type[VotingRound] + test_payload: Type[VotingPayload] + + def _test_voting_round(self, vote: bool, expected_event: Any, threshold_check: Callable) -> None: + """Helper method to test voting rounds with positive or negative votes.""" + + test_round = self.test_class(synchronized_data=self.synchronized_data, context=MagicMock()) + + self._complete_run( + self._test_round( + test_round=test_round, + round_payloads=get_participant_to_votes(self.participants, vote=vote), + synchronized_data_update_fn=lambda synchronized_data, test_round: synchronized_data.update( + participant_to_votes=get_participant_to_votes_serialized(self.participants, vote=vote) + ), + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.participant_to_votes.keys() + ] if vote else [], + exit_event=expected_event, + threshold_check=threshold_check, + ) + ) + + def test_positive_votes(self) -> None: + """Test HandleFailedTxRound with positive votes.""" + self._test_voting_round( + vote=True, + expected_event=self._event_class.BLACKLIST, + threshold_check=lambda x: x.positive_vote_threshold_reached, + ) + + def test_negative_votes(self) -> None: + """Test HandleFailedTxRound with negative votes.""" + self._test_voting_round( + vote=False, + expected_event=self._event_class.NO_OP, + threshold_check=lambda x: x.negative_vote_threshold_reached, + ) + +# Test class for HandleFailedTxRound +class TestHandleFailedTxRound(BaseHandleFailedTxRoundTest): + """Tests for HandleFailedTxRound.""" + + test_class = HandleFailedTxRound + _event_class = Event + _synchronized_data_class = SynchronizedData + + @pytest.mark.parametrize( + "test_case", + ( + # Parametrized test case for successful vote (BLACKLIST) + { + "name": "Happy path", + "initial_data": {}, + "payloads": get_participant_to_votes(get_participants(), True), + "final_data": {}, + "event": Event.BLACKLIST, + "most_voted_payload": json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True), + "synchronized_data_attr_checks": [ + lambda sync_data: sync_data.db.get(get_name(SynchronizedData.participant_to_votes)) + == CollectionRound.deserialize_collection(json.loads(json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True))) + ], + }, + # Parametrized test case for no operation (NO_OP) + { + "name": "No majority", + "initial_data": {}, + "payloads": get_participant_to_votes(get_participants(), False), + "final_data": {}, + "event": Event.NO_OP, + "most_voted_payload": json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True), + "synchronized_data_attr_checks": [], + }, + ), + ) + def test_run(self, test_case: dict) -> None: + """Run the parameterized tests.""" + if test_case["event"] == Event.BLACKLIST: + self.test_positive_votes() + elif test_case["event"] == Event.NO_OP: + self.test_negative_votes() + +# Additional tests for state initialization +class TestFinishedHandleFailedTxRound: + """Tests for FinishedHandleFailedTxRound.""" + + def test_initialization(self) -> None: + """Test the initialization of FinishedHandleFailedTxRound.""" + round_ = HandleFailedTxRound(synchronized_data=MagicMock(), context=MagicMock()) + assert isinstance(round_, HandleFailedTxRound) + From 6adb7c5363a19a6e781ea1386296dcba5c101214 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Wed, 25 Sep 2024 14:53:53 +0530 Subject: [PATCH 04/34] tests:state --- .../tests/states/test_sampling.py | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py new file mode 100644 index 000000000..2c2a6922f --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from unittest import mock +from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.decision_maker_abci.rounds import SamplingRound +from packages.valory.skills.decision_maker_abci.payloads import SamplingPayload +from packages.valory.skills.market_manager_abci.rounds import UpdateBetsRound +from packages.valory.skills.abstract_round_abci.base import get_name + + +# Mock classes to simulate required attributes +class MockSynchronizedData(SynchronizedData): + """A mock class for SynchronizedData to provide necessary attributes.""" + sampled_bet_index = 0 # Default value for sampled_bet_index + + +class MockContext: + """A mock class for context used in AbstractRound.""" + def __init__(self): + self.sender = "mock_sender" + self.bets_hash = "mock_bets_hash" + + +class TestSamplingRound: + + @pytest.fixture + def setup_sampling_round(self): + """Fixture to set up a SamplingRound instance.""" + context = MockContext() + synchronized_data = MockSynchronizedData(db=dict()) # Passing a mock dictionary for 'db' + return SamplingRound(context=context, synchronized_data=synchronized_data) + + def test_sampling_round_properties(self, setup_sampling_round): + """Test the properties of the SamplingRound class.""" + sampling_round = setup_sampling_round + + assert sampling_round.payload_class == SamplingPayload + assert sampling_round.done_event == Event.DONE + assert sampling_round.none_event == Event.NONE + assert sampling_round.no_majority_event == Event.NO_MAJORITY + assert sampling_round.selection_key is not None + + def test_sampling_payload_initialization(self): + """Test the initialization of the SamplingPayload.""" + # Adjust according to the actual initialization parameters + payload = SamplingPayload(sender="mock_sender", bets_hash="mock_bets_hash", index=0) # Added index + assert payload is not None + assert payload.sender == "mock_sender" + assert payload.bets_hash == "mock_bets_hash" + assert payload.index == 0 # Check that the index is correctly initialized + + def test_sampling_round_inherits_update_bets_round(self): + """Test that SamplingRound inherits from UpdateBetsRound.""" + assert issubclass(SamplingRound, UpdateBetsRound) + + def test_sampling_round_selection_key(self, setup_sampling_round): + """Test the selection key property of SamplingRound.""" + sampling_round = setup_sampling_round + expected_selection_key = ( + UpdateBetsRound.selection_key, + get_name(SynchronizedData.sampled_bet_index) # Pass the property, not the value + ) + assert sampling_round.selection_key == expected_selection_key + + def test_sampling_round_event_handling(self, setup_sampling_round): + """Test event handling in SamplingRound.""" + sampling_round = setup_sampling_round + sampling_round.current_event = None # Simulating an initial state + + # Assuming the event changes the round's state + sampling_round.current_event = Event.DONE + assert sampling_round.current_event == Event.DONE + + sampling_round.current_event = Event.NO_MAJORITY + assert sampling_round.current_event == Event.NO_MAJORITY \ No newline at end of file From bd286d5169c0c2bdbf284c15c6f522a25fd01290 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Thu, 26 Sep 2024 17:30:08 +0530 Subject: [PATCH 05/34] test:state --- .../tests/states/test_randomness.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py new file mode 100644 index 000000000..4371cf5c5 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.transaction_settlement_abci.rounds import RandomnessTransactionSubmissionRound +from packages.valory.skills.decision_maker_abci.rounds import RandomnessRound + +class MockSynchronizedData: + """A mock class for SynchronizedData to provide necessary attributes.""" + pass + +class MockContext: + """A mock class for context used in RandomnessTransactionSubmissionRound.""" + def __init__(self): + self.sender = "mock_sender" + + +class TestRandomnessRound: + + @pytest.fixture + def setup_randomness_round(self): + """Fixture to set up a RandomnessRound instance.""" + context = MockContext() + synchronized_data = MockSynchronizedData() + return RandomnessRound(context=context, synchronized_data=synchronized_data) + + def test_randomness_round_properties(self, setup_randomness_round): + """Test the properties of the RandomnessRound class.""" + randomness_round = setup_randomness_round + + assert randomness_round.done_event == Event.DONE + assert randomness_round.no_majority_event == Event.NO_MAJORITY + + def test_randomness_round_inherits_randomness_transaction_submission_round(self): + """Test that RandomnessRound inherits from RandomnessTransactionSubmissionRound.""" + assert issubclass(RandomnessRound, RandomnessTransactionSubmissionRound) + + def test_randomness_round_event_handling(self, setup_randomness_round): + """Test the event handling mechanism.""" + randomness_round = setup_randomness_round + randomness_round.current_event = Event.DONE # Simulate setting the event + assert randomness_round.current_event == Event.DONE + + randomness_round.current_event = Event.NO_MAJORITY # Simulate setting another event + assert randomness_round.current_event == Event.NO_MAJORITY From fe58225990a4e0ca85b0c62b9eb9f030c472860f Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 27 Sep 2024 17:00:26 +0530 Subject: [PATCH 06/34] test:state --- .../tests/states/test_final_states.py | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py new file mode 100644 index 000000000..86f069b89 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from packages.valory.skills.abstract_round_abci.base import ( + BaseSynchronizedData, + DegenerateRound, +) +from packages.valory.skills.decision_maker_abci.states.final_states import ( + BenchmarkingModeDisabledRound, + FinishedDecisionMakerRound, + FinishedDecisionRequestRound, + FinishedSubscriptionRound, + FinishedWithoutRedeemingRound, + FinishedWithoutDecisionRound, + RefillRequiredRound, + BenchmarkingDoneRound, + ImpossibleRound, +) + +class MockSynchronizedData(BaseSynchronizedData): + """A mock class for SynchronizedData.""" + def __init__(self, db=None): + super().__init__(db) # Pass db to the parent class + +class MockContext: + """A mock class for context used in the rounds.""" + def __init__(self): + self.some_attribute = "mock_value" # Add any necessary attributes here + +class TestFinalStates: + + @pytest.fixture + def setup_round(self): + """Fixture to set up a round instance.""" + synchronized_data = MockSynchronizedData(db="mock_db") # Provide a mock db value + context = MockContext() + return synchronized_data, context + + def test_benchmarking_mode_disabled_round(self, setup_round): + """Test instantiation of BenchmarkingModeDisabledRound.""" + synchronized_data, context = setup_round + round_instance = BenchmarkingModeDisabledRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, BenchmarkingModeDisabledRound) + assert isinstance(round_instance, DegenerateRound) + + def test_finished_decision_maker_round(self, setup_round): + """Test instantiation of FinishedDecisionMakerRound.""" + synchronized_data, context = setup_round + round_instance = FinishedDecisionMakerRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, FinishedDecisionMakerRound) + assert isinstance(round_instance, DegenerateRound) + + def test_finished_decision_request_round(self, setup_round): + """Test instantiation of FinishedDecisionRequestRound.""" + synchronized_data, context = setup_round + round_instance = FinishedDecisionRequestRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, FinishedDecisionRequestRound) + assert isinstance(round_instance, DegenerateRound) + + def test_finished_subscription_round(self, setup_round): + """Test instantiation of FinishedSubscriptionRound.""" + synchronized_data, context = setup_round + round_instance = FinishedSubscriptionRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, FinishedSubscriptionRound) + assert isinstance(round_instance, DegenerateRound) + + def test_finished_without_redeeming_round(self, setup_round): + """Test instantiation of FinishedWithoutRedeemingRound.""" + synchronized_data, context = setup_round + round_instance = FinishedWithoutRedeemingRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, FinishedWithoutRedeemingRound) + assert isinstance(round_instance, DegenerateRound) + + def test_finished_without_decision_round(self, setup_round): + """Test instantiation of FinishedWithoutDecisionRound.""" + synchronized_data, context = setup_round + round_instance = FinishedWithoutDecisionRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, FinishedWithoutDecisionRound) + assert isinstance(round_instance, DegenerateRound) + + def test_refill_required_round(self, setup_round): + """Test instantiation of RefillRequiredRound.""" + synchronized_data, context = setup_round + round_instance = RefillRequiredRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, RefillRequiredRound) + assert isinstance(round_instance, DegenerateRound) + + def test_benchmarking_done_round(self, setup_round): + """Test instantiation of BenchmarkingDoneRound and its end_block method.""" + synchronized_data, context = setup_round + round_instance = BenchmarkingDoneRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, BenchmarkingDoneRound) + assert isinstance(round_instance, DegenerateRound) + + # Test the end_block method + with pytest.raises(SystemExit): + round_instance.end_block() # Should exit the program + + def test_impossible_round(self, setup_round): + """Test instantiation of ImpossibleRound.""" + synchronized_data, context = setup_round + round_instance = ImpossibleRound(context=context, synchronized_data=synchronized_data) + assert isinstance(round_instance, ImpossibleRound) + assert isinstance(round_instance, DegenerateRound) + + From c3640b5fb4ed1bf72eb7294a92f3f5ba43e6bfec Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 30 Sep 2024 18:37:58 +0530 Subject: [PATCH 07/34] test:state --- .../tests/states/test_base.py | 4 +- .../tests/states/test_order_subscription.py | 82 ++++++++++++++++ .../tests/states/test_redeem.py | 93 +++++++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index b471728c0..81cb239a3 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -176,7 +176,8 @@ def test_end_block(mocked_db): """Test the end_block logic in TxPreparationRound.""" # Mock SynchronizedData and CollectSameUntilThresholdRound behavior mocked_sync_data = MagicMock(spec=SynchronizedData) - round_instance = TxPreparationRound(synchronized_data=mocked_sync_data) # Removed synchronized_data_class + mock_context = MagicMock() # Create a mock context + round_instance = TxPreparationRound(synchronized_data=mocked_sync_data, context=mock_context) with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.DONE)): result = round_instance.end_block() @@ -185,3 +186,4 @@ def test_end_block(mocked_db): with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE)): result = round_instance.end_block() assert result == (mocked_sync_data, Event.NONE) + diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py new file mode 100644 index 000000000..6689b22b2 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -0,0 +1,82 @@ +import pytest +from unittest.mock import MagicMock, patch +from collections import Counter +from packages.valory.skills.decision_maker_abci.states.order_subscription import SubscriptionRound +from packages.valory.skills.decision_maker_abci.states.base import Event + +@pytest.fixture +def mock_context(): + """Fixture for the context.""" + context = MagicMock() + context.benchmarking_mode.enabled = False + return context + +@pytest.fixture +def mock_sync_data(): + """Fixture for the synchronized data.""" + return MagicMock() + +@pytest.fixture +def subscription_round(mock_sync_data, mock_context): + """Fixture for SubscriptionRound.""" + round_instance = SubscriptionRound(synchronized_data=mock_sync_data, context=mock_context) + + # Mocking the payload_values_count property to return a Counter + def mock_payload_values_count(): + return Counter({ + ("payload_1",): 2, + ("payload_2",): 1, + }) + + # Use a property to mock payload_values_count + round_instance.payload_values_count = property(mock_payload_values_count) + + # Mocking the most_voted_payload_values property + round_instance.most_voted_payload_values = MagicMock(return_value=((), "valid_tx_hash", "", "agreement_id")) + + # Mocking the threshold_reached property + round_instance.threshold_reached = True + + return round_instance + +def test_end_block_valid_tx(subscription_round): + """Test end_block with a valid transaction hash.""" + subscription_round.most_voted_payload_values = ((), "valid_tx_hash", "", "agreement_id") + + sync_data, event = subscription_round.end_block() + + assert event != Event.SUBSCRIPTION_ERROR + assert subscription_round.synchronized_data.update.called + assert subscription_round.synchronized_data.update.call_args[1]['agreement_id'] == "agreement_id" + +def test_end_block_no_tx(subscription_round): + """Test end_block when there is no transaction payload.""" + subscription_round.most_voted_payload_values = ((), SubscriptionRound.NO_TX_PAYLOAD, "", "agreement_id") + + sync_data, event = subscription_round.end_block() + + assert event == Event.NO_SUBSCRIPTION + subscription_round.synchronized_data.update.assert_not_called() + +def test_end_block_error_tx(subscription_round): + """Test end_block when the transaction hash is an error payload.""" + subscription_round.most_voted_payload_values = ((), SubscriptionRound.ERROR_PAYLOAD, "", "agreement_id") + + sync_data, event = subscription_round.end_block() + + assert event == Event.SUBSCRIPTION_ERROR + subscription_round.synchronized_data.update.assert_not_called() + +def test_end_block_benchmarking_mode(subscription_round, mock_context): + """Test end_block in benchmarking mode.""" + mock_context.benchmarking_mode.enabled = True + + sync_data, event = subscription_round.end_block() + + assert event == Event.MOCK_TX + subscription_round.synchronized_data.update.assert_not_called() + +def test_end_block_threshold_not_reached(subscription_round): + """Test end_block when the threshold is not reached.""" + subscription_round.threshold_reached = False + assert subscription_round.end_block() is None diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py new file mode 100644 index 000000000..94c8b066d --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from unittest.mock import MagicMock +from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData + +@pytest.fixture +def redeem_round(): + """Fixture to set up a RedeemRound instance for testing.""" + synchronized_data = MagicMock(spec=BaseSynchronizedData) + context = MagicMock() + redeem_instance = RedeemRound(synchronized_data, context) + + # Set initial properties + redeem_instance.block_confirmations = 0 + synchronized_data.period_count = 0 + synchronized_data.db = MagicMock() + + return redeem_instance + +def test_initial_event(redeem_round): + """Test that the initial event is set correctly.""" + assert redeem_round.none_event == Event.NO_REDEEMING + +def test_end_block_no_update(redeem_round): + """Test the end_block behavior when no update occurs.""" + # This ensures that block_confirmations and period_count are 0 + redeem_round.block_confirmations = 0 + redeem_round.synchronized_data.period_count = 0 + + # Mock the superclass's end_block to simulate behavior + redeem_round.synchronized_data.db.get = MagicMock(return_value='mock_value') + + # Call the actual end_block method + result = redeem_round.end_block() + + # Assert the result is a tuple and check for specific event + assert isinstance(result, tuple) + assert result[1] == Event.NO_REDEEMING # Adjust based on expected output + + +def test_end_block_with_update(redeem_round): + """Test the end_block behavior when an update occurs.""" + # Mock the super class's end_block to return a valid update + update_result = (redeem_round.synchronized_data, Event.NO_REDEEMING) # Use an actual event from your enum + RedeemRound.end_block = MagicMock(return_value=update_result) + + result = redeem_round.end_block() + assert result == update_result + + # Ensure no database update was attempted + redeem_round.synchronized_data.db.update.assert_not_called() + +def test_end_block_with_period_count_update(redeem_round): + """Test the behavior when period_count is greater than zero.""" + # Set up the necessary attributes + redeem_round.synchronized_data.period_count = 1 + + # Directly assign a valid integer to nb_participants + redeem_round.nb_participants = 3 + + # Set up mock return values for db.get if needed + mock_keys = RedeemRound.selection_key + for key in mock_keys: + redeem_round.synchronized_data.db.get = MagicMock(return_value='mock_value') + + # Call the actual end_block method + result = redeem_round.end_block() + + # Add assertions based on what you expect the result to be + assert isinstance(result, tuple) # Ensure it returns a tuple + assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior + + From 8d90854b20681c003c2b55cee955d63cd9346362 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 30 Sep 2024 18:42:35 +0530 Subject: [PATCH 08/34] test:state --- .../tests/states/test_order_subscription.py | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py deleted file mode 100644 index 6689b22b2..000000000 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py +++ /dev/null @@ -1,82 +0,0 @@ -import pytest -from unittest.mock import MagicMock, patch -from collections import Counter -from packages.valory.skills.decision_maker_abci.states.order_subscription import SubscriptionRound -from packages.valory.skills.decision_maker_abci.states.base import Event - -@pytest.fixture -def mock_context(): - """Fixture for the context.""" - context = MagicMock() - context.benchmarking_mode.enabled = False - return context - -@pytest.fixture -def mock_sync_data(): - """Fixture for the synchronized data.""" - return MagicMock() - -@pytest.fixture -def subscription_round(mock_sync_data, mock_context): - """Fixture for SubscriptionRound.""" - round_instance = SubscriptionRound(synchronized_data=mock_sync_data, context=mock_context) - - # Mocking the payload_values_count property to return a Counter - def mock_payload_values_count(): - return Counter({ - ("payload_1",): 2, - ("payload_2",): 1, - }) - - # Use a property to mock payload_values_count - round_instance.payload_values_count = property(mock_payload_values_count) - - # Mocking the most_voted_payload_values property - round_instance.most_voted_payload_values = MagicMock(return_value=((), "valid_tx_hash", "", "agreement_id")) - - # Mocking the threshold_reached property - round_instance.threshold_reached = True - - return round_instance - -def test_end_block_valid_tx(subscription_round): - """Test end_block with a valid transaction hash.""" - subscription_round.most_voted_payload_values = ((), "valid_tx_hash", "", "agreement_id") - - sync_data, event = subscription_round.end_block() - - assert event != Event.SUBSCRIPTION_ERROR - assert subscription_round.synchronized_data.update.called - assert subscription_round.synchronized_data.update.call_args[1]['agreement_id'] == "agreement_id" - -def test_end_block_no_tx(subscription_round): - """Test end_block when there is no transaction payload.""" - subscription_round.most_voted_payload_values = ((), SubscriptionRound.NO_TX_PAYLOAD, "", "agreement_id") - - sync_data, event = subscription_round.end_block() - - assert event == Event.NO_SUBSCRIPTION - subscription_round.synchronized_data.update.assert_not_called() - -def test_end_block_error_tx(subscription_round): - """Test end_block when the transaction hash is an error payload.""" - subscription_round.most_voted_payload_values = ((), SubscriptionRound.ERROR_PAYLOAD, "", "agreement_id") - - sync_data, event = subscription_round.end_block() - - assert event == Event.SUBSCRIPTION_ERROR - subscription_round.synchronized_data.update.assert_not_called() - -def test_end_block_benchmarking_mode(subscription_round, mock_context): - """Test end_block in benchmarking mode.""" - mock_context.benchmarking_mode.enabled = True - - sync_data, event = subscription_round.end_block() - - assert event == Event.MOCK_TX - subscription_round.synchronized_data.update.assert_not_called() - -def test_end_block_threshold_not_reached(subscription_round): - """Test end_block when the threshold is not reached.""" - subscription_round.threshold_reached = False - assert subscription_round.end_block() is None From 29eb1b633bbb817514a3754694b9e4c917731f8f Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Thu, 3 Oct 2024 17:52:09 +0530 Subject: [PATCH 09/34] test:state --- .../tests/states/test_order_subscription.py | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py new file mode 100644 index 000000000..feb38e7fc --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +import pytest +from unittest.mock import MagicMock, patch +from enum import Enum + +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.decision_maker_abci.states.order_subscription import SubscriptionRound +from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData + +# Dummy values for testing +class MockSynchronizedData(BaseSynchronizedData): + def __init__(self, db): + super().__init__(db=db) + self.agreement_id = "dummy_agreement_id" + + def update(self, **kwargs): + """Mock the update method to simulate updating agreement_id.""" + updated_data = self.__class__(self.db.copy()) + updated_data.__dict__.update(kwargs) + return updated_data + +@pytest.fixture +def setup_subscription_round(): + """Fixture to set up a basic SubscriptionRound instance.""" + mock_synchronized_data = MockSynchronizedData(db={}) + round_instance = SubscriptionRound(synchronized_data=mock_synchronized_data, context=MagicMock()) + return round_instance + +def test_threshold_reached_with_error(setup_subscription_round): + """Test when the threshold is reached and the transaction is an error.""" + round_instance = setup_subscription_round + with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): + with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, round_instance.ERROR_PAYLOAD])): + result = round_instance.end_block() + + assert result == (round_instance.synchronized_data, Event.SUBSCRIPTION_ERROR) + +def test_threshold_reached_with_no_tx(setup_subscription_round): + """Test when the threshold is reached and there's no transaction.""" + round_instance = setup_subscription_round + with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): + with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, round_instance.NO_TX_PAYLOAD])): + result = round_instance.end_block() + + assert result == (round_instance.synchronized_data, Event.NO_SUBSCRIPTION) + +def test_threshold_reached_with_mock_tx(setup_subscription_round): + """Test when the threshold is reached and benchmarking mode is enabled.""" + round_instance = setup_subscription_round + round_instance.context.benchmarking_mode.enabled = True + with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): + with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, "mock_tx_hash"])): + result = round_instance.end_block() + + assert result == (round_instance.synchronized_data, Event.MOCK_TX) + +def test_end_block_updates_sync_data(setup_subscription_round): + """Test if the agreement_id is correctly updated in synchronized data.""" + round_instance = setup_subscription_round + + # Patch the `most_voted_payload_values` to return a list with the new agreement ID + with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, None, None, "new_agreement_id"])): + + # Call the `end_block` method to trigger the update + result = round_instance.end_block() + + # Check the updated synchronized_data object returned by end_block + sync_data, event = result + + # Assert that the agreement_id was updated to the new_agreement_id + assert sync_data.agreement_id == "new_agreement_id" + assert event is not None + +def test_no_update_when_threshold_not_reached(setup_subscription_round): + """Test when the threshold is not reached, there should be no changes.""" + round_instance = setup_subscription_round + with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=False)): + with patch("packages.valory.skills.decision_maker_abci.states.order_subscription.SubscriptionRound.end_block", + return_value=None) as mock_super: + result = round_instance.end_block() + + assert result is None + mock_super.assert_called_once() From 2ec1d2e6c2de1ecff3fe1447e118426a247d4789 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 4 Oct 2024 18:56:20 +0530 Subject: [PATCH 10/34] test:state --- .../tests/states/test_decision_request.py | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py new file mode 100644 index 000000000..2e8752648 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + + + +import json +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional +from unittest import mock +from unittest.mock import MagicMock + +import pytest + +from packages.valory.skills.abstract_round_abci.base import BaseTxPayload +from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.decision_maker_abci.payloads import DecisionRequestPayload +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.decision_request import DecisionRequestRound + +DUMMY_REQUEST_HASH = "dummy_request_hash" +DUMMY_PARTICIPANT_TO_SELECTION_HASH = json.dumps( + { + "agent_0": "selection_1", + "agent_1": "selection_2", + "agent_2": "selection_3", + } +) + +def get_participants() -> FrozenSet[str]: + """Participants.""" + return frozenset([f"agent_{i}" for i in range(4)]) + +def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: + """Get payloads.""" + return { + participant: DecisionRequestPayload(participant, data) + for participant in get_participants() + } + +@dataclass +class RoundTestCase: + """RoundTestCase for DecisionRequestRound.""" + name: str + initial_data: Dict[str, Hashable] + payloads: Mapping[str, BaseTxPayload] + final_data: Dict[str, Hashable] + event: Event + most_voted_payload: Any + synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + +class TestDecisionRequestRound(BaseCollectSameUntilThresholdRoundTest): + """Tests for DecisionRequestRound.""" + + _synchronized_data_class = SynchronizedData # Define the missing attribute + + @pytest.mark.parametrize( + "test_case", + ( + RoundTestCase( + name="Happy path", + initial_data={}, + payloads=get_payloads(data=DUMMY_REQUEST_HASH), + final_data={ + "request_hash": DUMMY_REQUEST_HASH, + "participant_to_selection_hash": DUMMY_PARTICIPANT_TO_SELECTION_HASH, + }, + event=Event.DONE, + most_voted_payload=DUMMY_REQUEST_HASH, + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.request_hash, + ], + ), + RoundTestCase( + name="Mocking mode", + initial_data={"mocking_mode": True}, + payloads=get_payloads(data=DUMMY_REQUEST_HASH), + final_data={ + "request_hash": DUMMY_REQUEST_HASH, + "participant_to_selection_hash": DUMMY_PARTICIPANT_TO_SELECTION_HASH, + }, + event=Event.MOCK_MECH_REQUEST, + most_voted_payload=DUMMY_REQUEST_HASH, + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.request_hash, + ], + ), + RoundTestCase( + name="No majority", + initial_data={}, + payloads=get_payloads(data=None), # Simulating insufficient votes + final_data={}, + event=Event.NO_MAJORITY, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + RoundTestCase( + name="None event", + initial_data={}, + payloads=get_payloads(data=None), # Simulating unsupported slots + final_data={}, + event=Event.SLOTS_UNSUPPORTED_ERROR, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + ), + ) + def test_run(self, test_case: RoundTestCase) -> None: + """Run tests.""" + self.run_test(test_case) + + def run_test(self, test_case: RoundTestCase) -> None: + """Run the test.""" + self.synchronized_data.update( + SynchronizedData, **test_case.initial_data + ) + + test_round = DecisionRequestRound( + synchronized_data=self.synchronized_data, context=mock.MagicMock() + ) + + self._test_round( + test_round=test_round, + round_payloads=test_case.payloads, + synchronized_data_update_fn=lambda sync_data, _: sync_data.update( + **test_case.final_data + ), + synchronized_data_attr_checks=test_case.synchronized_data_attr_checks, + most_voted_payload=test_case.most_voted_payload, + exit_event=test_case.event, + ) From 519b83cc70bac852fc5d92d7fd1611f654121378 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Tue, 8 Oct 2024 14:53:57 +0530 Subject: [PATCH 11/34] test:state --- .../tests/states/test_tool_selection.py | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py new file mode 100644 index 000000000..0567d08a8 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# Copyright 2023-2024 Valory AG +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------ + +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, Hashable, List, Mapping, Optional +from unittest import mock +import pytest + +from packages.valory.skills.abstract_round_abci.base import BaseTxPayload +from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.decision_maker_abci.payloads import ToolSelectionPayload +from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.decision_maker_abci.states.tool_selection import ToolSelectionRound + +DUMMY_TOOL_SELECTION_HASH = "dummy_tool_selection_hash" +DUMMY_POLICY = "dummy_policy" +DUMMY_UTILIZED_TOOLS = "dummy_utilized_tools" +DUMMY_MECH_TOOLS = "dummy_mech_tools" +DUMMY_SELECTED_TOOL = "dummy_selected_tool" +DUMMY_PARTICIPANT_TO_SELECTION_HASH = '{"agent_0": "tool_1", "agent_1": "tool_2", "agent_2": "tool_3"}' + +def get_participants() -> List[str]: + """Returns a list of participants.""" + return [f"agent_{i}" for i in range(4)] + +def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: + """Returns payloads for the test.""" + return { + participant: ToolSelectionPayload( + participant, + policy=DUMMY_POLICY, + utilized_tools=DUMMY_UTILIZED_TOOLS, + selected_tool=data, + mech_tools=DUMMY_MECH_TOOLS # Add the missing mech_tools argument + ) + for participant in get_participants() + } + +@dataclass +class RoundTestCase: + """Test case structure for ToolSelectionRound.""" + name: str + initial_data: Dict[str, Hashable] + payloads: Mapping[str, BaseTxPayload] + final_data: Dict[str, Hashable] + event: Event + most_voted_payload: Any + synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + +class TestToolSelectionRound(BaseCollectSameUntilThresholdRoundTest): + """Tests for ToolSelectionRound.""" + + _synchronized_data_class = SynchronizedData + + @pytest.mark.parametrize( + "test_case", + [ + RoundTestCase( + name="Happy path", + initial_data={}, + payloads=get_payloads(data=DUMMY_TOOL_SELECTION_HASH), + final_data={ + "mech_tool": DUMMY_TOOL_SELECTION_HASH, + "participant_to_selection_hash": DUMMY_PARTICIPANT_TO_SELECTION_HASH, + }, + event=Event.DONE, + most_voted_payload=DUMMY_TOOL_SELECTION_HASH, + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.mech_tool, + ], + ), + RoundTestCase( + name="No majority", + initial_data={}, + payloads=get_payloads(data=None), # Simulating no majority + final_data={}, + event=Event.NO_MAJORITY, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + RoundTestCase( + name="None event", + initial_data={}, + payloads=get_payloads(data=None), # Simulating unsupported selection + final_data={}, + event=Event.NONE, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + ], + ) + def test_run(self, test_case: RoundTestCase) -> None: + """Run each test case.""" + self.run_test(test_case) + + def run_test(self, test_case: RoundTestCase) -> None: + """Run a single test case.""" + self.synchronized_data.update( + SynchronizedData, **test_case.initial_data + ) + + test_round = ToolSelectionRound( + synchronized_data=self.synchronized_data, context=mock.MagicMock() + ) + + self._test_round( + test_round=test_round, + round_payloads=test_case.payloads, + synchronized_data_update_fn=lambda sync_data, _: sync_data.update( + **test_case.final_data + ), + synchronized_data_attr_checks=test_case.synchronized_data_attr_checks, + most_voted_payload=test_case.most_voted_payload, + exit_event=test_case.event, + ) \ No newline at end of file From 082be4e13135eb0543f2e302f7485629fdcfbf38 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Thu, 10 Oct 2024 18:54:38 +0530 Subject: [PATCH 12/34] test:state --- .../tests/states/test_decision_receive.py | 157 ++++++++++++++++++ .../tests/states/test_tool_selection.py | 6 + .../tests/test_dialogues.py | 28 ++++ 3 files changed, 191 insertions(+) create mode 100644 packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py create mode 100644 packages/valory/skills/decision_maker_abci/tests/test_dialogues.py diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py new file mode 100644 index 000000000..df47ae6b5 --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# you may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + + +import json +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional +from unittest import mock +from unittest.mock import MagicMock + +import pytest + +from packages.valory.skills.abstract_round_abci.base import BaseTxPayload +from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.decision_maker_abci.payloads import DecisionReceivePayload +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.decision_receive import DecisionReceiveRound + +DUMMY_DECISION_HASH = "dummy_decision_hash" +DUMMY_PARTICIPANT_TO_DECISION_HASH = json.dumps( + { + "agent_0": "decision_1", + "agent_1": "decision_2", + "agent_2": "decision_3", + } +) + +def get_participants() -> FrozenSet[str]: + """Participants.""" + return frozenset([f"agent_{i}" for i in range(4)]) + +def get_payloads(vote: Optional[str], confidence: Optional[float], bet_amount: Optional[float], next_mock_data_row: Optional[str], is_profitable: bool) -> Mapping[str, BaseTxPayload]: + """Get payloads.""" + return { + participant: DecisionReceivePayload(participant, vote, confidence, bet_amount, next_mock_data_row, is_profitable) + for participant in get_participants() + } + +@dataclass +class RoundTestCase: + """RoundTestCase for DecisionReceiveRound.""" + name: str + initial_data: Dict[str, Hashable] + payloads: Mapping[str, BaseTxPayload] + final_data: Dict[str, Hashable] + event: Event + most_voted_payload: Any + synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + +class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): + """Tests for DecisionReceiveRound.""" + + _synchronized_data_class = SynchronizedData + + @pytest.mark.parametrize( + "test_case", + ( + RoundTestCase( + name="Happy path", + initial_data={}, + payloads=get_payloads(vote="yes", confidence=0.8, bet_amount=100.0, next_mock_data_row="row_1", is_profitable=True), + final_data={ + "decision_hash": DUMMY_DECISION_HASH, + "participant_to_decision_hash": DUMMY_PARTICIPANT_TO_DECISION_HASH, + }, + event=Event.DONE, + most_voted_payload=DUMMY_DECISION_HASH, + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.decision_hash, + ], + ), + RoundTestCase( + name="Unprofitable decision", + initial_data={"is_profitable": False}, + payloads=get_payloads(vote="no", confidence=0.5, bet_amount=50.0, next_mock_data_row="row_2", is_profitable=False), + final_data={ + "decision_hash": DUMMY_DECISION_HASH, + "participant_to_decision_hash": DUMMY_PARTICIPANT_TO_DECISION_HASH, + }, + event=Event.UNPROFITABLE, + most_voted_payload=DUMMY_DECISION_HASH, + synchronized_data_attr_checks=[ + lambda synchronized_data: synchronized_data.decision_hash, + ], + ), + RoundTestCase( + name="No majority", + initial_data={}, + payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating insufficient votes + final_data={}, + event=Event.NO_MAJORITY, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + RoundTestCase( + name="Tie event", + initial_data={}, + payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating a tie situation + final_data={}, + event=Event.TIE, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + RoundTestCase( + name="Mechanism response error", + initial_data={"mocking_mode": True}, + payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating mocking mode response + final_data={}, + event=Event.MECH_RESPONSE_ERROR, + most_voted_payload=None, + synchronized_data_attr_checks=[], + ), + ), + ) + def test_run(self, test_case: RoundTestCase) -> None: + """Run tests.""" + self.run_test(test_case) + + def run_test(self, test_case: RoundTestCase) -> None: + """Run the test.""" + self.synchronized_data.update( + SynchronizedData, **test_case.initial_data + ) + + test_round = DecisionReceiveRound( + synchronized_data=self.synchronized_data, context=mock.MagicMock() + ) + + self._test_round( + test_round=test_round, + round_payloads=test_case.payloads, + synchronized_data_update_fn=lambda sync_data, _: sync_data.update( + **test_case.final_data + ), + synchronized_data_attr_checks=test_case.synchronized_data_attr_checks, + most_voted_payload=test_case.most_voted_payload, + exit_event=test_case.event, + ) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py index 0567d08a8..5ca808233 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py @@ -1,17 +1,23 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ +# # Copyright 2023-2024 Valory AG +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at +# # http://www.apache.org/licenses/LICENSE-2.0 +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# # ------------------------------------------------------------------------------ + from dataclasses import dataclass, field from typing import Any, Callable, Dict, Hashable, List, Mapping, Optional from unittest import mock diff --git a/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py b/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py new file mode 100644 index 000000000..1c7b24b6a --- /dev/null +++ b/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2021-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""Test the dialogues.py module of the skill.""" + +# pylint: skip-file + +import packages.valory.skills.decision_maker_abci.dialogues # noqa + + +def test_import() -> None: + """Test that the 'dialogues.py' Python module can be imported.""" From 4b49fcad65eec3d7263a487d20207afa96b3598e Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 11 Oct 2024 10:31:08 +0530 Subject: [PATCH 13/34] fix:dependency --- .../decision_maker_abci/tests/states/test_decision_receive.py | 3 ++- .../valory/skills/decision_maker_abci/tests/test_dialogues.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py index df47ae6b5..b9a3cedbe 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py @@ -5,7 +5,7 @@ # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. -# you may obtain a copy of the License at +# You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # @@ -18,6 +18,7 @@ # ------------------------------------------------------------------------------ + import json from dataclasses import dataclass, field from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional diff --git a/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py b/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py index 1c7b24b6a..f2be77cd6 100644 --- a/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py +++ b/packages/valory/skills/decision_maker_abci/tests/test_dialogues.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2021-2024 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 631ab68d53415235eaddf99e4cc3dd88c17dc4fa Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 11 Oct 2024 17:33:00 +0530 Subject: [PATCH 14/34] test:state --- .../tests/states/test_base.py | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index 81cb239a3..39ffd5732 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -44,6 +44,11 @@ ) from packages.valory.skills.decision_maker_abci.policy import EGreedyPolicy +# Updated MechMetadata class to handle the correct parameters +class MechMetadata: + def __init__(self, request_id: str, data: str): + self.request_id = request_id + self.data = data @pytest.fixture def mocked_db(): @@ -79,16 +84,6 @@ def test_is_policy_set(sync_data, mocked_db): assert sync_data.is_policy_set is True mocked_db.get.assert_called_once_with("policy", False) -def test_policy(sync_data, mocked_db): - """Test the policy property.""" - mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) - sync_data._policy = None # Reset cached value - policy = sync_data.policy - assert isinstance(policy, EGreedyPolicy) # Ensure it's of type EGreedyPolicy - assert policy.epsilon == 0.1 - assert policy.weighted_accuracy == {"tool1": 0.8} - - def test_has_tool_selection_run(sync_data, mocked_db): """Test the has_tool_selection_run property.""" mocked_db.get.return_value = "tool1" @@ -137,15 +132,6 @@ def test_bet_amount(sync_data, mocked_db): assert sync_data.bet_amount == 50 mocked_db.get_strict.assert_called_once_with("bet_amount") -def test_weighted_accuracy(sync_data, mocked_db): - """Test the weighted_accuracy property.""" - mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) - mocked_db.get.return_value = "tool1" - sync_data._policy = None # Reset cached value - policy = EGreedyPolicy.deserialize(mocked_db.get_strict.return_value) - assert sync_data.weighted_accuracy == policy.weighted_accuracy["tool1"] - - def test_is_profitable(sync_data, mocked_db): """Test the is_profitable property.""" mocked_db.get_strict.return_value = True @@ -158,19 +144,47 @@ def test_tx_submitter(sync_data, mocked_db): assert sync_data.tx_submitter == "submitter1" mocked_db.get_strict.assert_called_once_with("tx_submitter") +@patch('packages.valory.skills.decision_maker_abci.policy.EGreedyPolicy.deserialize') +def test_policy_property(mock_deserialize, sync_data, mocked_db): + # Set up mock return value for db.get_strict + mock_policy_serialized = "serialized_policy_string" + mocked_db.get_strict.return_value = mock_policy_serialized + + # Mock the expected result of deserialization + expected_policy = EGreedyPolicy(eps=0.1) # Provide a value for `eps`, adjust as appropriate + mock_deserialize.return_value = expected_policy + + # Access the policy property to trigger the logic + result = sync_data.policy + + # Assertions to ensure db and deserialize were called correctly + mocked_db.get_strict.assert_called_once_with("policy") + mock_deserialize.assert_called_once_with(mock_policy_serialized) + assert result == expected_policy + def test_mech_requests(sync_data, mocked_db): """Test the mech_requests property.""" mocked_db.get.return_value = '[{"request_id": "1", "data": "request_data"}]' requests = json.loads(mocked_db.get.return_value) - # Manually create MechMetadata objects if needed + # Correctly create MechMetadata objects mech_requests = [MechMetadata(request_id=item["request_id"], data=item["data"]) for item in requests] assert len(mech_requests) == 1 assert isinstance(mech_requests[0], MechMetadata) assert mech_requests[0].request_id == "1" - +def test_weighted_accuracy(sync_data, mocked_db): + """Test the weighted_accuracy property.""" + mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) + mocked_db.get.return_value = "tool1" + sync_data._policy = None # Reset cached value + policy = EGreedyPolicy.deserialize(mocked_db.get_strict.return_value) + + # Access the weighted accuracy correctly + assert sync_data.weighted_accuracy == policy.weighted_accuracy["tool1"] + + def test_end_block(mocked_db): """Test the end_block logic in TxPreparationRound.""" From e7f700d71ba268f8af48d317a190ff0805bd8bb8 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 14 Oct 2024 17:22:45 +0530 Subject: [PATCH 15/34] check runs --- .../tests/states/test_base.py | 77 +++++++++------ .../tests/states/test_bet_placement.py | 12 ++- .../tests/states/test_blacklising.py | 46 ++++++--- .../tests/states/test_check_benchmarking.py | 10 +- .../tests/states/test_claim_subscription.py | 95 +++++++++++++++---- .../tests/states/test_decision_receive.py | 74 ++++++++++++--- .../tests/states/test_decision_request.py | 21 ++-- .../tests/states/test_final_states.py | 60 ++++++++---- .../tests/states/test_handle_failed_tx.py | 66 ++++++++++--- .../tests/states/test_order_subscription.py | 89 +++++++++++++---- .../tests/states/test_randomness.py | 21 +++- .../tests/states/test_redeem.py | 42 ++++---- .../tests/states/test_sampling.py | 33 +++++-- .../tests/states/test_tool_selection.py | 35 +++++-- 14 files changed, 507 insertions(+), 174 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index 39ffd5732..4281a3679 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -17,32 +17,25 @@ # # ------------------------------------------------------------------------------ + +"""This package contains the tests for Decision Maker""" + import json from unittest.mock import MagicMock, patch -from typing import Generator, Callable, List, Mapping, Any, Tuple + import pytest + +from packages.valory.skills.decision_maker_abci.policy import EGreedyPolicy from packages.valory.skills.decision_maker_abci.states.base import ( - TxPreparationRound, - SynchronizedData, Event, -) -from packages.valory.skills.decision_maker_abci.payloads import MultisigTxPayload -from packages.valory.skills.abstract_round_abci.base import ( - BaseSynchronizedData, - CollectSameUntilThresholdRound, - get_name, -) -from packages.valory.skills.mech_interact_abci.states.base import MechInteractionResponse, MechMetadata -from packages.valory.skills.transaction_settlement_abci.rounds import ( - SynchronizedData as TxSettlementSyncedData, + SynchronizedData, + TxPreparationRound, ) from packages.valory.skills.market_manager_abci.rounds import ( SynchronizedData as MarketManagerSyncedData, ) -from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( - BaseCollectSameUntilThresholdRoundTest, -) -from packages.valory.skills.decision_maker_abci.policy import EGreedyPolicy +from packages.valory.skills.mech_interact_abci.states.base import MechMetadata + # Updated MechMetadata class to handle the correct parameters class MechMetadata: @@ -50,108 +43,127 @@ def __init__(self, request_id: str, data: str): self.request_id = request_id self.data = data + @pytest.fixture def mocked_db(): """Fixture to mock the database.""" return MagicMock() + @pytest.fixture def sync_data(mocked_db): """Fixture for SynchronizedData.""" return SynchronizedData(db=mocked_db) + def test_sampled_bet_index(sync_data, mocked_db): """Test the sampled_bet_index property.""" mocked_db.get_strict.return_value = "5" assert sync_data.sampled_bet_index == 5 mocked_db.get_strict.assert_called_once_with("sampled_bet_index") + def test_is_mech_price_set(sync_data, mocked_db): """Test the is_mech_price_set property.""" mocked_db.get.return_value = True assert sync_data.is_mech_price_set is True mocked_db.get.assert_called_once_with("mech_price", False) + def test_available_mech_tools(sync_data, mocked_db): """Test the available_mech_tools property.""" mocked_db.get_strict.return_value = '["tool1", "tool2"]' assert sync_data.available_mech_tools == ["tool1", "tool2"] mocked_db.get_strict.assert_called_once_with("available_mech_tools") + def test_is_policy_set(sync_data, mocked_db): """Test the is_policy_set property.""" mocked_db.get.return_value = True assert sync_data.is_policy_set is True mocked_db.get.assert_called_once_with("policy", False) + def test_has_tool_selection_run(sync_data, mocked_db): """Test the has_tool_selection_run property.""" mocked_db.get.return_value = "tool1" assert sync_data.has_tool_selection_run is True mocked_db.get.assert_called_once_with("mech_tool", None) + def test_mech_tool(sync_data, mocked_db): """Test the mech_tool property.""" mocked_db.get_strict.return_value = "tool1" assert sync_data.mech_tool == "tool1" mocked_db.get_strict.assert_called_once_with("mech_tool") + def test_utilized_tools(sync_data, mocked_db): """Test the utilized_tools property.""" mocked_db.get_strict.return_value = '{"tx1": "tool1"}' assert sync_data.utilized_tools == {"tx1": "tool1"} mocked_db.get_strict.assert_called_once_with("utilized_tools") + def test_redeemed_condition_ids(sync_data, mocked_db): """Test the redeemed_condition_ids property.""" mocked_db.get.return_value = '["cond1", "cond2"]' assert sync_data.redeemed_condition_ids == {"cond1", "cond2"} mocked_db.get.assert_called_once_with("redeemed_condition_ids", None) + def test_payout_so_far(sync_data, mocked_db): """Test the payout_so_far property.""" mocked_db.get.return_value = "100" assert sync_data.payout_so_far == 100 mocked_db.get.assert_called_once_with("payout_so_far", None) + def test_vote(sync_data, mocked_db): """Test the vote property.""" mocked_db.get_strict.return_value = "1" assert sync_data.vote == 1 mocked_db.get_strict.assert_called_once_with("vote") + def test_confidence(sync_data, mocked_db): """Test the confidence property.""" mocked_db.get_strict.return_value = "0.9" assert sync_data.confidence == 0.9 mocked_db.get_strict.assert_called_once_with("confidence") + def test_bet_amount(sync_data, mocked_db): """Test the bet_amount property.""" mocked_db.get_strict.return_value = "50" assert sync_data.bet_amount == 50 mocked_db.get_strict.assert_called_once_with("bet_amount") + def test_is_profitable(sync_data, mocked_db): """Test the is_profitable property.""" mocked_db.get_strict.return_value = True assert sync_data.is_profitable is True mocked_db.get_strict.assert_called_once_with("is_profitable") + def test_tx_submitter(sync_data, mocked_db): """Test the tx_submitter property.""" mocked_db.get_strict.return_value = "submitter1" assert sync_data.tx_submitter == "submitter1" mocked_db.get_strict.assert_called_once_with("tx_submitter") -@patch('packages.valory.skills.decision_maker_abci.policy.EGreedyPolicy.deserialize') + +@patch("packages.valory.skills.decision_maker_abci.policy.EGreedyPolicy.deserialize") def test_policy_property(mock_deserialize, sync_data, mocked_db): # Set up mock return value for db.get_strict mock_policy_serialized = "serialized_policy_string" mocked_db.get_strict.return_value = mock_policy_serialized # Mock the expected result of deserialization - expected_policy = EGreedyPolicy(eps=0.1) # Provide a value for `eps`, adjust as appropriate + expected_policy = EGreedyPolicy( + eps=0.1 + ) # Provide a value for `eps`, adjust as appropriate mock_deserialize.return_value = expected_policy # Access the policy property to trigger the logic @@ -162,21 +174,28 @@ def test_policy_property(mock_deserialize, sync_data, mocked_db): mock_deserialize.assert_called_once_with(mock_policy_serialized) assert result == expected_policy + def test_mech_requests(sync_data, mocked_db): """Test the mech_requests property.""" mocked_db.get.return_value = '[{"request_id": "1", "data": "request_data"}]' requests = json.loads(mocked_db.get.return_value) # Correctly create MechMetadata objects - mech_requests = [MechMetadata(request_id=item["request_id"], data=item["data"]) for item in requests] - + mech_requests = [ + MechMetadata(request_id=item["request_id"], data=item["data"]) + for item in requests + ] + assert len(mech_requests) == 1 assert isinstance(mech_requests[0], MechMetadata) assert mech_requests[0].request_id == "1" + def test_weighted_accuracy(sync_data, mocked_db): """Test the weighted_accuracy property.""" - mocked_db.get_strict.return_value = json.dumps({"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}}) + mocked_db.get_strict.return_value = json.dumps( + {"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}} + ) mocked_db.get.return_value = "tool1" sync_data._policy = None # Reset cached value policy = EGreedyPolicy.deserialize(mocked_db.get_strict.return_value) @@ -185,19 +204,23 @@ def test_weighted_accuracy(sync_data, mocked_db): assert sync_data.weighted_accuracy == policy.weighted_accuracy["tool1"] - def test_end_block(mocked_db): """Test the end_block logic in TxPreparationRound.""" # Mock SynchronizedData and CollectSameUntilThresholdRound behavior mocked_sync_data = MagicMock(spec=SynchronizedData) mock_context = MagicMock() # Create a mock context - round_instance = TxPreparationRound(synchronized_data=mocked_sync_data, context=mock_context) + round_instance = TxPreparationRound( + synchronized_data=mocked_sync_data, context=mock_context + ) - with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.DONE)): + with patch.object( + TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.DONE) + ): result = round_instance.end_block() assert result == (mocked_sync_data, Event.DONE) - with patch.object(TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE)): + with patch.object( + TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE) + ): result = round_instance.end_block() assert result == (mocked_sync_data, Event.NONE) - diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py index 8b90948a0..0de1e8d68 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py @@ -17,9 +17,16 @@ # # ------------------------------------------------------------------------------ + +"""This package contains the tests for Decision Maker""" + import pytest -from packages.valory.skills.decision_maker_abci.states.bet_placement import BetPlacementRound + from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.decision_maker_abci.states.bet_placement import ( + BetPlacementRound, +) + @pytest.fixture def bet_placement_round(): @@ -28,8 +35,7 @@ def bet_placement_round(): context = {} # Example placeholder return BetPlacementRound(synchronized_data, context) + def test_initial_event(bet_placement_round): """Test that the initial event is set correctly.""" assert bet_placement_round.none_event == Event.INSUFFICIENT_BALANCE - - diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py index 56919e9a0..6cbe72c0f 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py @@ -17,14 +17,21 @@ # # ------------------------------------------------------------------------------ -import pytest + +"""This package contains the tests for Decision Maker""" from unittest.mock import MagicMock, patch -from typing import Tuple, Optional, Type, Any -from packages.valory.skills.decision_maker_abci.states.blacklisting import BlacklistingRound + +import pytest + from packages.valory.skills.decision_maker_abci.payloads import BlacklistingPayload -from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.blacklisting import ( + BlacklistingRound, +) from packages.valory.skills.market_manager_abci.rounds import UpdateBetsRound -from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData, get_name @pytest.fixture @@ -44,7 +51,9 @@ def mocked_synchronized_data(): @pytest.fixture def blacklisting_round(mocked_context, mocked_synchronized_data): """Fixture to create an instance of BlacklistingRound.""" - return BlacklistingRound(context=mocked_context, synchronized_data=mocked_synchronized_data) + return BlacklistingRound( + context=mocked_context, synchronized_data=mocked_synchronized_data + ) def test_blacklisting_round_initialization(blacklisting_round): @@ -57,11 +66,15 @@ def test_blacklisting_round_initialization(blacklisting_round): assert len(blacklisting_round.selection_key) == 2 -def test_blacklisting_round_end_block_done_event_no_benchmarking(blacklisting_round, mocked_context): +def test_blacklisting_round_end_block_done_event_no_benchmarking( + blacklisting_round, mocked_context +): """Test end_block when event is DONE and benchmarking is disabled.""" # Mock the superclass end_block to return DONE event synced_data = MagicMock(spec=SynchronizedData) - with patch.object(UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE)) as mock_super_end_block: + with patch.object( + UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE) + ) as mock_super_end_block: result = blacklisting_round.end_block() mock_super_end_block.assert_called_once() @@ -69,25 +82,34 @@ def test_blacklisting_round_end_block_done_event_no_benchmarking(blacklisting_ro assert not mocked_context.benchmarking_mode.enabled # Benchmarking disabled -def test_blacklisting_round_end_block_done_event_with_benchmarking(blacklisting_round, mocked_context): +def test_blacklisting_round_end_block_done_event_with_benchmarking( + blacklisting_round, mocked_context +): """Test end_block when event is DONE and benchmarking is enabled.""" # Set benchmarking mode to enabled mocked_context.benchmarking_mode.enabled = True # Mock the superclass end_block to return DONE event synced_data = MagicMock(spec=SynchronizedData) - with patch.object(UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE)) as mock_super_end_block: + with patch.object( + UpdateBetsRound, "end_block", return_value=(synced_data, Event.DONE) + ) as mock_super_end_block: result = blacklisting_round.end_block() mock_super_end_block.assert_called_once() - assert result == (synced_data, Event.MOCK_TX) # Should return MOCK_TX since benchmarking is enabled + assert result == ( + synced_data, + Event.MOCK_TX, + ) # Should return MOCK_TX since benchmarking is enabled assert mocked_context.benchmarking_mode.enabled # Benchmarking enabled def test_blacklisting_round_end_block_none_event(blacklisting_round): """Test end_block when the superclass returns None.""" # Mock the superclass end_block to return None - with patch.object(UpdateBetsRound, "end_block", return_value=None) as mock_super_end_block: + with patch.object( + UpdateBetsRound, "end_block", return_value=None + ) as mock_super_end_block: result = blacklisting_round.end_block() mock_super_end_block.assert_called_once() diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py index ed3051c52..aef475c8f 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py @@ -16,11 +16,17 @@ # limitations under the License. # # ------------------------------------------------------------------------------ -import pytest + + +"""This package contains the tests for Decision Maker""" + from unittest.mock import MagicMock + from packages.valory.skills.decision_maker_abci.rounds import CheckBenchmarkingModeRound from packages.valory.skills.decision_maker_abci.states.base import Event -from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import HandleFailedTxRound +from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import ( + HandleFailedTxRound, +) def test_check_benchmarking_mode_round_initialization(): diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py index 8bbe5e271..48d945d43 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_claim_subscription.py @@ -17,32 +17,54 @@ # # ------------------------------------------------------------------------------ -import pytest -from unittest.mock import MagicMock -from dataclasses import dataclass, field -from typing import Any, Callable, Dict, List, Hashable, Mapping, Type, Optional, FrozenSet + +"""This package contains the tests for Decision Maker""" + import json +from dataclasses import dataclass, field +from typing import ( + Any, + Callable, + Dict, + FrozenSet, + Hashable, + List, + Mapping, + Optional, + Type, +) +from unittest.mock import MagicMock + +import pytest from packages.valory.skills.abstract_round_abci.base import ( + AbciAppDB, CollectionRound, VotingRound, - AbciAppDB, get_name, ) from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( BaseVotingRoundTest, ) from packages.valory.skills.decision_maker_abci.payloads import ClaimPayload -from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData -from packages.valory.skills.decision_maker_abci.states.claim_subscription import ClaimRound +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.claim_subscription import ( + ClaimRound, +) + # Dummy payload data DUMMY_PAYLOAD_DATA = {"vote": True} + # Data class for test cases @dataclass class RoundTestCase: """Data class to hold round test case details.""" + name: str initial_data: Dict[str, Hashable] payloads: Mapping[str, ClaimPayload] @@ -51,35 +73,51 @@ class RoundTestCase: most_voted_payload: Any synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + # Maximum participants MAX_PARTICIPANTS: int = 4 + # Helper functions for payloads and participants def get_participants() -> FrozenSet[str]: """Get participants for the test.""" return frozenset([f"agent_{i}" for i in range(MAX_PARTICIPANTS)]) -def get_participant_to_votes(participants: FrozenSet[str], vote: bool) -> Dict[str, ClaimPayload]: + +def get_participant_to_votes( + participants: FrozenSet[str], vote: bool +) -> Dict[str, ClaimPayload]: """Map participants to votes.""" return { participant: ClaimPayload(sender=participant, vote=vote) for participant in participants } -def get_participant_to_votes_serialized(participants: FrozenSet[str], vote: bool) -> Dict[str, Dict[str, Any]]: + +def get_participant_to_votes_serialized( + participants: FrozenSet[str], vote: bool +) -> Dict[str, Dict[str, Any]]: """Get serialized votes from participants.""" return CollectionRound.serialize_collection( get_participant_to_votes(participants, vote) ) -def get_payloads(payload_cls: Type[ClaimPayload], data: Optional[str]) -> Mapping[str, ClaimPayload]: + +def get_payloads( + payload_cls: Type[ClaimPayload], data: Optional[str] +) -> Mapping[str, ClaimPayload]: """Generate payloads for the test.""" - return {participant: payload_cls(participant, data is not None) for participant in get_participants()} + return { + participant: payload_cls(participant, data is not None) + for participant in get_participants() + } + def get_dummy_claim_payload_serialized() -> str: """Get serialized dummy payload.""" return json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True) + # Base test class for ClaimRound class BaseClaimRoundTest(BaseVotingRoundTest): """Base Test Class for ClaimRound""" @@ -87,21 +125,29 @@ class BaseClaimRoundTest(BaseVotingRoundTest): test_class: Type[VotingRound] test_payload: Type[ClaimPayload] - def _test_voting_round(self, vote: bool, expected_event: Any, threshold_check: Callable) -> None: + def _test_voting_round( + self, vote: bool, expected_event: Any, threshold_check: Callable + ) -> None: """Helper method to test voting rounds with positive or negative votes.""" - test_round = self.test_class(synchronized_data=self.synchronized_data, context=MagicMock()) + test_round = self.test_class( + synchronized_data=self.synchronized_data, context=MagicMock() + ) self._complete_run( self._test_round( test_round=test_round, round_payloads=get_participant_to_votes(self.participants, vote=vote), - synchronized_data_update_fn=lambda synchronized_data,test_round: synchronized_data.update( - participant_to_votes=get_participant_to_votes_serialized(self.participants, vote=vote) + synchronized_data_update_fn=lambda synchronized_data, test_round: synchronized_data.update( + participant_to_votes=get_participant_to_votes_serialized( + self.participants, vote=vote + ) ), synchronized_data_attr_checks=[ lambda synchronized_data: synchronized_data.participant_to_votes.keys() - ] if vote else [], + ] + if vote + else [], exit_event=expected_event, threshold_check=threshold_check, ) @@ -123,6 +169,7 @@ def test_negative_votes(self) -> None: threshold_check=lambda x: x.negative_vote_threshold_reached, ) + # Test class for ClaimRound class TestClaimRound(BaseClaimRoundTest): """Tests for ClaimRound.""" @@ -137,19 +184,27 @@ class TestClaimRound(BaseClaimRoundTest): RoundTestCase( name="Happy path", initial_data={}, - payloads=get_payloads(ClaimPayload, get_dummy_claim_payload_serialized()), + payloads=get_payloads( + ClaimPayload, get_dummy_claim_payload_serialized() + ), final_data={}, event=Event.DONE, most_voted_payload=get_dummy_claim_payload_serialized(), synchronized_data_attr_checks=[ - lambda sync_data: sync_data.db.get(get_name(SynchronizedData.participant_to_votes)) - == CollectionRound.deserialize_collection(json.loads(get_dummy_claim_payload_serialized())) + lambda sync_data: sync_data.db.get( + get_name(SynchronizedData.participant_to_votes) + ) + == CollectionRound.deserialize_collection( + json.loads(get_dummy_claim_payload_serialized()) + ) ], ), RoundTestCase( name="No majority", initial_data={}, - payloads=get_payloads(ClaimPayload, get_dummy_claim_payload_serialized()), + payloads=get_payloads( + ClaimPayload, get_dummy_claim_payload_serialized() + ), final_data={}, event=Event.NO_MAJORITY, most_voted_payload=get_dummy_claim_payload_serialized(), diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py index b9a3cedbe..835c470dd 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py @@ -18,23 +18,28 @@ # ------------------------------------------------------------------------------ +"""This package contains the tests for Decision Maker""" import json from dataclasses import dataclass, field from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional from unittest import mock -from unittest.mock import MagicMock import pytest from packages.valory.skills.abstract_round_abci.base import BaseTxPayload -from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseCollectSameUntilThresholdRoundTest, +) from packages.valory.skills.decision_maker_abci.payloads import DecisionReceivePayload from packages.valory.skills.decision_maker_abci.states.base import ( Event, SynchronizedData, ) -from packages.valory.skills.decision_maker_abci.states.decision_receive import DecisionReceiveRound +from packages.valory.skills.decision_maker_abci.states.decision_receive import ( + DecisionReceiveRound, +) + DUMMY_DECISION_HASH = "dummy_decision_hash" DUMMY_PARTICIPANT_TO_DECISION_HASH = json.dumps( @@ -45,20 +50,32 @@ } ) + def get_participants() -> FrozenSet[str]: """Participants.""" return frozenset([f"agent_{i}" for i in range(4)]) -def get_payloads(vote: Optional[str], confidence: Optional[float], bet_amount: Optional[float], next_mock_data_row: Optional[str], is_profitable: bool) -> Mapping[str, BaseTxPayload]: + +def get_payloads( + vote: Optional[str], + confidence: Optional[float], + bet_amount: Optional[float], + next_mock_data_row: Optional[str], + is_profitable: bool, +) -> Mapping[str, BaseTxPayload]: """Get payloads.""" return { - participant: DecisionReceivePayload(participant, vote, confidence, bet_amount, next_mock_data_row, is_profitable) + participant: DecisionReceivePayload( + participant, vote, confidence, bet_amount, next_mock_data_row, is_profitable + ) for participant in get_participants() } + @dataclass class RoundTestCase: """RoundTestCase for DecisionReceiveRound.""" + name: str initial_data: Dict[str, Hashable] payloads: Mapping[str, BaseTxPayload] @@ -67,10 +84,11 @@ class RoundTestCase: most_voted_payload: Any synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): """Tests for DecisionReceiveRound.""" - _synchronized_data_class = SynchronizedData + _synchronized_data_class = SynchronizedData @pytest.mark.parametrize( "test_case", @@ -78,7 +96,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): RoundTestCase( name="Happy path", initial_data={}, - payloads=get_payloads(vote="yes", confidence=0.8, bet_amount=100.0, next_mock_data_row="row_1", is_profitable=True), + payloads=get_payloads( + vote="yes", + confidence=0.8, + bet_amount=100.0, + next_mock_data_row="row_1", + is_profitable=True, + ), final_data={ "decision_hash": DUMMY_DECISION_HASH, "participant_to_decision_hash": DUMMY_PARTICIPANT_TO_DECISION_HASH, @@ -92,7 +116,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): RoundTestCase( name="Unprofitable decision", initial_data={"is_profitable": False}, - payloads=get_payloads(vote="no", confidence=0.5, bet_amount=50.0, next_mock_data_row="row_2", is_profitable=False), + payloads=get_payloads( + vote="no", + confidence=0.5, + bet_amount=50.0, + next_mock_data_row="row_2", + is_profitable=False, + ), final_data={ "decision_hash": DUMMY_DECISION_HASH, "participant_to_decision_hash": DUMMY_PARTICIPANT_TO_DECISION_HASH, @@ -106,7 +136,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): RoundTestCase( name="No majority", initial_data={}, - payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating insufficient votes + payloads=get_payloads( + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, + is_profitable=True, + ), # Simulating insufficient votes final_data={}, event=Event.NO_MAJORITY, most_voted_payload=None, @@ -115,7 +151,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): RoundTestCase( name="Tie event", initial_data={}, - payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating a tie situation + payloads=get_payloads( + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, + is_profitable=True, + ), # Simulating a tie situation final_data={}, event=Event.TIE, most_voted_payload=None, @@ -124,7 +166,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): RoundTestCase( name="Mechanism response error", initial_data={"mocking_mode": True}, - payloads=get_payloads(vote=None, confidence=None, bet_amount=None, next_mock_data_row=None, is_profitable=True), # Simulating mocking mode response + payloads=get_payloads( + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, + is_profitable=True, + ), # Simulating mocking mode response final_data={}, event=Event.MECH_RESPONSE_ERROR, most_voted_payload=None, @@ -138,9 +186,7 @@ def test_run(self, test_case: RoundTestCase) -> None: def run_test(self, test_case: RoundTestCase) -> None: """Run the test.""" - self.synchronized_data.update( - SynchronizedData, **test_case.initial_data - ) + self.synchronized_data.update(SynchronizedData, **test_case.initial_data) test_round = DecisionReceiveRound( synchronized_data=self.synchronized_data, context=mock.MagicMock() diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py index 2e8752648..ef1bd1a1c 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py @@ -18,23 +18,29 @@ # ------------------------------------------------------------------------------ +"""This package contains the tests for Decision Maker""" import json from dataclasses import dataclass, field from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional from unittest import mock -from unittest.mock import MagicMock + import pytest from packages.valory.skills.abstract_round_abci.base import BaseTxPayload -from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseCollectSameUntilThresholdRoundTest, +) from packages.valory.skills.decision_maker_abci.payloads import DecisionRequestPayload from packages.valory.skills.decision_maker_abci.states.base import ( Event, SynchronizedData, ) -from packages.valory.skills.decision_maker_abci.states.decision_request import DecisionRequestRound +from packages.valory.skills.decision_maker_abci.states.decision_request import ( + DecisionRequestRound, +) + DUMMY_REQUEST_HASH = "dummy_request_hash" DUMMY_PARTICIPANT_TO_SELECTION_HASH = json.dumps( @@ -45,10 +51,12 @@ } ) + def get_participants() -> FrozenSet[str]: """Participants.""" return frozenset([f"agent_{i}" for i in range(4)]) + def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: """Get payloads.""" return { @@ -56,9 +64,11 @@ def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: for participant in get_participants() } + @dataclass class RoundTestCase: """RoundTestCase for DecisionRequestRound.""" + name: str initial_data: Dict[str, Hashable] payloads: Mapping[str, BaseTxPayload] @@ -67,6 +77,7 @@ class RoundTestCase: most_voted_payload: Any synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + class TestDecisionRequestRound(BaseCollectSameUntilThresholdRoundTest): """Tests for DecisionRequestRound.""" @@ -129,9 +140,7 @@ def test_run(self, test_case: RoundTestCase) -> None: def run_test(self, test_case: RoundTestCase) -> None: """Run the test.""" - self.synchronized_data.update( - SynchronizedData, **test_case.initial_data - ) + self.synchronized_data.update(SynchronizedData, **test_case.initial_data) test_round = DecisionRequestRound( synchronized_data=self.synchronized_data, context=mock.MagicMock() diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py index 86f069b89..367b37988 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py @@ -17,95 +17,121 @@ # # ------------------------------------------------------------------------------ + +"""This package contains the tests for Decision Maker""" + import pytest + from packages.valory.skills.abstract_round_abci.base import ( BaseSynchronizedData, DegenerateRound, ) -from packages.valory.skills.decision_maker_abci.states.final_states import ( +from packages.valory.skills.decision_maker_abci.states.final_states import ( + BenchmarkingDoneRound, BenchmarkingModeDisabledRound, FinishedDecisionMakerRound, FinishedDecisionRequestRound, FinishedSubscriptionRound, - FinishedWithoutRedeemingRound, FinishedWithoutDecisionRound, - RefillRequiredRound, - BenchmarkingDoneRound, + FinishedWithoutRedeemingRound, ImpossibleRound, + RefillRequiredRound, ) + class MockSynchronizedData(BaseSynchronizedData): """A mock class for SynchronizedData.""" + def __init__(self, db=None): super().__init__(db) # Pass db to the parent class + class MockContext: """A mock class for context used in the rounds.""" + def __init__(self): self.some_attribute = "mock_value" # Add any necessary attributes here -class TestFinalStates: +class TestFinalStates: @pytest.fixture def setup_round(self): """Fixture to set up a round instance.""" - synchronized_data = MockSynchronizedData(db="mock_db") # Provide a mock db value + synchronized_data = MockSynchronizedData( + db="mock_db" + ) # Provide a mock db value context = MockContext() return synchronized_data, context def test_benchmarking_mode_disabled_round(self, setup_round): """Test instantiation of BenchmarkingModeDisabledRound.""" synchronized_data, context = setup_round - round_instance = BenchmarkingModeDisabledRound(context=context, synchronized_data=synchronized_data) + round_instance = BenchmarkingModeDisabledRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, BenchmarkingModeDisabledRound) assert isinstance(round_instance, DegenerateRound) def test_finished_decision_maker_round(self, setup_round): """Test instantiation of FinishedDecisionMakerRound.""" synchronized_data, context = setup_round - round_instance = FinishedDecisionMakerRound(context=context, synchronized_data=synchronized_data) + round_instance = FinishedDecisionMakerRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, FinishedDecisionMakerRound) assert isinstance(round_instance, DegenerateRound) def test_finished_decision_request_round(self, setup_round): """Test instantiation of FinishedDecisionRequestRound.""" synchronized_data, context = setup_round - round_instance = FinishedDecisionRequestRound(context=context, synchronized_data=synchronized_data) + round_instance = FinishedDecisionRequestRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, FinishedDecisionRequestRound) assert isinstance(round_instance, DegenerateRound) def test_finished_subscription_round(self, setup_round): """Test instantiation of FinishedSubscriptionRound.""" synchronized_data, context = setup_round - round_instance = FinishedSubscriptionRound(context=context, synchronized_data=synchronized_data) + round_instance = FinishedSubscriptionRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, FinishedSubscriptionRound) assert isinstance(round_instance, DegenerateRound) def test_finished_without_redeeming_round(self, setup_round): """Test instantiation of FinishedWithoutRedeemingRound.""" synchronized_data, context = setup_round - round_instance = FinishedWithoutRedeemingRound(context=context, synchronized_data=synchronized_data) + round_instance = FinishedWithoutRedeemingRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, FinishedWithoutRedeemingRound) assert isinstance(round_instance, DegenerateRound) def test_finished_without_decision_round(self, setup_round): """Test instantiation of FinishedWithoutDecisionRound.""" synchronized_data, context = setup_round - round_instance = FinishedWithoutDecisionRound(context=context, synchronized_data=synchronized_data) + round_instance = FinishedWithoutDecisionRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, FinishedWithoutDecisionRound) assert isinstance(round_instance, DegenerateRound) def test_refill_required_round(self, setup_round): """Test instantiation of RefillRequiredRound.""" synchronized_data, context = setup_round - round_instance = RefillRequiredRound(context=context, synchronized_data=synchronized_data) + round_instance = RefillRequiredRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, RefillRequiredRound) assert isinstance(round_instance, DegenerateRound) def test_benchmarking_done_round(self, setup_round): """Test instantiation of BenchmarkingDoneRound and its end_block method.""" synchronized_data, context = setup_round - round_instance = BenchmarkingDoneRound(context=context, synchronized_data=synchronized_data) + round_instance = BenchmarkingDoneRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, BenchmarkingDoneRound) assert isinstance(round_instance, DegenerateRound) @@ -116,8 +142,8 @@ def test_benchmarking_done_round(self, setup_round): def test_impossible_round(self, setup_round): """Test instantiation of ImpossibleRound.""" synchronized_data, context = setup_round - round_instance = ImpossibleRound(context=context, synchronized_data=synchronized_data) + round_instance = ImpossibleRound( + context=context, synchronized_data=synchronized_data + ) assert isinstance(round_instance, ImpossibleRound) assert isinstance(round_instance, DegenerateRound) - - diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py index 4d5330062..8f2f76215 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py @@ -17,16 +17,31 @@ # # ------------------------------------------------------------------------------ -from unittest.mock import MagicMock -from typing import Mapping, Callable, Any, List, FrozenSet, Dict, Type + +"""This package contains the tests for Decision Maker""" + import json +from typing import Any, Callable, Dict, FrozenSet, List, Mapping, Type +from unittest.mock import MagicMock + import pytest -from packages.valory.skills.abstract_round_abci.base import VotingRound, get_name, CollectionRound +from packages.valory.skills.abstract_round_abci.base import ( + CollectionRound, + VotingRound, + get_name, +) +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseVotingRoundTest, +) from packages.valory.skills.decision_maker_abci.payloads import VotingPayload -from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData -from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseVotingRoundTest -from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import HandleFailedTxRound +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.handle_failed_tx import ( + HandleFailedTxRound, +) # Helper functions @@ -34,23 +49,31 @@ def get_participants() -> FrozenSet[str]: """Get participants for the test.""" return frozenset([f"agent_{i}" for i in range(MAX_PARTICIPANTS)]) -def get_participant_to_votes(participants: FrozenSet[str], vote: bool) -> Dict[str, VotingPayload]: + +def get_participant_to_votes( + participants: FrozenSet[str], vote: bool +) -> Dict[str, VotingPayload]: """Map participants to votes.""" return { participant: VotingPayload(sender=participant, vote=vote) for participant in participants } -def get_participant_to_votes_serialized(participants: FrozenSet[str], vote: bool) -> Dict[str, Dict[str, Any]]: + +def get_participant_to_votes_serialized( + participants: FrozenSet[str], vote: bool +) -> Dict[str, Dict[str, Any]]: """Get serialized votes from participants.""" return CollectionRound.serialize_collection( get_participant_to_votes(participants, vote) ) + # Dummy Payload Data DUMMY_PAYLOAD_DATA = {"vote": True} MAX_PARTICIPANTS = 4 + # Base test class for HandleFailedTxRound class BaseHandleFailedTxRoundTest(BaseVotingRoundTest): """Base Test Class for HandleFailedTxRound""" @@ -58,21 +81,29 @@ class BaseHandleFailedTxRoundTest(BaseVotingRoundTest): test_class: Type[VotingRound] test_payload: Type[VotingPayload] - def _test_voting_round(self, vote: bool, expected_event: Any, threshold_check: Callable) -> None: + def _test_voting_round( + self, vote: bool, expected_event: Any, threshold_check: Callable + ) -> None: """Helper method to test voting rounds with positive or negative votes.""" - test_round = self.test_class(synchronized_data=self.synchronized_data, context=MagicMock()) + test_round = self.test_class( + synchronized_data=self.synchronized_data, context=MagicMock() + ) self._complete_run( self._test_round( test_round=test_round, round_payloads=get_participant_to_votes(self.participants, vote=vote), synchronized_data_update_fn=lambda synchronized_data, test_round: synchronized_data.update( - participant_to_votes=get_participant_to_votes_serialized(self.participants, vote=vote) + participant_to_votes=get_participant_to_votes_serialized( + self.participants, vote=vote + ) ), synchronized_data_attr_checks=[ lambda synchronized_data: synchronized_data.participant_to_votes.keys() - ] if vote else [], + ] + if vote + else [], exit_event=expected_event, threshold_check=threshold_check, ) @@ -94,6 +125,7 @@ def test_negative_votes(self) -> None: threshold_check=lambda x: x.negative_vote_threshold_reached, ) + # Test class for HandleFailedTxRound class TestHandleFailedTxRound(BaseHandleFailedTxRoundTest): """Tests for HandleFailedTxRound.""" @@ -114,8 +146,12 @@ class TestHandleFailedTxRound(BaseHandleFailedTxRoundTest): "event": Event.BLACKLIST, "most_voted_payload": json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True), "synchronized_data_attr_checks": [ - lambda sync_data: sync_data.db.get(get_name(SynchronizedData.participant_to_votes)) - == CollectionRound.deserialize_collection(json.loads(json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True))) + lambda sync_data: sync_data.db.get( + get_name(SynchronizedData.participant_to_votes) + ) + == CollectionRound.deserialize_collection( + json.loads(json.dumps(DUMMY_PAYLOAD_DATA, sort_keys=True)) + ) ], }, # Parametrized test case for no operation (NO_OP) @@ -137,6 +173,7 @@ def test_run(self, test_case: dict) -> None: elif test_case["event"] == Event.NO_OP: self.test_negative_votes() + # Additional tests for state initialization class TestFinishedHandleFailedTxRound: """Tests for FinishedHandleFailedTxRound.""" @@ -145,4 +182,3 @@ def test_initialization(self) -> None: """Test the initialization of FinishedHandleFailedTxRound.""" round_ = HandleFailedTxRound(synchronized_data=MagicMock(), context=MagicMock()) assert isinstance(round_, HandleFailedTxRound) - diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py index feb38e7fc..d030384b7 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -17,16 +17,23 @@ # # ------------------------------------------------------------------------------ -import pytest + +"""This package contains the tests for Decision Maker""" + from unittest.mock import MagicMock, patch -from enum import Enum -from packages.valory.skills.decision_maker_abci.states.base import Event -from packages.valory.skills.decision_maker_abci.states.order_subscription import SubscriptionRound +import pytest + from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.decision_maker_abci.states.order_subscription import ( + SubscriptionRound, +) + # Dummy values for testing class MockSynchronizedData(BaseSynchronizedData): + """The class for testing """ def __init__(self, db): super().__init__(db=db) self.agreement_id = "dummy_agreement_id" @@ -37,64 +44,108 @@ def update(self, **kwargs): updated_data.__dict__.update(kwargs) return updated_data + @pytest.fixture def setup_subscription_round(): """Fixture to set up a basic SubscriptionRound instance.""" mock_synchronized_data = MockSynchronizedData(db={}) - round_instance = SubscriptionRound(synchronized_data=mock_synchronized_data, context=MagicMock()) + round_instance = SubscriptionRound( + synchronized_data=mock_synchronized_data, context=MagicMock() + ) return round_instance + def test_threshold_reached_with_error(setup_subscription_round): """Test when the threshold is reached and the transaction is an error.""" round_instance = setup_subscription_round - with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): - with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, round_instance.ERROR_PAYLOAD])): + with patch.object( + SubscriptionRound, + "threshold_reached", + new_callable=MagicMock(return_value=True), + ): + with patch.object( + SubscriptionRound, + "most_voted_payload_values", + new_callable=MagicMock(return_value=[None, round_instance.ERROR_PAYLOAD]), + ): result = round_instance.end_block() - assert result == (round_instance.synchronized_data, Event.SUBSCRIPTION_ERROR) + assert result == ( + round_instance.synchronized_data, + Event.SUBSCRIPTION_ERROR, + ) + def test_threshold_reached_with_no_tx(setup_subscription_round): """Test when the threshold is reached and there's no transaction.""" round_instance = setup_subscription_round - with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): - with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, round_instance.NO_TX_PAYLOAD])): + with patch.object( + SubscriptionRound, + "threshold_reached", + new_callable=MagicMock(return_value=True), + ): + with patch.object( + SubscriptionRound, + "most_voted_payload_values", + new_callable=MagicMock(return_value=[None, round_instance.NO_TX_PAYLOAD]), + ): result = round_instance.end_block() assert result == (round_instance.synchronized_data, Event.NO_SUBSCRIPTION) + def test_threshold_reached_with_mock_tx(setup_subscription_round): """Test when the threshold is reached and benchmarking mode is enabled.""" round_instance = setup_subscription_round round_instance.context.benchmarking_mode.enabled = True - with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=True)): - with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, "mock_tx_hash"])): + with patch.object( + SubscriptionRound, + "threshold_reached", + new_callable=MagicMock(return_value=True), + ): + with patch.object( + SubscriptionRound, + "most_voted_payload_values", + new_callable=MagicMock(return_value=[None, "mock_tx_hash"]), + ): result = round_instance.end_block() assert result == (round_instance.synchronized_data, Event.MOCK_TX) + def test_end_block_updates_sync_data(setup_subscription_round): """Test if the agreement_id is correctly updated in synchronized data.""" round_instance = setup_subscription_round - + # Patch the `most_voted_payload_values` to return a list with the new agreement ID - with patch.object(SubscriptionRound, 'most_voted_payload_values', new_callable=MagicMock(return_value=[None, None, None, "new_agreement_id"])): - + with patch.object( + SubscriptionRound, + "most_voted_payload_values", + new_callable=MagicMock(return_value=[None, None, None, "new_agreement_id"]), + ): # Call the `end_block` method to trigger the update result = round_instance.end_block() # Check the updated synchronized_data object returned by end_block sync_data, event = result - + # Assert that the agreement_id was updated to the new_agreement_id assert sync_data.agreement_id == "new_agreement_id" assert event is not None + def test_no_update_when_threshold_not_reached(setup_subscription_round): """Test when the threshold is not reached, there should be no changes.""" round_instance = setup_subscription_round - with patch.object(SubscriptionRound, 'threshold_reached', new_callable=MagicMock(return_value=False)): - with patch("packages.valory.skills.decision_maker_abci.states.order_subscription.SubscriptionRound.end_block", - return_value=None) as mock_super: + with patch.object( + SubscriptionRound, + "threshold_reached", + new_callable=MagicMock(return_value=False), + ): + with patch( + "packages.valory.skills.decision_maker_abci.states.order_subscription.SubscriptionRound.end_block", + return_value=None, + ) as mock_super: result = round_instance.end_block() assert result is None diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py index 4371cf5c5..a3e45c2fd 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py @@ -17,23 +17,32 @@ # # ------------------------------------------------------------------------------ +"""This package contains the tests for Decision Maker""" import pytest + +from packages.valory.skills.decision_maker_abci.rounds import RandomnessRound from packages.valory.skills.decision_maker_abci.states.base import Event -from packages.valory.skills.transaction_settlement_abci.rounds import RandomnessTransactionSubmissionRound -from packages.valory.skills.decision_maker_abci.rounds import RandomnessRound +from packages.valory.skills.transaction_settlement_abci.rounds import ( + RandomnessTransactionSubmissionRound, +) + class MockSynchronizedData: """A mock class for SynchronizedData to provide necessary attributes.""" + pass + class MockContext: """A mock class for context used in RandomnessTransactionSubmissionRound.""" + def __init__(self): + """Mock function""" self.sender = "mock_sender" - -class TestRandomnessRound: +class TestRandomnessRound: + """The class for testing Randomness Round""" @pytest.fixture def setup_randomness_round(self): """Fixture to set up a RandomnessRound instance.""" @@ -58,5 +67,7 @@ def test_randomness_round_event_handling(self, setup_randomness_round): randomness_round.current_event = Event.DONE # Simulate setting the event assert randomness_round.current_event == Event.DONE - randomness_round.current_event = Event.NO_MAJORITY # Simulate setting another event + randomness_round.current_event = ( + Event.NO_MAJORITY + ) # Simulate setting another event assert randomness_round.current_event == Event.NO_MAJORITY diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 94c8b066d..33880df5c 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -17,30 +17,38 @@ # # ------------------------------------------------------------------------------ -import pytest + +"""This package contains the tests for Decision Maker""" + from unittest.mock import MagicMock -from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound -from packages.valory.skills.decision_maker_abci.states.base import Event + +import pytest + from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData +from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound + @pytest.fixture def redeem_round(): """Fixture to set up a RedeemRound instance for testing.""" synchronized_data = MagicMock(spec=BaseSynchronizedData) - context = MagicMock() + context = MagicMock() redeem_instance = RedeemRound(synchronized_data, context) - + # Set initial properties redeem_instance.block_confirmations = 0 synchronized_data.period_count = 0 synchronized_data.db = MagicMock() - + return redeem_instance + def test_initial_event(redeem_round): """Test that the initial event is set correctly.""" assert redeem_round.none_event == Event.NO_REDEEMING + def test_end_block_no_update(redeem_round): """Test the end_block behavior when no update occurs.""" # This ensures that block_confirmations and period_count are 0 @@ -48,11 +56,11 @@ def test_end_block_no_update(redeem_round): redeem_round.synchronized_data.period_count = 0 # Mock the superclass's end_block to simulate behavior - redeem_round.synchronized_data.db.get = MagicMock(return_value='mock_value') + redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") # Call the actual end_block method result = redeem_round.end_block() - + # Assert the result is a tuple and check for specific event assert isinstance(result, tuple) assert result[1] == Event.NO_REDEEMING # Adjust based on expected output @@ -61,7 +69,10 @@ def test_end_block_no_update(redeem_round): def test_end_block_with_update(redeem_round): """Test the end_block behavior when an update occurs.""" # Mock the super class's end_block to return a valid update - update_result = (redeem_round.synchronized_data, Event.NO_REDEEMING) # Use an actual event from your enum + update_result = ( + redeem_round.synchronized_data, + Event.NO_REDEEMING, + ) # Use an actual event from your enum RedeemRound.end_block = MagicMock(return_value=update_result) result = redeem_round.end_block() @@ -70,24 +81,23 @@ def test_end_block_with_update(redeem_round): # Ensure no database update was attempted redeem_round.synchronized_data.db.update.assert_not_called() + def test_end_block_with_period_count_update(redeem_round): """Test the behavior when period_count is greater than zero.""" # Set up the necessary attributes redeem_round.synchronized_data.period_count = 1 - + # Directly assign a valid integer to nb_participants - redeem_round.nb_participants = 3 + redeem_round.nb_participants = 3 # Set up mock return values for db.get if needed - mock_keys = RedeemRound.selection_key + mock_keys = RedeemRound.selection_key for key in mock_keys: - redeem_round.synchronized_data.db.get = MagicMock(return_value='mock_value') + redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") # Call the actual end_block method result = redeem_round.end_block() - + # Add assertions based on what you expect the result to be assert isinstance(result, tuple) # Ensure it returns a tuple assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior - - diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py index 2c2a6922f..0bf13c8b0 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py @@ -17,35 +17,46 @@ # # ------------------------------------------------------------------------------ + +"""This package contains the tests for Decision Maker""" + import pytest -from unittest import mock -from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData -from packages.valory.skills.decision_maker_abci.rounds import SamplingRound + +from packages.valory.skills.abstract_round_abci.base import get_name from packages.valory.skills.decision_maker_abci.payloads import SamplingPayload +from packages.valory.skills.decision_maker_abci.rounds import SamplingRound +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) from packages.valory.skills.market_manager_abci.rounds import UpdateBetsRound -from packages.valory.skills.abstract_round_abci.base import get_name # Mock classes to simulate required attributes class MockSynchronizedData(SynchronizedData): """A mock class for SynchronizedData to provide necessary attributes.""" + sampled_bet_index = 0 # Default value for sampled_bet_index class MockContext: """A mock class for context used in AbstractRound.""" + def __init__(self): + """Mock function""" self.sender = "mock_sender" self.bets_hash = "mock_bets_hash" class TestSamplingRound: - + """The class for testing Sampling Round""" @pytest.fixture def setup_sampling_round(self): """Fixture to set up a SamplingRound instance.""" context = MockContext() - synchronized_data = MockSynchronizedData(db=dict()) # Passing a mock dictionary for 'db' + synchronized_data = MockSynchronizedData( + db=dict() + ) # Passing a mock dictionary for 'db' return SamplingRound(context=context, synchronized_data=synchronized_data) def test_sampling_round_properties(self, setup_sampling_round): @@ -61,7 +72,9 @@ def test_sampling_round_properties(self, setup_sampling_round): def test_sampling_payload_initialization(self): """Test the initialization of the SamplingPayload.""" # Adjust according to the actual initialization parameters - payload = SamplingPayload(sender="mock_sender", bets_hash="mock_bets_hash", index=0) # Added index + payload = SamplingPayload( + sender="mock_sender", bets_hash="mock_bets_hash", index=0 + ) # Added index assert payload is not None assert payload.sender == "mock_sender" assert payload.bets_hash == "mock_bets_hash" @@ -76,7 +89,9 @@ def test_sampling_round_selection_key(self, setup_sampling_round): sampling_round = setup_sampling_round expected_selection_key = ( UpdateBetsRound.selection_key, - get_name(SynchronizedData.sampled_bet_index) # Pass the property, not the value + get_name( + SynchronizedData.sampled_bet_index + ), # Pass the property, not the value ) assert sampling_round.selection_key == expected_selection_key @@ -90,4 +105,4 @@ def test_sampling_round_event_handling(self, setup_sampling_round): assert sampling_round.current_event == Event.DONE sampling_round.current_event = Event.NO_MAJORITY - assert sampling_round.current_event == Event.NO_MAJORITY \ No newline at end of file + assert sampling_round.current_event == Event.NO_MAJORITY diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py index 5ca808233..583b774e0 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_tool_selection.py @@ -18,28 +18,44 @@ # ------------------------------------------------------------------------------ +"""This package contains the tests for Decision Maker""" + + from dataclasses import dataclass, field from typing import Any, Callable, Dict, Hashable, List, Mapping, Optional from unittest import mock + import pytest from packages.valory.skills.abstract_round_abci.base import BaseTxPayload -from packages.valory.skills.abstract_round_abci.test_tools.rounds import BaseCollectSameUntilThresholdRoundTest +from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( + BaseCollectSameUntilThresholdRoundTest, +) from packages.valory.skills.decision_maker_abci.payloads import ToolSelectionPayload -from packages.valory.skills.decision_maker_abci.states.base import Event, SynchronizedData -from packages.valory.skills.decision_maker_abci.states.tool_selection import ToolSelectionRound +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) +from packages.valory.skills.decision_maker_abci.states.tool_selection import ( + ToolSelectionRound, +) + DUMMY_TOOL_SELECTION_HASH = "dummy_tool_selection_hash" DUMMY_POLICY = "dummy_policy" DUMMY_UTILIZED_TOOLS = "dummy_utilized_tools" DUMMY_MECH_TOOLS = "dummy_mech_tools" DUMMY_SELECTED_TOOL = "dummy_selected_tool" -DUMMY_PARTICIPANT_TO_SELECTION_HASH = '{"agent_0": "tool_1", "agent_1": "tool_2", "agent_2": "tool_3"}' +DUMMY_PARTICIPANT_TO_SELECTION_HASH = ( + '{"agent_0": "tool_1", "agent_1": "tool_2", "agent_2": "tool_3"}' +) + def get_participants() -> List[str]: """Returns a list of participants.""" return [f"agent_{i}" for i in range(4)] + def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: """Returns payloads for the test.""" return { @@ -48,14 +64,16 @@ def get_payloads(data: Optional[str]) -> Mapping[str, BaseTxPayload]: policy=DUMMY_POLICY, utilized_tools=DUMMY_UTILIZED_TOOLS, selected_tool=data, - mech_tools=DUMMY_MECH_TOOLS # Add the missing mech_tools argument + mech_tools=DUMMY_MECH_TOOLS, # Add the missing mech_tools argument ) for participant in get_participants() } + @dataclass class RoundTestCase: """Test case structure for ToolSelectionRound.""" + name: str initial_data: Dict[str, Hashable] payloads: Mapping[str, BaseTxPayload] @@ -64,6 +82,7 @@ class RoundTestCase: most_voted_payload: Any synchronized_data_attr_checks: List[Callable] = field(default_factory=list) + class TestToolSelectionRound(BaseCollectSameUntilThresholdRoundTest): """Tests for ToolSelectionRound.""" @@ -112,9 +131,7 @@ def test_run(self, test_case: RoundTestCase) -> None: def run_test(self, test_case: RoundTestCase) -> None: """Run a single test case.""" - self.synchronized_data.update( - SynchronizedData, **test_case.initial_data - ) + self.synchronized_data.update(SynchronizedData, **test_case.initial_data) test_round = ToolSelectionRound( synchronized_data=self.synchronized_data, context=mock.MagicMock() @@ -129,4 +146,4 @@ def run_test(self, test_case: RoundTestCase) -> None: synchronized_data_attr_checks=test_case.synchronized_data_attr_checks, most_voted_payload=test_case.most_voted_payload, exit_event=test_case.event, - ) \ No newline at end of file + ) From a351372fa6199d6e698839614c232eebb801c686 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Tue, 15 Oct 2024 11:30:00 +0530 Subject: [PATCH 16/34] check runs --- .../tests/states/test_base.py | 28 ++++++++++--------- .../tests/states/test_decision_request.py | 1 - .../tests/states/test_handle_failed_tx.py | 2 +- .../tests/states/test_order_subscription.py | 4 ++- .../tests/states/test_randomness.py | 1 + .../tests/states/test_sampling.py | 1 + 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index 4281a3679..89eda8386 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -25,15 +25,15 @@ import pytest -from packages.valory.skills.decision_maker_abci.policy import EGreedyPolicy +from packages.valory.skills.decision_maker_abci.policy import ( + AccuracyInfo, + EGreedyPolicy, +) from packages.valory.skills.decision_maker_abci.states.base import ( Event, SynchronizedData, TxPreparationRound, ) -from packages.valory.skills.market_manager_abci.rounds import ( - SynchronizedData as MarketManagerSyncedData, -) from packages.valory.skills.mech_interact_abci.states.base import MechMetadata @@ -193,15 +193,17 @@ def test_mech_requests(sync_data, mocked_db): def test_weighted_accuracy(sync_data, mocked_db): """Test the weighted_accuracy property.""" - mocked_db.get_strict.return_value = json.dumps( - {"epsilon": 0.1, "weighted_accuracy": {"tool1": 0.8}} + selected_mech_tool = "tool1" + policy_db_name = "policy" + policy_mock = EGreedyPolicy( + eps=0.1, accuracy_store={selected_mech_tool: AccuracyInfo(requests=1)} + ).serialize() + mocked_db.get_strict = lambda name: ( + policy_mock if name == policy_db_name else selected_mech_tool ) - mocked_db.get.return_value = "tool1" - sync_data._policy = None # Reset cached value - policy = EGreedyPolicy.deserialize(mocked_db.get_strict.return_value) - - # Access the weighted accuracy correctly - assert sync_data.weighted_accuracy == policy.weighted_accuracy["tool1"] + policy = EGreedyPolicy.deserialize(policy_mock) + assert selected_mech_tool in policy.weighted_accuracy + assert sync_data.weighted_accuracy == policy.weighted_accuracy[selected_mech_tool] def test_end_block(mocked_db): @@ -223,4 +225,4 @@ def test_end_block(mocked_db): TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE) ): result = round_instance.end_block() - assert result == (mocked_sync_data, Event.NONE) + assert result == (mocked_sync_data, Event.NONE) \ No newline at end of file diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py index ef1bd1a1c..e1a9003a3 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_request.py @@ -25,7 +25,6 @@ from typing import Any, Callable, Dict, FrozenSet, Hashable, List, Mapping, Optional from unittest import mock - import pytest from packages.valory.skills.abstract_round_abci.base import BaseTxPayload diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py index 8f2f76215..b88bad2cc 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_handle_failed_tx.py @@ -21,7 +21,7 @@ """This package contains the tests for Decision Maker""" import json -from typing import Any, Callable, Dict, FrozenSet, List, Mapping, Type +from typing import Any, Callable, Dict, FrozenSet, Type from unittest.mock import MagicMock import pytest diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py index d030384b7..ac0502af8 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -33,8 +33,10 @@ # Dummy values for testing class MockSynchronizedData(BaseSynchronizedData): - """The class for testing """ + """The class for testing""" + def __init__(self, db): + """Mock""" super().__init__(db=db) self.agreement_id = "dummy_agreement_id" diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py index a3e45c2fd..fe5683cc2 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py @@ -43,6 +43,7 @@ def __init__(self): class TestRandomnessRound: """The class for testing Randomness Round""" + @pytest.fixture def setup_randomness_round(self): """Fixture to set up a RandomnessRound instance.""" diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py index 0bf13c8b0..8f0f462e7 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py @@ -50,6 +50,7 @@ def __init__(self): class TestSamplingRound: """The class for testing Sampling Round""" + @pytest.fixture def setup_sampling_round(self): """Fixture to set up a SamplingRound instance.""" From 43e5c15e5b02d59dff4164f0f20f1d9f8f3e5a67 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Wed, 16 Oct 2024 17:31:12 +0530 Subject: [PATCH 17/34] check runs --- .../tests/states/test_base.py | 71 ++++++++++--------- .../tests/states/test_final_states.py | 47 ++++++++---- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index 89eda8386..e7dcb5009 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -17,7 +17,6 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" import json @@ -34,120 +33,127 @@ SynchronizedData, TxPreparationRound, ) -from packages.valory.skills.mech_interact_abci.states.base import MechMetadata -# Updated MechMetadata class to handle the correct parameters class MechMetadata: - def __init__(self, request_id: str, data: str): + """The class for test of Mech Data""" + + def __init__(self, request_id: str, data: str) -> None: + """Initialize MechMetadata with request ID and data.""" self.request_id = request_id self.data = data @pytest.fixture -def mocked_db(): +def mocked_db() -> MagicMock: """Fixture to mock the database.""" return MagicMock() @pytest.fixture -def sync_data(mocked_db): +def sync_data(mocked_db: MagicMock) -> SynchronizedData: """Fixture for SynchronizedData.""" return SynchronizedData(db=mocked_db) -def test_sampled_bet_index(sync_data, mocked_db): +def test_sampled_bet_index(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the sampled_bet_index property.""" mocked_db.get_strict.return_value = "5" assert sync_data.sampled_bet_index == 5 mocked_db.get_strict.assert_called_once_with("sampled_bet_index") -def test_is_mech_price_set(sync_data, mocked_db): +def test_is_mech_price_set(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the is_mech_price_set property.""" mocked_db.get.return_value = True assert sync_data.is_mech_price_set is True mocked_db.get.assert_called_once_with("mech_price", False) -def test_available_mech_tools(sync_data, mocked_db): +def test_available_mech_tools( + sync_data: SynchronizedData, mocked_db: MagicMock +) -> None: """Test the available_mech_tools property.""" mocked_db.get_strict.return_value = '["tool1", "tool2"]' assert sync_data.available_mech_tools == ["tool1", "tool2"] mocked_db.get_strict.assert_called_once_with("available_mech_tools") -def test_is_policy_set(sync_data, mocked_db): +def test_is_policy_set(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the is_policy_set property.""" mocked_db.get.return_value = True assert sync_data.is_policy_set is True mocked_db.get.assert_called_once_with("policy", False) -def test_has_tool_selection_run(sync_data, mocked_db): +def test_has_tool_selection_run( + sync_data: SynchronizedData, mocked_db: MagicMock +) -> None: """Test the has_tool_selection_run property.""" mocked_db.get.return_value = "tool1" assert sync_data.has_tool_selection_run is True mocked_db.get.assert_called_once_with("mech_tool", None) -def test_mech_tool(sync_data, mocked_db): +def test_mech_tool(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the mech_tool property.""" mocked_db.get_strict.return_value = "tool1" assert sync_data.mech_tool == "tool1" mocked_db.get_strict.assert_called_once_with("mech_tool") -def test_utilized_tools(sync_data, mocked_db): +def test_utilized_tools(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the utilized_tools property.""" mocked_db.get_strict.return_value = '{"tx1": "tool1"}' assert sync_data.utilized_tools == {"tx1": "tool1"} mocked_db.get_strict.assert_called_once_with("utilized_tools") -def test_redeemed_condition_ids(sync_data, mocked_db): +def test_redeemed_condition_ids( + sync_data: SynchronizedData, mocked_db: MagicMock +) -> None: """Test the redeemed_condition_ids property.""" mocked_db.get.return_value = '["cond1", "cond2"]' assert sync_data.redeemed_condition_ids == {"cond1", "cond2"} mocked_db.get.assert_called_once_with("redeemed_condition_ids", None) -def test_payout_so_far(sync_data, mocked_db): +def test_payout_so_far(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the payout_so_far property.""" mocked_db.get.return_value = "100" assert sync_data.payout_so_far == 100 mocked_db.get.assert_called_once_with("payout_so_far", None) -def test_vote(sync_data, mocked_db): +def test_vote(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the vote property.""" mocked_db.get_strict.return_value = "1" assert sync_data.vote == 1 mocked_db.get_strict.assert_called_once_with("vote") -def test_confidence(sync_data, mocked_db): +def test_confidence(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the confidence property.""" mocked_db.get_strict.return_value = "0.9" assert sync_data.confidence == 0.9 mocked_db.get_strict.assert_called_once_with("confidence") -def test_bet_amount(sync_data, mocked_db): +def test_bet_amount(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the bet_amount property.""" mocked_db.get_strict.return_value = "50" assert sync_data.bet_amount == 50 mocked_db.get_strict.assert_called_once_with("bet_amount") -def test_is_profitable(sync_data, mocked_db): +def test_is_profitable(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the is_profitable property.""" mocked_db.get_strict.return_value = True assert sync_data.is_profitable is True mocked_db.get_strict.assert_called_once_with("is_profitable") -def test_tx_submitter(sync_data, mocked_db): +def test_tx_submitter(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the tx_submitter property.""" mocked_db.get_strict.return_value = "submitter1" assert sync_data.tx_submitter == "submitter1" @@ -155,32 +161,28 @@ def test_tx_submitter(sync_data, mocked_db): @patch("packages.valory.skills.decision_maker_abci.policy.EGreedyPolicy.deserialize") -def test_policy_property(mock_deserialize, sync_data, mocked_db): - # Set up mock return value for db.get_strict +def test_policy_property( + mock_deserialize: MagicMock, sync_data: SynchronizedData, mocked_db: MagicMock +) -> None: + """Test for policy property""" mock_policy_serialized = "serialized_policy_string" mocked_db.get_strict.return_value = mock_policy_serialized - # Mock the expected result of deserialization - expected_policy = EGreedyPolicy( - eps=0.1 - ) # Provide a value for `eps`, adjust as appropriate + expected_policy = EGreedyPolicy(eps=0.1) mock_deserialize.return_value = expected_policy - # Access the policy property to trigger the logic result = sync_data.policy - # Assertions to ensure db and deserialize were called correctly mocked_db.get_strict.assert_called_once_with("policy") mock_deserialize.assert_called_once_with(mock_policy_serialized) assert result == expected_policy -def test_mech_requests(sync_data, mocked_db): +def test_mech_requests(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the mech_requests property.""" mocked_db.get.return_value = '[{"request_id": "1", "data": "request_data"}]' requests = json.loads(mocked_db.get.return_value) - # Correctly create MechMetadata objects mech_requests = [ MechMetadata(request_id=item["request_id"], data=item["data"]) for item in requests @@ -191,7 +193,7 @@ def test_mech_requests(sync_data, mocked_db): assert mech_requests[0].request_id == "1" -def test_weighted_accuracy(sync_data, mocked_db): +def test_weighted_accuracy(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: """Test the weighted_accuracy property.""" selected_mech_tool = "tool1" policy_db_name = "policy" @@ -206,11 +208,10 @@ def test_weighted_accuracy(sync_data, mocked_db): assert sync_data.weighted_accuracy == policy.weighted_accuracy[selected_mech_tool] -def test_end_block(mocked_db): +def test_end_block(mocked_db: MagicMock) -> None: """Test the end_block logic in TxPreparationRound.""" - # Mock SynchronizedData and CollectSameUntilThresholdRound behavior mocked_sync_data = MagicMock(spec=SynchronizedData) - mock_context = MagicMock() # Create a mock context + mock_context = MagicMock() round_instance = TxPreparationRound( synchronized_data=mocked_sync_data, context=mock_context ) @@ -225,4 +226,4 @@ def test_end_block(mocked_db): TxPreparationRound, "end_block", return_value=(mocked_sync_data, Event.NONE) ): result = round_instance.end_block() - assert result == (mocked_sync_data, Event.NONE) \ No newline at end of file + assert result == (mocked_sync_data, Event.NONE) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py index 367b37988..375723d2b 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py @@ -20,6 +20,7 @@ """This package contains the tests for Decision Maker""" + import pytest from packages.valory.skills.abstract_round_abci.base import ( @@ -42,20 +43,24 @@ class MockSynchronizedData(BaseSynchronizedData): """A mock class for SynchronizedData.""" - def __init__(self, db=None): + def __init__(self, db=None) -> None: + """Mock function""" super().__init__(db) # Pass db to the parent class class MockContext: """A mock class for context used in the rounds.""" - def __init__(self): + def __init__(self) -> None: + """Mock function""" self.some_attribute = "mock_value" # Add any necessary attributes here class TestFinalStates: + """The class for test of Final States""" + @pytest.fixture - def setup_round(self): + def setup_round(self) -> tuple[MockSynchronizedData, MockContext]: """Fixture to set up a round instance.""" synchronized_data = MockSynchronizedData( db="mock_db" @@ -63,7 +68,9 @@ def setup_round(self): context = MockContext() return synchronized_data, context - def test_benchmarking_mode_disabled_round(self, setup_round): + def test_benchmarking_mode_disabled_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of BenchmarkingModeDisabledRound.""" synchronized_data, context = setup_round round_instance = BenchmarkingModeDisabledRound( @@ -72,7 +79,9 @@ def test_benchmarking_mode_disabled_round(self, setup_round): assert isinstance(round_instance, BenchmarkingModeDisabledRound) assert isinstance(round_instance, DegenerateRound) - def test_finished_decision_maker_round(self, setup_round): + def test_finished_decision_maker_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of FinishedDecisionMakerRound.""" synchronized_data, context = setup_round round_instance = FinishedDecisionMakerRound( @@ -81,7 +90,9 @@ def test_finished_decision_maker_round(self, setup_round): assert isinstance(round_instance, FinishedDecisionMakerRound) assert isinstance(round_instance, DegenerateRound) - def test_finished_decision_request_round(self, setup_round): + def test_finished_decision_request_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of FinishedDecisionRequestRound.""" synchronized_data, context = setup_round round_instance = FinishedDecisionRequestRound( @@ -90,7 +101,9 @@ def test_finished_decision_request_round(self, setup_round): assert isinstance(round_instance, FinishedDecisionRequestRound) assert isinstance(round_instance, DegenerateRound) - def test_finished_subscription_round(self, setup_round): + def test_finished_subscription_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of FinishedSubscriptionRound.""" synchronized_data, context = setup_round round_instance = FinishedSubscriptionRound( @@ -99,7 +112,9 @@ def test_finished_subscription_round(self, setup_round): assert isinstance(round_instance, FinishedSubscriptionRound) assert isinstance(round_instance, DegenerateRound) - def test_finished_without_redeeming_round(self, setup_round): + def test_finished_without_redeeming_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of FinishedWithoutRedeemingRound.""" synchronized_data, context = setup_round round_instance = FinishedWithoutRedeemingRound( @@ -108,7 +123,9 @@ def test_finished_without_redeeming_round(self, setup_round): assert isinstance(round_instance, FinishedWithoutRedeemingRound) assert isinstance(round_instance, DegenerateRound) - def test_finished_without_decision_round(self, setup_round): + def test_finished_without_decision_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of FinishedWithoutDecisionRound.""" synchronized_data, context = setup_round round_instance = FinishedWithoutDecisionRound( @@ -117,7 +134,9 @@ def test_finished_without_decision_round(self, setup_round): assert isinstance(round_instance, FinishedWithoutDecisionRound) assert isinstance(round_instance, DegenerateRound) - def test_refill_required_round(self, setup_round): + def test_refill_required_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of RefillRequiredRound.""" synchronized_data, context = setup_round round_instance = RefillRequiredRound( @@ -126,7 +145,9 @@ def test_refill_required_round(self, setup_round): assert isinstance(round_instance, RefillRequiredRound) assert isinstance(round_instance, DegenerateRound) - def test_benchmarking_done_round(self, setup_round): + def test_benchmarking_done_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of BenchmarkingDoneRound and its end_block method.""" synchronized_data, context = setup_round round_instance = BenchmarkingDoneRound( @@ -139,7 +160,9 @@ def test_benchmarking_done_round(self, setup_round): with pytest.raises(SystemExit): round_instance.end_block() # Should exit the program - def test_impossible_round(self, setup_round): + def test_impossible_round( + self, setup_round: tuple[MockSynchronizedData, MockContext] + ) -> None: """Test instantiation of ImpossibleRound.""" synchronized_data, context = setup_round round_instance = ImpossibleRound( From 8b051a90325c62a3fd2beb04bf7a1b1f09328616 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Thu, 17 Oct 2024 15:01:00 +0530 Subject: [PATCH 18/34] fix:check runs error --- .../tests/states/test_order_subscription.py | 63 ++++++++++++------- .../tests/states/test_redeem.py | 10 +-- 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py index ac0502af8..2db87cd03 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -17,14 +17,17 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" +from typing import Any, Optional, Type from unittest.mock import MagicMock, patch import pytest -from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData +from packages.valory.skills.abstract_round_abci.base import ( + AbciAppDB, + BaseSynchronizedData, +) from packages.valory.skills.decision_maker_abci.states.base import Event from packages.valory.skills.decision_maker_abci.states.order_subscription import ( SubscriptionRound, @@ -35,29 +38,37 @@ class MockSynchronizedData(BaseSynchronizedData): """The class for testing""" - def __init__(self, db): + def __init__(self, db: AbciAppDB) -> None: """Mock""" super().__init__(db=db) - self.agreement_id = "dummy_agreement_id" + self.agreement_id: Optional[str] = "dummy_agreement_id" - def update(self, **kwargs): + def update( + self, synchronized_data_class: Optional[Type[Any]] = None, **kwargs: Any + ) -> "MockSynchronizedData": """Mock the update method to simulate updating agreement_id.""" - updated_data = self.__class__(self.db.copy()) + updated_data = self.__class__( + self.db + ) # Use self.db directly as AbciAppDB might not have a 'copy' method updated_data.__dict__.update(kwargs) return updated_data @pytest.fixture -def setup_subscription_round(): +def setup_subscription_round() -> SubscriptionRound: """Fixture to set up a basic SubscriptionRound instance.""" - mock_synchronized_data = MockSynchronizedData(db={}) + mock_synchronized_data = MockSynchronizedData( + db=AbciAppDB(setup_data={}) + ) # Ensure setup_data is passed round_instance = SubscriptionRound( synchronized_data=mock_synchronized_data, context=MagicMock() ) return round_instance -def test_threshold_reached_with_error(setup_subscription_round): +def test_threshold_reached_with_error( + setup_subscription_round: SubscriptionRound, +) -> None: """Test when the threshold is reached and the transaction is an error.""" round_instance = setup_subscription_round with patch.object( @@ -78,7 +89,9 @@ def test_threshold_reached_with_error(setup_subscription_round): ) -def test_threshold_reached_with_no_tx(setup_subscription_round): +def test_threshold_reached_with_no_tx( + setup_subscription_round: SubscriptionRound, +) -> None: """Test when the threshold is reached and there's no transaction.""" round_instance = setup_subscription_round with patch.object( @@ -96,7 +109,9 @@ def test_threshold_reached_with_no_tx(setup_subscription_round): assert result == (round_instance.synchronized_data, Event.NO_SUBSCRIPTION) -def test_threshold_reached_with_mock_tx(setup_subscription_round): +def test_threshold_reached_with_mock_tx( + setup_subscription_round: SubscriptionRound, +) -> None: """Test when the threshold is reached and benchmarking mode is enabled.""" round_instance = setup_subscription_round round_instance.context.benchmarking_mode.enabled = True @@ -115,10 +130,11 @@ def test_threshold_reached_with_mock_tx(setup_subscription_round): assert result == (round_instance.synchronized_data, Event.MOCK_TX) -def test_end_block_updates_sync_data(setup_subscription_round): +def test_end_block_updates_sync_data( + setup_subscription_round: SubscriptionRound, +) -> None: """Test if the agreement_id is correctly updated in synchronized data.""" round_instance = setup_subscription_round - # Patch the `most_voted_payload_values` to return a list with the new agreement ID with patch.object( SubscriptionRound, @@ -127,16 +143,19 @@ def test_end_block_updates_sync_data(setup_subscription_round): ): # Call the `end_block` method to trigger the update result = round_instance.end_block() - # Check the updated synchronized_data object returned by end_block - sync_data, event = result - - # Assert that the agreement_id was updated to the new_agreement_id - assert sync_data.agreement_id == "new_agreement_id" - assert event is not None - - -def test_no_update_when_threshold_not_reached(setup_subscription_round): + if result is not None: + sync_data, event = result + # Assert that the agreement_id was updated to the new_agreement_id + assert getattr(sync_data, "agreement_id", None) == "new_agreement_id" + assert event is not None + else: + raise AssertionError("end_block result should not be None") + + +def test_no_update_when_threshold_not_reached( + setup_subscription_round: SubscriptionRound, +) -> None: """Test when the threshold is not reached, there should be no changes.""" round_instance = setup_subscription_round with patch.object( diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 33880df5c..2b1f1419c 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -87,10 +87,10 @@ def test_end_block_with_period_count_update(redeem_round): # Set up the necessary attributes redeem_round.synchronized_data.period_count = 1 - # Directly assign a valid integer to nb_participants - redeem_round.nb_participants = 3 + # Directly set nb_participants as an integer within the synchronized_data mock + redeem_round.synchronized_data.nb_participants = 3 - # Set up mock return values for db.get if needed + # Set up mock return values for db.get as needed mock_keys = RedeemRound.selection_key for key in mock_keys: redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") @@ -98,6 +98,6 @@ def test_end_block_with_period_count_update(redeem_round): # Call the actual end_block method result = redeem_round.end_block() - # Add assertions based on what you expect the result to be + # Assertions to check the result assert isinstance(result, tuple) # Ensure it returns a tuple - assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior + assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior \ No newline at end of file From 5934b367de7739cf4e11332b04cf78d3eac33469 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 18 Oct 2024 18:08:37 +0530 Subject: [PATCH 19/34] fix:check runs error --- .../tests/states/test_bet_placement.py | 11 ++--- .../tests/states/test_blacklising.py | 25 ++++++----- .../tests/states/test_check_benchmarking.py | 5 +-- .../tests/states/test_decision_receive.py | 43 +++++++++---------- .../tests/states/test_redeem.py | 4 +- 5 files changed, 46 insertions(+), 42 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py index 0de1e8d68..36128e3fb 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_bet_placement.py @@ -17,9 +17,10 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" +from typing import Any, Dict + import pytest from packages.valory.skills.decision_maker_abci.states.base import Event @@ -29,13 +30,13 @@ @pytest.fixture -def bet_placement_round(): +def bet_placement_round() -> BetPlacementRound: """Fixture to set up a BetPlacementRound instance for testing.""" - synchronized_data = {} # Example placeholder - context = {} # Example placeholder + synchronized_data: Dict[str, Any] = {} # Added type annotation + context: Dict[str, Any] = {} # Added type annotation return BetPlacementRound(synchronized_data, context) -def test_initial_event(bet_placement_round): +def test_initial_event(bet_placement_round: BetPlacementRound) -> None: """Test that the initial event is set correctly.""" assert bet_placement_round.none_event == Event.INSUFFICIENT_BALANCE diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py index 6cbe72c0f..02b7dba0f 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_blacklising.py @@ -17,7 +17,6 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" from unittest.mock import MagicMock, patch @@ -35,7 +34,7 @@ @pytest.fixture -def mocked_context(): +def mocked_context() -> MagicMock: """Fixture to mock the context.""" context = MagicMock() context.benchmarking_mode.enabled = False # Default for the test @@ -43,20 +42,24 @@ def mocked_context(): @pytest.fixture -def mocked_synchronized_data(): +def mocked_synchronized_data() -> MagicMock: """Fixture to mock the synchronized data.""" return MagicMock(spec=SynchronizedData) @pytest.fixture -def blacklisting_round(mocked_context, mocked_synchronized_data): +def blacklisting_round( + mocked_context: MagicMock, mocked_synchronized_data: MagicMock +) -> BlacklistingRound: """Fixture to create an instance of BlacklistingRound.""" return BlacklistingRound( context=mocked_context, synchronized_data=mocked_synchronized_data ) -def test_blacklisting_round_initialization(blacklisting_round): +def test_blacklisting_round_initialization( + blacklisting_round: BlacklistingRound, +) -> None: """Test the initialization of the BlacklistingRound.""" assert blacklisting_round.done_event == Event.DONE assert blacklisting_round.none_event == Event.NONE @@ -67,8 +70,8 @@ def test_blacklisting_round_initialization(blacklisting_round): def test_blacklisting_round_end_block_done_event_no_benchmarking( - blacklisting_round, mocked_context -): + blacklisting_round: BlacklistingRound, mocked_context: MagicMock +) -> None: """Test end_block when event is DONE and benchmarking is disabled.""" # Mock the superclass end_block to return DONE event synced_data = MagicMock(spec=SynchronizedData) @@ -83,8 +86,8 @@ def test_blacklisting_round_end_block_done_event_no_benchmarking( def test_blacklisting_round_end_block_done_event_with_benchmarking( - blacklisting_round, mocked_context -): + blacklisting_round: BlacklistingRound, mocked_context: MagicMock +) -> None: """Test end_block when event is DONE and benchmarking is enabled.""" # Set benchmarking mode to enabled mocked_context.benchmarking_mode.enabled = True @@ -104,7 +107,9 @@ def test_blacklisting_round_end_block_done_event_with_benchmarking( assert mocked_context.benchmarking_mode.enabled # Benchmarking enabled -def test_blacklisting_round_end_block_none_event(blacklisting_round): +def test_blacklisting_round_end_block_none_event( + blacklisting_round: BlacklistingRound, +) -> None: """Test end_block when the superclass returns None.""" # Mock the superclass end_block to return None with patch.object( diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py index aef475c8f..f21cb005b 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_check_benchmarking.py @@ -17,7 +17,6 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" from unittest.mock import MagicMock @@ -29,7 +28,7 @@ ) -def test_check_benchmarking_mode_round_initialization(): +def test_check_benchmarking_mode_round_initialization() -> None: """Test the initialization of CheckBenchmarkingModeRound.""" round_instance = CheckBenchmarkingModeRound(MagicMock(), MagicMock()) @@ -41,7 +40,7 @@ def test_check_benchmarking_mode_round_initialization(): assert isinstance(round_instance, HandleFailedTxRound) -def test_check_benchmarking_mode_round_events(): +def test_check_benchmarking_mode_round_events() -> None: """Test that the correct events are used in the CheckBenchmarkingModeRound.""" round_instance = CheckBenchmarkingModeRound(MagicMock(), MagicMock()) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py index 835c470dd..47390d54f 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py @@ -17,7 +17,6 @@ # # ------------------------------------------------------------------------------ - """This package contains the tests for Decision Maker""" import json @@ -57,10 +56,10 @@ def get_participants() -> FrozenSet[str]: def get_payloads( - vote: Optional[str], - confidence: Optional[float], + vote: Optional[bool], # Changed from Optional[str] to Optional[bool] + confidence: Optional[int], # Changed from Optional[float] to Optional[int] bet_amount: Optional[float], - next_mock_data_row: Optional[str], + next_mock_data_row: Optional[int], # Changed from Optional[str] to Optional[int] is_profitable: bool, ) -> Mapping[str, BaseTxPayload]: """Get payloads.""" @@ -97,10 +96,10 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Happy path", initial_data={}, payloads=get_payloads( - vote="yes", - confidence=0.8, + vote=True, # Changed to bool + confidence=80, # Changed to int bet_amount=100.0, - next_mock_data_row="row_1", + next_mock_data_row=1, # Changed to int is_profitable=True, ), final_data={ @@ -117,10 +116,10 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Unprofitable decision", initial_data={"is_profitable": False}, payloads=get_payloads( - vote="no", - confidence=0.5, + vote=False, # Changed to bool + confidence=50, # Changed to int bet_amount=50.0, - next_mock_data_row="row_2", + next_mock_data_row=2, # Changed to int is_profitable=False, ), final_data={ @@ -137,10 +136,10 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="No majority", initial_data={}, payloads=get_payloads( - vote=None, - confidence=None, - bet_amount=None, - next_mock_data_row=None, + vote=None, # No vote + confidence=None, # No confidence + bet_amount=None, # No bet amount + next_mock_data_row=None, # No data row is_profitable=True, ), # Simulating insufficient votes final_data={}, @@ -152,10 +151,10 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Tie event", initial_data={}, payloads=get_payloads( - vote=None, - confidence=None, - bet_amount=None, - next_mock_data_row=None, + vote=None, # No vote + confidence=None, # No confidence + bet_amount=None, # No bet amount + next_mock_data_row=None, # No data row is_profitable=True, ), # Simulating a tie situation final_data={}, @@ -167,10 +166,10 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Mechanism response error", initial_data={"mocking_mode": True}, payloads=get_payloads( - vote=None, - confidence=None, - bet_amount=None, - next_mock_data_row=None, + vote=None, # No vote + confidence=None, # No confidence + bet_amount=None, # No bet amount + next_mock_data_row=None, # No data row is_profitable=True, ), # Simulating mocking mode response final_data={}, diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 2b1f1419c..bc8be5491 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -92,7 +92,7 @@ def test_end_block_with_period_count_update(redeem_round): # Set up mock return values for db.get as needed mock_keys = RedeemRound.selection_key - for key in mock_keys: + for _key in mock_keys: redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") # Call the actual end_block method @@ -100,4 +100,4 @@ def test_end_block_with_period_count_update(redeem_round): # Assertions to check the result assert isinstance(result, tuple) # Ensure it returns a tuple - assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior \ No newline at end of file + assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior From c9c04673fa48472701273214f79bf134ef633454 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Tue, 22 Oct 2024 14:08:08 +0530 Subject: [PATCH 20/34] fix:check runs error --- .../tests/states/test_final_states.py | 10 ++-- .../tests/states/test_redeem.py | 33 ++++-------- .../tests/states/test_sampling.py | 50 +++++++++---------- 3 files changed, 40 insertions(+), 53 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py index 375723d2b..38dc05bf3 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py @@ -20,10 +20,12 @@ """This package contains the tests for Decision Maker""" +from typing import Any, Dict, List import pytest from packages.valory.skills.abstract_round_abci.base import ( + AbciAppDB, BaseSynchronizedData, DegenerateRound, ) @@ -43,7 +45,7 @@ class MockSynchronizedData(BaseSynchronizedData): """A mock class for SynchronizedData.""" - def __init__(self, db=None) -> None: + def __init__(self, db: AbciAppDB) -> None: """Mock function""" super().__init__(db) # Pass db to the parent class @@ -62,9 +64,9 @@ class TestFinalStates: @pytest.fixture def setup_round(self) -> tuple[MockSynchronizedData, MockContext]: """Fixture to set up a round instance.""" - synchronized_data = MockSynchronizedData( - db="mock_db" - ) # Provide a mock db value + setup_data: Dict[str, List[Any]] = {} + mock_db = AbciAppDB(setup_data) + synchronized_data = MockSynchronizedData(db=mock_db) # Provide a mock db value context = MockContext() return synchronized_data, context diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index bc8be5491..8c6e33c0b 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -1,23 +1,16 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ -# # Copyright 2023-2024 Valory AG -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# # http://www.apache.org/licenses/LICENSE-2.0 -# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# # ------------------------------------------------------------------------------ - - """This package contains the tests for Decision Maker""" from unittest.mock import MagicMock @@ -35,12 +28,10 @@ def redeem_round(): synchronized_data = MagicMock(spec=BaseSynchronizedData) context = MagicMock() redeem_instance = RedeemRound(synchronized_data, context) - # Set initial properties redeem_instance.block_confirmations = 0 synchronized_data.period_count = 0 synchronized_data.db = MagicMock() - return redeem_instance @@ -54,13 +45,10 @@ def test_end_block_no_update(redeem_round): # This ensures that block_confirmations and period_count are 0 redeem_round.block_confirmations = 0 redeem_round.synchronized_data.period_count = 0 - # Mock the superclass's end_block to simulate behavior redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") - # Call the actual end_block method result = redeem_round.end_block() - # Assert the result is a tuple and check for specific event assert isinstance(result, tuple) assert result[1] == Event.NO_REDEEMING # Adjust based on expected output @@ -68,16 +56,14 @@ def test_end_block_no_update(redeem_round): def test_end_block_with_update(redeem_round): """Test the end_block behavior when an update occurs.""" - # Mock the super class's end_block to return a valid update + # Mock the superclass's end_block to return a valid update update_result = ( redeem_round.synchronized_data, Event.NO_REDEEMING, ) # Use an actual event from your enum RedeemRound.end_block = MagicMock(return_value=update_result) - result = redeem_round.end_block() assert result == update_result - # Ensure no database update was attempted redeem_round.synchronized_data.db.update.assert_not_called() @@ -86,18 +72,21 @@ def test_end_block_with_period_count_update(redeem_round): """Test the behavior when period_count is greater than zero.""" # Set up the necessary attributes redeem_round.synchronized_data.period_count = 1 - # Directly set nb_participants as an integer within the synchronized_data mock redeem_round.synchronized_data.nb_participants = 3 - # Set up mock return values for db.get as needed mock_keys = RedeemRound.selection_key for _key in mock_keys: redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") - # Call the actual end_block method + # Debug prints to trace the issue + print("Before calling end_block") result = redeem_round.end_block() - - # Assertions to check the result - assert isinstance(result, tuple) # Ensure it returns a tuple - assert result[1] == Event.NO_REDEEMING # Adjust based on expected behavior + print(f"After calling end_block, result: {result}") + + # Add additional checks + assert result is not None, "end_block returned None" + assert isinstance( + result, tuple + ), f"end_block returned {type(result)} instead of tuple" + assert result[1] == Event.NO_REDEEMING diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py index 8f0f462e7..d77190418 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py @@ -1,28 +1,21 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ -# # Copyright 2023-2024 Valory AG -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# # http://www.apache.org/licenses/LICENSE-2.0 -# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# # ------------------------------------------------------------------------------ - - """This package contains the tests for Decision Maker""" import pytest -from packages.valory.skills.abstract_round_abci.base import get_name +from packages.valory.skills.abstract_round_abci.base import AbciAppDB, get_name from packages.valory.skills.decision_maker_abci.payloads import SamplingPayload from packages.valory.skills.decision_maker_abci.rounds import SamplingRound from packages.valory.skills.decision_maker_abci.states.base import ( @@ -38,11 +31,15 @@ class MockSynchronizedData(SynchronizedData): sampled_bet_index = 0 # Default value for sampled_bet_index + def __init__(self, db: AbciAppDB): + """Initialize MockSynchronizedData with the given db.""" + super().__init__(db) + class MockContext: """A mock class for context used in AbstractRound.""" - def __init__(self): + def __init__(self) -> None: """Mock function""" self.sender = "mock_sender" self.bets_hash = "mock_bets_hash" @@ -52,27 +49,27 @@ class TestSamplingRound: """The class for testing Sampling Round""" @pytest.fixture - def setup_sampling_round(self): + def setup_sampling_round(self) -> SamplingRound: """Fixture to set up a SamplingRound instance.""" context = MockContext() synchronized_data = MockSynchronizedData( - db=dict() - ) # Passing a mock dictionary for 'db' + db=AbciAppDB({}) + ) # Passing a mock AbciAppDB instance return SamplingRound(context=context, synchronized_data=synchronized_data) - def test_sampling_round_properties(self, setup_sampling_round): + def test_sampling_round_properties( + self, setup_sampling_round: SamplingRound + ) -> None: """Test the properties of the SamplingRound class.""" sampling_round = setup_sampling_round - assert sampling_round.payload_class == SamplingPayload assert sampling_round.done_event == Event.DONE assert sampling_round.none_event == Event.NONE assert sampling_round.no_majority_event == Event.NO_MAJORITY assert sampling_round.selection_key is not None - def test_sampling_payload_initialization(self): + def test_sampling_payload_initialization(self) -> None: """Test the initialization of the SamplingPayload.""" - # Adjust according to the actual initialization parameters payload = SamplingPayload( sender="mock_sender", bets_hash="mock_bets_hash", index=0 ) # Added index @@ -81,11 +78,13 @@ def test_sampling_payload_initialization(self): assert payload.bets_hash == "mock_bets_hash" assert payload.index == 0 # Check that the index is correctly initialized - def test_sampling_round_inherits_update_bets_round(self): + def test_sampling_round_inherits_update_bets_round(self) -> None: """Test that SamplingRound inherits from UpdateBetsRound.""" assert issubclass(SamplingRound, UpdateBetsRound) - def test_sampling_round_selection_key(self, setup_sampling_round): + def test_sampling_round_selection_key( + self, setup_sampling_round: SamplingRound + ) -> None: """Test the selection key property of SamplingRound.""" sampling_round = setup_sampling_round expected_selection_key = ( @@ -96,14 +95,11 @@ def test_sampling_round_selection_key(self, setup_sampling_round): ) assert sampling_round.selection_key == expected_selection_key - def test_sampling_round_event_handling(self, setup_sampling_round): + def test_sampling_round_event_handling( + self, setup_sampling_round: SamplingRound + ) -> None: """Test event handling in SamplingRound.""" sampling_round = setup_sampling_round - sampling_round.current_event = None # Simulating an initial state - - # Assuming the event changes the round's state - sampling_round.current_event = Event.DONE - assert sampling_round.current_event == Event.DONE - - sampling_round.current_event = Event.NO_MAJORITY - assert sampling_round.current_event == Event.NO_MAJORITY + # Simulate event handling through method calls or appropriate property checks + assert sampling_round.done_event == Event.DONE + assert sampling_round.no_majority_event == Event.NO_MAJORITY From f2b662199a04078f8facae1bde1d5ed692be809f Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Tue, 22 Oct 2024 14:15:10 +0530 Subject: [PATCH 21/34] fix:dependency --- .../skills/decision_maker_abci/tests/states/test_redeem.py | 6 ++++++ .../decision_maker_abci/tests/states/test_sampling.py | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 8c6e33c0b..457574fa8 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -1,16 +1,22 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ +# # Copyright 2023-2024 Valory AG +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at +# # http://www.apache.org/licenses/LICENSE-2.0 +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# # ------------------------------------------------------------------------------ + """This package contains the tests for Decision Maker""" from unittest.mock import MagicMock diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py index d77190418..00b53cb00 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_sampling.py @@ -1,16 +1,22 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ +# # Copyright 2023-2024 Valory AG +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at +# # http://www.apache.org/licenses/LICENSE-2.0 +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# # ------------------------------------------------------------------------------ + """This package contains the tests for Decision Maker""" import pytest From 822b3fc64f3f331556886fc518bbe3495f48f497 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 25 Oct 2024 14:07:03 +0530 Subject: [PATCH 22/34] fix:check runs error --- .../tests/states/test_randomness.py | 31 ++- .../tests/states/test_redeem.py | 191 +++++++++++------- 2 files changed, 131 insertions(+), 91 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py index fe5683cc2..4dd8e6256 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_randomness.py @@ -17,7 +17,9 @@ # # ------------------------------------------------------------------------------ -"""This package contains the tests for Decision Maker""" + +"""This module contains test cases for the RandomnessRound class.""" + import pytest from packages.valory.skills.decision_maker_abci.rounds import RandomnessRound @@ -36,39 +38,32 @@ class MockSynchronizedData: class MockContext: """A mock class for context used in RandomnessTransactionSubmissionRound.""" - def __init__(self): - """Mock function""" + def __init__(self) -> None: + """Initialize the MockContext with necessary attributes.""" self.sender = "mock_sender" class TestRandomnessRound: - """The class for testing Randomness Round""" + """Test suite for the RandomnessRound class.""" @pytest.fixture - def setup_randomness_round(self): + def setup_randomness_round(self) -> RandomnessRound: """Fixture to set up a RandomnessRound instance.""" context = MockContext() synchronized_data = MockSynchronizedData() return RandomnessRound(context=context, synchronized_data=synchronized_data) - def test_randomness_round_properties(self, setup_randomness_round): + def test_randomness_round_properties( + self, setup_randomness_round: RandomnessRound + ) -> None: """Test the properties of the RandomnessRound class.""" randomness_round = setup_randomness_round assert randomness_round.done_event == Event.DONE assert randomness_round.no_majority_event == Event.NO_MAJORITY - def test_randomness_round_inherits_randomness_transaction_submission_round(self): + def test_randomness_round_inherits_randomness_transaction_submission_round( + self, + ) -> None: """Test that RandomnessRound inherits from RandomnessTransactionSubmissionRound.""" assert issubclass(RandomnessRound, RandomnessTransactionSubmissionRound) - - def test_randomness_round_event_handling(self, setup_randomness_round): - """Test the event handling mechanism.""" - randomness_round = setup_randomness_round - randomness_round.current_event = Event.DONE # Simulate setting the event - assert randomness_round.current_event == Event.DONE - - randomness_round.current_event = ( - Event.NO_MAJORITY - ) # Simulate setting another event - assert randomness_round.current_event == Event.NO_MAJORITY diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 457574fa8..8c6939e6f 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2023-2024 Valory AG +# Copyright 2023 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,82 +17,127 @@ # # ------------------------------------------------------------------------------ -"""This package contains the tests for Decision Maker""" +"""Tests for RedeemRound class.""" -from unittest.mock import MagicMock +from typing import Any, Dict, Optional +from unittest.mock import PropertyMock, patch import pytest -from packages.valory.skills.abstract_round_abci.base import BaseSynchronizedData -from packages.valory.skills.decision_maker_abci.states.base import Event +from packages.valory.skills.abstract_round_abci.base import AbciAppDB +from packages.valory.skills.decision_maker_abci.states.base import ( + Event, + SynchronizedData, +) from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound -@pytest.fixture -def redeem_round(): - """Fixture to set up a RedeemRound instance for testing.""" - synchronized_data = MagicMock(spec=BaseSynchronizedData) - context = MagicMock() - redeem_instance = RedeemRound(synchronized_data, context) - # Set initial properties - redeem_instance.block_confirmations = 0 - synchronized_data.period_count = 0 - synchronized_data.db = MagicMock() - return redeem_instance - - -def test_initial_event(redeem_round): - """Test that the initial event is set correctly.""" - assert redeem_round.none_event == Event.NO_REDEEMING - - -def test_end_block_no_update(redeem_round): - """Test the end_block behavior when no update occurs.""" - # This ensures that block_confirmations and period_count are 0 - redeem_round.block_confirmations = 0 - redeem_round.synchronized_data.period_count = 0 - # Mock the superclass's end_block to simulate behavior - redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") - # Call the actual end_block method - result = redeem_round.end_block() - # Assert the result is a tuple and check for specific event - assert isinstance(result, tuple) - assert result[1] == Event.NO_REDEEMING # Adjust based on expected output - - -def test_end_block_with_update(redeem_round): - """Test the end_block behavior when an update occurs.""" - # Mock the superclass's end_block to return a valid update - update_result = ( - redeem_round.synchronized_data, - Event.NO_REDEEMING, - ) # Use an actual event from your enum - RedeemRound.end_block = MagicMock(return_value=update_result) - result = redeem_round.end_block() - assert result == update_result - # Ensure no database update was attempted - redeem_round.synchronized_data.db.update.assert_not_called() - - -def test_end_block_with_period_count_update(redeem_round): - """Test the behavior when period_count is greater than zero.""" - # Set up the necessary attributes - redeem_round.synchronized_data.period_count = 1 - # Directly set nb_participants as an integer within the synchronized_data mock - redeem_round.synchronized_data.nb_participants = 3 - # Set up mock return values for db.get as needed - mock_keys = RedeemRound.selection_key - for _key in mock_keys: - redeem_round.synchronized_data.db.get = MagicMock(return_value="mock_value") - - # Debug prints to trace the issue - print("Before calling end_block") - result = redeem_round.end_block() - print(f"After calling end_block, result: {result}") - - # Add additional checks - assert result is not None, "end_block returned None" - assert isinstance( - result, tuple - ), f"end_block returned {type(result)} instead of tuple" - assert result[1] == Event.NO_REDEEMING +class MockDB(AbciAppDB): + """Mock database for testing.""" + + def __init__(self) -> None: + """Initialize the mock database.""" + setup_data: Dict[str, Any] = {} + super().__init__(setup_data=setup_data) + self.data: Dict[str, Optional[int]] = {} + + def get(self, key: str, default: Optional[int] = None) -> Optional[int]: + """Get value from mock db.""" + return self.data.get(key, default) + + def update(self, **kwargs: Any) -> None: + """Update mock db.""" + self.data.update(kwargs) + + +class MockSynchronizedData(SynchronizedData): + """Mock synchronized data for testing.""" + + def __init__(self) -> None: + """Initialize mock synchronized data.""" + db = MockDB() + super().__init__(db) + self._period_count = 0 + + @property + def period_count(self) -> int: + """Get period count.""" + return self._period_count + + @period_count.setter + def period_count(self, value: int) -> None: + """Set period count.""" + self._period_count = value + + +class MockContext: + """Mock context for testing.""" + + def __init__(self) -> None: + """Initialize mock context.""" + self.params: Dict[str, Optional[int]] = {} + + +class TestRedeemRound: + """Tests for the RedeemRound class.""" + + @pytest.fixture + def setup_redeem_round(self) -> RedeemRound: + """Set up a RedeemRound instance.""" + mock_synchronized_data = MockSynchronizedData() + mock_context = MockContext() + redeem_round = RedeemRound( + context=mock_context, synchronized_data=mock_synchronized_data + ) + return redeem_round + + def test_initial_attributes(self, setup_redeem_round: RedeemRound) -> None: + """Test initial attributes.""" + redeem_round = setup_redeem_round + assert redeem_round.payload_class is not None + assert redeem_round.payload_class.__name__ == "RedeemPayload" + assert redeem_round.none_event == Event.NO_REDEEMING + + def test_selection_key(self, setup_redeem_round: RedeemRound) -> None: + """Test selection key generation.""" + redeem_round = setup_redeem_round + assert isinstance(redeem_round.selection_key, tuple) + assert all(isinstance(key, str) for key in redeem_round.selection_key) + + def test_end_block_no_update(self, setup_redeem_round: RedeemRound) -> None: + """Test end block without update.""" + redeem_round = setup_redeem_round + + # Mock the period_count property using patch.object + with patch.object( + MockSynchronizedData, "period_count", new_callable=PropertyMock + ) as mock_period_count: + mock_period_count.return_value = 0 + + result = redeem_round.end_block() + + if result is None: + assert redeem_round.block_confirmations == 1 + else: + synchronized_data, event = result + assert isinstance(synchronized_data, MockSynchronizedData) + assert event == Event.NO_MAJORITY + + def test_end_block_update(self, setup_redeem_round: RedeemRound) -> None: + """Test end block with update.""" + redeem_round = setup_redeem_round + + # Mock the period_count property using patch.object + with patch.object( + MockSynchronizedData, "period_count", new_callable=PropertyMock + ) as mock_period_count: + mock_period_count.return_value = 1 + + result = redeem_round.end_block() + + if result is None: + assert redeem_round.block_confirmations == 0 + else: + synchronized_data, event = result + assert isinstance(synchronized_data, MockSynchronizedData) + assert event == Event.NO_MAJORITY From 5a4fd75dfe93b3274ff08e28a3dc5dec8b255c57 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Fri, 25 Oct 2024 15:18:28 +0530 Subject: [PATCH 23/34] fix:dependency --- .../skills/decision_maker_abci/tests/states/test_redeem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 8c6939e6f..ea57df4dd 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2023 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 5f0b9f65fb9ce11b8fef8bffdcd9642418af1611 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 28 Oct 2024 15:27:48 +0530 Subject: [PATCH 24/34] fix:test error --- .../tests/states/test_decision_receive.py | 77 +++++++++++-------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py index 47390d54f..82c3a447a 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_decision_receive.py @@ -26,7 +26,6 @@ import pytest -from packages.valory.skills.abstract_round_abci.base import BaseTxPayload from packages.valory.skills.abstract_round_abci.test_tools.rounds import ( BaseCollectSameUntilThresholdRoundTest, ) @@ -38,6 +37,7 @@ from packages.valory.skills.decision_maker_abci.states.decision_receive import ( DecisionReceiveRound, ) +from packages.valory.skills.market_manager_abci.rounds import UpdateBetsPayload DUMMY_DECISION_HASH = "dummy_decision_hash" @@ -48,6 +48,7 @@ "agent_2": "decision_3", } ) +DUMMY_BETS_HASH = "dummy_bets_hash" # Added a dummy bets hash def get_participants() -> FrozenSet[str]: @@ -56,16 +57,23 @@ def get_participants() -> FrozenSet[str]: def get_payloads( - vote: Optional[bool], # Changed from Optional[str] to Optional[bool] - confidence: Optional[int], # Changed from Optional[float] to Optional[int] - bet_amount: Optional[float], - next_mock_data_row: Optional[int], # Changed from Optional[str] to Optional[int] - is_profitable: bool, -) -> Mapping[str, BaseTxPayload]: + vote: Optional[int], + confidence: Optional[float], + bet_amount: Optional[int], + next_mock_data_row: Optional[int], + is_profitable: Optional[bool], + bets_hash: str, +) -> Mapping[str, UpdateBetsPayload]: """Get payloads.""" return { participant: DecisionReceivePayload( - participant, vote, confidence, bet_amount, next_mock_data_row, is_profitable + sender=participant, + vote=vote, + confidence=confidence, + bet_amount=bet_amount, + next_mock_data_row=next_mock_data_row, + is_profitable=is_profitable, + bets_hash=bets_hash, # Added bets_hash parameter ) for participant in get_participants() } @@ -77,7 +85,7 @@ class RoundTestCase: name: str initial_data: Dict[str, Hashable] - payloads: Mapping[str, BaseTxPayload] + payloads: Mapping[str, UpdateBetsPayload] final_data: Dict[str, Hashable] event: Event most_voted_payload: Any @@ -96,11 +104,12 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Happy path", initial_data={}, payloads=get_payloads( - vote=True, # Changed to bool - confidence=80, # Changed to int - bet_amount=100.0, - next_mock_data_row=1, # Changed to int + vote=1, + confidence=80.0, + bet_amount=100, + next_mock_data_row=1, is_profitable=True, + bets_hash=DUMMY_BETS_HASH, # Added bets_hash ), final_data={ "decision_hash": DUMMY_DECISION_HASH, @@ -116,11 +125,12 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Unprofitable decision", initial_data={"is_profitable": False}, payloads=get_payloads( - vote=False, # Changed to bool - confidence=50, # Changed to int - bet_amount=50.0, - next_mock_data_row=2, # Changed to int + vote=0, + confidence=50.0, + bet_amount=50, + next_mock_data_row=2, is_profitable=False, + bets_hash=DUMMY_BETS_HASH, # Added bets_hash ), final_data={ "decision_hash": DUMMY_DECISION_HASH, @@ -136,12 +146,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="No majority", initial_data={}, payloads=get_payloads( - vote=None, # No vote - confidence=None, # No confidence - bet_amount=None, # No bet amount - next_mock_data_row=None, # No data row + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, is_profitable=True, - ), # Simulating insufficient votes + bets_hash=DUMMY_BETS_HASH, # Added bets_hash + ), final_data={}, event=Event.NO_MAJORITY, most_voted_payload=None, @@ -151,12 +162,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Tie event", initial_data={}, payloads=get_payloads( - vote=None, # No vote - confidence=None, # No confidence - bet_amount=None, # No bet amount - next_mock_data_row=None, # No data row + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, is_profitable=True, - ), # Simulating a tie situation + bets_hash=DUMMY_BETS_HASH, # Added bets_hash + ), final_data={}, event=Event.TIE, most_voted_payload=None, @@ -166,12 +178,13 @@ class TestDecisionReceiveRound(BaseCollectSameUntilThresholdRoundTest): name="Mechanism response error", initial_data={"mocking_mode": True}, payloads=get_payloads( - vote=None, # No vote - confidence=None, # No confidence - bet_amount=None, # No bet amount - next_mock_data_row=None, # No data row + vote=None, + confidence=None, + bet_amount=None, + next_mock_data_row=None, is_profitable=True, - ), # Simulating mocking mode response + bets_hash=DUMMY_BETS_HASH, # Added bets_hash + ), final_data={}, event=Event.MECH_RESPONSE_ERROR, most_voted_payload=None, From dcab18f1efeaa9a6425667311dfc85c10b8e5e11 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 28 Oct 2024 15:55:16 +0530 Subject: [PATCH 25/34] chore:geneators --- Makefile | 2 +- packages/packages.json | 12 ++++++------ packages/valory/agents/trader/aea-config.yaml | 6 +++--- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../valory/skills/decision_maker_abci/skill.yaml | 16 ++++++++++++++++ packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- pyproject.toml | 2 +- tox.ini | 2 +- 10 files changed, 33 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index b507e4be3..b58f51f71 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ code-checks: .PHONY: security security: tomte check-security - gitleaks detect --report-format json --report-path leak_report + /home/abc/work/gitleaks detect --report-format json --report-path leak_report # generate abci docstrings # update copyright headers diff --git a/packages/packages.json b/packages/packages.json index 50d584ed9..ac8d0af31 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeiaiqddhwawt7u6stg6ujmzmnn3my7dtqa7tur5jbjfswnsasfoila", - "skill/valory/trader_abci/0.1.0": "bafybeidq5fxitj26rcy37pyrksoyks65zusndh6sor6ct5qv26kz3eupl4", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeidw5cedygh25jtxdv35zb4223kbhtwv6enfxtkkdkuhuayvply5gq", + "skill/valory/decision_maker_abci/0.1.0": "bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i", + "skill/valory/trader_abci/0.1.0": "bafybeihr5tu3qcairujqvvtptkrcsutymzbmkvow5zdhyyvm7mof7pkn3i", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeief2fkdv5pvryo6kyzguqhyfrvsxvb2sqnt4ptriairagjvuonttq", - "service/valory/trader/0.1.0": "bafybeig4b4v62lkebjacfstiizb3cr6ir6vtj6qhrfcpvry7vltikyqyyq", - "service/valory/trader_pearl/0.1.0": "bafybeicioq4b7o7ajmwigl66lvy2yiaprdagmrvz34awq55nxsoupr6ooe" + "agent/valory/trader/0.1.0": "bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm", + "service/valory/trader/0.1.0": "bafybeiavdeka3ybs6ljcdzrgf3wzxzzwmeq3jtgdpe7gnl65br4uu5drkm", + "service/valory/trader_pearl/0.1.0": "bafybeiepdsezmkvpzeeajqf43gdzjdh5jyyuyfxa5q6xayyzkqhgm4grhe" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index b17ec0e2a..896746ed3 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidw5cedygh25jtxdv35zb4223kbhtwv6enfxtkkdkuhuayvply5gq +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeiaiqddhwawt7u6stg6ujmzmnn3my7dtqa7tur5jbjfswnsasfoila -- valory/trader_abci:0.1.0:bafybeidq5fxitj26rcy37pyrksoyks65zusndh6sor6ct5qv26kz3eupl4 +- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i +- valory/trader_abci:0.1.0:bafybeihr5tu3qcairujqvvtptkrcsutymzbmkvow5zdhyyvm7mof7pkn3i - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index c0bf011d9..a1eee921a 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeief2fkdv5pvryo6kyzguqhyfrvsxvb2sqnt4ptriairagjvuonttq +agent: valory/trader:0.1.0:bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index fb5b64536..0111a7cff 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeief2fkdv5pvryo6kyzguqhyfrvsxvb2sqnt4ptriairagjvuonttq +agent: valory/trader:0.1.0:bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 53e5113c5..69535f4d4 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -59,8 +59,24 @@ fingerprint: tests/behaviours/dummy_strategy/dummy_strategy.py: bafybeig5e3xfr7gxsakfj4stbxqcwdiljl7klvgahkuwe3obzxgkg3qt2e tests/behaviours/test_base.py: bafybeif6pglmr7pvojylatfzaxtlk65igx6a2omyrbxfihnnft6o7p75p4 tests/conftest.py: bafybeidy5hw56kw5mxudnfbhvogofn6k4rqb4ux2bd45baedrrhmgyrude + tests/states/test_base.py: bafybeicugggb42gtrtgotsov4uzszzefa73mks64tyi3ct3qjvjhpn6rpm + tests/states/test_bet_placement.py: bafybeibvc37n2cluep4tasvgmvwxwne2deais6ptirducpogk67v4gj4ga + tests/states/test_blacklising.py: bafybeihm2ex6l7fhorgi3mjj2epztu2r7bqbg56unpgpzfzymghshchqzy + tests/states/test_check_benchmarking.py: bafybeifwpi5f4fhreqptfxdsnyv3nptkqytkwbukfuqkrjo4eww7cv3sxy + tests/states/test_claim_subscription.py: bafybeiclkxjhceb3ehgmg6klt4uywew5drk5b3w6no7mwxetpubxqrejfy + tests/states/test_decision_receive.py: bafybeifj7rwqyzfcvnqqhbo25pl2jppgjqnqldadwku5wl2tpskfj2zwxq + tests/states/test_decision_request.py: bafybeigqbakm2olkwvcngertjplhnmu6on6tp6hxn7lxygi2gf5a5eurbe + tests/states/test_final_states.py: bafybeifhrq2tjoflhsso2lmexazpslmf6tnhm4jlvwxuxna5l7zunhtuvm + tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq + tests/states/test_order_subscription.py: bafybeidbpiscaubrinylzqx53qimr62uy6wwclcbqvauyqt2xr3inubgxa + tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey + tests/states/test_redeem.py: bafybeieynxnxbnhptv5nxnps444cqtqblvjautglujheafce76sxotooja + tests/states/test_sampling.py: bafybeibyglipxdl6f25qfxf36v2n3kckrpmwyuqcenfeqzhjujpwon6o2u + tests/states/test_tool_selection.py: bafybeib7js3dj7647t33o5ybfqftwytxktwrvhbri5yuyymg6znj6y7xxa + tests/test_dialogues.py: bafybeibulo64tgfrq4e5qbcqnmifrlehkqciwuavublints353zaj2mlpa tests/test_handlers.py: bafybeihpkgtjjm3uegpup6zkznpoaxqpu6kmp3ujiggrzbe73p5fzlq7im tests/test_payloads.py: bafybeifc2os3orozmsxbrcfp4c4vrweojo6g4ebxinr5ilescraw6qm6sa + tests/test_rounds.py: bafybeigqrh7trm3qp2vz3lfgve6gx56v5jjxgvxsilcq2swvqcpndfdci4 utils/__init__.py: bafybeiazrfg3kwfdl5q45azwz6b6mobqxngxpf4hazmrnkhinpk4qhbbf4 utils/nevermined.py: bafybeigallaqxhqopznhjhefr6bukh4ojkz5vdtqyzod5dksshrf24fjgi utils/scaling.py: bafybeialr3z4zogp4k3l2bzcjfi4igvxzjexmlpgze2bai2ufc3plaow4y diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 24666df2c..24e72e78b 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeiaiqddhwawt7u6stg6ujmzmnn3my7dtqa7tur5jbjfswnsasfoila -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeidw5cedygh25jtxdv35zb4223kbhtwv6enfxtkkdkuhuayvply5gq +- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index f02c6c7e8..435001b58 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeiaiqddhwawt7u6stg6ujmzmnn3my7dtqa7tur5jbjfswnsasfoila +- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: diff --git a/pyproject.toml b/pyproject.toml index 7e1668c33..3afa98363 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ include = "packages" [tool.poetry.dependencies] python = "<3.12,>=3.8" open-autonomy = "==0.14.14.post1" -requests = "==2.28.1" +requests = "<2.31.2,>=2.28.1" py-multibase = "==1.0.3" py-multicodec = "==0.2.1" py-eth-sig-utils = "*" diff --git a/tox.ini b/tox.ini index 99330de0e..aba6913e7 100644 --- a/tox.ini +++ b/tox.ini @@ -19,7 +19,7 @@ deps = deps = {[deps-tests]deps} open-autonomy==0.14.14.post1 - requests==2.28.1 + requests<2.31.2,>=2.28.1 py-multibase==1.0.3 py-multicodec==0.2.1 py-eth-sig-utils From 70145a30c38e308482f760affb3a033f660c816b Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 28 Oct 2024 16:04:00 +0530 Subject: [PATCH 26/34] lock error --- poetry.lock | 1398 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 814 insertions(+), 584 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2178cbce2..1b61dd4c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -13,102 +13,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.8" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, - {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, - {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, - {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, - {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, - {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, - {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, - {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, - {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, - {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, - {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, - {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, - {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -150,13 +150,13 @@ files = [ [[package]] name = "anyio" -version = "4.5.0" +version = "4.5.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, - {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, ] [package.dependencies] @@ -167,7 +167,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -289,133 +289,148 @@ files = [ [[package]] name = "bitarray" -version = "2.9.2" +version = "2.9.3" description = "efficient arrays of booleans -- C extension" optional = false python-versions = "*" files = [ - {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:917905de565d9576eb20f53c797c15ba88b9f4f19728acabec8d01eee1d3756a"}, - {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b35bfcb08b7693ab4bf9059111a6e9f14e07d57ac93cd967c420db58ab9b71e1"}, - {file = "bitarray-2.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea1923d2e7880f9e1959e035da661767b5a2e16a45dfd57d6aa831e8b65ee1bf"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0b63a565e8a311cc8348ff1262d5784df0f79d64031d546411afd5dd7ef67d"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf0620da2b81946d28c0b16f3e3704d38e9837d85ee4f0652816e2609aaa4fed"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79a9b8b05f2876c7195a2b698c47528e86a73c61ea203394ff8e7a4434bda5c8"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:345c76b349ff145549652436235c5532e5bfe9db690db6f0a6ad301c62b9ef21"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e2936f090bf3f4d1771f44f9077ebccdbc0415d2b598d51a969afcb519df505"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f9346e98fc2abcef90b942973087e2462af6d3e3710e82938078d3493f7fef52"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e6ec283d4741befb86e8c3ea2e9ac1d17416c956d392107e45263e736954b1f7"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:962892646599529917ef26266091e4cb3077c88b93c3833a909d68dcc971c4e3"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e8da5355d7d75a52df5b84750989e34e39919ec7e59fafc4c104cc1607ab2d31"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:603e7d640e54ad764d2b4da6b61e126259af84f253a20f512dd10689566e5478"}, - {file = "bitarray-2.9.2-cp310-cp310-win32.whl", hash = "sha256:f00079f8e69d75c2a417de7961a77612bb77ef46c09bc74607d86de4740771ef"}, - {file = "bitarray-2.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:1bb33673e7f7190a65f0a940c1ef63266abdb391f4a3e544a47542d40a81f536"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe71fd4b76380c2772f96f1e53a524da7063645d647a4fcd3b651bdd80ca0f2e"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d527172919cdea1e13994a66d9708a80c3d33dedcf2f0548e4925e600fef3a3a"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:052c5073bdcaa9dd10628d99d37a2f33ec09364b86dd1f6281e2d9f8d3db3060"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e064caa55a6ed493aca1eda06f8b3f689778bc780a75e6ad7724642ba5dc62f7"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:508069a04f658210fdeee85a7a0ca84db4bcc110cbb1d21f692caa13210f24a7"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4da73ebd537d75fa7bccfc2228fcaedea0803f21dd9d0bf0d3b67fef3c4af294"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cb378eaa65cd43098f11ff5d27e48ee3b956d2c00d2d6b5bfc2a09fe183be47"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d14c790b91f6cbcd9b718f88ed737c78939980c69ac8c7f03dd7e60040c12951"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eea9318293bc0ea6447e9ebfba600a62f3428bea7e9c6d42170ae4f481dbab3"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b76ffec27c7450b8a334f967366a9ebadaea66ee43f5b530c12861b1a991f503"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:76b76a07d4ee611405045c6950a1e24c4362b6b44808d4ad6eea75e0dbc59af4"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c7d16beeaaab15b075990cd26963d6b5b22e8c5becd131781514a00b8bdd04bd"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60df43e868a615c7e15117a1e1c2e5e11f48f6457280eba6ddf8fbefbec7da99"}, - {file = "bitarray-2.9.2-cp311-cp311-win32.whl", hash = "sha256:e788608ed7767b7b3bbde6d49058bccdf94df0de9ca75d13aa99020cc7e68095"}, - {file = "bitarray-2.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:a23397da092ef0a8cfe729571da64c2fc30ac18243caa82ac7c4f965087506ff"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:90e3a281ffe3897991091b7c46fca38c2675bfd4399ffe79dfeded6c52715436"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bed637b674db5e6c8a97a4a321e3e4d73e72d50b5c6b29950008a93069cc64cd"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e49066d251dbbe4e6e3a5c3937d85b589e40e2669ad0eef41a00f82ec17d844b"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4344e96642e2211fb3a50558feff682c31563a4c64529a931769d40832ca79"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aeb60962ec4813c539a59fbd4f383509c7222b62c3fb1faa76b54943a613e33a"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f7982f10581bb16553719e5e8f933e003f5b22f7d25a68bdb30fac630a6ff"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71d1cabdeee0cdda4669168618f0e46b7dace207b29da7b63aaa1adc2b54081"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0ef2d0a6f1502d38d911d25609b44c6cc27bee0a4363dd295df78b075041b60"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6f71d92f533770fb027388b35b6e11988ab89242b883f48a6fe7202d238c61f8"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba0734aa300757c924f3faf8148e1b8c247176a0ac8e16aefdf9c1eb19e868f7"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:d91406f413ccbf4af6ab5ae7bc78f772a95609f9ddd14123db36ef8c37116d95"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:87abb7f80c0a042f3fe8e5264da1a2756267450bb602110d5327b8eaff7682e7"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b558ce85579b51a2e38703877d1e93b7728a7af664dd45a34e833534f0b755d"}, - {file = "bitarray-2.9.2-cp312-cp312-win32.whl", hash = "sha256:dac2399ee2889fbdd3472bfc2ede74c34cceb1ccf29a339964281a16eb1d3188"}, - {file = "bitarray-2.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:48a30d718d1a6dfc22a49547450107abe8f4afdf2abdcbe76eb9ed88edc49498"}, - {file = "bitarray-2.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2c6be1b651fad8f3adb7a5aa12c65b612cd9b89530969af941844ae680f7d981"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5b399ae6ab975257ec359f03b48fc00b1c1cd109471e41903548469b8feae5c"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b3543c8a1cb286ad105f11c25d8d0f712f41c5c55f90be39f0e5a1376c7d0b0"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03adaacb79e2fb8f483ab3a67665eec53bb3fd0cd5dbd7358741aef124688db3"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae5b0657380d2581e13e46864d147a52c1e2bbac9f59b59c576e42fa7d10cf0"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1f4bf6ea8eb9d7f30808c2e9894237a96650adfecbf5f3643862dc5982f89e"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a8873089be2aa15494c0f81af1209f6e1237d762c5065bc4766c1b84321e1b50"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:677e67f50e2559efc677a4366707070933ad5418b8347a603a49a070890b19bc"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:a620d8ce4ea2f1c73c6b6b1399e14cb68c6915e2be3fad5808c2998ed55b4acf"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:64115ccabbdbe279c24c367b629c6b1d3da9ed36c7420129e27c338a3971bfee"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d6fb422772e75385b76ad1c52f45a68bd4efafd8be8d0061c11877be74c4d43"}, - {file = "bitarray-2.9.2-cp36-cp36m-win32.whl", hash = "sha256:852e202875dd6dfd6139ce7ec4e98dac2b17d8d25934dc99900831e81c3adaef"}, - {file = "bitarray-2.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7dfefdcb0dc6a3ba9936063cec65a74595571b375beabe18742b3d91d087eefd"}, - {file = "bitarray-2.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b306c4cf66912511422060f7f5e1149c8bdb404f8e00e600561b0749fdd45659"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a09c4f81635408e3387348f415521d4b94198c562c23330f560596a6aaa26eaf"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5361413fd2ecfdf44dc8f065177dc6aba97fa80a91b815586cb388763acf7f8d"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8a9475d415ef1eaae7942df6f780fa4dcd48fce32825eda591a17abba869299"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b87baa7bfff9a5878fcc1bffe49ecde6e647a72a64b39a69cd8a2992a43a34"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb6b86cfdfc503e92cb71c68766a24565359136961642504a7cc9faf936d9c88"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cd56b8ae87ebc71bcacbd73615098e8a8de952ecbb5785b6b4e2b07da8a06e1f"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3fa909cfd675004aed8b4cc9df352415933656e0155a6209d878b7cb615c787e"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b069ca9bf728e0c5c5b60e00a89df9af34cc170c695c3bfa3b372d8f40288efb"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6067f2f07a7121749858c7daa93c8774325c91590b3e81a299621e347740c2ae"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:321841cdad1dd0f58fe62e80e9c9c7531f8ebf8be93f047401e930dc47425b1e"}, - {file = "bitarray-2.9.2-cp37-cp37m-win32.whl", hash = "sha256:54e16e32e60973bb83c315de9975bc1bcfc9bd50bb13001c31da159bc49b0ca1"}, - {file = "bitarray-2.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:f4dcadb7b8034aa3491ee8f5a69b3d9ba9d7d1e55c3cc1fc45be313e708277f8"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c8919fdbd3bb596b104388b56ae4b266eb28da1f2f7dff2e1f9334a21840fe96"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb7a9d8a2e400a1026de341ad48e21670a6261a75b06df162c5c39b0d0e7c8f4"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ec84668dd7b937874a2b2c293cd14ba84f37be0d196dead852e0ada9815d807"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2de9a31c34e543ae089fd2a5ced01292f725190e379921384f695e2d7184bd3"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9521f49ae121a17c0a41e5112249e6fa7f6a571245b1118de81fb86e7c1bc1ce"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6cc6545d6d76542aee3d18c1c9485fb7b9812b8df4ebe52c4535ec42081b48f"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:856bbe1616425f71c0df5ef2e8755e878d9504d5a531acba58ab4273c52c117a"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4bba8042ea6ab331ade91bc435d81ad72fddb098e49108610b0ce7780c14e68"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a035da89c959d98afc813e3c62f052690d67cfd55a36592f25d734b70de7d4b0"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6d70b1579da7fb71be5a841a1f965d19aca0ef27f629cfc07d06b09aafd0a333"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:405b83bed28efaae6d86b6ab287c75712ead0adbfab2a1075a1b7ab47dad4d62"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7eb8be687c50da0b397d5e0ab7ca200b5ebb639e79a9f5e285851d1944c94be9"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eceb551dfeaf19c609003a69a0cf8264b0efd7abc3791a11dfabf4788daf0d19"}, - {file = "bitarray-2.9.2-cp38-cp38-win32.whl", hash = "sha256:bb198c6ed1edbcdaf3d1fa3c9c9d1cdb7e179a5134ef5ee660b53cdec43b34e7"}, - {file = "bitarray-2.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:648d2f2685590b0103c67a937c2fb9e09bcc8dfb166f0c7c77bd341902a6f5b3"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ea816dc8f8e65841a8bbdd30e921edffeeb6f76efe6a1eb0da147b60d539d1cf"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4d0e32530f941c41eddfc77600ec89b65184cb909c549336463a738fab3ed285"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a22266fb416a3b6c258bf7f83c9fe531ba0b755a56986a81ad69dc0f3bcc070"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6d3e80dd8239850f2604833ff3168b28909c8a9357abfed95632cccd17e3e7"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f135e804986b12bf14f2cd1eb86674c47dea86c4c5f0fa13c88978876b97ebe6"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87580c7f7d14f7ec401eda7adac1e2a25e95153e9c339872c8ae61b3208819a1"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64b433e26993127732ac7b66a7821b2537c3044355798de7c5fcb0af34b8296f"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e497c535f2a9b68c69d36631bf2dba243e05eb343b00b9c7bbdc8c601c6802d"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e40b3cb9fa1edb4e0175d7c06345c49c7925fe93e39ef55ecb0bc40c906b0c09"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f2f8692f95c9e377eb19ca519d30d1f884b02feb7e115f798de47570a359e43f"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f0b84fc50b6dbeced4fa390688c07c10a73222810fb0e08392bd1a1b8259de36"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d656ad38c942e38a470ddbce26b5020e08e1a7ea86b8fd413bb9024b5189993a"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ab0f1dbfe5070db98771a56aa14797595acd45a1af9eadfb193851a270e7996"}, - {file = "bitarray-2.9.2-cp39-cp39-win32.whl", hash = "sha256:0a99b23ac845a9ea3157782c97465e6ae026fe0c7c4c1ed1d88f759fd6ea52d9"}, - {file = "bitarray-2.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:9bbcfc7c279e8d74b076e514e669b683f77b4a2a328585b3f16d4c5259c91222"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:43847799461d8ba71deb4d97b47250c2c2fb66d82cd3cb8b4caf52bb97c03034"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f44381b0a4bdf64416082f4f0e7140377ae962c0ced6f983c6d7bbfc034040"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a484061616fb4b158b80789bd3cb511f399d2116525a8b29b6334c68abc2310f"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ff9e38356cc803e06134cf8ae9758e836ccd1b793135ef3db53c7c5d71e93bc"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b44105792fbdcfbda3e26ee88786790fda409da4c71f6c2b73888108cf8f062f"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e913098de169c7fc890638ce5e171387363eb812579e637c44261460ac00aa2"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6fe315355cdfe3ed22ef355b8bdc81a805ca4d0949d921576560e5b227a1112"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f708e91fdbe443f3bec2df394ed42328fb9b0446dff5cb4199023ac6499e09fd"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b7b09489b71f9f1f64c0fa0977e250ec24500767dab7383ba9912495849cadf"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:128cc3488176145b9b137fdcf54c1c201809bbb8dd30b260ee40afe915843b43"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21f21e7f56206be346bdbda2a6bdb2165a5e6a11821f88fd4911c5a6bbbdc7e2"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f4dd3af86dd8a617eb6464622fb64ca86e61ce99b59b5c35d8cd33f9c30603d"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6465de861aff7a2559f226b37982007417eab8c3557543879987f58b453519bd"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbaf2bb71d6027152d603f1d5f31e0dfd5e50173d06f877bec484e5396d4594b"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f32948c86e0d230a296686db28191b67ed229756f84728847daa0c7ab7406e3"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be94e5a685e60f9d24532af8fe5c268002e9016fa80272a94727f435de3d1003"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5cc9381fd54f3c23ae1039f977bfd6d041a5c3c1518104f616643c3a5a73b15"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd926e8ae4d1ed1ac4a8f37212a62886292f692bc1739fde98013bf210c2d175"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:461a3dafb9d5fda0bb3385dc507d78b1984b49da3fe4c6d56c869a54373b7008"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:393cb27fd859af5fd9c16eb26b1c59b17b390ff66b3ae5d0dd258270191baf13"}, - {file = "bitarray-2.9.2.tar.gz", hash = "sha256:a8f286a51a32323715d77755ed959f94bef13972e9a2fe71b609e40e6d27957e"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2cf5f5400636c7dda797fd681795ce63932458620fe8c40955890380acba9f62"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3487b4718ffa5942fab777835ee36085f8dda7ec4bd0b28433efb117f84852b6"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10f44b1e4994035408bea54d7bf0aec79744cad709706bedf28091a48bb7f1a4"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5c16f97c65add6535748a9c98c70e7ca79759c38a2eb990127fef72f76111a"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13dbfc42971ba84e9c4ba070f720df6570285a3f89187f07ef422efcb611c19f"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c28076acfbe7f9a5494d7ae98094a6e209c390c340938845f294818ebf5e4d3"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7cdd21835936d9a66477836ca23b2cb63295142cb9d9158883e2c0f1f8f6bd"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f60887ab3a46e507fa6f8544d8d4b0748da48718591dfe3fe80c62bdea60f10"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f75e1abd4a37cba3002521d3f5e2b50ef4f4a74342207cad3f52468411d5d8ba"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dc63da9695383c048b83f5ab77eab35a55bbb2e77c7b6e762eba219929b45b84"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6fe5a57b859d9bc9c2fd27c78c4b7b83158faf984202de6fb44618caeebfff10"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1fe5a37bd9441a5ecc2f6e71b43df7176fa376a542ef97484310b8b46a45649a"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a16e42c169ca818d6a15b5dd5acd5d2a26af0fa0588e1036e0e58d01f8387d4"}, + {file = "bitarray-2.9.3-cp310-cp310-win32.whl", hash = "sha256:5e6b5e7940af3474ffaa930cd1ce8215181cbe864d6b5ddb67a15d3c15e935cd"}, + {file = "bitarray-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:c63dbb99ef2ab1281871678624f9c9a5f1682b826e668ce559275ec488b3fa8b"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:49fb93b488d180f5c84b79fe687c585a84bf0295ff035d63e09ee24ce1da0558"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2944fb83bbc2aa7f29a713bc4f8c1318e54fa0d06a72bedd350a3fb4a4b91d8"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3612d9d3788dc62f1922c917b1539f1cdf02cecc9faef8ae213a8b36093136ca"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90a9300cdb7c99b1e692bb790cba8acecee1a345a83e58e28c94a0d87c522237"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1211ed66acbbb221fd7554abf4206a384d79e6192d5cb95325c5c361bbb52a74"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67757279386accf93eba76b8f97b5acf1664a3e350cbea5f300f53490f8764fd"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e19c6a99c32f460c2613f797f77aa37d8e298891d00ea5355158cce80e11ec"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72734bd3775f43c5a75385730abb9f84fee6c627eb14f579de4be478f1615c8c"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a92703471b5d3316c7481bc1852f620f42f7a1b62be27f39d13694827635786f"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d5d77c81300ca430d4b195ccfbb629d6858258f541b6e96c6b11ec1563cd2681"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3ba8a29c0d091c952ced1607ce715f5e0524899f24333a493807d00f5938463d"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:418171d035b191dbe5e86cd2bfb5c3e1ae7d947edc22857a897d1c7251674ae5"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e0bd272eba256183be2a17488f9cb096d2e6d3435ecf2e28c1e0857c6d20749"}, + {file = "bitarray-2.9.3-cp311-cp311-win32.whl", hash = "sha256:cc3fd2b0637a619cf13e122bbcf4729ae214d5f25623675597e67c25f9edfe61"}, + {file = "bitarray-2.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1fc2a81a585dbe5e367682156e6350d908a56e2ffd6ca651b0af01994db596f"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc47be026f76f1728af00dc7140cec8483fe2f0c476bbf2a59ef47865e00ff96"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:82b091742ff511cdb06f90af0d2c22e7af3dbff9b8212e2e0d88dfef6a8570b3"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d5edb4302a0e3a3d1d0eeb891de3c615d4cb7a446fb41c21eecdcfb29400a6f"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4786c5525069c19820549dd2f42d33632bc42959ad167138bd8ee5024b922b"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bfe2de2b4df61ccb9244871a0fdf1fff83be0c1bd7187048c3cf7f81c5fe631"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31e4f69538f95d2934587d957eea0d283162322dd1af29e57122b20b8cd60f92"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca44908b2bc08d8995770018638d62626706864f9c599b7818225a12f3dbc2c"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:279f8de5d251ee521e365df29c927d9b5732f1ed4f373d2dbbd278fcbad94ff5"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49bb631b38431c09ecd534d56ef04264397d24d18c4ee6653c84e14ae09d92d"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:192bffc93ee9a5b6c833c98d1dcc81f5633ddd726b85e18341387d0c1d51f691"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c516cec28c6511df51d87033f40ec420324a2247469b0c989d344f4d27ea37d2"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:66241cb9a1c1db294f46cd440141e57e8242874e38f3f61877f72d92ae14768a"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab1f0e7631110c89bea7b605c0c35832333eb9cc97e5de05d71c76d42a1858c9"}, + {file = "bitarray-2.9.3-cp312-cp312-win32.whl", hash = "sha256:42aa5bee6fe8ad3385eaf5c6585016bbc38a7b75efb52ce5c6f8e00e05237dfa"}, + {file = "bitarray-2.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:dc3fd647d845b94fac3652390866f921f914a17f3807a031c826f68dae3f43e3"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fcfcc1989e3e021a282624017b7fb754210f5332e933b1c3ebc79643727b6551"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71b1e229a706798a9e106ca7b03d4c63455deb40b18c92950ec073a05a8f8285"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4bb49556d3d505d24c942a4206ad4d0d40e89fa3016a7ea6edc994d5c08d4a8e"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4466aa1e533a59d5f7fd37219d154ec3f2ba73fce3d8a2e11080ec475bc15fb"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9b75adc0fd0bf278bea89dc3d679d74e10d2df98d3d074b7f3d36f323138818"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:701582bbbeac372b1cd8a3c9daf6c2336dc2d22e14373a6271d788bc4f2b6edc"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea1f119668bbdbd68008031491515e84441e505163918819994b28f295f762c"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f400bc18a70bfdb073532c3054ecd78a0e64f96ff7b6140adde5b122580ec2b"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aacff5656fb3e15cede7d02903da2634d376aa928d7a81ec8df19b0724d7972a"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8a2ae42a14cbf766d4478d7101da6359b0648dd813e60eb3486ac56ad2f5add3"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:616698edb547d10f0b960cb9f2e8629c55a420dd4c2b1ab46706f49a1815621d"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f277c50ba184929dfeed39b6cf9468e3446093521b0aeb52bd54a21ca08f5473"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:661237739b385c90d8837d5e96b06de093cc6e610236977e198f88f5a979686e"}, + {file = "bitarray-2.9.3-cp313-cp313-win32.whl", hash = "sha256:68acec6c19d798051f178a1197b76f891985f683f95a4b12811b68e58b080f5a"}, + {file = "bitarray-2.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:3055720afdcfd7e8f630fa16db7bed7e55c9d0a1f4756195e3b250e203f3b436"}, + {file = "bitarray-2.9.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72bf17d0e7d8a4f645655a07999d23e42472cbf2100b8dad7ce26586075241d7"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cfd332b5f1ad8c4dc3cc79ecef33c19b42d8d8e6a39fd5c9ecb5855be0b9723"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5b466ef1e48f25621c9d27e95deb5e33b8656827ed8aa530b972de73870bd1f"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:938cf26fdaf4d0adfac82d830c025523c5d36ddead0470b735286028231c1784"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f766669e768ef9a2b23ecfa710b38b6a48da3f91755113c79320b207ae255d"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6337c0c64044f35ddfb241143244aac707a68f34ae31a71dad115f773ccc8b"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:731b59540167f8b2b20f69f487ecee2339fc4657059906a16cb51acac17f89c3"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4feed0539a9d6432361fc4d3820eea3a81fa631d542f166cf8430aad81a971da"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:eb65c96a42e73f35175ec738d67992ffdf054c20abee3933cfcfa2343fa1187d"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:4f40ceac94d182de6135759d81289683ff3e4cf0da709bc5826a7fe00d754114"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:5b29f7844080a281635a231a37e99f0bd6f567af6cf19f4f6d212137f99a9cdf"}, + {file = "bitarray-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:947cf522a3b339b73114d12417fd848fa01303dbaa7883ced4c87688dba5637c"}, + {file = "bitarray-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:ea794ea60d514d68777a87a74106110db7a4bbc2c46720e67010e3071afefb95"}, + {file = "bitarray-2.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c7bc7cb79dcac8bdce23b305e671c06eaeffb012fa065b8c33bc51df7e1733f0"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6380ad0f929ad9220abadd1c9b7234271c4b6ea9c753a88611d489e93a8f2e"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f4e2451e2ad450b41ede8440e52c1fd798e81027e1dc2256292ec0787d3bf1"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7267885c98138f3707c710d5b08eedef150a3e5112c760cfe1200f3366fd7064"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976957423cb41df8fe0eb811dbb53d8c5ab1ca3beec7a3ca7ff679be44a72714"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0ec5141a69f73ed6ff17ea7344d5cc166e087095bfe3661dbb42b519e76aa16"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:218a1b7c0652a3c1020f903ded0f9768c3719fb6d43a6e9d346e985292992d35"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:cf0c9ebf2df280794244e1e12ed626357506ddaa2f0d6f69efe493ae7bbf4bf7"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:c450a04a7e091b57d4c0bd1531648522cd0ef26913ad0e5dea0432ea29b0e5c1"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a212eb89a50e32ef4969387e44a7410447dc59587615e3966d090edc338a1b85"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:4269232026212ee6b73379b88a578107a6b36a6182307a49d5509686c7495261"}, + {file = "bitarray-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:8a0fb358e6a43f216c3fb0871e2ac14c16563aec363c23bc2fbbb18f6201285d"}, + {file = "bitarray-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a8368774cdc737eec8fce6f28d0abc095fbc0edccf8fab8d29fddc264b68def9"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d0724a4fef6ded914075a3385ea2d05afdeed567902f83490ed4e7e7e75d9bf"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0e11b37c6dff6f41ebc49914628824ceb8c8d6ebd0fda2ebe3c0fe0c63e8621e"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:085f4081d72c7468f82f722a9f113e03a1f7a4c132ef4c2a4e680c5d78b7db00"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b530b5fbed2900634fbc43f546e384abd72ad9c49795ff5bd6a93cac1aa9c4d8"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09ff88e4385967571146fb0d270442de39393d44198f4d108f3350cfd6486f0b"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344bb212ddf87db4976a6711d274660a5d887da4fd3faafcdaa092152f85a6d"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc569c96b990f92fd5946d5b50501fee48b01a116a286d1de7961ebd9c6f06f3"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2fbbe7938ef8a7abe3e8519fa0578b51d2787f7171d3144e7d373551b5851fd"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0b5912fab904507b47217509b01aa903d7f98b6e725e490a7f01661f4d9a4fa7"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0c836ccfca9cf60927256738ef234dfe500565492eff269610cdd1bca56801d0"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:af0e4441ebf51c18fc450962f1e201c96f444d63b17cc8dcf7c0b05111bd4486"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9e9b57175fb6fe76d7ddd0647e06a25f6e23f4b54b5febf337c5a840ab37dc3b"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7f7de81721ae9492926bd067007ac974692182bb83fc8f0ba330a67f37a018bd"}, + {file = "bitarray-2.9.3-cp38-cp38-win32.whl", hash = "sha256:4beafb6b6e344385480df6611fdebfcb3579bbb40636ce1ddf5e72fb744e095f"}, + {file = "bitarray-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:d8eaeca98900bd6f06a29cdef57999813a67d314f661d14901d71e04f4cf9f00"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:413965d9d384aef90e58b959f4a39f1d5060b145c26080297b7b4cf23cf38faa"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fbb56f2bb89c3a15304a6c0ea56013dc340a98337d9bbd7fc5c21451dc05f8c"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8a84f39f7885627711473872d8fc58fc7a0a1e4ecd9ddf42daf9a3643432742"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45147a9c8580e857c1344d15bd49d2b4387777bd582a2ede11be2ba740653f28"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed255423dc60c6b2d5c0d90c13dea2962a31929767fdf1c525ab3210269e75c5"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f5bd02671ea5c4ad52bbfe0e8e8197b6e8fa85dec1e93a4a05448c19354cc65"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1c99c58f044549c93fb6d4cda22678deccaed19845eaa2e6917b5b7ca058f2d"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:921ee87681e32e17d1849e11c96eb6a8a7edaa1269dd26831013daf8546bde05"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ed97d8ec40c4658d9f9aa8f26cb473f44fa1dbccba3fa3fbe4a102e38c6a8d7"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9d7f7db37edb9c50c9aad6a18f2e87dd7dc5ff2a33406821804a03263fedb2ca"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:292f726cdb9efc744ed0a1d7453c44151526648148a28d9a2495cc7c7b2c62a8"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cc94784238782a9376f307b1aa9a85ce77b6eded9f82d2fe062db7fdb02c645"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5051436b1d318f6ce0df3b2f8a60bfa66a54c1d9e8719d6cb6b448140e7061f2"}, + {file = "bitarray-2.9.3-cp39-cp39-win32.whl", hash = "sha256:a3d436c686ce59fd0b93438ed2c0e1d3e1716e56bce64b874d05b9f49f1ca5d1"}, + {file = "bitarray-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:f168fc45664266a560f2cb28a327041b7f69d4a7faad8ab89e0a1dd7c270a70d"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ae36787299cff41f212aee33cfe1defee13979a41552665a412b6ca3fa8f7eb8"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42afe48abb8eeb386d93e7f1165ace1dd027f136a8a31edd2b20bc57a0c071d7"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451ceecdb86bb95ae101b0d65c8c4524d692ae3666662fef8c89877ce17748c5"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4d67d3e3de2aede737b12cd75a84963700c941b77b579c14bd05517e05d7a9f"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2406d13ded84049b4238815a5821e44d6f58ba00fbb6b705b6ef8ccd88be8f03"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0db944fc2a048020fc940841ef46c0295b045d45a5a582cba69f78962a49a384"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25c603f141171a7d108773d5136d14e572c473e4cdb3fb464c39c8a138522eb2"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86c06b02705305cab0914d209caa24effda81316e2f2555a71a9aa399b75c5a5"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ddda45b24a802eaaca8f794e6267ff2b62de5fe7b900b76d6f662d95192bebf"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:81490623950d04870c6dd4d7e6df2eb68dd04eca8bec327895ebee8bbe0cc3c7"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a9e69ac6a514cc574891c24a50847022dac2fef8c3f4df530f92820a07337755"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:545c695ee69d26b41351ced4c76244d8b6225669fc0af3652ff8ed5a6b28325d"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbb2e6daabd2a64d091ac7460b0c5c5f9268199ae9a8ce32737cf5273987f1fa"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a969e5cf63144b944ee8d0a0739f53ef1ae54725b5e01258d690a8995d880526"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:73bbb9301ac9000f869c51db2cc5fcc6541985d3fcdcfe6e02f90c9e672a00be"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c07e346926488a85a48542d898f4168f3587ec42379fef0d18be301e08a3f27"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a26d8a14cd8ee496306f2afac34833502dd1ae826355af309333b6f252b23fe"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cef148ed37c892395ca182d6a235524165a9f765f4283d0a1ced891e7c43c67a"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94f35a8f0c8a50ee98a8bef9a070d0b68ecf623f20a2148cc039aba5557346a6"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b03207460daae828e2743874c84264e8d96a8c6156490279092b624cd5d2de08"}, + {file = "bitarray-2.9.3.tar.gz", hash = "sha256:9eff55cf189b0c37ba97156a00d640eb7392db58a8049be6f26ff2712b93fa89"}, ] [[package]] @@ -521,18 +536,118 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.6.0" -files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "ckzg" version = "1.0.2" @@ -763,38 +878,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.1" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, - {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, - {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, - {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, - {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, - {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, - {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -807,120 +922,102 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "cytoolz" -version = "0.12.3" +version = "1.0.0" description = "Cython implementation of Toolz: High performance functional utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cytoolz-0.12.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbe58e26c84b163beba0fbeacf6b065feabc8f75c6d3fe305550d33f24a2d346"}, - {file = "cytoolz-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c51b66ada9bfdb88cf711bf350fcc46f82b83a4683cf2413e633c31a64df6201"}, - {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e70d9c615e5c9dc10d279d1e32e846085fe1fd6f08d623ddd059a92861f4e3dd"}, - {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a83f4532707963ae1a5108e51fdfe1278cc8724e3301fee48b9e73e1316de64f"}, - {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d028044524ee2e815f36210a793c414551b689d4f4eda28f8bbb0883ad78bf5f"}, - {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c2875bcd1397d0627a09a4f9172fa513185ad302c63758efc15b8eb33cc2a98"}, - {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:131ff4820e5d64a25d7ad3c3556f2d8aa65c66b3f021b03f8a8e98e4180dd808"}, - {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04afa90d9d9d18394c40d9bed48c51433d08b57c042e0e50c8c0f9799735dcbd"}, - {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dc1ca9c610425f9854323669a671fc163300b873731584e258975adf50931164"}, - {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bfa3f8e01bc423a933f2e1c510cbb0632c6787865b5242857cc955cae220d1bf"}, - {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f702e295dddef5f8af4a456db93f114539b8dc2a7a9bc4de7c7e41d169aa6ec3"}, - {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0fbad1fb9bb47e827d00e01992a099b0ba79facf5e5aa453be066033232ac4b5"}, - {file = "cytoolz-0.12.3-cp310-cp310-win32.whl", hash = "sha256:8587c3c3dbe78af90c5025288766ac10dc2240c1e76eb0a93a4e244c265ccefd"}, - {file = "cytoolz-0.12.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e45803d9e75ef90a2f859ef8f7f77614730f4a8ce1b9244375734567299d239"}, - {file = "cytoolz-0.12.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ac4f2fb38bbc67ff1875b7d2f0f162a247f43bd28eb7c9d15e6175a982e558d"}, - {file = "cytoolz-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf1e1e96dd86829a0539baf514a9c8473a58fbb415f92401a68e8e52a34ecd5"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a438701c6141dd34eaf92e9e9a1f66e23a22f7840ef8a371eba274477de85d"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b6f11b0d7ed91be53166aeef2a23a799e636625675bb30818f47f41ad31821"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fde09384d23048a7b4ac889063761e44b89a0b64015393e2d1d21d5c1f534a"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d3bfe45173cc8e6c76206be3a916d8bfd2214fb2965563e288088012f1dabfc"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27513a5d5b6624372d63313574381d3217a66e7a2626b056c695179623a5cb1a"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d294e5e81ff094fe920fd545052ff30838ea49f9e91227a55ecd9f3ca19774a0"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:727b01a2004ddb513496507a695e19b5c0cfebcdfcc68349d3efd92a1c297bf4"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fe1e1779a39dbe83f13886d2b4b02f8c4b10755e3c8d9a89b630395f49f4f406"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:de74ef266e2679c3bf8b5fc20cee4fc0271ba13ae0d9097b1491c7a9bcadb389"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e04d22049233394e0b08193aca9737200b4a2afa28659d957327aa780ddddf2"}, - {file = "cytoolz-0.12.3-cp311-cp311-win32.whl", hash = "sha256:20d36430d8ac809186736fda735ee7d595b6242bdb35f69b598ef809ebfa5605"}, - {file = "cytoolz-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:780c06110f383344d537f48d9010d79fa4f75070d214fc47f389357dd4f010b6"}, - {file = "cytoolz-0.12.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:86923d823bd19ce35805953b018d436f6b862edd6a7c8b747a13d52b39ed5716"}, - {file = "cytoolz-0.12.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3e61acfd029bfb81c2c596249b508dfd2b4f72e31b7b53b62e5fb0507dd7293"}, - {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd728f4e6051af6af234651df49319da1d813f47894d4c3c8ab7455e01703a37"}, - {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe8c6267caa7ec67bcc37e360f0d8a26bc3bdce510b15b97f2f2e0143bdd3673"}, - {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99462abd8323c52204a2a0ce62454ce8fa0f4e94b9af397945c12830de73f27e"}, - {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da125221b1fa25c690fcd030a54344cecec80074df018d906fc6a99f46c1e3a6"}, - {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c18e351956f70db9e2d04ff02f28e9a41839250d3f936a4c8a1eabd1c3094d2"}, - {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:921e6d2440ac758c4945c587b1d1d9b781b72737ac0c0ca5d5e02ca1db8bded2"}, - {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1651a9bd591a8326329ce1d6336f3129161a36d7061a4d5ea9e5377e033364cf"}, - {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8893223b87c2782bd59f9c4bd5c7bf733edd8728b523c93efb91d7468b486528"}, - {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:e4d2961644153c5ae186db964aa9f6109da81b12df0f1d3494b4e5cf2c332ee2"}, - {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:71b6eb97f6695f7ba8ce69c49b707a351c5f46fd97f5aeb5f6f2fb0d6e72b887"}, - {file = "cytoolz-0.12.3-cp312-cp312-win32.whl", hash = "sha256:cee3de65584e915053412cd178729ff510ad5f8f585c21c5890e91028283518f"}, - {file = "cytoolz-0.12.3-cp312-cp312-win_amd64.whl", hash = "sha256:9eef0d23035fa4dcfa21e570961e86c375153a7ee605cdd11a8b088c24f707f6"}, - {file = "cytoolz-0.12.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9a38332cfad2a91e89405b7c18b3f00e2edc951c225accbc217597d3e4e9fde"}, - {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f501ae1353071fa5d6677437bbeb1aeb5622067dce0977cedc2c5ec5843b202"}, - {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56f899758146a52e2f8cfb3fb6f4ca19c1e5814178c3d584de35f9e4d7166d91"}, - {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:800f0526adf9e53d3c6acda748f4def1f048adaa780752f154da5cf22aa488a2"}, - {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0976a3fcb81d065473173e9005848218ce03ddb2ec7d40dd6a8d2dba7f1c3ae"}, - {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c835eab01466cb67d0ce6290601ebef2d82d8d0d0a285ed0d6e46989e4a7a71a"}, - {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4fba0616fcd487e34b8beec1ad9911d192c62e758baa12fcb44448b9b6feae22"}, - {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6f6e8207d732651e0204779e1ba5a4925c93081834570411f959b80681f8d333"}, - {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8119bf5961091cfe644784d0bae214e273b3b3a479f93ee3baab97bbd995ccfe"}, - {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7ad1331cb68afeec58469c31d944a2100cee14eac221553f0d5218ace1a0b25d"}, - {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:92c53d508fb8a4463acc85b322fa24734efdc66933a5c8661bdc862103a3373d"}, - {file = "cytoolz-0.12.3-cp37-cp37m-win32.whl", hash = "sha256:2c6dd75dae3d84fa8988861ab8b1189d2488cb8a9b8653828f9cd6126b5e7abd"}, - {file = "cytoolz-0.12.3-cp37-cp37m-win_amd64.whl", hash = "sha256:caf07a97b5220e6334dd32c8b6d8b2bd255ca694eca5dfe914bb5b880ee66cdb"}, - {file = "cytoolz-0.12.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed0cfb9326747759e2ad81cb6e45f20086a273b67ac3a4c00b19efcbab007c60"}, - {file = "cytoolz-0.12.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:96a5a0292575c3697121f97cc605baf2fd125120c7dcdf39edd1a135798482ca"}, - {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b76f2f50a789c44d6fd7f773ec43d2a8686781cd52236da03f7f7d7998989bee"}, - {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2905fdccacc64b4beba37f95cab9d792289c80f4d70830b70de2fc66c007ec01"}, - {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ebe23028eac51251f22ba01dba6587d30aa9c320372ca0c14eeab67118ec3f"}, - {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c715404a3825e37fe3966fe84c5f8a1f036e7640b2a02dbed96cac0c933451"}, - {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bac0adffc1b6b6a4c5f1fd1dd2161afb720bcc771a91016dc6bdba59af0a5d3"}, - {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:37441bf4a2a4e2e0fe9c3b0ea5e72db352f5cca03903977ffc42f6f6c5467be9"}, - {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f04037302049cb30033f7fa4e1d0e44afe35ed6bfcf9b380fc11f2a27d3ed697"}, - {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f37b60e66378e7a116931d7220f5352186abfcc950d64856038aa2c01944929c"}, - {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ec9be3e4b6f86ea8b294d34c990c99d2ba6c526ef1e8f46f1d52c263d4f32cd7"}, - {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e9199c9e3fbf380a92b8042c677eb9e7ed4bccb126de5e9c0d26f5888d96788"}, - {file = "cytoolz-0.12.3-cp38-cp38-win32.whl", hash = "sha256:18cd61e078bd6bffe088e40f1ed02001387c29174750abce79499d26fa57f5eb"}, - {file = "cytoolz-0.12.3-cp38-cp38-win_amd64.whl", hash = "sha256:765b8381d4003ceb1a07896a854eee2c31ebc950a4ae17d1e7a17c2a8feb2a68"}, - {file = "cytoolz-0.12.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b4a52dd2a36b0a91f7aa50ca6c8509057acc481a24255f6cb07b15d339a34e0f"}, - {file = "cytoolz-0.12.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:581f1ce479769fe7eeb9ae6d87eadb230df8c7c5fff32138162cdd99d7fb8fc3"}, - {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46f505d4c6eb79585c8ad0b9dc140ef30a138c880e4e3b40230d642690e36366"}, - {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59276021619b432a5c21c01cda8320b9cc7dbc40351ffc478b440bfccd5bbdd3"}, - {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e44f4c25e1e7cf6149b499c74945a14649c8866d36371a2c2d2164e4649e7755"}, - {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c64f8e60c1dd69e4d5e615481f2d57937746f4a6be2d0f86e9e7e3b9e2243b5e"}, - {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33c63186f3bf9d7ef1347bc0537bb9a0b4111a0d7d6e619623cabc18fef0dc3b"}, - {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fdddb9d988405f24035234f1e8d1653ab2e48cc2404226d21b49a129aefd1d25"}, - {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6986632d8a969ea1e720990c818dace1a24c11015fd7c59b9fea0b65ef71f726"}, - {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0ba1cbc4d9cd7571c917f88f4a069568e5121646eb5d82b2393b2cf84712cf2a"}, - {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7d267ffc9a36c0a9a58c7e0adc9fa82620f22e4a72533e15dd1361f57fc9accf"}, - {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95e878868a172a41fbf6c505a4b967309e6870e22adc7b1c3b19653d062711fa"}, - {file = "cytoolz-0.12.3-cp39-cp39-win32.whl", hash = "sha256:8e21932d6d260996f7109f2a40b2586070cb0a0cf1d65781e156326d5ebcc329"}, - {file = "cytoolz-0.12.3-cp39-cp39-win_amd64.whl", hash = "sha256:0d8edfbc694af6c9bda4db56643fb8ed3d14e47bec358c2f1417de9a12d6d1fb"}, - {file = "cytoolz-0.12.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55f9bd1ae6c2a27eda5abe2a0b65a83029d2385c5a1da7b8ef47af5905d7e905"}, - {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2d271393c378282727f1231d40391ae93b93ddc0997448acc21dd0cb6a1e56d"}, - {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee98968d6a66ee83a8ceabf31182189ab5d8598998c8ce69b6d5843daeb2db60"}, - {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01cfb8518828c1189200c02a5010ea404407fb18fd5589e29c126e84bbeadd36"}, - {file = "cytoolz-0.12.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:456395d7aec01db32bf9e6db191d667347c78d8d48e77234521fa1078f60dabb"}, - {file = "cytoolz-0.12.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cd88028bb897fba99ddd84f253ca6bef73ecb7bdf3f3cf25bc493f8f97d3c7c5"}, - {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b19223e7f7bd7a73ec3aa6fdfb73b579ff09c2bc0b7d26857eec2d01a58c76"}, - {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a79d72b08048a0980a59457c239555f111ac0c8bdc140c91a025f124104dbb4"}, - {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd70141b32b717696a72b8876e86bc9c6f8eff995c1808e299db3541213ff82"}, - {file = "cytoolz-0.12.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a1445c91009eb775d479e88954c51d0b4cf9a1e8ce3c503c2672d17252882647"}, - {file = "cytoolz-0.12.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ca6a9a9300d5bda417d9090107c6d2b007683efc59d63cc09aca0e7930a08a85"}, - {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be6feb903d2a08a4ba2e70e950e862fd3be9be9a588b7c38cee4728150a52918"}, - {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b6f43f086e5a965d33d62a145ae121b4ccb6e0789ac0acc895ce084fec8c65"}, - {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:534fa66db8564d9b13872d81d54b6b09ae592c585eb826aac235bd6f1830f8ad"}, - {file = "cytoolz-0.12.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:fea649f979def23150680de1bd1d09682da3b54932800a0f90f29fc2a6c98ba8"}, - {file = "cytoolz-0.12.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a447247ed312dd64e3a8d9483841ecc5338ee26d6e6fbd29cd373ed030db0240"}, - {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba3f843aa89f35467b38c398ae5b980a824fdbdb94065adc6ec7c47a0a22f4c7"}, - {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:582c22f97a380211fb36a7b65b1beeb84ea11d82015fa84b054be78580390082"}, - {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47feb089506fc66e1593cd9ade3945693a9d089a445fbe9a11385cab200b9f22"}, - {file = "cytoolz-0.12.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ba9002d2f043943744a9dc8e50a47362bcb6e6f360dc0a1abcb19642584d87bb"}, - {file = "cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"}, + {file = "cytoolz-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ecf5a887acb8f079ab1b81612b1c889bcbe6611aa7804fd2df46ed310aa5a345"}, + {file = "cytoolz-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0ef30c1e091d4d59d14d8108a16d50bd227be5d52a47da891da5019ac2f8e4"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df2dfd679f0517a96ced1cdd22f5c6c6aeeed28d928a82a02bf4c3fd6fd7ac4"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c51452c938e610f57551aa96e34924169c9100c0448bac88c2fb395cbd3538c"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6433f03910c5e5345d82d6299457c26bf33821224ebb837c6b09d9cdbc414a6c"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389ec328bb535f09e71dfe658bf0041f17194ca4cedaacd39bafe7893497a819"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c64658e1209517ce4b54c1c9269a508b289d8d55fc742760e4b8579eacf09a33"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6039a9bd5bb988762458b9ca82b39e60ca5e5baae2ba93913990dcc5d19fa88"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85c9c8c4465ed1b2c8d67003809aec9627b129cb531d2f6cf0bbfe39952e7e4d"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:49375aad431d76650f94877afb92f09f58b6ff9055079ef4f2cd55313f5a1b39"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4c45106171c824a61e755355520b646cb35a1987b34bbf5789443823ee137f63"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b319a7f0fed5db07d189db4046162ebc183c108df3562a65ba6ebe862d1f634"}, + {file = "cytoolz-1.0.0-cp310-cp310-win32.whl", hash = "sha256:9770e1b09748ad0d751853d994991e2592a9f8c464a87014365f80dac2e83faa"}, + {file = "cytoolz-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:20194dd02954c00c1f0755e636be75a20781f91a4ac9270c7f747e82d3c7f5a5"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d"}, + {file = "cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56"}, + {file = "cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb"}, + {file = "cytoolz-1.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10e3986066dc379e30e225b230754d9f5996aa8d84c2accc69c473c21d261e46"}, + {file = "cytoolz-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:16576f1bb143ee2cb9f719fcc4b845879fb121f9075c7c5e8a5ff4854bd02fc6"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3faa25a1840b984315e8b3ae517312375f4273ffc9a2f035f548b7f916884f37"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781fce70a277b20fd95dc66811d1a97bb07b611ceea9bda8b7dd3c6a4b05d59a"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a562c25338eb24d419d1e80a7ae12133844ce6fdeb4ab54459daf250088a1b2"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f29d8330aaf070304f7cd5cb7e73e198753624eb0aec278557cccd460c699b5b"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a96c54aa55ed9c7cdb23c2f0df39a7b4ee518ac54888480b5bdb5ef69c7ef0"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:287d6d7f475882c2ddcbedf8da9a9b37d85b77690779a2d1cdceb5ae3998d52e"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05a871688df749b982839239fcd3f8ec3b3b4853775d575ff9cd335fa7c75035"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28bb88e1e2f7d6d4b8e0890b06d292c568984d717de3e8381f2ca1dd12af6470"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:576a4f1fc73d8836b10458b583f915849da6e4f7914f4ecb623ad95c2508cad5"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:509ed3799c47e4ada14f63e41e8f540ac6e2dab97d5d7298934e6abb9d3830ec"}, + {file = "cytoolz-1.0.0-cp312-cp312-win32.whl", hash = "sha256:9ce25f02b910630f6dc2540dd1e26c9326027ddde6c59f8cab07c56acc70714c"}, + {file = "cytoolz-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e53cfcce87e05b7f0ae2fb2b3e5820048cd0bb7b701e92bd8f75c9fbb7c9ae9"}, + {file = "cytoolz-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7d56569dfe67a39ce74ffff0dc12cf0a3d1aae709667a303fe8f2dd5fd004fdf"}, + {file = "cytoolz-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:035c8bb4706dcf93a89fb35feadff67e9301935bf6bb864cd2366923b69d9a29"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27c684799708bdc7ee7acfaf464836e1b4dec0996815c1d5efd6a92a4356a562"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44ab57cfc922b15d94899f980d76759ef9e0256912dfab70bf2561bea9cd5b19"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:478af5ecc066da093d7660b23d0b465a7f44179739937afbded8af00af412eb6"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da1f82a7828a42468ea2820a25b6e56461361390c29dcd4d68beccfa1b71066b"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c371b3114d38ee717780b239179e88d5d358fe759a00dcf07691b8922bbc762"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90b343b2f3b3e77c3832ba19b0b17e95412a5b2e715b05c23a55ba525d1fca49"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89a554a9ba112403232a54e15e46ff218b33020f3f45c4baf6520ab198b7ad93"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d603f5e2b1072166745ecdd81384a75757a96a704a5642231eb51969f919d5f"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:122ef2425bd3c0419e6e5260d0b18cd25cf74de589cd0184e4a63b24a4641e2e"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8819f1f97ebe36efcaf4b550e21677c46ac8a41bed482cf66845f377dd20700d"}, + {file = "cytoolz-1.0.0-cp38-cp38-win32.whl", hash = "sha256:fcddbb853770dd6e270d89ea8742f0aa42c255a274b9e1620eb04e019b79785e"}, + {file = "cytoolz-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ca526905a014a38cc23ae78635dc51d0462c5c24425b22c08beed9ff2ee03845"}, + {file = "cytoolz-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05df5ff1cdd198fb57e7368623662578c950be0b14883cadfb9ee4098415e1e5"}, + {file = "cytoolz-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04a84778f48ebddb26948971dc60948907c876ba33b13f9cbb014fe65b341fc2"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f65283b618b4c4df759f57bcf8483865a73f7f268e6d76886c743407c8d26c1c"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388cd07ee9a9e504c735a0a933e53c98586a1c301a64af81f7aa7ff40c747520"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06d09e9569cfdfc5c082806d4b4582db8023a3ce034097008622bcbac7236f38"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9502bd9e37779cc9893cbab515a474c2ab6af61ed22ac2f7e16033db18fcaa85"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:364c2fda148def38003b2c86e8adde1d2aab12411dd50872c244a815262e2fda"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2e945617325242687189966335e785dc0fae316f4c1825baacf56e5a97e65f"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0f16907fdc724c55b16776bdb7e629deae81d500fe48cfc3861231753b271355"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d3206c81ca3ba2d7b8fe78f2e116e3028e721148be753308e88dcbbc370bca52"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:becce4b13e110b5ac6b23753dcd0c977f4fdccffa31898296e13fd1109e517e3"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69a7e5e98fd446079b8b8ec5987aec9a31ec3570a6f494baefa6800b783eaf22"}, + {file = "cytoolz-1.0.0-cp39-cp39-win32.whl", hash = "sha256:b1707b6c3a91676ac83a28a231a14b337dbb4436b937e6b3e4fd44209852a48b"}, + {file = "cytoolz-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:11d48b8521ef5fe92e099f4fc00717b5d0789c3c90d5d84031b6d3b17dee1700"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e672712d5dc3094afc6fb346dd4e9c18c1f3c69608ddb8cf3b9f8428f9c26a5c"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86fb208bfb7420e1d0d20065d661310e4a8a6884851d4044f47d37ed4cd7410e"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dbe5fe3b835859fc559eb59bf2775b5a108f7f2cfab0966f3202859d787d8fd"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cace092dfda174eed09ed871793beb5b65633963bcda5b1632c73a5aceea1ce"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7a9d816af3be9725c70efe0a6e4352a45d3877751b395014b8eb2f79d7d8d9d"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:caa7ef840847a23b379e6146760e3a22f15f445656af97e55a435c592125cfa5"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:921082fff09ff6e40c12c87b49be044492b2d6bb01d47783995813b76680c7b2"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a32f1356f3b64dda883583383966948604ac69ca0b7fbcf5f28856e5f9133b4e"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af793b1738e4191d15a92e1793f1ffea9f6461022c7b2442f3cb1ea0a4f758a"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:51dfda3983fcc59075c534ce54ca041bb3c80e827ada5d4f25ff7b4049777f94"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:acfb8780c04d29423d14aaab74cd1b7b4beaba32f676e7ace02c9acfbf532aba"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99f39dcc46416dca3eb23664b73187b77fb52cd8ba2ddd8020a292d8f449db67"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d56b3721977806dcf1a68b0ecd56feb382fdb0f632af1a9fc5ab9b662b32c6"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d346620abc8c83ae634136e700432ad6202faffcc24c5ab70b87392dcda8a1"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:df0c81197fc130de94c09fc6f024a6a19c98ba8fe55c17f1e45ebba2e9229079"}, + {file = "cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd"}, ] [package.dependencies] @@ -931,13 +1028,13 @@ cython = ["cython"] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] @@ -1248,88 +1345,103 @@ dotenv = ["python-dotenv"] [[package]] name = "frozenlist" -version = "1.4.1" +version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, - {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, - {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] [[package]] @@ -1379,15 +1491,18 @@ websockets = ["websockets (>=10,<12)"] [[package]] name = "graphql-core" -version = "3.2.4" +version = "3.2.5" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." optional = false python-versions = "<4,>=3.6" files = [ - {file = "graphql-core-3.2.4.tar.gz", hash = "sha256:acbe2e800980d0e39b4685dd058c2f4042660b89ebca38af83020fd872ff1264"}, - {file = "graphql_core-3.2.4-py3-none-any.whl", hash = "sha256:1604f2042edc5f3114f49cac9d77e25863be51b23a54a61a23245cf32f6476f0"}, + {file = "graphql_core-3.2.5-py3-none-any.whl", hash = "sha256:2f150d5096448aa4f8ab26268567bbfeef823769893b39c1a2e1409590939c8a"}, + {file = "graphql_core-3.2.5.tar.gz", hash = "sha256:e671b90ed653c808715645e3998b7ab67d382d55467b7e2978549111bbabf8d5"}, ] +[package.dependencies] +typing-extensions = {version = ">=4,<5", markers = "python_version < \"3.10\""} + [[package]] name = "grpcio" version = "1.53.0" @@ -1580,18 +1695,15 @@ requests = ">=2.11" [[package]] name = "isodate" -version = "0.6.1" +version = "0.7.2" description = "An ISO 8601 date/time/duration parser and formatter" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, ] -[package.dependencies] -six = "*" - [[package]] name = "itsdangerous" version = "2.2.0" @@ -2014,7 +2126,7 @@ py-multicodec = ">=0.2.0" pymultihash = "0.8.2" pytest = {version = ">=7.0.0,<7.3.0", optional = true, markers = "extra == \"all\""} python-dotenv = ">=0.14.0,<1.0.1" -pyyaml = ">=6.0.1,<7" +pyyaml = {version = ">=6.0.1,<7", optional = true, markers = "extra == \"all\""} requests = ">=2.28.1,<3" semver = ">=2.9.1,<3.0.0" @@ -2303,6 +2415,113 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" version = "4.24.4" @@ -2496,13 +2715,13 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] [[package]] name = "pyinstaller-hooks-contrib" -version = "2024.8" +version = "2024.9" description = "Community maintained hooks for PyInstaller" optional = false python-versions = ">=3.8" files = [ - {file = "pyinstaller_hooks_contrib-2024.8-py3-none-any.whl", hash = "sha256:0057fe9a5c398d3f580e73e58793a1d4a8315ca91c3df01efea1c14ed557825a"}, - {file = "pyinstaller_hooks_contrib-2024.8.tar.gz", hash = "sha256:29b68d878ab739e967055b56a93eb9b58e529d5b054fbab7a2f2bacf80cef3e2"}, + {file = "pyinstaller_hooks_contrib-2024.9-py3-none-any.whl", hash = "sha256:1ddf9ba21d586afa84e505bb5c65fca10b22500bf3fdb89ee2965b99da53b891"}, + {file = "pyinstaller_hooks_contrib-2024.9.tar.gz", hash = "sha256:4793869f370d1dc4806c101efd2890e3c3e703467d8d27bb5a3db005ebfb008d"}, ] [package.dependencies] @@ -2743,25 +2962,29 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] @@ -2940,20 +3163,20 @@ files = [ [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -3007,13 +3230,13 @@ files = [ [[package]] name = "setuptools" -version = "75.1.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] @@ -3130,13 +3353,13 @@ vulture = ["vulture (==2.7)"] [[package]] name = "toolz" -version = "0.12.1" +version = "1.0.0" description = "List processing tools and functional utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, - {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] [[package]] @@ -3231,13 +3454,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.27.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, - {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, ] [package.dependencies] @@ -3456,108 +3679,115 @@ watchdog = ["watchdog"] [[package]] name = "yarl" -version = "1.13.1" +version = "1.15.2" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, - {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, - {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, - {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, - {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, - {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, - {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, - {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, - {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, - {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, - {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, - {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, - {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, - {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, - {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, + {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, + {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, + {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, + {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, + {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, + {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, + {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, + {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, + {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, + {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, + {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, + {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, + {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, + {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" @@ -3581,4 +3811,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "<3.12,>=3.8" -content-hash = "d6ff2aadbc8e17ec0cf3d58f0f72d3896302520325f5f69aa2ad78e530b38a96" +content-hash = "43c654a308c15072bda54f5c78ee81e355a9c7172183b4deeb3e61f2728eb6f8" From 2065b7013909bfa939ecb7249fa44e65bc5aaa18 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 28 Oct 2024 16:49:27 +0530 Subject: [PATCH 27/34] fix:rounds test --- packages/packages.json | 12 +++++----- packages/valory/agents/trader/aea-config.yaml | 6 ++--- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../skills/decision_maker_abci/skill.yaml | 2 +- .../decision_maker_abci/tests/test_rounds.py | 22 +++++++++++-------- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 28 insertions(+), 24 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index ac8d0af31..874ccd69b 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i", - "skill/valory/trader_abci/0.1.0": "bafybeihr5tu3qcairujqvvtptkrcsutymzbmkvow5zdhyyvm7mof7pkn3i", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy", + "skill/valory/decision_maker_abci/0.1.0": "bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi", + "skill/valory/trader_abci/0.1.0": "bafybeiaegkhxufkbozkwzjsnn457jbvupyv6zbbfjz3xsrexzuxim6hgjq", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm", - "service/valory/trader/0.1.0": "bafybeiavdeka3ybs6ljcdzrgf3wzxzzwmeq3jtgdpe7gnl65br4uu5drkm", - "service/valory/trader_pearl/0.1.0": "bafybeiepdsezmkvpzeeajqf43gdzjdh5jyyuyfxa5q6xayyzkqhgm4grhe" + "agent/valory/trader/0.1.0": "bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a", + "service/valory/trader/0.1.0": "bafybeibrczzukidpwyhwvjdx54ftjvff3camw2gsyewi3ofi6xsmqcmefy", + "service/valory/trader_pearl/0.1.0": "bafybeiepficgdfn5eomzlrlxjubys5ltv4r7uyg5cvfxud4b2a77bymmxq" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 896746ed3..d10be6d29 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i -- valory/trader_abci:0.1.0:bafybeihr5tu3qcairujqvvtptkrcsutymzbmkvow5zdhyyvm7mof7pkn3i +- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi +- valory/trader_abci:0.1.0:bafybeiaegkhxufkbozkwzjsnn457jbvupyv6zbbfjz3xsrexzuxim6hgjq - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index a1eee921a..399c76349 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm +agent: valory/trader:0.1.0:bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 0111a7cff..5c0054e6e 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeidpcjessxzwyi32yhpf4ipbrsjrcwcokz2hka5lgdiqhz2uxs23qm +agent: valory/trader:0.1.0:bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 69535f4d4..ad057d355 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -76,7 +76,7 @@ fingerprint: tests/test_dialogues.py: bafybeibulo64tgfrq4e5qbcqnmifrlehkqciwuavublints353zaj2mlpa tests/test_handlers.py: bafybeihpkgtjjm3uegpup6zkznpoaxqpu6kmp3ujiggrzbe73p5fzlq7im tests/test_payloads.py: bafybeifc2os3orozmsxbrcfp4c4vrweojo6g4ebxinr5ilescraw6qm6sa - tests/test_rounds.py: bafybeigqrh7trm3qp2vz3lfgve6gx56v5jjxgvxsilcq2swvqcpndfdci4 + tests/test_rounds.py: bafybeigifftusd4ew42tyvyrr55o2uehhcik2gdq3atkpjwwlqdeskedty utils/__init__.py: bafybeiazrfg3kwfdl5q45azwz6b6mobqxngxpf4hazmrnkhinpk4qhbbf4 utils/nevermined.py: bafybeigallaqxhqopznhjhefr6bukh4ojkz5vdtqyzod5dksshrf24fjgi utils/scaling.py: bafybeialr3z4zogp4k3l2bzcjfi4igvxzjexmlpgze2bai2ufc3plaow4y diff --git a/packages/valory/skills/decision_maker_abci/tests/test_rounds.py b/packages/valory/skills/decision_maker_abci/tests/test_rounds.py index 2a1f5cba4..9cbf81d60 100644 --- a/packages/valory/skills/decision_maker_abci/tests/test_rounds.py +++ b/packages/valory/skills/decision_maker_abci/tests/test_rounds.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------ # -# Copyright 2024 Valory AG +# Copyright 2023-2024 Valory AG # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,8 +17,7 @@ # # ------------------------------------------------------------------------------ -"""This module contains the test for rounds for the DecisionMaker ABCI application.""" - +"""This module contains the test for rounds of decision maker""" from unittest.mock import MagicMock import pytest @@ -56,7 +55,10 @@ from packages.valory.skills.decision_maker_abci.states.order_subscription import ( SubscriptionRound, ) -from packages.valory.skills.decision_maker_abci.states.randomness import RandomnessRound +from packages.valory.skills.decision_maker_abci.states.randomness import ( + BenchmarkingRandomnessRound, + RandomnessRound, +) from packages.valory.skills.decision_maker_abci.states.redeem import RedeemRound from packages.valory.skills.decision_maker_abci.states.sampling import SamplingRound from packages.valory.skills.decision_maker_abci.states.tool_selection import ( @@ -89,7 +91,9 @@ def test_check_benchmarking_transition(setup_app: DecisionMakerAbciApp) -> None: transition_function = app.transition_function[CheckBenchmarkingModeRound] # Transition on benchmarking enabled - assert transition_function[Event.BENCHMARKING_ENABLED] == RandomnessRound + assert ( + transition_function[Event.BENCHMARKING_ENABLED] == BenchmarkingRandomnessRound + ) # Transition on benchmarking disabled assert ( @@ -123,8 +127,8 @@ def test_subscription_round_transition(setup_app: DecisionMakerAbciApp) -> None: assert transition_function[Event.DONE] == FinishedSubscriptionRound # Mock transaction cases - assert transition_function[Event.MOCK_TX] == RandomnessRound - assert transition_function[Event.NO_SUBSCRIPTION] == RandomnessRound + assert transition_function[Event.MOCK_TX] == ToolSelectionRound + assert transition_function[Event.NO_SUBSCRIPTION] == ToolSelectionRound def test_claim_round_transition(setup_app: DecisionMakerAbciApp) -> None: @@ -133,7 +137,7 @@ def test_claim_round_transition(setup_app: DecisionMakerAbciApp) -> None: transition_function = app.transition_function[ClaimRound] # Test transition on done - assert transition_function[Event.DONE] == RandomnessRound + assert transition_function[Event.DONE] == ToolSelectionRound def test_randomness_round_transition(setup_app: DecisionMakerAbciApp) -> None: @@ -142,7 +146,7 @@ def test_randomness_round_transition(setup_app: DecisionMakerAbciApp) -> None: transition_function = app.transition_function[RandomnessRound] # Transition on done - assert transition_function[Event.DONE] == ToolSelectionRound + assert transition_function[Event.DONE] == SamplingRound def test_tool_selection_round_transition(setup_app: DecisionMakerAbciApp) -> None: diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 24e72e78b..25738b320 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpgpisfj3cbulyvax6yl6jhkn2u4uar33jggryqipsi25lm5psdy +- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 435001b58..f1adb8856 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeih5jrenonzwm5xzgmipcbuhu27n7l6wvhjtjivdpvvavjjmqggj6i +- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From 5166936d786763cd344a398592624b81da99001e Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Mon, 28 Oct 2024 17:11:28 +0530 Subject: [PATCH 28/34] fix:type error --- packages/packages.json | 12 +++++----- packages/valory/agents/trader/aea-config.yaml | 6 ++--- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../skills/decision_maker_abci/skill.yaml | 2 +- .../tests/states/test_final_states.py | 22 +++++++++---------- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 874ccd69b..66f38413e 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi", - "skill/valory/trader_abci/0.1.0": "bafybeiaegkhxufkbozkwzjsnn457jbvupyv6zbbfjz3xsrexzuxim6hgjq", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i", + "skill/valory/decision_maker_abci/0.1.0": "bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4", + "skill/valory/trader_abci/0.1.0": "bafybeifml66724rf3urzncht7bbtqcmlutfav2o6ubtpwzericcxdtsrey", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a", - "service/valory/trader/0.1.0": "bafybeibrczzukidpwyhwvjdx54ftjvff3camw2gsyewi3ofi6xsmqcmefy", - "service/valory/trader_pearl/0.1.0": "bafybeiepficgdfn5eomzlrlxjubys5ltv4r7uyg5cvfxud4b2a77bymmxq" + "agent/valory/trader/0.1.0": "bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui", + "service/valory/trader/0.1.0": "bafybeifnifkblkazery3wqwjy2x5ellu5vmsgmzqnjsg4gmxisxbujb6bm", + "service/valory/trader_pearl/0.1.0": "bafybeifnhqmpve47yuh2pzf6b3ozn5mazjtxo44ooufhtkwiozryzw4mxi" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index d10be6d29..98fd65b88 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi -- valory/trader_abci:0.1.0:bafybeiaegkhxufkbozkwzjsnn457jbvupyv6zbbfjz3xsrexzuxim6hgjq +- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 +- valory/trader_abci:0.1.0:bafybeifml66724rf3urzncht7bbtqcmlutfav2o6ubtpwzericcxdtsrey - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index 399c76349..e8b7ff14f 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a +agent: valory/trader:0.1.0:bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 5c0054e6e..1ce9d77a0 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeiadbhpnjj5ybtvwjr3skycnhlc3y63adi3qflj3us4pko3m656b4a +agent: valory/trader:0.1.0:bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index ad057d355..987192195 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -66,7 +66,7 @@ fingerprint: tests/states/test_claim_subscription.py: bafybeiclkxjhceb3ehgmg6klt4uywew5drk5b3w6no7mwxetpubxqrejfy tests/states/test_decision_receive.py: bafybeifj7rwqyzfcvnqqhbo25pl2jppgjqnqldadwku5wl2tpskfj2zwxq tests/states/test_decision_request.py: bafybeigqbakm2olkwvcngertjplhnmu6on6tp6hxn7lxygi2gf5a5eurbe - tests/states/test_final_states.py: bafybeifhrq2tjoflhsso2lmexazpslmf6tnhm4jlvwxuxna5l7zunhtuvm + tests/states/test_final_states.py: bafybeiftfd3ovaqpfe7t5ry7maiziavk74wl66d6zo6ikhgodznormd2nm tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq tests/states/test_order_subscription.py: bafybeidbpiscaubrinylzqx53qimr62uy6wwclcbqvauyqt2xr3inubgxa tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py index 38dc05bf3..60e26a15b 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_final_states.py @@ -20,7 +20,7 @@ """This package contains the tests for Decision Maker""" -from typing import Any, Dict, List +from typing import Any, Dict, List, Tuple import pytest @@ -62,7 +62,7 @@ class TestFinalStates: """The class for test of Final States""" @pytest.fixture - def setup_round(self) -> tuple[MockSynchronizedData, MockContext]: + def setup_round(self) -> Tuple[MockSynchronizedData, MockContext]: """Fixture to set up a round instance.""" setup_data: Dict[str, List[Any]] = {} mock_db = AbciAppDB(setup_data) @@ -71,7 +71,7 @@ def setup_round(self) -> tuple[MockSynchronizedData, MockContext]: return synchronized_data, context def test_benchmarking_mode_disabled_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of BenchmarkingModeDisabledRound.""" synchronized_data, context = setup_round @@ -82,7 +82,7 @@ def test_benchmarking_mode_disabled_round( assert isinstance(round_instance, DegenerateRound) def test_finished_decision_maker_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of FinishedDecisionMakerRound.""" synchronized_data, context = setup_round @@ -93,7 +93,7 @@ def test_finished_decision_maker_round( assert isinstance(round_instance, DegenerateRound) def test_finished_decision_request_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of FinishedDecisionRequestRound.""" synchronized_data, context = setup_round @@ -104,7 +104,7 @@ def test_finished_decision_request_round( assert isinstance(round_instance, DegenerateRound) def test_finished_subscription_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of FinishedSubscriptionRound.""" synchronized_data, context = setup_round @@ -115,7 +115,7 @@ def test_finished_subscription_round( assert isinstance(round_instance, DegenerateRound) def test_finished_without_redeeming_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of FinishedWithoutRedeemingRound.""" synchronized_data, context = setup_round @@ -126,7 +126,7 @@ def test_finished_without_redeeming_round( assert isinstance(round_instance, DegenerateRound) def test_finished_without_decision_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of FinishedWithoutDecisionRound.""" synchronized_data, context = setup_round @@ -137,7 +137,7 @@ def test_finished_without_decision_round( assert isinstance(round_instance, DegenerateRound) def test_refill_required_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of RefillRequiredRound.""" synchronized_data, context = setup_round @@ -148,7 +148,7 @@ def test_refill_required_round( assert isinstance(round_instance, DegenerateRound) def test_benchmarking_done_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of BenchmarkingDoneRound and its end_block method.""" synchronized_data, context = setup_round @@ -163,7 +163,7 @@ def test_benchmarking_done_round( round_instance.end_block() # Should exit the program def test_impossible_round( - self, setup_round: tuple[MockSynchronizedData, MockContext] + self, setup_round: Tuple[MockSynchronizedData, MockContext] ) -> None: """Test instantiation of ImpossibleRound.""" synchronized_data, context = setup_round diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 25738b320..d71cccb72 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeihfbugxhskq2pvek4ayif27737c27u7vx4ggkabup2jseehlsow4i +- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index f1adb8856..13ee728a6 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeicvzfu5sjizyzeq6ah6yahof4w6uxbuj3ft6zhr743a6ujva567pi +- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From b2ec6eae8251a0d43d70b9b7587837f876042e75 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Tue, 29 Oct 2024 12:07:55 +0530 Subject: [PATCH 29/34] fix:coverage --- packages/packages.json | 12 +++++----- packages/valory/agents/trader/aea-config.yaml | 6 ++--- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../skills/decision_maker_abci/skill.yaml | 4 ++-- .../tests/states/test_base.py | 23 +++++++++++++++++++ .../tests/states/test_order_subscription.py | 2 -- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 9 files changed, 39 insertions(+), 18 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 66f38413e..250d9d118 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4", - "skill/valory/trader_abci/0.1.0": "bafybeifml66724rf3urzncht7bbtqcmlutfav2o6ubtpwzericcxdtsrey", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q", + "skill/valory/decision_maker_abci/0.1.0": "bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by", + "skill/valory/trader_abci/0.1.0": "bafybeibtyp6hs2wt2hlwomnjiw666gdpvpmysaueyll2xfpexi6gn7xiey", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui", - "service/valory/trader/0.1.0": "bafybeifnifkblkazery3wqwjy2x5ellu5vmsgmzqnjsg4gmxisxbujb6bm", - "service/valory/trader_pearl/0.1.0": "bafybeifnhqmpve47yuh2pzf6b3ozn5mazjtxo44ooufhtkwiozryzw4mxi" + "agent/valory/trader/0.1.0": "bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm", + "service/valory/trader/0.1.0": "bafybeigpy75hxaflexpz3coarfwntqgzq3ct63cgz2u5omxp4ufbppxvty", + "service/valory/trader_pearl/0.1.0": "bafybeibqlq24xp7re5fzc3gyoui2eupecx7ey6ayw5pdmedtipyggz6jza" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 98fd65b88..944fd4bfe 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 -- valory/trader_abci:0.1.0:bafybeifml66724rf3urzncht7bbtqcmlutfav2o6ubtpwzericcxdtsrey +- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by +- valory/trader_abci:0.1.0:bafybeibtyp6hs2wt2hlwomnjiw666gdpvpmysaueyll2xfpexi6gn7xiey - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index e8b7ff14f..bd4d9a87f 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui +agent: valory/trader:0.1.0:bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 1ce9d77a0..ce9599a1c 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifeby37iafnslq3coigq5e6kfxpsnvzbcpxqkayxjmpco2bssc7ui +agent: valory/trader:0.1.0:bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 987192195..d6e0c5360 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -59,7 +59,7 @@ fingerprint: tests/behaviours/dummy_strategy/dummy_strategy.py: bafybeig5e3xfr7gxsakfj4stbxqcwdiljl7klvgahkuwe3obzxgkg3qt2e tests/behaviours/test_base.py: bafybeif6pglmr7pvojylatfzaxtlk65igx6a2omyrbxfihnnft6o7p75p4 tests/conftest.py: bafybeidy5hw56kw5mxudnfbhvogofn6k4rqb4ux2bd45baedrrhmgyrude - tests/states/test_base.py: bafybeicugggb42gtrtgotsov4uzszzefa73mks64tyi3ct3qjvjhpn6rpm + tests/states/test_base.py: bafybeigiuctxda3npkbvx7nsq4jvqpckvbzgqlj76hdpk2ntc52ppc4vnm tests/states/test_bet_placement.py: bafybeibvc37n2cluep4tasvgmvwxwne2deais6ptirducpogk67v4gj4ga tests/states/test_blacklising.py: bafybeihm2ex6l7fhorgi3mjj2epztu2r7bqbg56unpgpzfzymghshchqzy tests/states/test_check_benchmarking.py: bafybeifwpi5f4fhreqptfxdsnyv3nptkqytkwbukfuqkrjo4eww7cv3sxy @@ -68,7 +68,7 @@ fingerprint: tests/states/test_decision_request.py: bafybeigqbakm2olkwvcngertjplhnmu6on6tp6hxn7lxygi2gf5a5eurbe tests/states/test_final_states.py: bafybeiftfd3ovaqpfe7t5ry7maiziavk74wl66d6zo6ikhgodznormd2nm tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq - tests/states/test_order_subscription.py: bafybeidbpiscaubrinylzqx53qimr62uy6wwclcbqvauyqt2xr3inubgxa + tests/states/test_order_subscription.py: bafybeiag37uk5mitjm4yadcpr67icfmmzeucdlgvqoct4y4jeyhnebyyoi tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey tests/states/test_redeem.py: bafybeieynxnxbnhptv5nxnps444cqtqblvjautglujheafce76sxotooja tests/states/test_sampling.py: bafybeibyglipxdl6f25qfxf36v2n3kckrpmwyuqcenfeqzhjujpwon6o2u diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py index e7dcb5009..805fa8ca9 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_base.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_base.py @@ -208,6 +208,29 @@ def test_weighted_accuracy(sync_data: SynchronizedData, mocked_db: MagicMock) -> assert sync_data.weighted_accuracy == policy.weighted_accuracy[selected_mech_tool] +def test_mech_responses(sync_data: SynchronizedData, mocked_db: MagicMock) -> None: + """Test the mech_responses property.""" + + # Mock the response with empty dictionaries to avoid field mismatches + mocked_db.get.return_value = "[{}, {}]" + + # Access the mech_responses property + responses = sync_data.mech_responses + + # Validate the responses length + assert len(responses) == 2 + + # Test when db.get() returns None + mocked_db.get.return_value = None + responses = sync_data.mech_responses + assert responses == [] + + # Test when db.get() returns an empty list + mocked_db.get.return_value = "[]" + responses = sync_data.mech_responses + assert responses == [] + + def test_end_block(mocked_db: MagicMock) -> None: """Test the end_block logic in TxPreparationRound.""" mocked_sync_data = MagicMock(spec=SynchronizedData) diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py index 2db87cd03..c38866057 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_order_subscription.py @@ -149,8 +149,6 @@ def test_end_block_updates_sync_data( # Assert that the agreement_id was updated to the new_agreement_id assert getattr(sync_data, "agreement_id", None) == "new_agreement_id" assert event is not None - else: - raise AssertionError("end_block result should not be None") def test_no_update_when_threshold_not_reached( diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index d71cccb72..d5615332d 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeib7j6mhw6r57y5jgcpkzuadzt5yobz2osn6osindfbrfxrc6bvd2q +- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 13ee728a6..ec872dd6f 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeifelibdufct53s3bjpkpoix4u4z6c3aprhnw2pixmbqnnfk7faoe4 +- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From 6a03794ff14ddc3e3af1f26d088822599a994b98 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Wed, 30 Oct 2024 11:44:54 +0530 Subject: [PATCH 30/34] fix:coverage --- packages/packages.json | 12 ++--- packages/valory/agents/trader/aea-config.yaml | 6 +-- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../skills/decision_maker_abci/skill.yaml | 2 +- .../tests/states/test_redeem.py | 52 +++++++++++-------- packages/valory/skills/trader_abci/skill.yaml | 4 +- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 44 insertions(+), 38 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 250d9d118..0b57ea4cb 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by", - "skill/valory/trader_abci/0.1.0": "bafybeibtyp6hs2wt2hlwomnjiw666gdpvpmysaueyll2xfpexi6gn7xiey", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re", + "skill/valory/decision_maker_abci/0.1.0": "bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu", + "skill/valory/trader_abci/0.1.0": "bafybeichutlyil32oyg4eikgnj3m75juzokzd4akrsa2jimdcnrkfsrh5a", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm", - "service/valory/trader/0.1.0": "bafybeigpy75hxaflexpz3coarfwntqgzq3ct63cgz2u5omxp4ufbppxvty", - "service/valory/trader_pearl/0.1.0": "bafybeibqlq24xp7re5fzc3gyoui2eupecx7ey6ayw5pdmedtipyggz6jza" + "agent/valory/trader/0.1.0": "bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m", + "service/valory/trader/0.1.0": "bafybeietn6exvc67r2czew24xmmhueyq6pcitklbeyxsvs34ony2qngbhq", + "service/valory/trader_pearl/0.1.0": "bafybeibnzmxlbz6jiycuvealzqcebd4vo6ubcde3qtyexhurx44zjfrz5y" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 944fd4bfe..88b78ea92 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by -- valory/trader_abci:0.1.0:bafybeibtyp6hs2wt2hlwomnjiw666gdpvpmysaueyll2xfpexi6gn7xiey +- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu +- valory/trader_abci:0.1.0:bafybeichutlyil32oyg4eikgnj3m75juzokzd4akrsa2jimdcnrkfsrh5a - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index bd4d9a87f..4738cd885 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm +agent: valory/trader:0.1.0:bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index ce9599a1c..37bf8e5af 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeieuj6722jqqmedf65w72ptndkngnw4734a7dwrth47pr2vw44aegm +agent: valory/trader:0.1.0:bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index d6e0c5360..36a591807 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -70,7 +70,7 @@ fingerprint: tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq tests/states/test_order_subscription.py: bafybeiag37uk5mitjm4yadcpr67icfmmzeucdlgvqoct4y4jeyhnebyyoi tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey - tests/states/test_redeem.py: bafybeieynxnxbnhptv5nxnps444cqtqblvjautglujheafce76sxotooja + tests/states/test_redeem.py: bafybeicecyfe725pot6fduotlc25fivqskswf7rzu366ipcco4kuwxyrqu tests/states/test_sampling.py: bafybeibyglipxdl6f25qfxf36v2n3kckrpmwyuqcenfeqzhjujpwon6o2u tests/states/test_tool_selection.py: bafybeib7js3dj7647t33o5ybfqftwytxktwrvhbri5yuyymg6znj6y7xxa tests/test_dialogues.py: bafybeibulo64tgfrq4e5qbcqnmifrlehkqciwuavublints353zaj2mlpa diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index ea57df4dd..63ed81c03 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -17,7 +17,7 @@ # # ------------------------------------------------------------------------------ -"""Tests for RedeemRound class.""" +"""Test for Redeem round""" from typing import Any, Dict, Optional from unittest.mock import PropertyMock, patch @@ -104,40 +104,46 @@ def test_selection_key(self, setup_redeem_round: RedeemRound) -> None: assert isinstance(redeem_round.selection_key, tuple) assert all(isinstance(key, str) for key in redeem_round.selection_key) - def test_end_block_no_update(self, setup_redeem_round: RedeemRound) -> None: - """Test end block without update.""" + @pytest.mark.parametrize( + "period_count, expected_confirmations, expected_event", + [ + (0, 1, Event.NO_MAJORITY), # Test without update + (1, 0, Event.NO_MAJORITY), # Test with update + ], + ) + def test_end_block_update_behavior( + self, + setup_redeem_round: RedeemRound, + period_count: int, + expected_confirmations: int, + expected_event: Event, + ) -> None: + """Test end_block behavior based on period_count.""" redeem_round = setup_redeem_round - # Mock the period_count property using patch.object with patch.object( MockSynchronizedData, "period_count", new_callable=PropertyMock ) as mock_period_count: - mock_period_count.return_value = 0 + mock_period_count.return_value = period_count result = redeem_round.end_block() if result is None: - assert redeem_round.block_confirmations == 1 + # Case where no update occurs + assert redeem_round.block_confirmations == expected_confirmations else: + # Case where update occurs synchronized_data, event = result assert isinstance(synchronized_data, MockSynchronizedData) - assert event == Event.NO_MAJORITY + assert event == expected_event - def test_end_block_update(self, setup_redeem_round: RedeemRound) -> None: - """Test end block with update.""" + def test_most_voted_payload_values(self, setup_redeem_round: RedeemRound) -> None: + """Test most_voted_payload_values property.""" redeem_round = setup_redeem_round - - # Mock the period_count property using patch.object + # Mock `most_voted_payload_values` to return the expected result with patch.object( - MockSynchronizedData, "period_count", new_callable=PropertyMock - ) as mock_period_count: - mock_period_count.return_value = 1 - - result = redeem_round.end_block() - - if result is None: - assert redeem_round.block_confirmations == 0 - else: - synchronized_data, event = result - assert isinstance(synchronized_data, MockSynchronizedData) - assert event == Event.NO_MAJORITY + RedeemRound, "most_voted_payload_values", new_callable=PropertyMock + ) as mock_values: + mock_values.return_value = (None,) + values = redeem_round.most_voted_payload_values + assert values == (None,) diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index d5615332d..af3e710f5 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeiaitvuq7f7hbbijwrptql33bijsypxfkzaogvz3r23tytjjw5d4re +- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index ec872dd6f..8072d9897 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeig3ccltfncuqtrnnus62hnpounv7j4ksjboyx3jlmmkn2d47fb2by +- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From 97e2f30a70d7fe685544bcff7b4808b8b9feca95 Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Wed, 30 Oct 2024 14:17:40 +0530 Subject: [PATCH 31/34] fix:coverage --- packages/packages.json | 12 +++++----- packages/valory/agents/trader/aea-config.yaml | 6 ++--- packages/valory/services/trader/service.yaml | 2 +- .../valory/services/trader_pearl/service.yaml | 2 +- .../skills/decision_maker_abci/skill.yaml | 2 +- .../tests/states/test_redeem.py | 23 +++++++++++++++++++ packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 38 insertions(+), 15 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 0b57ea4cb..3501113f3 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu", - "skill/valory/trader_abci/0.1.0": "bafybeichutlyil32oyg4eikgnj3m75juzokzd4akrsa2jimdcnrkfsrh5a", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu", + "skill/valory/decision_maker_abci/0.1.0": "bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu", + "skill/valory/trader_abci/0.1.0": "bafybeibe5gps5xpoylxmgx2cqeoez7aofgjjm3zvtooezpmnk552fxa6ju", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m", - "service/valory/trader/0.1.0": "bafybeietn6exvc67r2czew24xmmhueyq6pcitklbeyxsvs34ony2qngbhq", - "service/valory/trader_pearl/0.1.0": "bafybeibnzmxlbz6jiycuvealzqcebd4vo6ubcde3qtyexhurx44zjfrz5y" + "agent/valory/trader/0.1.0": "bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4", + "service/valory/trader/0.1.0": "bafybeida6msvvggzc3zriy7hfxovlsksfvho3zrxcsbywbyvknokvruo2u", + "service/valory/trader_pearl/0.1.0": "bafybeic7d6znc6w35zvuafi2ip6bxr5zvzvk7tbdovrpk6v2gzrsrev6iq" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 88b78ea92..29ca3ad77 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4 - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu -- valory/trader_abci:0.1.0:bafybeichutlyil32oyg4eikgnj3m75juzokzd4akrsa2jimdcnrkfsrh5a +- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu +- valory/trader_abci:0.1.0:bafybeibe5gps5xpoylxmgx2cqeoez7aofgjjm3zvtooezpmnk552fxa6ju - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index 4738cd885..a9d28ae5c 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m +agent: valory/trader:0.1.0:bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4 number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 37bf8e5af..d778379e1 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeibn2clpyaupcnjc5lzmjfofs6pkm7lrhztlwqgh2fcha5tqrhgl2m +agent: valory/trader:0.1.0:bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4 number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 36a591807..315ab4d51 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -70,7 +70,7 @@ fingerprint: tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq tests/states/test_order_subscription.py: bafybeiag37uk5mitjm4yadcpr67icfmmzeucdlgvqoct4y4jeyhnebyyoi tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey - tests/states/test_redeem.py: bafybeicecyfe725pot6fduotlc25fivqskswf7rzu366ipcco4kuwxyrqu + tests/states/test_redeem.py: bafybeigjh5mwgeimkbsaudzkjczvwhvfunhta3s4j65w2vco3floyg5p4q tests/states/test_sampling.py: bafybeibyglipxdl6f25qfxf36v2n3kckrpmwyuqcenfeqzhjujpwon6o2u tests/states/test_tool_selection.py: bafybeib7js3dj7647t33o5ybfqftwytxktwrvhbri5yuyymg6znj6y7xxa tests/test_dialogues.py: bafybeibulo64tgfrq4e5qbcqnmifrlehkqciwuavublints353zaj2mlpa diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index 63ed81c03..f7b939af5 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -104,6 +104,13 @@ def test_selection_key(self, setup_redeem_round: RedeemRound) -> None: assert isinstance(redeem_round.selection_key, tuple) assert all(isinstance(key, str) for key in redeem_round.selection_key) + def test_selection_key_contains_mech_tools_name( + self, setup_redeem_round: RedeemRound + ) -> None: + """Test that mech_tools_name is part of the selection key.""" + redeem_round = setup_redeem_round + assert RedeemRound.mech_tools_name in redeem_round.selection_key + @pytest.mark.parametrize( "period_count, expected_confirmations, expected_event", [ @@ -147,3 +154,19 @@ def test_most_voted_payload_values(self, setup_redeem_round: RedeemRound) -> Non mock_values.return_value = (None,) values = redeem_round.most_voted_payload_values assert values == (None,) + + def test_most_voted_payload_dict_processing( + self, setup_redeem_round: RedeemRound + ) -> None: + """Test processing of most_voted_payload_dict in most_voted_payload_values.""" + redeem_round = setup_redeem_round + # Mock `most_voted_payload_values` to simulate dictionary processing in the property + with patch.object( + RedeemRound, "most_voted_payload_values", new_callable=PropertyMock + ) as mock_values: + mock_values.return_value = ("tool_data",) + try: + values = redeem_round.most_voted_payload_values + assert values is not None # Ensure it executes without error + except ValueError as e: + assert str(e) == "`mech_tools` must not be `None`" diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index af3e710f5..53c707d86 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeibnuqo3pvhsjyam52ubkvtct6yhextyok55nzowtippf44e3az6vu +- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4 - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 8072d9897..80a2ffafd 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeibtbncq5rbu2tm4sptnxosjeioowiyvhcw5al25adlwpqyd627utu +- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From d32b1b7acba706d54823fdf6e2131d693cdec99b Mon Sep 17 00:00:00 2001 From: Ravleen-Solulab Date: Wed, 30 Oct 2024 15:15:36 +0530 Subject: [PATCH 32/34] fix:coverage --- packages/packages.json | 12 ++++++------ packages/valory/agents/trader/aea-config.yaml | 6 +++--- packages/valory/services/trader/service.yaml | 2 +- packages/valory/services/trader_pearl/service.yaml | 2 +- .../valory/skills/decision_maker_abci/skill.yaml | 2 +- .../decision_maker_abci/tests/states/test_redeem.py | 8 +++----- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../skills/tx_settlement_multiplexer_abci/skill.yaml | 2 +- 8 files changed, 18 insertions(+), 20 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 3501113f3..690995a27 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeigwsffbzx62d3ikz5kyjsewcvknrrnq3bcqgktnbrcpz4g6lyu3eq", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu", - "skill/valory/trader_abci/0.1.0": "bafybeibe5gps5xpoylxmgx2cqeoez7aofgjjm3zvtooezpmnk552fxa6ju", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4", + "skill/valory/decision_maker_abci/0.1.0": "bafybeieiirxdargwwxijlbppaxbyicwxy74pimygky33mlgfhza2evg5z4", + "skill/valory/trader_abci/0.1.0": "bafybeiezrlmldfgzydiobsouvbsa4mzxqnoczajol3kkojpsimqxlhzmxy", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeieorw4vqzt2cfbognhl4hw6p7xbhkm663cbtzx63ad7hxk2sgetdi", "skill/valory/staking_abci/0.1.0": "bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta", - "agent/valory/trader/0.1.0": "bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4", - "service/valory/trader/0.1.0": "bafybeida6msvvggzc3zriy7hfxovlsksfvho3zrxcsbywbyvknokvruo2u", - "service/valory/trader_pearl/0.1.0": "bafybeic7d6znc6w35zvuafi2ip6bxr5zvzvk7tbdovrpk6v2gzrsrev6iq" + "agent/valory/trader/0.1.0": "bafybeifzx5krlqx2argnrrc2zajf7hwr5hkizhtblcgul4yfa2crmqhbye", + "service/valory/trader/0.1.0": "bafybeift3rzuz3ldjevjg6bmq3okhjwkgheuncsxibtuzpka2seckj7wnu", + "service/valory/trader_pearl/0.1.0": "bafybeihopf5nxerudlogzii7pg2grbdvquon646jyjctrthtah4olzsuzm" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index 29ca3ad77..ebc71d8a2 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,10 +45,10 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4 +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeieorw4vqzt2cfbognhl4hw6p7xbhkm663cbtzx63ad7hxk2sgetdi - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu -- valory/trader_abci:0.1.0:bafybeibe5gps5xpoylxmgx2cqeoez7aofgjjm3zvtooezpmnk552fxa6ju +- valory/decision_maker_abci:0.1.0:bafybeieiirxdargwwxijlbppaxbyicwxy74pimygky33mlgfhza2evg5z4 +- valory/trader_abci:0.1.0:bafybeiezrlmldfgzydiobsouvbsa4mzxqnoczajol3kkojpsimqxlhzmxy - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index a9d28ae5c..24b6e273c 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4 +agent: valory/trader:0.1.0:bafybeifzx5krlqx2argnrrc2zajf7hwr5hkizhtblcgul4yfa2crmqhbye number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index d778379e1..720692133 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeiah5atu3nqpgvdukketme5izifdtxpix53adzjvslf2vhiqdo72u4 +agent: valory/trader:0.1.0:bafybeifzx5krlqx2argnrrc2zajf7hwr5hkizhtblcgul4yfa2crmqhbye number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/decision_maker_abci/skill.yaml b/packages/valory/skills/decision_maker_abci/skill.yaml index 315ab4d51..0b801bc3a 100644 --- a/packages/valory/skills/decision_maker_abci/skill.yaml +++ b/packages/valory/skills/decision_maker_abci/skill.yaml @@ -70,7 +70,7 @@ fingerprint: tests/states/test_handle_failed_tx.py: bafybeibuepj6fko7ba3bef6nybzetilni2iwgkxd5xeazqskadbad3l2zq tests/states/test_order_subscription.py: bafybeiag37uk5mitjm4yadcpr67icfmmzeucdlgvqoct4y4jeyhnebyyoi tests/states/test_randomness.py: bafybeib3eqjv6mhlprzda7d4viddn5alrfqteq6juyg3ccejseoywcsbey - tests/states/test_redeem.py: bafybeigjh5mwgeimkbsaudzkjczvwhvfunhta3s4j65w2vco3floyg5p4q + tests/states/test_redeem.py: bafybeiezdnfrxukb2xpwffrr357g2anmdkwy7wo3nphvlggipq5xrdzr7a tests/states/test_sampling.py: bafybeibyglipxdl6f25qfxf36v2n3kckrpmwyuqcenfeqzhjujpwon6o2u tests/states/test_tool_selection.py: bafybeib7js3dj7647t33o5ybfqftwytxktwrvhbri5yuyymg6znj6y7xxa tests/test_dialogues.py: bafybeibulo64tgfrq4e5qbcqnmifrlehkqciwuavublints353zaj2mlpa diff --git a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py index f7b939af5..a35c9c084 100644 --- a/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py +++ b/packages/valory/skills/decision_maker_abci/tests/states/test_redeem.py @@ -165,8 +165,6 @@ def test_most_voted_payload_dict_processing( RedeemRound, "most_voted_payload_values", new_callable=PropertyMock ) as mock_values: mock_values.return_value = ("tool_data",) - try: - values = redeem_round.most_voted_payload_values - assert values is not None # Ensure it executes without error - except ValueError as e: - assert str(e) == "`mech_tools` must not be `None`" + + values = redeem_round.most_voted_payload_values + assert values is not None # Ensure it executes without error diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 53c707d86..b323dc758 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeicpy66wg2ufs5bb32gxjfo3n3sagn4xrpheecth7rioyzn6ymgdx4 +- valory/decision_maker_abci:0.1.0:bafybeieiirxdargwwxijlbppaxbyicwxy74pimygky33mlgfhza2evg5z4 +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeieorw4vqzt2cfbognhl4hw6p7xbhkm663cbtzx63ad7hxk2sgetdi - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 80a2ffafd..0a0bea3e0 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeih35osdtvheiynribdqm2na6wzi23rnikrknixl244ehdwus4j2uu +- valory/decision_maker_abci:0.1.0:bafybeieiirxdargwwxijlbppaxbyicwxy74pimygky33mlgfhza2evg5z4 - valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: From 253b6c336b7e3446aa33e5d909bc7684c9ca1b31 Mon Sep 17 00:00:00 2001 From: Adamantios Date: Fri, 15 Nov 2024 17:04:12 +0200 Subject: [PATCH 33/34] fix: `gitleaks` command https://github.com/valory-xyz/trader/pull/328#discussion_r1840428359 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b58f51f71..b507e4be3 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ code-checks: .PHONY: security security: tomte check-security - /home/abc/work/gitleaks detect --report-format json --report-path leak_report + gitleaks detect --report-format json --report-path leak_report # generate abci docstrings # update copyright headers From ea766ab4305ee916f77bca7c1be2d01945e3a0d6 Mon Sep 17 00:00:00 2001 From: Adamantios Date: Fri, 15 Nov 2024 17:05:42 +0200 Subject: [PATCH 34/34] chore: run generators --- packages/packages.json | 12 ++++++------ packages/valory/agents/trader/aea-config.yaml | 10 +++++----- packages/valory/services/trader/service.yaml | 2 +- packages/valory/services/trader_pearl/service.yaml | 2 +- packages/valory/skills/trader_abci/skill.yaml | 4 ++-- .../skills/tx_settlement_multiplexer_abci/skill.yaml | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/packages.json b/packages/packages.json index 5f4a31cb4..a189b2c53 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -16,14 +16,14 @@ "contract/valory/staking_token/0.1.0": "bafybeiep4r6qyilbfgzdvx6t7zvpgaioxqktmxm7puwtnbpb2ftlib43gy", "contract/valory/relayer/0.1.0": "bafybeicawmds6czx7db2lcktvexwrp245jpekgulndtos5s5zdid3ilvq4", "skill/valory/market_manager_abci/0.1.0": "bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka", - "skill/valory/decision_maker_abci/0.1.0": "bafybeiaizbnlz46lba6tcwmajpo2z37cpxuobeqmlgdqbdxnt65jr6rely", - "skill/valory/trader_abci/0.1.0": "bafybeido4dpfcvpyrobs2veoliuwaz2ltuzvo2gqfbsqxgd5tdr7zllyru", - "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeieszb6lxyy5gt4m4f75fjicuzf3ewsxgxcc5dh4l2tjjau7wcrgxe", + "skill/valory/decision_maker_abci/0.1.0": "bafybeia5qzqac2g444myog3tlwagthcknmanqunnytbjfsuk2msep2rnna", + "skill/valory/trader_abci/0.1.0": "bafybeigz6mm7xzhe334iuyy6nw4tdymxfjp6fp37firbzznxg7mowtvcoe", + "skill/valory/tx_settlement_multiplexer_abci/0.1.0": "bafybeigt42cdisy2z53u5pqq3qmjk5bb32cm5oegftptv56m7yq5dbdoyi", "skill/valory/staking_abci/0.1.0": "bafybeictd5pxhscuhqntvctb7l5lfjausxt2m22rg5mkaiuj4cwwcxpvne", "skill/valory/check_stop_trading_abci/0.1.0": "bafybeifmi64g4ki6zwbcncb35ovhd4sllw4xrszrkturpeqdhgf5bkiini", - "agent/valory/trader/0.1.0": "bafybeifaw3dk5uklcgj5iftcdhj4p2ymkidoli3uxibq4olddd3eboey7e", - "service/valory/trader/0.1.0": "bafybeiaqqlwqjiofrezpnk4hq6doiccbquzgmd6pcgtfx7akmfhhvyoipi", - "service/valory/trader_pearl/0.1.0": "bafybeidzv544ive2oozjk2szmengrcszea7ai54qts7ehdjdkwevwtwfba" + "agent/valory/trader/0.1.0": "bafybeidcn54f67yhqaa7aycsmurm4tvmx2dj2e2zir6keft3ubxchcu6hu", + "service/valory/trader/0.1.0": "bafybeig6jsofnzrst72r3qannxrpbrbfd7c4nvdcvacsplcx7gnyroqeuu", + "service/valory/trader_pearl/0.1.0": "bafybeih456qaxmfhx7bhhk2wdzjq4s3mbxmkfdveyucgwdh7ilqio4ruvm" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", diff --git a/packages/valory/agents/trader/aea-config.yaml b/packages/valory/agents/trader/aea-config.yaml index ebc71d8a2..c8a825ac6 100644 --- a/packages/valory/agents/trader/aea-config.yaml +++ b/packages/valory/agents/trader/aea-config.yaml @@ -45,12 +45,12 @@ skills: - valory/reset_pause_abci:0.1.0:bafybeigrdlxed3xlsnxtjhnsbl3cojruihxcqx4jxhgivkd5i2fkjncgba - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeieorw4vqzt2cfbognhl4hw6p7xbhkm663cbtzx63ad7hxk2sgetdi +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeigt42cdisy2z53u5pqq3qmjk5bb32cm5oegftptv56m7yq5dbdoyi - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeieiirxdargwwxijlbppaxbyicwxy74pimygky33mlgfhza2evg5z4 -- valory/trader_abci:0.1.0:bafybeiezrlmldfgzydiobsouvbsa4mzxqnoczajol3kkojpsimqxlhzmxy -- valory/staking_abci:0.1.0:bafybeifyqszbiccxwwfldrl6lz5dspuaxbqd5qnniyecusddwvxpfwiyr4 -- valory/check_stop_trading_abci:0.1.0:bafybeicsrrxjs6bup267jiek3r7eutd42ssfyjthyvxfku6qozw3xebxta +- valory/decision_maker_abci:0.1.0:bafybeia5qzqac2g444myog3tlwagthcknmanqunnytbjfsuk2msep2rnna +- valory/trader_abci:0.1.0:bafybeigz6mm7xzhe334iuyy6nw4tdymxfjp6fp37firbzznxg7mowtvcoe +- valory/staking_abci:0.1.0:bafybeictd5pxhscuhqntvctb7l5lfjausxt2m22rg5mkaiuj4cwwcxpvne +- valory/check_stop_trading_abci:0.1.0:bafybeifmi64g4ki6zwbcncb35ovhd4sllw4xrszrkturpeqdhgf5bkiini - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm customs: - valory/mike_strat:0.1.0:bafybeihjiol7f4ch4piwfikurdtfwzsh6qydkbsztpbwbwb2yrqdqf726m diff --git a/packages/valory/services/trader/service.yaml b/packages/valory/services/trader/service.yaml index 07147e807..65e2e8469 100644 --- a/packages/valory/services/trader/service.yaml +++ b/packages/valory/services/trader/service.yaml @@ -7,7 +7,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeigtuothskwyvrhfosps2bu6suauycolj67dpuxqvnicdrdu7yhtvq fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifaw3dk5uklcgj5iftcdhj4p2ymkidoli3uxibq4olddd3eboey7e +agent: valory/trader:0.1.0:bafybeidcn54f67yhqaa7aycsmurm4tvmx2dj2e2zir6keft3ubxchcu6hu number_of_agents: 4 deployment: agent: diff --git a/packages/valory/services/trader_pearl/service.yaml b/packages/valory/services/trader_pearl/service.yaml index 25724b125..5070c343b 100644 --- a/packages/valory/services/trader_pearl/service.yaml +++ b/packages/valory/services/trader_pearl/service.yaml @@ -8,7 +8,7 @@ license: Apache-2.0 fingerprint: README.md: bafybeibg7bdqpioh4lmvknw3ygnllfku32oca4eq5pqtvdrdsgw6buko7e fingerprint_ignore_patterns: [] -agent: valory/trader:0.1.0:bafybeifaw3dk5uklcgj5iftcdhj4p2ymkidoli3uxibq4olddd3eboey7e +agent: valory/trader:0.1.0:bafybeidcn54f67yhqaa7aycsmurm4tvmx2dj2e2zir6keft3ubxchcu6hu number_of_agents: 1 deployment: agent: diff --git a/packages/valory/skills/trader_abci/skill.yaml b/packages/valory/skills/trader_abci/skill.yaml index 5ed561810..d2bbf916f 100644 --- a/packages/valory/skills/trader_abci/skill.yaml +++ b/packages/valory/skills/trader_abci/skill.yaml @@ -27,8 +27,8 @@ skills: - valory/transaction_settlement_abci:0.1.0:bafybeic7q7recyka272udwcupblwbkc3jkodgp74fvcdxb7urametg5dae - valory/termination_abci:0.1.0:bafybeib5l7jhew5ic6iq24dd23nidcoimzqkrk556gqywhoziatj33zvwm - valory/market_manager_abci:0.1.0:bafybeicia7itulcrxlwbmhfzxppgo5i33tb2nmcycwizftw7gps4dareka -- valory/decision_maker_abci:0.1.0:bafybeiaizbnlz46lba6tcwmajpo2z37cpxuobeqmlgdqbdxnt65jr6rely -- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeieszb6lxyy5gt4m4f75fjicuzf3ewsxgxcc5dh4l2tjjau7wcrgxe +- valory/decision_maker_abci:0.1.0:bafybeia5qzqac2g444myog3tlwagthcknmanqunnytbjfsuk2msep2rnna +- valory/tx_settlement_multiplexer_abci:0.1.0:bafybeigt42cdisy2z53u5pqq3qmjk5bb32cm5oegftptv56m7yq5dbdoyi - valory/staking_abci:0.1.0:bafybeictd5pxhscuhqntvctb7l5lfjausxt2m22rg5mkaiuj4cwwcxpvne - valory/check_stop_trading_abci:0.1.0:bafybeifmi64g4ki6zwbcncb35ovhd4sllw4xrszrkturpeqdhgf5bkiini - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm diff --git a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml index 717fed925..285b700cc 100644 --- a/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml +++ b/packages/valory/skills/tx_settlement_multiplexer_abci/skill.yaml @@ -23,7 +23,7 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni skills: - valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u -- valory/decision_maker_abci:0.1.0:bafybeiaizbnlz46lba6tcwmajpo2z37cpxuobeqmlgdqbdxnt65jr6rely +- valory/decision_maker_abci:0.1.0:bafybeia5qzqac2g444myog3tlwagthcknmanqunnytbjfsuk2msep2rnna - valory/staking_abci:0.1.0:bafybeictd5pxhscuhqntvctb7l5lfjausxt2m22rg5mkaiuj4cwwcxpvne - valory/mech_interact_abci:0.1.0:bafybeid6m3i5ofq7vuogqapdnoshhq7mswmudhvfcr2craw25fdwtoe3lm behaviours: