chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,28 +1,45 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import pathlib
|
|
3
4
|
import textwrap
|
|
5
|
+
from collections.abc import Sequence
|
|
4
6
|
from dataclasses import asdict
|
|
5
|
-
from
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
from typing import Any, Optional
|
|
6
9
|
|
|
7
10
|
import click
|
|
8
11
|
import pytest
|
|
9
12
|
from click.testing import CliRunner
|
|
10
13
|
|
|
11
|
-
from chia._tests.
|
|
12
|
-
from chia._tests.environments.wallet import WalletTestFramework
|
|
14
|
+
from chia._tests.environments.wallet import STANDARD_TX_ENDPOINT_ARGS, WalletTestFramework
|
|
13
15
|
from chia._tests.wallet.conftest import * # noqa
|
|
14
|
-
from chia.cmds.cmd_classes import
|
|
16
|
+
from chia.cmds.cmd_classes import ChiaCliContext, ChiaCommand, chia_command, option
|
|
17
|
+
from chia.cmds.cmd_helpers import (
|
|
18
|
+
_TRANSACTION_ENDPOINT_DECORATOR_APPLIED,
|
|
19
|
+
NeedsCoinSelectionConfig,
|
|
20
|
+
NeedsTXConfig,
|
|
21
|
+
NeedsWalletRPC,
|
|
22
|
+
TransactionEndpoint,
|
|
23
|
+
TransactionEndpointWithTimelocks,
|
|
24
|
+
transaction_endpoint_runner,
|
|
25
|
+
)
|
|
26
|
+
from chia.cmds.cmds_util import coin_selection_args, tx_config_args, tx_out_cmd
|
|
27
|
+
from chia.cmds.param_types import CliAmount
|
|
15
28
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
29
|
+
from chia.util.ints import uint64
|
|
30
|
+
from chia.wallet.conditions import ConditionValidTimes
|
|
31
|
+
from chia.wallet.transaction_record import TransactionRecord
|
|
32
|
+
from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
|
|
16
33
|
|
|
17
34
|
|
|
18
|
-
def check_click_parsing(cmd: ChiaCommand, *args: str) -> None:
|
|
35
|
+
def check_click_parsing(cmd: ChiaCommand, *args: str, context: Optional[ChiaCliContext] = None) -> None:
|
|
19
36
|
@click.group()
|
|
20
37
|
def _cmd() -> None:
|
|
21
38
|
pass
|
|
22
39
|
|
|
23
40
|
mock_type = type(cmd.__class__.__name__, (cmd.__class__,), {})
|
|
24
41
|
|
|
25
|
-
def dict_compare_with_ignore_context(one:
|
|
42
|
+
def dict_compare_with_ignore_context(one: dict[str, Any], two: dict[str, Any]) -> None:
|
|
26
43
|
for k, v in one.items():
|
|
27
44
|
if k == "context":
|
|
28
45
|
continue
|
|
@@ -35,11 +52,17 @@ def check_click_parsing(cmd: ChiaCommand, *args: str) -> None:
|
|
|
35
52
|
# cmd is appropriately not recognized as a dataclass but I'm not sure how to hint that something is a dataclass
|
|
36
53
|
dict_compare_with_ignore_context(asdict(cmd), asdict(self)) # type: ignore[call-overload]
|
|
37
54
|
|
|
55
|
+
# We hack this in because more robust solutions are harder and probably not worth it
|
|
56
|
+
setattr(new_run, _TRANSACTION_ENDPOINT_DECORATOR_APPLIED, True)
|
|
57
|
+
|
|
38
58
|
setattr(mock_type, "run", new_run)
|
|
39
|
-
chia_command(_cmd, "_", "")(mock_type)
|
|
59
|
+
chia_command(group=_cmd, name="_", short_help="", help="")(mock_type)
|
|
60
|
+
|
|
61
|
+
if context is None:
|
|
62
|
+
context = ChiaCliContext()
|
|
40
63
|
|
|
41
64
|
runner = CliRunner()
|
|
42
|
-
result = runner.invoke(_cmd, ["_", *args], catch_exceptions=False)
|
|
65
|
+
result = runner.invoke(_cmd, ["_", *args], catch_exceptions=False, obj=context.to_click())
|
|
43
66
|
assert result.output == ""
|
|
44
67
|
|
|
45
68
|
|
|
@@ -48,12 +71,12 @@ def test_cmd_bases() -> None:
|
|
|
48
71
|
def cmd() -> None:
|
|
49
72
|
pass
|
|
50
73
|
|
|
51
|
-
@chia_command(cmd, "temp_cmd", "blah")
|
|
74
|
+
@chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
|
|
52
75
|
class TempCMD:
|
|
53
76
|
def run(self) -> None:
|
|
54
77
|
print("syncronous")
|
|
55
78
|
|
|
56
|
-
@chia_command(cmd, "temp_cmd_async", "blah")
|
|
79
|
+
@chia_command(group=cmd, name="temp_cmd_async", short_help="blah", help="n/a")
|
|
57
80
|
class TempCMDAsync:
|
|
58
81
|
async def run(self) -> None:
|
|
59
82
|
print("asyncronous")
|
|
@@ -95,14 +118,15 @@ def test_option_loading() -> None:
|
|
|
95
118
|
def cmd() -> None:
|
|
96
119
|
pass
|
|
97
120
|
|
|
98
|
-
@chia_command(cmd, "temp_cmd", "blah")
|
|
121
|
+
@chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
|
|
99
122
|
class TempCMD:
|
|
100
123
|
some_option: int = option("-o", "--some-option", required=True, type=int)
|
|
124
|
+
choices: list[str] = option("--choice", multiple=True, type=str)
|
|
101
125
|
|
|
102
126
|
def run(self) -> None:
|
|
103
127
|
print(self.some_option)
|
|
104
128
|
|
|
105
|
-
@chia_command(cmd, "temp_cmd_2", "blah")
|
|
129
|
+
@chia_command(group=cmd, name="temp_cmd_2", short_help="blah", help="n/a")
|
|
106
130
|
class TempCMD2:
|
|
107
131
|
some_option: int = option("-o", "--some-option", required=True, type=int, default=13)
|
|
108
132
|
|
|
@@ -142,14 +166,14 @@ def test_context_requirement() -> None:
|
|
|
142
166
|
@click.group()
|
|
143
167
|
@click.pass_context
|
|
144
168
|
def cmd(ctx: click.Context) -> None:
|
|
145
|
-
ctx.obj =
|
|
169
|
+
ctx.obj = ChiaCliContext(root_path=pathlib.Path("foo", "bar")).to_click()
|
|
146
170
|
|
|
147
|
-
@chia_command(cmd, "temp_cmd", "blah")
|
|
171
|
+
@chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
|
|
148
172
|
class TempCMD:
|
|
149
|
-
context:
|
|
173
|
+
context: ChiaCliContext
|
|
150
174
|
|
|
151
175
|
def run(self) -> None:
|
|
152
|
-
assert self.context
|
|
176
|
+
assert self.context.root_path == pathlib.Path("foo", "bar")
|
|
153
177
|
|
|
154
178
|
runner = CliRunner()
|
|
155
179
|
result = runner.invoke(
|
|
@@ -162,7 +186,7 @@ def test_context_requirement() -> None:
|
|
|
162
186
|
# Test that other variables named context are disallowed
|
|
163
187
|
with pytest.raises(ValueError, match="context"):
|
|
164
188
|
|
|
165
|
-
@chia_command(cmd, "shouldnt_work", "blah")
|
|
189
|
+
@chia_command(group=cmd, name="shouldnt_work", short_help="blah", help="n/a")
|
|
166
190
|
class BadCMD:
|
|
167
191
|
context: int
|
|
168
192
|
|
|
@@ -174,7 +198,7 @@ def test_typing() -> None:
|
|
|
174
198
|
def cmd() -> None:
|
|
175
199
|
pass
|
|
176
200
|
|
|
177
|
-
@chia_command(cmd, "temp_cmd", "blah")
|
|
201
|
+
@chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
|
|
178
202
|
class TempCMD:
|
|
179
203
|
integer: int = option("--integer", default=1, required=False)
|
|
180
204
|
text: str = option("--text", default="1", required=False)
|
|
@@ -206,7 +230,7 @@ def test_typing() -> None:
|
|
|
206
230
|
)
|
|
207
231
|
|
|
208
232
|
# Test optional
|
|
209
|
-
@chia_command(cmd, "temp_cmd_optional", "blah")
|
|
233
|
+
@chia_command(group=cmd, name="temp_cmd_optional", short_help="blah", help="n/a")
|
|
210
234
|
class TempCMDOptional:
|
|
211
235
|
optional: Optional[int] = option("--optional", required=False)
|
|
212
236
|
|
|
@@ -218,7 +242,7 @@ def test_typing() -> None:
|
|
|
218
242
|
# Test optional failure
|
|
219
243
|
with pytest.raises(TypeError):
|
|
220
244
|
|
|
221
|
-
@chia_command(cmd, "temp_cmd_optional_bad", "blah")
|
|
245
|
+
@chia_command(group=cmd, name="temp_cmd_optional_bad", short_help="blah", help="n/a")
|
|
222
246
|
class TempCMDOptionalBad2:
|
|
223
247
|
optional: Optional[int] = option("--optional", required=True)
|
|
224
248
|
|
|
@@ -226,20 +250,20 @@ def test_typing() -> None:
|
|
|
226
250
|
|
|
227
251
|
with pytest.raises(TypeError):
|
|
228
252
|
|
|
229
|
-
@chia_command(cmd, "temp_cmd_optional_bad", "blah")
|
|
253
|
+
@chia_command(group=cmd, name="temp_cmd_optional_bad", short_help="blah", help="n/a")
|
|
230
254
|
class TempCMDOptionalBad3:
|
|
231
255
|
optional: Optional[int] = option("--optional", default="string", required=False)
|
|
232
256
|
|
|
233
257
|
def run(self) -> None: ...
|
|
234
258
|
|
|
235
|
-
@chia_command(cmd, "temp_cmd_optional_fine", "blah")
|
|
259
|
+
@chia_command(group=cmd, name="temp_cmd_optional_fine", short_help="blah", help="n/a")
|
|
236
260
|
class TempCMDOptionalBad4:
|
|
237
261
|
optional: Optional[int] = option("--optional", default=None, required=False)
|
|
238
262
|
|
|
239
263
|
def run(self) -> None: ...
|
|
240
264
|
|
|
241
265
|
# Test multiple
|
|
242
|
-
@chia_command(cmd, "temp_cmd_sequence", "blah")
|
|
266
|
+
@chia_command(group=cmd, name="temp_cmd_sequence", short_help="blah", help="n/a")
|
|
243
267
|
class TempCMDSequence:
|
|
244
268
|
sequence: Sequence[int] = option("--sequence", multiple=True)
|
|
245
269
|
|
|
@@ -251,7 +275,7 @@ def test_typing() -> None:
|
|
|
251
275
|
# Test sequence failure
|
|
252
276
|
with pytest.raises(TypeError):
|
|
253
277
|
|
|
254
|
-
@chia_command(cmd, "temp_cmd_sequence_bad", "blah")
|
|
278
|
+
@chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
|
|
255
279
|
class TempCMDSequenceBad:
|
|
256
280
|
sequence: Sequence[int] = option("--sequence")
|
|
257
281
|
|
|
@@ -259,7 +283,7 @@ def test_typing() -> None:
|
|
|
259
283
|
|
|
260
284
|
with pytest.raises(TypeError):
|
|
261
285
|
|
|
262
|
-
@chia_command(cmd, "temp_cmd_sequence_bad", "blah")
|
|
286
|
+
@chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
|
|
263
287
|
class TempCMDSequenceBad2:
|
|
264
288
|
sequence: int = option("--sequence", multiple=True)
|
|
265
289
|
|
|
@@ -267,7 +291,7 @@ def test_typing() -> None:
|
|
|
267
291
|
|
|
268
292
|
with pytest.raises(ValueError):
|
|
269
293
|
|
|
270
|
-
@chia_command(cmd, "temp_cmd_sequence_bad", "blah")
|
|
294
|
+
@chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
|
|
271
295
|
class TempCMDSequenceBad3:
|
|
272
296
|
sequence: Sequence[int] = option("--sequence", default=[1, 2, 3], multiple=True)
|
|
273
297
|
|
|
@@ -275,7 +299,7 @@ def test_typing() -> None:
|
|
|
275
299
|
|
|
276
300
|
with pytest.raises(TypeError):
|
|
277
301
|
|
|
278
|
-
@chia_command(cmd, "temp_cmd_sequence_bad", "blah")
|
|
302
|
+
@chia_command(group=cmd, name="temp_cmd_sequence_bad", short_help="blah", help="n/a")
|
|
279
303
|
class TempCMDSequenceBad4:
|
|
280
304
|
sequence: Sequence[int] = option("--sequence", default=(1, 2, "3"), multiple=True)
|
|
281
305
|
|
|
@@ -284,29 +308,29 @@ def test_typing() -> None:
|
|
|
284
308
|
# Test invalid type
|
|
285
309
|
with pytest.raises(TypeError):
|
|
286
310
|
|
|
287
|
-
@chia_command(cmd, "temp_cmd_bad_type", "blah")
|
|
311
|
+
@chia_command(group=cmd, name="temp_cmd_bad_type", short_help="blah", help="n/a")
|
|
288
312
|
class TempCMDBadType:
|
|
289
|
-
sequence:
|
|
313
|
+
sequence: list[int] = option("--sequence")
|
|
290
314
|
|
|
291
315
|
def run(self) -> None: ...
|
|
292
316
|
|
|
293
317
|
# Test invalid default
|
|
294
318
|
with pytest.raises(TypeError):
|
|
295
319
|
|
|
296
|
-
@chia_command(cmd, "temp_cmd_bad_default", "blah")
|
|
320
|
+
@chia_command(group=cmd, name="temp_cmd_bad_default", short_help="blah", help="n/a")
|
|
297
321
|
class TempCMDBadDefault:
|
|
298
322
|
integer: int = option("--int", default="string")
|
|
299
323
|
|
|
300
324
|
def run(self) -> None: ...
|
|
301
325
|
|
|
302
326
|
# Test bytes parsing
|
|
303
|
-
@chia_command(cmd, "temp_cmd_bad_bytes", "blah")
|
|
327
|
+
@chia_command(group=cmd, name="temp_cmd_bad_bytes", short_help="blah", help="n/a")
|
|
304
328
|
class TempCMDBadBytes:
|
|
305
329
|
blob: bytes = option("--blob", required=True)
|
|
306
330
|
|
|
307
331
|
def run(self) -> None: ...
|
|
308
332
|
|
|
309
|
-
@chia_command(cmd, "temp_cmd_bad_bytes32", "blah")
|
|
333
|
+
@chia_command(group=cmd, name="temp_cmd_bad_bytes32", short_help="blah", help="n/a")
|
|
310
334
|
class TempCMDBadBytes32:
|
|
311
335
|
blob32: bytes32 = option("--blob32", required=True)
|
|
312
336
|
|
|
@@ -328,7 +352,7 @@ def test_typing() -> None:
|
|
|
328
352
|
assert "not a valid 32-byte hex string" in result.output
|
|
329
353
|
|
|
330
354
|
|
|
331
|
-
@pytest.mark.limit_consensus_modes(
|
|
355
|
+
@pytest.mark.limit_consensus_modes(reason="doesn't matter")
|
|
332
356
|
@pytest.mark.parametrize(
|
|
333
357
|
"wallet_environments",
|
|
334
358
|
[
|
|
@@ -352,7 +376,7 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
|
|
|
352
376
|
def cmd() -> None:
|
|
353
377
|
pass
|
|
354
378
|
|
|
355
|
-
@chia_command(cmd, "temp_cmd", "blah")
|
|
379
|
+
@chia_command(group=cmd, name="temp_cmd", short_help="blah", help="n/a")
|
|
356
380
|
class TempCMD:
|
|
357
381
|
rpc_info: NeedsWalletRPC
|
|
358
382
|
|
|
@@ -384,7 +408,7 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
|
|
|
384
408
|
|
|
385
409
|
expected_command = TempCMD(
|
|
386
410
|
rpc_info=NeedsWalletRPC(
|
|
387
|
-
context=
|
|
411
|
+
context=ChiaCliContext(root_path=wallet_environments.environments[0].node.root_path),
|
|
388
412
|
wallet_rpc_port=port,
|
|
389
413
|
fingerprint=fingerprint,
|
|
390
414
|
),
|
|
@@ -398,3 +422,199 @@ async def test_wallet_rpc_helper(wallet_environments: WalletTestFramework) -> No
|
|
|
398
422
|
test_present_client_info = TempCMD(rpc_info=NeedsWalletRPC(client_info="hello world")) # type: ignore[arg-type]
|
|
399
423
|
async with test_present_client_info.rpc_info.wallet_rpc(consume_errors=False) as client_info:
|
|
400
424
|
assert client_info == "hello world" # type: ignore[comparison-overlap]
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def test_tx_config_helper() -> None:
|
|
428
|
+
@click.group()
|
|
429
|
+
def cmd() -> None:
|
|
430
|
+
pass # pragma: no cover
|
|
431
|
+
|
|
432
|
+
@chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
|
|
433
|
+
class CsCMD:
|
|
434
|
+
coin_selection_loader: NeedsCoinSelectionConfig
|
|
435
|
+
|
|
436
|
+
def run(self) -> None:
|
|
437
|
+
# ignoring the `None` return here for convenient testing sake
|
|
438
|
+
return self.coin_selection_loader.load_coin_selection_config(100) # type: ignore[return-value]
|
|
439
|
+
|
|
440
|
+
example_cs_cmd = CsCMD(
|
|
441
|
+
coin_selection_loader=NeedsCoinSelectionConfig(
|
|
442
|
+
min_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
|
|
443
|
+
max_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
|
|
444
|
+
amounts_to_exclude=(CliAmount(amount=Decimal("0.01"), mojos=False),),
|
|
445
|
+
coins_to_exclude=(bytes32([0] * 32),),
|
|
446
|
+
)
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
check_click_parsing(
|
|
450
|
+
example_cs_cmd,
|
|
451
|
+
"--min-coin-amount",
|
|
452
|
+
"0.01",
|
|
453
|
+
"--max-coin-amount",
|
|
454
|
+
"0.01",
|
|
455
|
+
"--exclude-amount",
|
|
456
|
+
"0.01",
|
|
457
|
+
"--exclude-coin",
|
|
458
|
+
bytes32([0] * 32).hex(),
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
# again, convenience for testing sake
|
|
462
|
+
assert example_cs_cmd.run() == CoinSelectionConfig( # type: ignore[func-returns-value]
|
|
463
|
+
min_coin_amount=uint64(1),
|
|
464
|
+
max_coin_amount=uint64(1),
|
|
465
|
+
excluded_coin_amounts=[uint64(1)],
|
|
466
|
+
excluded_coin_ids=[bytes32([0] * 32)],
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
@chia_command(group=cmd, name="tx_config_cmd", short_help="blah", help="blah")
|
|
470
|
+
class TXConfigCMD:
|
|
471
|
+
tx_config_loader: NeedsTXConfig
|
|
472
|
+
|
|
473
|
+
def run(self) -> None:
|
|
474
|
+
# ignoring the `None` return here for convenient testing sake
|
|
475
|
+
return self.tx_config_loader.load_tx_config(100, {}, 0) # type: ignore[return-value]
|
|
476
|
+
|
|
477
|
+
example_tx_config_cmd = TXConfigCMD(
|
|
478
|
+
tx_config_loader=NeedsTXConfig(
|
|
479
|
+
min_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
|
|
480
|
+
max_coin_amount=CliAmount(amount=Decimal("0.01"), mojos=False),
|
|
481
|
+
amounts_to_exclude=(CliAmount(amount=Decimal("0.01"), mojos=False),),
|
|
482
|
+
coins_to_exclude=(bytes32([0] * 32),),
|
|
483
|
+
reuse=False,
|
|
484
|
+
)
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
check_click_parsing(
|
|
488
|
+
example_tx_config_cmd,
|
|
489
|
+
"--min-coin-amount",
|
|
490
|
+
"0.01",
|
|
491
|
+
"--max-coin-amount",
|
|
492
|
+
"0.01",
|
|
493
|
+
"--exclude-amount",
|
|
494
|
+
"0.01",
|
|
495
|
+
"--exclude-coin",
|
|
496
|
+
bytes32([0] * 32).hex(),
|
|
497
|
+
"--new-address",
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
# again, convenience for testing sake
|
|
501
|
+
assert example_tx_config_cmd.run() == TXConfig( # type: ignore[func-returns-value]
|
|
502
|
+
min_coin_amount=uint64(1),
|
|
503
|
+
max_coin_amount=uint64(1),
|
|
504
|
+
excluded_coin_amounts=[uint64(1)],
|
|
505
|
+
excluded_coin_ids=[bytes32([0] * 32)],
|
|
506
|
+
reuse_puzhash=False,
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
@pytest.mark.anyio
|
|
511
|
+
async def test_transaction_endpoint_mixin() -> None:
|
|
512
|
+
@click.group()
|
|
513
|
+
def cmd() -> None:
|
|
514
|
+
pass # pragma: no cover
|
|
515
|
+
|
|
516
|
+
@chia_command(group=cmd, name="bad_cmd", short_help="blah", help="blah")
|
|
517
|
+
class BadCMD(TransactionEndpoint):
|
|
518
|
+
def run(self) -> None: # type: ignore[override]
|
|
519
|
+
pass # pragma: no cover
|
|
520
|
+
|
|
521
|
+
with pytest.raises(TypeError, match="transaction_endpoint_runner"):
|
|
522
|
+
BadCMD(**STANDARD_TX_ENDPOINT_ARGS)
|
|
523
|
+
|
|
524
|
+
@chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
|
|
525
|
+
class TxCMD(TransactionEndpoint):
|
|
526
|
+
@transaction_endpoint_runner
|
|
527
|
+
async def run(self) -> list[TransactionRecord]:
|
|
528
|
+
assert self.load_condition_valid_times() == ConditionValidTimes(
|
|
529
|
+
min_time=uint64(10),
|
|
530
|
+
max_time=uint64(20),
|
|
531
|
+
)
|
|
532
|
+
return []
|
|
533
|
+
|
|
534
|
+
# Check that our default object lines up with the default options
|
|
535
|
+
check_click_parsing(TxCMD(**STANDARD_TX_ENDPOINT_ARGS))
|
|
536
|
+
|
|
537
|
+
example_tx_cmd = TxCMD(
|
|
538
|
+
**{
|
|
539
|
+
**STANDARD_TX_ENDPOINT_ARGS,
|
|
540
|
+
**dict(
|
|
541
|
+
fee=uint64(1_000_000_000_000 / 100),
|
|
542
|
+
push=False,
|
|
543
|
+
valid_at=10,
|
|
544
|
+
expires_at=20,
|
|
545
|
+
),
|
|
546
|
+
}
|
|
547
|
+
)
|
|
548
|
+
check_click_parsing(
|
|
549
|
+
example_tx_cmd,
|
|
550
|
+
"--fee",
|
|
551
|
+
"0.01",
|
|
552
|
+
"--no-push",
|
|
553
|
+
"--valid-at",
|
|
554
|
+
"10",
|
|
555
|
+
"--expires-at",
|
|
556
|
+
"20",
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
await example_tx_cmd.run() # trigger inner assert
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
# While we sit in between two paradigms, this test is in place to ensure they remain in sync.
|
|
563
|
+
# Delete this if the old decorators are deleted.
|
|
564
|
+
def test_old_decorator_support() -> None:
|
|
565
|
+
@click.group()
|
|
566
|
+
def cmd() -> None:
|
|
567
|
+
pass # pragma: no cover
|
|
568
|
+
|
|
569
|
+
@chia_command(group=cmd, name="cs_cmd", short_help="blah", help="blah")
|
|
570
|
+
class CsCMD:
|
|
571
|
+
coin_selection_loader: NeedsCoinSelectionConfig
|
|
572
|
+
|
|
573
|
+
def run(self) -> None:
|
|
574
|
+
pass # pragma: no cover
|
|
575
|
+
|
|
576
|
+
@chia_command(group=cmd, name="tx_config_cmd", short_help="blah", help="blah")
|
|
577
|
+
class TXConfigCMD:
|
|
578
|
+
tx_config_loader: NeedsTXConfig
|
|
579
|
+
|
|
580
|
+
def run(self) -> None:
|
|
581
|
+
pass # pragma: no cover
|
|
582
|
+
|
|
583
|
+
@chia_command(group=cmd, name="tx_cmd", short_help="blah", help="blah")
|
|
584
|
+
class TxCMD(TransactionEndpoint):
|
|
585
|
+
@transaction_endpoint_runner
|
|
586
|
+
async def run(self) -> list[TransactionRecord]:
|
|
587
|
+
return [] # pragma: no cover
|
|
588
|
+
|
|
589
|
+
@chia_command(group=cmd, name="tx_w_tl_cmd", short_help="blah", help="blah")
|
|
590
|
+
class TxWTlCMD(TransactionEndpointWithTimelocks):
|
|
591
|
+
@transaction_endpoint_runner
|
|
592
|
+
async def run(self) -> list[TransactionRecord]:
|
|
593
|
+
return [] # pragma: no cover
|
|
594
|
+
|
|
595
|
+
@cmd.command("cs_cmd_dec")
|
|
596
|
+
@coin_selection_args
|
|
597
|
+
def cs_cmd(**kwargs: Any) -> None:
|
|
598
|
+
pass # pragma: no cover
|
|
599
|
+
|
|
600
|
+
@cmd.command("tx_config_cmd_dec")
|
|
601
|
+
@tx_config_args
|
|
602
|
+
def tx_config_cmd(**kwargs: Any) -> None:
|
|
603
|
+
pass # pragma: no cover
|
|
604
|
+
|
|
605
|
+
@cmd.command("tx_cmd_dec") # type: ignore[arg-type]
|
|
606
|
+
@tx_out_cmd(enable_timelock_args=False)
|
|
607
|
+
def tx_cmd(**kwargs: Any) -> None:
|
|
608
|
+
pass # pragma: no cover
|
|
609
|
+
|
|
610
|
+
@cmd.command("tx_w_tl_cmd_dec") # type: ignore[arg-type]
|
|
611
|
+
@tx_out_cmd(enable_timelock_args=True)
|
|
612
|
+
def tx_w_tl_cmd(**kwargs: Any) -> None:
|
|
613
|
+
pass # pragma: no cover
|
|
614
|
+
|
|
615
|
+
for command_name, command in cmd.commands.items():
|
|
616
|
+
if "_dec" in command_name:
|
|
617
|
+
continue
|
|
618
|
+
params = [param.to_info_dict() for param in cmd.commands[command_name].params]
|
|
619
|
+
for param in cmd.commands[f"{command_name}_dec"].params:
|
|
620
|
+
assert param.to_info_dict() in params
|
|
@@ -44,7 +44,7 @@ async def test_failure_output_no_traceback(
|
|
|
44
44
|
) as (client, _):
|
|
45
45
|
await client.fetch(path="/table", request_json={"response": expected_response})
|
|
46
46
|
|
|
47
|
-
out,
|
|
47
|
+
out, _err = capsys.readouterr()
|
|
48
48
|
|
|
49
49
|
assert "ResponseFailureError" not in out
|
|
50
50
|
assert "Traceback:" not in out
|
|
@@ -69,7 +69,7 @@ async def test_failure_output_with_traceback(
|
|
|
69
69
|
) as (client, _):
|
|
70
70
|
await client.fetch(path="/table", request_json={"response": expected_response})
|
|
71
71
|
|
|
72
|
-
out,
|
|
72
|
+
out, _err = capsys.readouterr()
|
|
73
73
|
assert sample_traceback_json not in out
|
|
74
74
|
assert sample_traceback in out
|
|
75
75
|
|
chia/_tests/cmds/test_daemon.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Any,
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
from _pytest.capture import CaptureFixture
|
|
@@ -28,7 +28,7 @@ async def test_daemon(
|
|
|
28
28
|
async def unlock_keyring(_passphrase: str) -> bool:
|
|
29
29
|
return True
|
|
30
30
|
|
|
31
|
-
async def connect_to_daemon_and_validate(_root_path: Path, _config:
|
|
31
|
+
async def connect_to_daemon_and_validate(_root_path: Path, _config: dict[str, Any]) -> DummyConnection:
|
|
32
32
|
return DummyConnection()
|
|
33
33
|
|
|
34
34
|
class DummyKeychain:
|
|
@@ -74,7 +74,7 @@ def test_start_daemon(tmp_path: Path, empty_keyring: Any, mocker: MockerFixture)
|
|
|
74
74
|
return None
|
|
75
75
|
|
|
76
76
|
async def create_start_daemon_connection_dummy(
|
|
77
|
-
root_path: Path, config:
|
|
77
|
+
root_path: Path, config: dict[str, Any], *, skip_keyring: bool
|
|
78
78
|
) -> DummyDaemon:
|
|
79
79
|
return DummyDaemon()
|
|
80
80
|
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import aiohttp
|
|
8
|
+
import anyio
|
|
9
|
+
import click
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
# TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
|
|
13
|
+
from _pytest.capture import CaptureFixture
|
|
14
|
+
|
|
15
|
+
import chia._tests
|
|
16
|
+
from chia._tests.util.misc import Marks, datacases
|
|
17
|
+
from chia.cmds.gh import Per, TestCMD, get_gh_token
|
|
18
|
+
|
|
19
|
+
test_root = Path(chia._tests.__file__).parent
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class InvalidOnlyCase:
|
|
24
|
+
only: Path
|
|
25
|
+
per: Per
|
|
26
|
+
exists: bool
|
|
27
|
+
marks: Marks = ()
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def id(self) -> str:
|
|
31
|
+
return f"{self.per}: {self.only}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@datacases(
|
|
35
|
+
InvalidOnlyCase(only=Path("does_not_exist.py"), per="directory", exists=False),
|
|
36
|
+
InvalidOnlyCase(only=Path("pools/test_pool_rpc.py"), per="directory", exists=True),
|
|
37
|
+
InvalidOnlyCase(only=Path("does_not_exist/"), per="file", exists=False),
|
|
38
|
+
InvalidOnlyCase(only=Path("pools/"), per="file", exists=True),
|
|
39
|
+
)
|
|
40
|
+
@pytest.mark.anyio
|
|
41
|
+
async def test_invalid_only(case: InvalidOnlyCase) -> None:
|
|
42
|
+
cmd = TestCMD(only=case.only, per=case.per)
|
|
43
|
+
|
|
44
|
+
if case.exists:
|
|
45
|
+
assert test_root.joinpath(case.only).exists()
|
|
46
|
+
explanation = "wrong type"
|
|
47
|
+
if case.per == "directory":
|
|
48
|
+
assert test_root.joinpath(case.only).is_file()
|
|
49
|
+
else:
|
|
50
|
+
assert test_root.joinpath(case.only).is_dir()
|
|
51
|
+
else:
|
|
52
|
+
assert not test_root.joinpath(case.only).exists()
|
|
53
|
+
explanation = "does not exist"
|
|
54
|
+
|
|
55
|
+
with pytest.raises(click.ClickException, match=rf"\bto be a {re.escape(case.per)}\b.*\b{re.escape(explanation)}\b"):
|
|
56
|
+
await cmd.run()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@pytest.mark.skip("considering inclusion, but not yet")
|
|
60
|
+
@pytest.mark.anyio
|
|
61
|
+
async def test_successfully_dispatches(
|
|
62
|
+
capsys: CaptureFixture[str],
|
|
63
|
+
) -> None:
|
|
64
|
+
cmd = TestCMD(
|
|
65
|
+
# TODO: stop hardcoding here
|
|
66
|
+
owner="chia-network",
|
|
67
|
+
repository="chia-blockchain",
|
|
68
|
+
per="file",
|
|
69
|
+
only=Path("util/test_errors.py"),
|
|
70
|
+
duplicates=2,
|
|
71
|
+
oses=["linux", "macos-arm"],
|
|
72
|
+
full_python_matrix=True,
|
|
73
|
+
open_browser=False,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
capsys.readouterr()
|
|
77
|
+
await cmd.run()
|
|
78
|
+
stdout, stderr = capsys.readouterr()
|
|
79
|
+
|
|
80
|
+
assert len(stderr.strip()) == 0
|
|
81
|
+
for line in stdout.splitlines():
|
|
82
|
+
match = re.search(r"(?<=\brun api url: )(?P<url>.*)", line)
|
|
83
|
+
if match is None:
|
|
84
|
+
continue
|
|
85
|
+
url = match.group("url")
|
|
86
|
+
break
|
|
87
|
+
else:
|
|
88
|
+
pytest.fail(f"Failed to find run url in: {stdout}")
|
|
89
|
+
|
|
90
|
+
token = await get_gh_token()
|
|
91
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
92
|
+
|
|
93
|
+
async with aiohttp.ClientSession(raise_for_status=True, headers=headers) as client:
|
|
94
|
+
while True:
|
|
95
|
+
async with client.get(url) as response:
|
|
96
|
+
d = await response.json()
|
|
97
|
+
jobs_url = d["jobs_url"]
|
|
98
|
+
conclusion = d["conclusion"]
|
|
99
|
+
|
|
100
|
+
print("conclusion:", conclusion)
|
|
101
|
+
if conclusion is None:
|
|
102
|
+
await anyio.sleep(5)
|
|
103
|
+
continue
|
|
104
|
+
|
|
105
|
+
break
|
|
106
|
+
|
|
107
|
+
async with client.get(jobs_url) as response:
|
|
108
|
+
d = await response.json()
|
|
109
|
+
jobs = d["jobs"]
|
|
110
|
+
|
|
111
|
+
by_name = {job["name"]: job for job in jobs}
|
|
112
|
+
|
|
113
|
+
assert by_name["Configure matrix"]["conclusion"] == "success"
|
|
114
|
+
assert by_name["macos-intel"]["conclusion"] == "skipped"
|
|
115
|
+
assert by_name["windows"]["conclusion"] == "skipped"
|
|
116
|
+
|
|
117
|
+
versions = ["3.9", "3.10", "3.11", "3.12"]
|
|
118
|
+
runs_by_name: dict[str, list[str]] = {name: [] for name in ["ubuntu", "macos-arm"]}
|
|
119
|
+
for name in by_name:
|
|
120
|
+
platform, _, rest = name.partition(" / ")
|
|
121
|
+
|
|
122
|
+
jobs = runs_by_name.get(platform)
|
|
123
|
+
if jobs is None:
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
jobs.append(rest)
|
|
127
|
+
|
|
128
|
+
expected = len(versions) * cmd.duplicates
|
|
129
|
+
print("expected:", expected)
|
|
130
|
+
print("runs_by_name:", runs_by_name)
|
|
131
|
+
assert len({expected, *(len(runs) for runs in runs_by_name.values())}) == 1
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import re
|
|
4
|
-
from typing import Tuple
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
from _pytest.capture import CaptureFixture
|
|
@@ -18,7 +17,7 @@ from chia.types.aliases import FarmerService, HarvesterService, WalletService
|
|
|
18
17
|
@pytest.mark.anyio
|
|
19
18
|
async def test_farm_summary_command(
|
|
20
19
|
capsys: CaptureFixture[str],
|
|
21
|
-
farmer_one_harvester_simulator_wallet:
|
|
20
|
+
farmer_one_harvester_simulator_wallet: tuple[
|
|
22
21
|
HarvesterService,
|
|
23
22
|
FarmerService,
|
|
24
23
|
SimulatorFullNodeService,
|