architect-py 5.1.0__tar.gz → 5.1.1__tar.gz
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.
- {architect_py-5.1.0 → architect_py-5.1.1}/PKG-INFO +1 -1
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/__init__.py +1 -1
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/async_client.py +23 -2
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/client.py +56 -70
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/client.pyi +7 -6
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/common_types/time_in_force.py +1 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/common_types/tradable_product.py +1 -1
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/juniper_base_client.py +4 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/client.py +3 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/resolve_endpoint.py +9 -2
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/conftest.py +0 -3
- architect_py-5.1.1/architect_py/tests/test_encoding.py +37 -0
- architect_py-5.1.1/architect_py/tests/test_sync_client.py +23 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py.egg-info/PKG-INFO +1 -1
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py.egg-info/SOURCES.txt +2 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/pyproject.toml +1 -1
- {architect_py-5.1.0 → architect_py-5.1.1}/templates/juniper_base_client.py +4 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/LICENSE +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/README.md +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/common_types/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/common_types/order_dir.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/base_model.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/client.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/enums.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/exceptions.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/fragments.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_execution_info_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_execution_infos_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_first_notice_date_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_future_series_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_product_info_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_product_infos_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/input_types.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/search_symbols_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/user_id_query.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Accounts/AccountsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Accounts/AccountsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Accounts/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrder.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrderRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrdersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrdersResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/CreateAlgoOrderRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/PauseAlgoRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/PauseAlgoResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/StartAlgoRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/StartAlgoResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/StopAlgoRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/StopAlgoResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Auth/CreateJwtRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Auth/CreateJwtResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Auth/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/DepositsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/DepositsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/RqdAccountStatisticsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/RqdAccountStatisticsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementUrlRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementUrlResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/WithdrawalsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/WithdrawalsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/ConfigRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/ConfigResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/RestartCptyRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/RestartCptyResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptyRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptyResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptyStatus.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptyStatusRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptysRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptysResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountHistoryRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountHistoryResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummariesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummariesResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummary.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummaryRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/HistoricalFillsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/HistoricalFillsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/HistoricalOrdersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/HistoricalOrdersResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Health/HealthCheckRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Health/HealthCheckResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Health/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/ArrayOfL1BookSnapshot.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/Candle.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/HistoricalCandlesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/HistoricalCandlesResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L1BookSnapshot.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L1BookSnapshotRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L1BookSnapshotsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L2BookSnapshot.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L2BookSnapshotRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/L2BookUpdate.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/Liquidation.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/MarketStatus.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/MarketStatusRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeCandlesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeCurrentCandlesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeL1BookSnapshotsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeL2BookUpdatesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeLiquidationsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeManyCandlesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeTickersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/SubscribeTradesRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/Ticker.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/TickerRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/TickerUpdate.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/TickersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/TickersResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/Trade.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Marketdata/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/Cancel.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/CancelAllOrdersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/CancelAllOrdersResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/CancelOrderRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/OpenOrdersRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/OpenOrdersResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/Order.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/PendingCancelsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/PendingCancelsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/PlaceOrderRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Oms/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/OptionsMarketdata/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/Dropcopy.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/DropcopyRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/Orderflow.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/OrderflowRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/SubscribeOrderflowRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Orderflow/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/DownloadProductCatalogRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/DownloadProductCatalogResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/ExecutionInfoRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/ExecutionInfoResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/PruneExpiredSymbolsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/PruneExpiredSymbolsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SubscribeSymbology.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SymbologyRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SymbologySnapshot.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SymbologyUpdate.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SymbolsRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/SymbolsResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/UploadProductCatalogRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/UploadProductCatalogResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/UploadSymbologyRequest.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/UploadSymbologyResponse.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Symbology/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/definitions.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/server.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/utils.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_book_building.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_marketdata.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_order_entry.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_orderflow.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_portfolio_management.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_rounding.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/tests/test_symbology.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/nearest_tick.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/nearest_tick_2.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/orderbook.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/pandas.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/price_bands.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py/utils/symbol_parsing.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py.egg-info/dependency_links.txt +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py.egg-info/requires.txt +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/architect_py.egg-info/top_level.txt +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/__init__.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/book_subscription.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/candles.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/common.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/external_cpty.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/funding_rate_mean_reversion_algo.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/order_sending.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/stream_l1_marketdata.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/stream_l2_marketdata.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/trades.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/tutorial_async.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/examples/tutorial_sync.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/add_imports_to_inits.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/correct_sync_interface.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/generate_functions_md.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/postprocess_grpc.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/preprocess_grpc_schema.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/scripts/prune_graphql_schema.py +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/setup.cfg +0 -0
- {architect_py-5.1.0 → architect_py-5.1.1}/templates/exceptions.py +0 -0
@@ -102,7 +102,9 @@ class AsyncClient:
|
|
102
102
|
)
|
103
103
|
endpoint = kwargs["endpoint"]
|
104
104
|
|
105
|
-
grpc_host, grpc_port, use_ssl = await resolve_endpoint(
|
105
|
+
grpc_host, grpc_port, use_ssl = await resolve_endpoint(
|
106
|
+
endpoint, paper_trading=paper_trading
|
107
|
+
)
|
106
108
|
logging.info(
|
107
109
|
f"Resolved endpoint {endpoint}: {grpc_host}:{grpc_port} use_ssl={use_ssl}"
|
108
110
|
)
|
@@ -179,6 +181,22 @@ class AsyncClient:
|
|
179
181
|
)
|
180
182
|
self.grpc_core = GrpcClient(host=grpc_host, port=grpc_port, use_ssl=use_ssl)
|
181
183
|
|
184
|
+
async def close(self):
|
185
|
+
"""
|
186
|
+
Close the gRPC channel and GraphQL client.
|
187
|
+
"""
|
188
|
+
if self.grpc_core is not None:
|
189
|
+
await self.grpc_core.close()
|
190
|
+
|
191
|
+
for grpc_client in self.grpc_marketdata.values():
|
192
|
+
await grpc_client.close()
|
193
|
+
|
194
|
+
self.grpc_marketdata.clear()
|
195
|
+
# NB: this line removes the "Error in sys.excepthook:" on close
|
196
|
+
|
197
|
+
if self.graphql_client is not None:
|
198
|
+
await self.graphql_client.close()
|
199
|
+
|
182
200
|
async def refresh_jwt(self, force: bool = False):
|
183
201
|
"""
|
184
202
|
Refresh the JWT for the gRPC channel if it's nearing expiration (within 1 minute).
|
@@ -259,6 +277,9 @@ class AsyncClient:
|
|
259
277
|
self.grpc_marketdata[venue] = GrpcClient(
|
260
278
|
host=grpc_host, port=grpc_port, use_ssl=use_ssl
|
261
279
|
)
|
280
|
+
logging.debug(
|
281
|
+
f"Setting marketdata endpoint for {venue}: {grpc_host}:{grpc_port} use_ssl={use_ssl}"
|
282
|
+
)
|
262
283
|
except Exception as e:
|
263
284
|
logging.error("Failed to set marketdata endpoint: %s", e)
|
264
285
|
|
@@ -1448,7 +1469,7 @@ class AsyncClient:
|
|
1448
1469
|
)
|
1449
1470
|
if execution_info is None:
|
1450
1471
|
raise ValueError(
|
1451
|
-
"Could not find execution information for {symbol} for rounding price for limit order. Please round price manually."
|
1472
|
+
f"Could not find execution information for {symbol} for rounding price for limit order. Please round price manually."
|
1452
1473
|
)
|
1453
1474
|
if (tick_size := execution_info.tick_size) is not None:
|
1454
1475
|
if tick_size:
|
@@ -2,13 +2,12 @@ import asyncio
|
|
2
2
|
import sys
|
3
3
|
import threading
|
4
4
|
from asyncio import AbstractEventLoop
|
5
|
+
from collections.abc import Callable
|
5
6
|
from functools import partial
|
6
|
-
from typing import Any,
|
7
|
+
from typing import Any, Concatenate, Coroutine, Optional, ParamSpec, TypeVar
|
7
8
|
|
8
9
|
from .async_client import AsyncClient
|
9
10
|
|
10
|
-
T = TypeVar("T")
|
11
|
-
|
12
11
|
|
13
12
|
def is_async_function(obj):
|
14
13
|
# can be converted to C function for faster performance
|
@@ -16,24 +15,30 @@ def is_async_function(obj):
|
|
16
15
|
return callable(obj) and hasattr(obj, "__code__") and obj.__code__.co_flags & 0x80
|
17
16
|
|
18
17
|
|
18
|
+
P = ParamSpec("P")
|
19
|
+
T = TypeVar("T")
|
20
|
+
|
21
|
+
|
19
22
|
class Client:
|
20
23
|
"""
|
24
|
+
One can find the function definition in the AsyncClient class and in the pyi file.
|
25
|
+
|
21
26
|
This class is a wrapper around the AsyncClient class that allows you to call async methods synchronously.
|
22
27
|
This does not work for subscription based methods.
|
23
28
|
|
24
29
|
This Client takes control of the event loop, which you can pass in.
|
25
30
|
|
26
|
-
One can find the function definition in the AsyncClient class.
|
27
31
|
|
28
32
|
The AsyncClient is more performant and powerful, so it is recommended to use that class if possible.
|
29
|
-
|
30
|
-
Avoid adding functions or other attributes to this class unless you know what you are doing, because
|
31
|
-
the __getattribute__ method changes the behavior of the class in a way that is not intuitive.
|
32
|
-
|
33
|
-
Instead, add them to the AsyncClient class.
|
33
|
+
Avoid adding functions or other attributes to this class unless you know what you are doing.
|
34
34
|
"""
|
35
35
|
|
36
|
-
__slots__ = (
|
36
|
+
__slots__ = (
|
37
|
+
"client",
|
38
|
+
"_event_loop",
|
39
|
+
"_sync_call",
|
40
|
+
"__dict__",
|
41
|
+
)
|
37
42
|
client: AsyncClient
|
38
43
|
_event_loop: AbstractEventLoop
|
39
44
|
|
@@ -56,88 +61,69 @@ class Client:
|
|
56
61
|
Pass in an `event_loop` if you want to use your own; otherwise, this class
|
57
62
|
will use the default asyncio event loop.
|
58
63
|
"""
|
64
|
+
self._sync_call = self._pick_executor()
|
65
|
+
|
59
66
|
if event_loop is None:
|
60
67
|
try:
|
61
68
|
event_loop = asyncio.get_running_loop()
|
62
69
|
except RuntimeError:
|
63
70
|
event_loop = asyncio.new_event_loop()
|
64
71
|
asyncio.set_event_loop(event_loop)
|
65
|
-
|
66
|
-
|
67
|
-
async_client = self.
|
68
|
-
AsyncClient.connect
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
)
|
72
|
+
object.__setattr__(self, "_event_loop", event_loop)
|
73
|
+
|
74
|
+
async_client: AsyncClient = self._sync_call(
|
75
|
+
AsyncClient.connect,
|
76
|
+
api_key=api_key,
|
77
|
+
api_secret=api_secret,
|
78
|
+
paper_trading=paper_trading,
|
79
|
+
endpoint=endpoint,
|
80
|
+
graphql_port=graphql_port,
|
81
|
+
**kwargs,
|
76
82
|
)
|
77
|
-
|
83
|
+
|
84
|
+
object.__setattr__(
|
85
|
+
self,
|
78
86
|
"client",
|
79
87
|
async_client,
|
80
88
|
)
|
89
|
+
self._promote_async_client_methods()
|
81
90
|
|
91
|
+
def _pick_executor(
|
92
|
+
self,
|
93
|
+
) -> Callable[
|
94
|
+
Concatenate[Callable[P, Coroutine[Any, Any, T]], P],
|
95
|
+
T,
|
96
|
+
]:
|
97
|
+
"""Return a function that runs a coroutine and blocks."""
|
82
98
|
if "ipykernel" in sys.modules:
|
83
|
-
|
99
|
+
executor = AsyncExecutor()
|
84
100
|
import atexit
|
85
101
|
|
86
|
-
executor = AsyncExecutor()
|
87
102
|
atexit.register(executor.shutdown)
|
103
|
+
return lambda fn, *a, **kw: executor.submit(fn(*a, **kw))
|
88
104
|
|
89
|
-
|
90
|
-
async_method: Callable[..., Coroutine[Any, Any, T]],
|
91
|
-
*args,
|
92
|
-
**kwargs,
|
93
|
-
) -> T:
|
94
|
-
"""
|
95
|
-
Executes the given coroutine synchronously using the executor.
|
96
|
-
"""
|
97
|
-
return executor.submit(async_method(*args, **kwargs))
|
105
|
+
return lambda fn, *a, **kw: self._event_loop.run_until_complete(fn(*a, **kw))
|
98
106
|
|
99
|
-
|
107
|
+
def _promote_async_client_methods(self) -> None:
|
108
|
+
for name in dir(self.client):
|
109
|
+
if name.startswith("_"):
|
110
|
+
continue
|
100
111
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
It can be found if you look in the AsyncClient class, which this class is a wrapper for,
|
105
|
-
or GraphQLClient, which is a parent class of AsyncClient
|
112
|
+
if any(x in name for x in ("stream", "subscribe", "connect")):
|
113
|
+
continue
|
114
|
+
attr = getattr(self.client, name)
|
106
115
|
|
107
|
-
|
108
|
-
|
109
|
-
In this case, will look through self.client, which is an instance of the Client class
|
116
|
+
if is_async_function(attr):
|
117
|
+
attr = partial(self._sync_call, attr)
|
110
118
|
|
111
|
-
|
112
|
-
but otherwise pass through the other attributes normally
|
119
|
+
object.__setattr__(self, name, attr)
|
113
120
|
|
114
|
-
|
115
|
-
|
116
|
-
in
|
117
|
-
|
118
|
-
attr = getattr(super().__getattribute__("client"), name)
|
119
|
-
if is_async_function(attr):
|
120
|
-
if "subscribe" in name:
|
121
|
-
raise AttributeError(
|
122
|
-
f"Method {name} is an subscription based async method and cannot be called synchronously"
|
123
|
-
)
|
124
|
-
return partial(super().__getattribute__("_sync_call"), attr)
|
121
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
122
|
+
# protect wrapper internals
|
123
|
+
if name in ("client", "_event_loop", "_sync_call"):
|
124
|
+
object.__setattr__(self, name, value)
|
125
125
|
else:
|
126
|
-
|
127
|
-
|
128
|
-
def __setattr__(self, name: str, value: Any):
|
129
|
-
"""primarily to prevent unintended shadowing"""
|
130
|
-
client = super().__getattribute__("client")
|
131
|
-
setattr(client, name, value)
|
132
|
-
|
133
|
-
def _sync_call(
|
134
|
-
self, async_method: Callable[..., Awaitable[T]], *args, **kwargs
|
135
|
-
) -> T:
|
136
|
-
return (
|
137
|
-
super()
|
138
|
-
.__getattribute__("_event_loop")
|
139
|
-
.run_until_complete(async_method(*args, **kwargs))
|
140
|
-
)
|
126
|
+
setattr(self.client, name, value)
|
141
127
|
|
142
128
|
|
143
129
|
class AsyncExecutor:
|
@@ -23,19 +23,16 @@ from typing import Any, AsyncGenerator, AsyncIterator, Literal, Sequence, overlo
|
|
23
23
|
|
24
24
|
class Client:
|
25
25
|
"""
|
26
|
+
One can find the function definition in the AsyncClient class and in the pyi file.
|
27
|
+
|
26
28
|
This class is a wrapper around the AsyncClient class that allows you to call async methods synchronously.
|
27
29
|
This does not work for subscription based methods.
|
28
30
|
|
29
31
|
This Client takes control of the event loop, which you can pass in.
|
30
32
|
|
31
|
-
One can find the function definition in the AsyncClient class.
|
32
33
|
|
33
34
|
The AsyncClient is more performant and powerful, so it is recommended to use that class if possible.
|
34
|
-
|
35
|
-
Avoid adding functions or other attributes to this class unless you know what you are doing, because
|
36
|
-
the __getattribute__ method changes the behavior of the class in a way that is not intuitive.
|
37
|
-
|
38
|
-
Instead, add them to the AsyncClient class.
|
35
|
+
Avoid adding functions or other attributes to this class unless you know what you are doing.
|
39
36
|
"""
|
40
37
|
api_key: str | None
|
41
38
|
api_secret: str | None
|
@@ -57,6 +54,10 @@ class Client:
|
|
57
54
|
will use the default asyncio event loop.
|
58
55
|
"""
|
59
56
|
l2_books: dict[Venue, dict[TradableProduct, tuple[L2BookSnapshot, asyncio.Task]]]
|
57
|
+
def close(self) -> None:
|
58
|
+
"""
|
59
|
+
Close the gRPC channel and GraphQL client.
|
60
|
+
"""
|
60
61
|
def refresh_jwt(self, force: bool = False):
|
61
62
|
"""
|
62
63
|
Refresh the JWT for the gRPC channel if it's nearing expiration (within 1 minute).
|
@@ -54,7 +54,7 @@ class TradableProduct(str):
|
|
54
54
|
return self.split("/", 1)[1]
|
55
55
|
|
56
56
|
def serialize(self) -> msgspec.Raw:
|
57
|
-
return msgspec.Raw(
|
57
|
+
return msgspec.Raw(msgspec.json.encode(str(self)))
|
58
58
|
|
59
59
|
@staticmethod
|
60
60
|
def deserialize(s: str) -> "TradableProduct":
|
@@ -8,7 +8,9 @@ import dns.resolver
|
|
8
8
|
from dns.rdtypes.IN.SRV import SRV
|
9
9
|
|
10
10
|
|
11
|
-
async def resolve_endpoint(
|
11
|
+
async def resolve_endpoint(
|
12
|
+
endpoint: str, paper_trading: bool = True
|
13
|
+
) -> Tuple[str, int, bool]:
|
12
14
|
"""
|
13
15
|
From a gRPC endpoint, resolve the host, port and whether or not the endpoint
|
14
16
|
should use SSL. If the port is specified explicitly, it will be used. Otherwise,
|
@@ -67,4 +69,9 @@ async def resolve_endpoint(endpoint: str) -> Tuple[str, int, bool]:
|
|
67
69
|
|
68
70
|
host = str(record.target).rstrip(".") # strips the period off of FQDNs
|
69
71
|
|
70
|
-
|
72
|
+
port = record.port
|
73
|
+
if paper_trading:
|
74
|
+
if "app.architect.co" in host or "staging.architect.co" in host:
|
75
|
+
port = 10080
|
76
|
+
|
77
|
+
return host, port, use_ssl
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from datetime import datetime, timezone
|
2
|
+
|
3
|
+
from architect_py.common_types.time_in_force import TimeInForce
|
4
|
+
from architect_py.common_types.tradable_product import TradableProduct
|
5
|
+
from architect_py.grpc.utils import encoder
|
6
|
+
|
7
|
+
|
8
|
+
def test_encoding():
|
9
|
+
product = TradableProduct("ES 20250321 CME Future", "USD")
|
10
|
+
encoded = encoder.encode(product)
|
11
|
+
|
12
|
+
assert encoded == b'"ES 20250321 CME Future/USD"', (
|
13
|
+
'Encoding of TradableProduct failed, expected "ES 20250321 CME Future/USD" but got '
|
14
|
+
+ str(encoded)
|
15
|
+
)
|
16
|
+
|
17
|
+
now = datetime.now(timezone.utc)
|
18
|
+
|
19
|
+
encoded = encoder.encode(TimeInForce.GTD(now))
|
20
|
+
|
21
|
+
assert encoded == b'{"GTD": "' + now.isoformat().encode() + b'"}', (
|
22
|
+
'Encoding of TimeInForce.GTD failed, expected {"GTD": "'
|
23
|
+
+ now.isoformat()
|
24
|
+
+ '"} but got '
|
25
|
+
+ str(encoded)
|
26
|
+
)
|
27
|
+
|
28
|
+
encoded = encoder.encode(TimeInForce.GTC)
|
29
|
+
|
30
|
+
assert encoded == b'"GTC"', (
|
31
|
+
'Encoding of TimeInForce.GTC failed, expected "GTC" but got ' + str(encoded)
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
if __name__ == "__main__":
|
36
|
+
test_encoding()
|
37
|
+
print("All tests passed.")
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import pytest
|
2
|
+
from dotenv import load_dotenv
|
3
|
+
|
4
|
+
from architect_py import Client
|
5
|
+
from architect_py.tests.conftest import TestEnvironment
|
6
|
+
|
7
|
+
|
8
|
+
@pytest.mark.asyncio
|
9
|
+
async def test_sync_client():
|
10
|
+
load_dotenv()
|
11
|
+
test_env = TestEnvironment.from_env()
|
12
|
+
client = Client(
|
13
|
+
api_key=test_env.api_key,
|
14
|
+
api_secret=test_env.api_secret,
|
15
|
+
paper_trading=test_env.paper_trading,
|
16
|
+
endpoint=test_env.endpoint,
|
17
|
+
graphql_port=test_env.graphql_port,
|
18
|
+
)
|
19
|
+
|
20
|
+
symbols = client.list_symbols(marketdata="CME")
|
21
|
+
|
22
|
+
assert symbols is not None
|
23
|
+
assert len(symbols) > 20
|
@@ -164,12 +164,14 @@ architect_py/grpc/models/Symbology/__init__.py
|
|
164
164
|
architect_py/tests/__init__.py
|
165
165
|
architect_py/tests/conftest.py
|
166
166
|
architect_py/tests/test_book_building.py
|
167
|
+
architect_py/tests/test_encoding.py
|
167
168
|
architect_py/tests/test_marketdata.py
|
168
169
|
architect_py/tests/test_order_entry.py
|
169
170
|
architect_py/tests/test_orderflow.py
|
170
171
|
architect_py/tests/test_portfolio_management.py
|
171
172
|
architect_py/tests/test_rounding.py
|
172
173
|
architect_py/tests/test_symbology.py
|
174
|
+
architect_py/tests/test_sync_client.py
|
173
175
|
architect_py/utils/nearest_tick.py
|
174
176
|
architect_py/utils/nearest_tick_2.py
|
175
177
|
architect_py/utils/orderbook.py
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_execution_info_query.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_execution_infos_query.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_first_notice_date_query.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_future_series_query.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_product_info_query.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/get_product_infos_query.py
RENAMED
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/graphql_client/search_symbols_query.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Accounts/AccountsRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Accounts/AccountsResponse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrdersRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/AlgoOrdersResponse.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/CreateAlgoOrderRequest.py
RENAMED
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/PauseAlgoResponse.py
RENAMED
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Algo/StartAlgoResponse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Auth/CreateJwtResponse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementUrlRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementUrlResponse.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementsRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/StatementsResponse.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/WithdrawalsRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Boss/WithdrawalsResponse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/RestartCptyRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Core/RestartCptyResponse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Cpty/CptyStatusRequest.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountHistoryRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountHistoryResponse.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummariesRequest.py
RENAMED
File without changes
|
{architect_py-5.1.0 → architect_py-5.1.1}/architect_py/grpc/models/Folio/AccountSummariesResponse.py
RENAMED
File without changes
|