stonepy 0.1.0__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.
- stonepy-0.1.0/.gitignore +11 -0
- stonepy-0.1.0/CHANGELOG.md +7 -0
- stonepy-0.1.0/LICENSE +21 -0
- stonepy-0.1.0/PKG-INFO +186 -0
- stonepy-0.1.0/README.md +151 -0
- stonepy-0.1.0/pyproject.toml +79 -0
- stonepy-0.1.0/src/stonepy/__init__.py +27 -0
- stonepy-0.1.0/src/stonepy/_core/__init__.py +1 -0
- stonepy-0.1.0/src/stonepy/_core/clock.py +49 -0
- stonepy-0.1.0/src/stonepy/_core/codec.py +96 -0
- stonepy-0.1.0/src/stonepy/_core/config.py +118 -0
- stonepy-0.1.0/src/stonepy/_core/endpoint.py +36 -0
- stonepy-0.1.0/src/stonepy/_core/errors.py +169 -0
- stonepy-0.1.0/src/stonepy/_core/logging.py +62 -0
- stonepy-0.1.0/src/stonepy/_core/models.py +31 -0
- stonepy-0.1.0/src/stonepy/_core/pipeline.py +605 -0
- stonepy-0.1.0/src/stonepy/_core/plugins.py +144 -0
- stonepy-0.1.0/src/stonepy/_core/ratelimit.py +99 -0
- stonepy-0.1.0/src/stonepy/_core/resource.py +12 -0
- stonepy-0.1.0/src/stonepy/_core/retry.py +30 -0
- stonepy-0.1.0/src/stonepy/_core/session.py +155 -0
- stonepy-0.1.0/src/stonepy/_core/status.py +80 -0
- stonepy-0.1.0/src/stonepy/_core/transport.py +352 -0
- stonepy-0.1.0/src/stonepy/_endpoints/__init__.py +36 -0
- stonepy-0.1.0/src/stonepy/_endpoints/cfd.py +82 -0
- stonepy-0.1.0/src/stonepy/_endpoints/clientapplication.py +45 -0
- stonepy-0.1.0/src/stonepy/_endpoints/clientpreference.py +236 -0
- stonepy-0.1.0/src/stonepy/_endpoints/margin.py +38 -0
- stonepy-0.1.0/src/stonepy/_endpoints/market.py +1295 -0
- stonepy-0.1.0/src/stonepy/_endpoints/message.py +284 -0
- stonepy-0.1.0/src/stonepy/_endpoints/news.py +319 -0
- stonepy-0.1.0/src/stonepy/_endpoints/order.py +367 -0
- stonepy-0.1.0/src/stonepy/_endpoints/preference.py +96 -0
- stonepy-0.1.0/src/stonepy/_endpoints/price_alert.py +126 -0
- stonepy-0.1.0/src/stonepy/_endpoints/session.py +99 -0
- stonepy-0.1.0/src/stonepy/_endpoints/spread.py +82 -0
- stonepy-0.1.0/src/stonepy/_endpoints/user_account.py +69 -0
- stonepy-0.1.0/src/stonepy/_endpoints/watchlist.py +167 -0
- stonepy-0.1.0/src/stonepy/_generator/__init__.py +1 -0
- stonepy-0.1.0/src/stonepy/_generator/__main__.py +159 -0
- stonepy-0.1.0/src/stonepy/_generator/catalog.py +552 -0
- stonepy-0.1.0/src/stonepy/_generator/emit_client.py +493 -0
- stonepy-0.1.0/src/stonepy/_generator/emit_contract.py +659 -0
- stonepy-0.1.0/src/stonepy/_generator/emit_endpoints.py +716 -0
- stonepy-0.1.0/src/stonepy/_generator/emit_models.py +203 -0
- stonepy-0.1.0/src/stonepy/_generator/render.py +342 -0
- stonepy-0.1.0/src/stonepy/_generator/scaffold.py +354 -0
- stonepy-0.1.0/src/stonepy/client.py +469 -0
- stonepy-0.1.0/src/stonepy/errors.py +23 -0
- stonepy-0.1.0/src/stonepy/models/AccountInformationResponseDTOv2.py +18 -0
- stonepy-0.1.0/src/stonepy/models/AccountResult.py +40 -0
- stonepy-0.1.0/src/stonepy/models/ActiveSignalsResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/AlertDTO.py +27 -0
- stonepy-0.1.0/src/stonepy/models/AllocationProfileDTO.py +24 -0
- stonepy-0.1.0/src/stonepy/models/AllocationProfileEntryDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/Api2FALogonOnResponseDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiAccountHolderDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiAccountInformationSaveRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiAccountInformationSaveResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiAccountOperatorDTOv2.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiActiveOrderDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiActiveStopLimitOrderDTOv2.py +42 -0
- stonepy-0.1.0/src/stonepy/models/ApiAdvisoryTradeOrderResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiAssociatedDTOv2.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiAssociatedResponseDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiBandedSpreadsDTO.py +17 -0
- stonepy-0.1.0/src/stonepy/models/ApiBasicStopLimitOrderDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiChangePasswordRequestDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiChangePasswordResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiCiConnectMultipleUsersDetailsDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientAccountDTO.py +30 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientAccountMarginResponseDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientAccountTokenDTOv2.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientAccountWatchlistDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientAccountWatchlistItemDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientApplicationMessageTranslationDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientApplicationMessageTranslationRequestDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientApplicationMessageTranslationResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientCommunicationResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientCommunicationUpdateRequestDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientCommunicationUpdateResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenMarginFactorDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenPriceToleranceDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingSaveDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingsDTO.py +28 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingsGetResponseDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingsSaveDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingsSaveRequestDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverriddenSettingsSaveResponseDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenMarginFactorDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenPriceToleranceDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingSaveDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingsDTO.py +28 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingsGetResponseDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingsSaveDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingsSaveRequestDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiClientPreferencesOverridenSettingsSaveResponseDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiCommunityActionDTO.py +29 -0
- stonepy-0.1.0/src/stonepy/models/ApiCommunityActionUserDetailsDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiConnectUserDetailsDTO.py +28 -0
- stonepy-0.1.0/src/stonepy/models/ApiContractDTOv2.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiCultureLookupDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiDateTimeOffsetDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiDeleteWatchlistRequestDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiDeleteWatchlistResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiErrorResponseDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiFollowedDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiFollowerDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiFreeCashToTradeResponseDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiFxFinancingDTO.py +22 -0
- stonepy-0.1.0/src/stonepy/models/ApiGetClientPreferenceResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiGetClientPreferencesResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiGetKeyListClientPreferenceResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiGetMarketInformationExtendedResponseDTOv2.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiGetPreferencesResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiIfDoneDTOv2.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiIfDoneResponseDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiKnockoutDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiLogOffRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiLogOffResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiLogOnRequestDTO.py +17 -0
- stonepy-0.1.0/src/stonepy/models/ApiLogOnResponseDTOv2.py +26 -0
- stonepy-0.1.0/src/stonepy/models/ApiLookupDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiLookupResponseDTO.py +24 -0
- stonepy-0.1.0/src/stonepy/models/ApiManagedClientAccountMarginResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiManagedClientAccountsMarginResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiManagedInstructionResponseDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiManagedTradeDTO.py +22 -0
- stonepy-0.1.0/src/stonepy/models/ApiManagedTradeHistoryDTO.py +27 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketEodDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketInformationDTOv2.py +141 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketInformationExtendedDTOv2.py +33 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketInformationSaveDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketSpreadDTO.py +17 -0
- stonepy-0.1.0/src/stonepy/models/ApiMarketTagDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiOpenPositionDTOv2.py +44 -0
- stonepy-0.1.0/src/stonepy/models/ApiOrderActionResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiOrderDTOv2.py +47 -0
- stonepy-0.1.0/src/stonepy/models/ApiOrderResponseDTO.py +34 -0
- stonepy-0.1.0/src/stonepy/models/ApiPrimaryMarketTagDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiProductInformationDTO.py +50 -0
- stonepy-0.1.0/src/stonepy/models/ApiQuoteResponseDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiRestrictionDTOv2.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveAccountInformationRequestDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveAccountInformationResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveClientPreferenceRequestDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveMarketInformationResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiSavePreferencesRequestDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveSignalPreferencesResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveWatchlistRequestDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiSaveWatchlistResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiSimulateOrderResponseDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiSimulateTradeOrderResponseDTO.py +31 -0
- stonepy-0.1.0/src/stonepy/models/ApiStepMarginBandDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/ApiStepMarginDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/ApiStopLimitOrderDTOv2.py +27 -0
- stonepy-0.1.0/src/stonepy/models/ApiStopLimitOrderHistoryDTO.py +35 -0
- stonepy-0.1.0/src/stonepy/models/ApiStopLimitResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/ApiTradeHistoryDTO.py +43 -0
- stonepy-0.1.0/src/stonepy/models/ApiTradeOrderDTOv2.py +22 -0
- stonepy-0.1.0/src/stonepy/models/ApiTradeOrderResponseDTO.py +26 -0
- stonepy-0.1.0/src/stonepy/models/ApiTraderDetailsDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ApiTradingAccountDTOv2.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ApiTradingDayTimesDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiUpdateDeleteClientPreferenceResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiUserDynamicProfileDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ApiUserFollowedUsersDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiUserFollowersDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ApiUserProfileDTO.py +30 -0
- stonepy-0.1.0/src/stonepy/models/ApiUserTradingAccountDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ApiValidateSessionRequestDTOv2.py +17 -0
- stonepy-0.1.0/src/stonepy/models/ApiValidateSessionResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ApiWallItemDTO.py +27 -0
- stonepy-0.1.0/src/stonepy/models/ApiWallItemsForUsersDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/CancelOrderRequestDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/CashEquity.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ClientAccountMarginDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ClientAccountMarginResponseDTO.py +25 -0
- stonepy-0.1.0/src/stonepy/models/ClientCommunicationMessageDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ClientPreferenceKeyDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ClientPreferenceRequestDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ClientPreferencesRequestDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/CorporateActionsDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/DeleteAllocationProfileRequestDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/DeleteAllocationProfileResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/DeleteWatchlistItemRequestDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/DeleteWatchlistResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/EnrichedOrderDTO.py +42 -0
- stonepy-0.1.0/src/stonepy/models/ExecutionResponseDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ExecutionVenueRequestDTO.py +32 -0
- stonepy-0.1.0/src/stonepy/models/FixedMarginOrderResponseDTO.py +27 -0
- stonepy-0.1.0/src/stonepy/models/FullMarketInformationSearchWithTagsResponseDTOv2.py +22 -0
- stonepy-0.1.0/src/stonepy/models/GetActiveStopLimitOrderResponseDTOv2.py +20 -0
- stonepy-0.1.0/src/stonepy/models/GetClientPreferenceResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/GetClientPreferencesResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/GetKeyListClientPreferenceResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/GetListClientPreferenceResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/GetMarketInformationResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/GetMessagePopupResponseDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/GetOpenPositionResponseDTOv2.py +18 -0
- stonepy-0.1.0/src/stonepy/models/GetOrderResponseDTOv2.py +20 -0
- stonepy-0.1.0/src/stonepy/models/GetOrdersResponseDTOv2.py +22 -0
- stonepy-0.1.0/src/stonepy/models/GetPriceBarResponseDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/GetPriceTickResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/GetVersionInformationResponseDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/HistoricalOrderDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/HistoricalOrdersResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/IdentifierDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/InsertWatchlistItemRequestDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/LegalPartyDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/LinkedAccountResult.py +36 -0
- stonepy-0.1.0/src/stonepy/models/ListActiveOrdersRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ListActiveOrdersResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ListActiveStopLimitOrderResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListAllocationProfilesResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListCfdMarketsResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ListManagedClientsResponseDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/ListMarketInformationRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ListMarketInformationResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListMarketInformationSearchResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListMarketSearchPaginatedResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ListMarketSearchResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ListOpenPositionsResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ListProductInformationDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/ListProductInformationResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListSpreadMarketsResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/ListStopLimitOrderHistoryResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/ListTradeHistoryResponseDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/ListWatchlistRequestDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/ListWatchlistResponseDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/LogonUser.py +13 -0
- stonepy-0.1.0/src/stonepy/models/ManagedClientDTO.py +24 -0
- stonepy-0.1.0/src/stonepy/models/ManagedTradingAccountDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/MarketInformationSearchWithTagsResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/MarketInformationSearchWithoutTagsResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/MarketInformationTagLookupResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/MarketPricesDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/MarketSearchResultDTO.py +122 -0
- stonepy-0.1.0/src/stonepy/models/MarketSpreadData.py +21 -0
- stonepy-0.1.0/src/stonepy/models/MultipleMarketInformationRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/NewFixedMarginTradeOrderRequestDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/NewStopLimitOrderRequestDTO.py +39 -0
- stonepy-0.1.0/src/stonepy/models/NewTradeOrderRequestDTO.py +36 -0
- stonepy-0.1.0/src/stonepy/models/NewsResponseDTO.py +17 -0
- stonepy-0.1.0/src/stonepy/models/OpenOrderDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/OpenOrdersResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/OrderDTO.py +34 -0
- stonepy-0.1.0/src/stonepy/models/OrderHistoryDTO.py +34 -0
- stonepy-0.1.0/src/stonepy/models/OrderRequestDTO.py +47 -0
- stonepy-0.1.0/src/stonepy/models/PendingOrderDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/PendingOrdersResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/PreferenceDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/PriceAlertDTO.py +32 -0
- stonepy-0.1.0/src/stonepy/models/PriceAlertResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/PriceBarDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/PriceDTO.py +29 -0
- stonepy-0.1.0/src/stonepy/models/PriceTickDTO.py +16 -0
- stonepy-0.1.0/src/stonepy/models/QuoteDTO.py +31 -0
- stonepy-0.1.0/src/stonepy/models/SaveAlertRequestDTOv2.py +27 -0
- stonepy-0.1.0/src/stonepy/models/SaveAlertResponseDTOv2.py +13 -0
- stonepy-0.1.0/src/stonepy/models/SaveAllocationProfileRequestDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/SaveAllocationProfileResponseDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/SaveClientPreferenceRequestDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/SaveMarketInformationRequestDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/SaveWatchlistRequestDTO.py +19 -0
- stonepy-0.1.0/src/stonepy/models/SaveWatchlistResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/SecureMessageCount.py +16 -0
- stonepy-0.1.0/src/stonepy/models/SignalDTO.py +47 -0
- stonepy-0.1.0/src/stonepy/models/SignalPerformanceDTO.py +21 -0
- stonepy-0.1.0/src/stonepy/models/SignalPerformanceResponseDTO.py +23 -0
- stonepy-0.1.0/src/stonepy/models/SingleActiveStopLimitOrderResponseDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/SingleOpenPositionResponseDTO.py +18 -0
- stonepy-0.1.0/src/stonepy/models/StoryResponseDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/SystemStatusDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/SystemStatusRequestDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/Timestamp.py +14 -0
- stonepy-0.1.0/src/stonepy/models/TradeMarginDTO.py +41 -0
- stonepy-0.1.0/src/stonepy/models/UpdateDeleteClientPreferenceResponseDTO.py +13 -0
- stonepy-0.1.0/src/stonepy/models/UpdateFixedMarginTradeOrderRequestDTO.py +20 -0
- stonepy-0.1.0/src/stonepy/models/UpdateStopLimitOrderRequestDTO.py +11 -0
- stonepy-0.1.0/src/stonepy/models/UpdateTradeOrderRequestDTO.py +14 -0
- stonepy-0.1.0/src/stonepy/models/UpdateWatchlistDisplayOrderRequestDTO.py +15 -0
- stonepy-0.1.0/src/stonepy/models/__init__.py +781 -0
- stonepy-0.1.0/src/stonepy/models/enums.py +665 -0
- stonepy-0.1.0/src/stonepy/py.typed +0 -0
- stonepy-0.1.0/src/stonepy/resources/__init__.py +48 -0
- stonepy-0.1.0/src/stonepy/resources/cfd/__init__.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/cfd/_sync/list_cfd_markets.py +37 -0
- stonepy-0.1.0/src/stonepy/resources/cfd/list_cfd_markets.py +36 -0
- stonepy-0.1.0/src/stonepy/resources/clientapplication/__init__.py +23 -0
- stonepy-0.1.0/src/stonepy/resources/clientapplication/_sync/get_version_information.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientapplication/get_version_information.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/__init__.py +57 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/delete.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/get.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/get_key_list.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/get_list.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/get_overridden_settings.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/save.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/_sync/save_overridden_settings.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/delete.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/get.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/get_key_list.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/get_list.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/get_overridden_settings.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/save.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/clientpreference/save_overridden_settings.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/margin/__init__.py +25 -0
- stonepy-0.1.0/src/stonepy/resources/margin/_sync/get_client_account_margin.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/margin/get_client_account_margin.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/market/__init__.py +153 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/full_search_with_tags.py +49 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_full_search_with_tags.py +51 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_latest_price_bars.py +28 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_latest_price_ticks.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_market_information.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_market_information_extended.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_market_spread.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_bars_after_date.py +42 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_bars_before_date.py +41 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_bars_between_dates.py +44 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_ticks_after_date.py +29 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_ticks_before_date.py +29 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/get_price_ticks_between_dates.py +35 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/list_market_information.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/list_market_information_search.py +45 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/list_market_search.py +46 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/list_market_search_paginated.py +52 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/save_market_information.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/save_product_information.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/market/_sync/search_with_tags.py +51 -0
- stonepy-0.1.0/src/stonepy/resources/market/full_search_with_tags.py +48 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_full_search_with_tags.py +50 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_latest_price_bars.py +27 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_latest_price_ticks.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_market_information.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_market_information_extended.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_market_spread.py +13 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_bars_after_date.py +41 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_bars_before_date.py +40 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_bars_between_dates.py +43 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_ticks_after_date.py +28 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_ticks_before_date.py +28 -0
- stonepy-0.1.0/src/stonepy/resources/market/get_price_ticks_between_dates.py +34 -0
- stonepy-0.1.0/src/stonepy/resources/market/list_market_information.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/market/list_market_information_search.py +44 -0
- stonepy-0.1.0/src/stonepy/resources/market/list_market_search.py +45 -0
- stonepy-0.1.0/src/stonepy/resources/market/list_market_search_paginated.py +51 -0
- stonepy-0.1.0/src/stonepy/resources/market/save_market_information.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/market/save_product_information.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/market/search_with_tags.py +50 -0
- stonepy-0.1.0/src/stonepy/resources/message/__init__.py +71 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/client_communication_message_update.py +23 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/get_client_application_message_translation.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/get_client_application_message_translation_with_interesting_items.py +24 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/get_client_communication_messages.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/get_message_popup.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/get_system_lookup.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/message/_sync/save_client_communication_message_response.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/message/client_communication_message_update.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/message/get_client_application_message_translation.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/message/get_client_application_message_translation_with_interesting_items.py +23 -0
- stonepy-0.1.0/src/stonepy/resources/message/get_client_communication_messages.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/message/get_message_popup.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/message/get_system_lookup.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/message/save_client_communication_message_response.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/news/__init__.py +55 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/get_market_report_headlines.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/get_market_reports.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/get_news.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/get_news_headlines.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/get_story.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/search_market_reports.py +31 -0
- stonepy-0.1.0/src/stonepy/resources/news/_sync/search_news.py +31 -0
- stonepy-0.1.0/src/stonepy/resources/news/get_market_report_headlines.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/news/get_market_reports.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/news/get_news.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/news/get_news_headlines.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/news/get_story.py +13 -0
- stonepy-0.1.0/src/stonepy/resources/news/search_market_reports.py +30 -0
- stonepy-0.1.0/src/stonepy/resources/news/search_news.py +30 -0
- stonepy-0.1.0/src/stonepy/resources/order/__init__.py +83 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/cancel_order.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/get_active_stop_limit_order.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/get_open_position.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/get_order.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/list_active_orders.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/list_active_stop_limit_orders.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/list_open_positions.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/list_stop_limit_order_history.py +31 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/list_trade_history.py +30 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/order.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/place_order.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/order/_sync/simulate_trade.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/order/cancel_order.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/order/get_active_stop_limit_order.py +22 -0
- stonepy-0.1.0/src/stonepy/resources/order/get_open_position.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/order/get_order.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/order/list_active_orders.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/order/list_active_stop_limit_orders.py +23 -0
- stonepy-0.1.0/src/stonepy/resources/order/list_open_positions.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/order/list_stop_limit_order_history.py +30 -0
- stonepy-0.1.0/src/stonepy/resources/order/list_trade_history.py +29 -0
- stonepy-0.1.0/src/stonepy/resources/order/order.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/order/place_order.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/order/simulate_trade.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/preference/__init__.py +37 -0
- stonepy-0.1.0/src/stonepy/resources/preference/_sync/delete_user_preference.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/preference/_sync/get_user_preference.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/preference/_sync/save_user_preference.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/preference/delete_user_preference.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/preference/get_user_preference.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/preference/save_user_preference.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/__init__.py +35 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/_sync/delete_pa.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/_sync/get_pa.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/_sync/save_pa.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/_sync/save_price_alert.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/delete_pa.py +13 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/get_pa.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/save_pa.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/price_alert/save_price_alert.py +17 -0
- stonepy-0.1.0/src/stonepy/resources/session/__init__.py +29 -0
- stonepy-0.1.0/src/stonepy/resources/session/_sync/change_password.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/session/_sync/delete_session.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/session/_sync/log_on.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/session/change_password.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/session/delete_session.py +13 -0
- stonepy-0.1.0/src/stonepy/resources/session/log_on.py +20 -0
- stonepy-0.1.0/src/stonepy/resources/spread/__init__.py +21 -0
- stonepy-0.1.0/src/stonepy/resources/spread/_sync/list_spread_markets.py +37 -0
- stonepy-0.1.0/src/stonepy/resources/spread/list_spread_markets.py +36 -0
- stonepy-0.1.0/src/stonepy/resources/user_account/__init__.py +35 -0
- stonepy-0.1.0/src/stonepy/resources/user_account/_sync/get_client_and_trading_account.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/user_account/_sync/save_account_information.py +19 -0
- stonepy-0.1.0/src/stonepy/resources/user_account/get_client_and_trading_account.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/user_account/save_account_information.py +18 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/__init__.py +39 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/_sync/delete_watchlist.py +16 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/_sync/get_watchlists.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/_sync/get_watchlists_list.py +27 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/_sync/save_watchlist.py +14 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/delete_watchlist.py +15 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/get_watchlists.py +13 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/get_watchlists_list.py +26 -0
- stonepy-0.1.0/src/stonepy/resources/watchlist/save_watchlist.py +13 -0
stonepy-0.1.0/.gitignore
ADDED
stonepy-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Aaron Morgan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
stonepy-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: stonepy
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python client for the StoneX (CIAPI) v2 trading API
|
|
5
|
+
Project-URL: Homepage, https://github.com/aaronmgn/stonepy
|
|
6
|
+
Project-URL: Repository, https://github.com/aaronmgn/stonepy
|
|
7
|
+
Project-URL: Issues, https://github.com/aaronmgn/stonepy/issues
|
|
8
|
+
Author-email: Aaron Morgan <aaron@dvops.io>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ciapi,cityindex,stonex,trading
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: httpx<1.0,>=0.27
|
|
22
|
+
Requires-Dist: pydantic<3.0,>=2.7
|
|
23
|
+
Requires-Dist: simplejson<4.0,>=3.19
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
26
|
+
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
29
|
+
Requires-Dist: respx>=0.21; extra == 'dev'
|
|
30
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
31
|
+
Requires-Dist: twine>=5; extra == 'dev'
|
|
32
|
+
Requires-Dist: types-simplejson; extra == 'dev'
|
|
33
|
+
Requires-Dist: unasync>=0.6; extra == 'dev'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# stonepy
|
|
37
|
+
|
|
38
|
+
Python client for the StoneX (CIAPI) v2 trading API.
|
|
39
|
+
|
|
40
|
+
## Installation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install stonepy
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Requires Python >= 3.11.
|
|
47
|
+
|
|
48
|
+
## Quickstart
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
from stonepy import ClientConfig, StoneXClient
|
|
52
|
+
from stonepy.models import ApiLogOnRequestDTO
|
|
53
|
+
|
|
54
|
+
config = ClientConfig(base_url="https://ciapi.cityindex.com/TradingAPI")
|
|
55
|
+
|
|
56
|
+
with StoneXClient(config) as client:
|
|
57
|
+
session = client.session.log_on(
|
|
58
|
+
ApiLogOnRequestDTO(
|
|
59
|
+
UserName="username",
|
|
60
|
+
Password="password",
|
|
61
|
+
AppKey="app-key",
|
|
62
|
+
AppVersion="stonepy",
|
|
63
|
+
AppComments="",
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
print(session.status_code)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Environment-based configuration is also available:
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from stonepy import ClientConfig, StoneXClient
|
|
73
|
+
|
|
74
|
+
config = ClientConfig.from_env()
|
|
75
|
+
|
|
76
|
+
with StoneXClient(config) as client:
|
|
77
|
+
print(client.session)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`ClientConfig.from_env()` reads `STONEX_BASE_URL`, `STONEX_APP_KEY`, `STONEX_USERNAME`,
|
|
81
|
+
and `STONEX_PASSWORD`. `STONEX_BASE_URL` is required unless `base_url=` is passed.
|
|
82
|
+
|
|
83
|
+
## Authentication and Sessions
|
|
84
|
+
|
|
85
|
+
Calling `client.session.log_on(...)` establishes the authenticated session token that the
|
|
86
|
+
client attaches to every subsequent request. The token is held by the client for the life of
|
|
87
|
+
its context manager.
|
|
88
|
+
|
|
89
|
+
If you supply `app_key`, `username`, and `password` on `ClientConfig` (directly or via
|
|
90
|
+
`ClientConfig.from_env()`), the client also refreshes the session automatically: it
|
|
91
|
+
re-authenticates in the background before the token expires, controlled by
|
|
92
|
+
`ClientConfig.proactive_refresh_seconds` (default `1080.0`, i.e. 18 minutes), and transparently
|
|
93
|
+
re-logs-on if a request is rejected with an expired-session error. Without those credentials you
|
|
94
|
+
must call `log_on` yourself and manage re-authentication.
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
config = ClientConfig(
|
|
98
|
+
base_url="https://ciapi.cityindex.com/TradingAPI",
|
|
99
|
+
app_key="app-key",
|
|
100
|
+
username="username",
|
|
101
|
+
password="password",
|
|
102
|
+
) # credentials present -> automatic proactive session refresh
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Async Usage
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from stonepy import AsyncStoneXClient, ClientConfig
|
|
109
|
+
from stonepy.models import ApiLogOnRequestDTO
|
|
110
|
+
|
|
111
|
+
config = ClientConfig(base_url="https://ciapi.cityindex.com/TradingAPI")
|
|
112
|
+
|
|
113
|
+
async with AsyncStoneXClient(config) as client:
|
|
114
|
+
session = await client.session.log_on(
|
|
115
|
+
ApiLogOnRequestDTO(
|
|
116
|
+
UserName="username",
|
|
117
|
+
Password="password",
|
|
118
|
+
AppKey="app-key",
|
|
119
|
+
AppVersion="stonepy",
|
|
120
|
+
AppComments="",
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
print(session.status_code)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Use `aclose()` for async clients when not using `async with`; use `close()` for sync clients.
|
|
127
|
+
|
|
128
|
+
## Error Handling
|
|
129
|
+
|
|
130
|
+
All library exceptions inherit from `StoneXError`.
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
from stonepy import RateLimitError, StoneXAPIError, StoneXError, StoneXClient
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
with StoneXClient(config) as client:
|
|
137
|
+
client.order.list_active_orders(request_dto)
|
|
138
|
+
except RateLimitError as exc:
|
|
139
|
+
print(exc.retry_after)
|
|
140
|
+
except StoneXAPIError as exc:
|
|
141
|
+
print(exc.http_status, exc.error_code, exc.error_message)
|
|
142
|
+
except StoneXError as exc:
|
|
143
|
+
print(exc)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Important subclasses include `AuthenticationError`, `RateLimitError`,
|
|
147
|
+
`OrderRejectedError`, `ResponseParseError`, `StoneXAPIError`, and `TransportError`.
|
|
148
|
+
|
|
149
|
+
## Pagination
|
|
150
|
+
|
|
151
|
+
Paginated API methods return the page DTO documented by StoneX. For example,
|
|
152
|
+
`client.market.list_market_search_paginated(...)` accepts `page`, `page_size`, and
|
|
153
|
+
`order_by` keyword arguments and returns `ListMarketSearchPaginatedResponseDTO`:
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
page = client.market.list_market_search_paginated(
|
|
157
|
+
"gold",
|
|
158
|
+
search_by_market_code=False,
|
|
159
|
+
search_by_market_name=True,
|
|
160
|
+
spread_product_type=True,
|
|
161
|
+
cfd_product_type=True,
|
|
162
|
+
binary_product_type=False,
|
|
163
|
+
ascending_order=True,
|
|
164
|
+
include_options=False,
|
|
165
|
+
client_account_id=12345,
|
|
166
|
+
page=0,
|
|
167
|
+
page_size=100,
|
|
168
|
+
)
|
|
169
|
+
print(page.total_number_of_results)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## API Reference
|
|
173
|
+
|
|
174
|
+
See `docs/API_REFERENCE.md` for the public package surface and links to the upstream StoneX
|
|
175
|
+
CIAPI v2 documentation.
|
|
176
|
+
|
|
177
|
+
## Development
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
uv venv
|
|
181
|
+
uv sync --extra dev
|
|
182
|
+
uv run pytest -q
|
|
183
|
+
uv run ruff check .
|
|
184
|
+
uv run ruff format --check .
|
|
185
|
+
uv run mypy
|
|
186
|
+
```
|
stonepy-0.1.0/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# stonepy
|
|
2
|
+
|
|
3
|
+
Python client for the StoneX (CIAPI) v2 trading API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install stonepy
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires Python >= 3.11.
|
|
12
|
+
|
|
13
|
+
## Quickstart
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from stonepy import ClientConfig, StoneXClient
|
|
17
|
+
from stonepy.models import ApiLogOnRequestDTO
|
|
18
|
+
|
|
19
|
+
config = ClientConfig(base_url="https://ciapi.cityindex.com/TradingAPI")
|
|
20
|
+
|
|
21
|
+
with StoneXClient(config) as client:
|
|
22
|
+
session = client.session.log_on(
|
|
23
|
+
ApiLogOnRequestDTO(
|
|
24
|
+
UserName="username",
|
|
25
|
+
Password="password",
|
|
26
|
+
AppKey="app-key",
|
|
27
|
+
AppVersion="stonepy",
|
|
28
|
+
AppComments="",
|
|
29
|
+
)
|
|
30
|
+
)
|
|
31
|
+
print(session.status_code)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Environment-based configuration is also available:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from stonepy import ClientConfig, StoneXClient
|
|
38
|
+
|
|
39
|
+
config = ClientConfig.from_env()
|
|
40
|
+
|
|
41
|
+
with StoneXClient(config) as client:
|
|
42
|
+
print(client.session)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`ClientConfig.from_env()` reads `STONEX_BASE_URL`, `STONEX_APP_KEY`, `STONEX_USERNAME`,
|
|
46
|
+
and `STONEX_PASSWORD`. `STONEX_BASE_URL` is required unless `base_url=` is passed.
|
|
47
|
+
|
|
48
|
+
## Authentication and Sessions
|
|
49
|
+
|
|
50
|
+
Calling `client.session.log_on(...)` establishes the authenticated session token that the
|
|
51
|
+
client attaches to every subsequent request. The token is held by the client for the life of
|
|
52
|
+
its context manager.
|
|
53
|
+
|
|
54
|
+
If you supply `app_key`, `username`, and `password` on `ClientConfig` (directly or via
|
|
55
|
+
`ClientConfig.from_env()`), the client also refreshes the session automatically: it
|
|
56
|
+
re-authenticates in the background before the token expires, controlled by
|
|
57
|
+
`ClientConfig.proactive_refresh_seconds` (default `1080.0`, i.e. 18 minutes), and transparently
|
|
58
|
+
re-logs-on if a request is rejected with an expired-session error. Without those credentials you
|
|
59
|
+
must call `log_on` yourself and manage re-authentication.
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
config = ClientConfig(
|
|
63
|
+
base_url="https://ciapi.cityindex.com/TradingAPI",
|
|
64
|
+
app_key="app-key",
|
|
65
|
+
username="username",
|
|
66
|
+
password="password",
|
|
67
|
+
) # credentials present -> automatic proactive session refresh
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Async Usage
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
from stonepy import AsyncStoneXClient, ClientConfig
|
|
74
|
+
from stonepy.models import ApiLogOnRequestDTO
|
|
75
|
+
|
|
76
|
+
config = ClientConfig(base_url="https://ciapi.cityindex.com/TradingAPI")
|
|
77
|
+
|
|
78
|
+
async with AsyncStoneXClient(config) as client:
|
|
79
|
+
session = await client.session.log_on(
|
|
80
|
+
ApiLogOnRequestDTO(
|
|
81
|
+
UserName="username",
|
|
82
|
+
Password="password",
|
|
83
|
+
AppKey="app-key",
|
|
84
|
+
AppVersion="stonepy",
|
|
85
|
+
AppComments="",
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
print(session.status_code)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Use `aclose()` for async clients when not using `async with`; use `close()` for sync clients.
|
|
92
|
+
|
|
93
|
+
## Error Handling
|
|
94
|
+
|
|
95
|
+
All library exceptions inherit from `StoneXError`.
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
from stonepy import RateLimitError, StoneXAPIError, StoneXError, StoneXClient
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
with StoneXClient(config) as client:
|
|
102
|
+
client.order.list_active_orders(request_dto)
|
|
103
|
+
except RateLimitError as exc:
|
|
104
|
+
print(exc.retry_after)
|
|
105
|
+
except StoneXAPIError as exc:
|
|
106
|
+
print(exc.http_status, exc.error_code, exc.error_message)
|
|
107
|
+
except StoneXError as exc:
|
|
108
|
+
print(exc)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Important subclasses include `AuthenticationError`, `RateLimitError`,
|
|
112
|
+
`OrderRejectedError`, `ResponseParseError`, `StoneXAPIError`, and `TransportError`.
|
|
113
|
+
|
|
114
|
+
## Pagination
|
|
115
|
+
|
|
116
|
+
Paginated API methods return the page DTO documented by StoneX. For example,
|
|
117
|
+
`client.market.list_market_search_paginated(...)` accepts `page`, `page_size`, and
|
|
118
|
+
`order_by` keyword arguments and returns `ListMarketSearchPaginatedResponseDTO`:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
page = client.market.list_market_search_paginated(
|
|
122
|
+
"gold",
|
|
123
|
+
search_by_market_code=False,
|
|
124
|
+
search_by_market_name=True,
|
|
125
|
+
spread_product_type=True,
|
|
126
|
+
cfd_product_type=True,
|
|
127
|
+
binary_product_type=False,
|
|
128
|
+
ascending_order=True,
|
|
129
|
+
include_options=False,
|
|
130
|
+
client_account_id=12345,
|
|
131
|
+
page=0,
|
|
132
|
+
page_size=100,
|
|
133
|
+
)
|
|
134
|
+
print(page.total_number_of_results)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## API Reference
|
|
138
|
+
|
|
139
|
+
See `docs/API_REFERENCE.md` for the public package surface and links to the upstream StoneX
|
|
140
|
+
CIAPI v2 documentation.
|
|
141
|
+
|
|
142
|
+
## Development
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uv venv
|
|
146
|
+
uv sync --extra dev
|
|
147
|
+
uv run pytest -q
|
|
148
|
+
uv run ruff check .
|
|
149
|
+
uv run ruff format --check .
|
|
150
|
+
uv run mypy
|
|
151
|
+
```
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "stonepy"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "Python client for the StoneX (CIAPI) v2 trading API"
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
license-files = ["LICENSE"]
|
|
9
|
+
authors = [{ name = "Aaron Morgan", email = "aaron@dvops.io" }]
|
|
10
|
+
keywords = ["stonex", "ciapi", "trading", "cityindex"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 3 - Alpha",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.11",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Typing :: Typed",
|
|
20
|
+
]
|
|
21
|
+
dependencies = ["httpx>=0.27,<1.0", "pydantic>=2.7,<3.0", "simplejson>=3.19,<4.0"]
|
|
22
|
+
|
|
23
|
+
[project.urls]
|
|
24
|
+
Homepage = "https://github.com/aaronmgn/stonepy"
|
|
25
|
+
Repository = "https://github.com/aaronmgn/stonepy"
|
|
26
|
+
Issues = "https://github.com/aaronmgn/stonepy/issues"
|
|
27
|
+
|
|
28
|
+
[project.optional-dependencies]
|
|
29
|
+
dev = [
|
|
30
|
+
"pytest>=8",
|
|
31
|
+
"pytest-cov>=5",
|
|
32
|
+
"respx>=0.21",
|
|
33
|
+
"mypy>=1.10",
|
|
34
|
+
"ruff>=0.5",
|
|
35
|
+
"unasync>=0.6",
|
|
36
|
+
"pre-commit>=3.7",
|
|
37
|
+
"types-simplejson",
|
|
38
|
+
"twine>=5",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[build-system]
|
|
42
|
+
requires = ["hatchling"]
|
|
43
|
+
build-backend = "hatchling.build"
|
|
44
|
+
|
|
45
|
+
[tool.hatch.version]
|
|
46
|
+
path = "src/stonepy/__init__.py"
|
|
47
|
+
|
|
48
|
+
[tool.hatch.build.targets.wheel]
|
|
49
|
+
packages = ["src/stonepy"]
|
|
50
|
+
|
|
51
|
+
[tool.hatch.build.targets.wheel.force-include]
|
|
52
|
+
"src/stonepy/py.typed" = "stonepy/py.typed"
|
|
53
|
+
|
|
54
|
+
[tool.hatch.build.targets.sdist]
|
|
55
|
+
include = ["src/stonepy", "README.md", "LICENSE", "CHANGELOG.md", "pyproject.toml"]
|
|
56
|
+
|
|
57
|
+
[tool.ruff]
|
|
58
|
+
line-length = 100
|
|
59
|
+
target-version = "py311"
|
|
60
|
+
|
|
61
|
+
[tool.ruff.lint]
|
|
62
|
+
select = ["E", "F", "I", "UP", "B", "SIM"]
|
|
63
|
+
|
|
64
|
+
[tool.mypy]
|
|
65
|
+
python_version = "3.11"
|
|
66
|
+
strict = true
|
|
67
|
+
files = ["src", "tests"]
|
|
68
|
+
|
|
69
|
+
[tool.pytest.ini_options]
|
|
70
|
+
addopts = "-q"
|
|
71
|
+
testpaths = ["tests"]
|
|
72
|
+
|
|
73
|
+
[tool.coverage.run]
|
|
74
|
+
source = ["src/stonepy"]
|
|
75
|
+
omit = [
|
|
76
|
+
"src/stonepy/models/*",
|
|
77
|
+
"src/stonepy/resources/*/_sync/*",
|
|
78
|
+
"src/stonepy/resources/*/__init__.py",
|
|
79
|
+
]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from stonepy._core.config import ClientConfig
|
|
2
|
+
from stonepy._core.errors import (
|
|
3
|
+
AuthenticationError,
|
|
4
|
+
OrderRejectedError,
|
|
5
|
+
RateLimitError,
|
|
6
|
+
ResponseParseError,
|
|
7
|
+
StoneXAPIError,
|
|
8
|
+
StoneXError,
|
|
9
|
+
TransportError,
|
|
10
|
+
)
|
|
11
|
+
from stonepy.client import AsyncStoneXClient, StoneXClient
|
|
12
|
+
|
|
13
|
+
__version__ = "0.1.0"
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"AsyncStoneXClient",
|
|
17
|
+
"AuthenticationError",
|
|
18
|
+
"ClientConfig",
|
|
19
|
+
"OrderRejectedError",
|
|
20
|
+
"RateLimitError",
|
|
21
|
+
"ResponseParseError",
|
|
22
|
+
"StoneXAPIError",
|
|
23
|
+
"StoneXClient",
|
|
24
|
+
"StoneXError",
|
|
25
|
+
"TransportError",
|
|
26
|
+
"__version__",
|
|
27
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Clock abstraction so timing logic is testable with a fake clock."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import time
|
|
7
|
+
from typing import Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Clock(Protocol):
|
|
11
|
+
def now(self) -> float: ...
|
|
12
|
+
def sleep(self, seconds: float) -> None: ...
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@runtime_checkable
|
|
16
|
+
class AsyncClock(Clock, Protocol):
|
|
17
|
+
async def asleep(self, seconds: float) -> None: ...
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SystemClock:
|
|
21
|
+
def now(self) -> float:
|
|
22
|
+
return time.monotonic()
|
|
23
|
+
|
|
24
|
+
def sleep(self, seconds: float) -> None:
|
|
25
|
+
if seconds > 0:
|
|
26
|
+
time.sleep(seconds)
|
|
27
|
+
|
|
28
|
+
async def asleep(self, seconds: float) -> None:
|
|
29
|
+
if seconds > 0:
|
|
30
|
+
await asyncio.sleep(seconds)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class FakeClock:
|
|
34
|
+
def __init__(self) -> None:
|
|
35
|
+
self._t = 0.0
|
|
36
|
+
|
|
37
|
+
def now(self) -> float:
|
|
38
|
+
return self._t
|
|
39
|
+
|
|
40
|
+
def sleep(self, seconds: float) -> None:
|
|
41
|
+
self._t += max(0.0, seconds)
|
|
42
|
+
|
|
43
|
+
async def asleep(self, seconds: float) -> None:
|
|
44
|
+
self.sleep(seconds)
|
|
45
|
+
|
|
46
|
+
def advance(self, seconds: float) -> None:
|
|
47
|
+
if seconds < 0:
|
|
48
|
+
raise ValueError("seconds must be non-negative")
|
|
49
|
+
self._t += seconds
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Decimal-safe JSON and WCF (`/Date(ms)/`) date handling."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
from datetime import UTC, datetime, timedelta
|
|
8
|
+
from decimal import Decimal
|
|
9
|
+
from typing import Annotated, Any, NoReturn, TypeAlias
|
|
10
|
+
|
|
11
|
+
import simplejson
|
|
12
|
+
from pydantic import BeforeValidator, PlainSerializer
|
|
13
|
+
|
|
14
|
+
WCF_MINVALUE_MS = -62135596800000
|
|
15
|
+
_WCF_RE = re.compile(r"\\?/Date\((-?\d+)(?:[+-]\d{4})?\)\\?/")
|
|
16
|
+
_UTC_EPOCH = datetime(1970, 1, 1, tzinfo=UTC)
|
|
17
|
+
_MS_PER_DAY = 86_400_000
|
|
18
|
+
_MS_PER_SECOND = 1_000
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _ensure_timezone_aware(value: datetime) -> datetime:
|
|
22
|
+
if value.utcoffset() is None:
|
|
23
|
+
raise ValueError("datetime must be timezone-aware")
|
|
24
|
+
return value
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def parse_wcf_date(value: Any) -> datetime | None:
|
|
28
|
+
if value is None:
|
|
29
|
+
return None
|
|
30
|
+
if isinstance(value, datetime):
|
|
31
|
+
return _ensure_timezone_aware(value)
|
|
32
|
+
if isinstance(value, bool):
|
|
33
|
+
raise ValueError(f"not a WCF date: {value!r}")
|
|
34
|
+
if isinstance(value, int):
|
|
35
|
+
ms = value
|
|
36
|
+
elif isinstance(value, str):
|
|
37
|
+
m = _WCF_RE.fullmatch(value)
|
|
38
|
+
if not m:
|
|
39
|
+
raise ValueError(f"not a WCF date: {value!r}")
|
|
40
|
+
ms = int(m.group(1))
|
|
41
|
+
else:
|
|
42
|
+
raise ValueError(f"not a WCF date: {value!r}")
|
|
43
|
+
if ms == WCF_MINVALUE_MS:
|
|
44
|
+
return None
|
|
45
|
+
try:
|
|
46
|
+
return _UTC_EPOCH + timedelta(milliseconds=ms)
|
|
47
|
+
except OverflowError as exc:
|
|
48
|
+
raise ValueError(f"WCF date out of range: {value!r}") from exc
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def format_wcf_date(value: datetime | None) -> str | None:
|
|
52
|
+
if value is None:
|
|
53
|
+
return None
|
|
54
|
+
aware_value = _ensure_timezone_aware(value)
|
|
55
|
+
delta = aware_value.astimezone(UTC) - _UTC_EPOCH
|
|
56
|
+
ms = (
|
|
57
|
+
delta.days * _MS_PER_DAY
|
|
58
|
+
+ delta.seconds * _MS_PER_SECOND
|
|
59
|
+
+ delta.microseconds // _MS_PER_SECOND
|
|
60
|
+
)
|
|
61
|
+
return f"/Date({ms})/"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
StoneXDateTime: TypeAlias = Annotated[
|
|
65
|
+
datetime | None,
|
|
66
|
+
BeforeValidator(parse_wcf_date),
|
|
67
|
+
PlainSerializer(format_wcf_date, when_used="always"),
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _reject_nonfinite_decimals(value: Any) -> None:
|
|
72
|
+
if isinstance(value, Decimal):
|
|
73
|
+
if not value.is_finite():
|
|
74
|
+
raise ValueError("non-finite Decimal values are not valid JSON")
|
|
75
|
+
elif isinstance(value, dict):
|
|
76
|
+
for key, item in value.items():
|
|
77
|
+
_reject_nonfinite_decimals(key)
|
|
78
|
+
_reject_nonfinite_decimals(item)
|
|
79
|
+
elif isinstance(value, (list, tuple)):
|
|
80
|
+
for item in value:
|
|
81
|
+
_reject_nonfinite_decimals(item)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _reject_json_constant(value: str) -> NoReturn:
|
|
85
|
+
raise ValueError(f"non-finite JSON constant is not allowed: {value}")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def dumps(obj: Any) -> str:
|
|
89
|
+
_reject_nonfinite_decimals(obj)
|
|
90
|
+
return simplejson.dumps(obj, use_decimal=True, allow_nan=False, separators=(",", ":"))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def loads(text: str | bytes) -> Any:
|
|
94
|
+
if isinstance(text, bytes):
|
|
95
|
+
text = text.decode("utf-8")
|
|
96
|
+
return json.loads(text, parse_float=Decimal, parse_constant=_reject_json_constant)
|