architect-py 5.0.0b3__py3-none-any.whl → 5.1.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. architect_py/__init__.py +432 -5
  2. architect_py/async_client.py +72 -38
  3. architect_py/client.py +11 -4
  4. architect_py/client.pyi +504 -0
  5. architect_py/common_types/__init__.py +2 -1
  6. architect_py/common_types/time_in_force.py +94 -0
  7. architect_py/common_types/tradable_product.py +9 -0
  8. architect_py/graphql_client/__init__.py +1 -216
  9. architect_py/graphql_client/client.py +2 -1043
  10. architect_py/graphql_client/enums.py +0 -72
  11. architect_py/graphql_client/fragments.py +4 -152
  12. architect_py/grpc/__init__.py +0 -143
  13. architect_py/grpc/client.py +6 -1
  14. architect_py/grpc/models/Core/RestartCptyRequest.py +40 -0
  15. architect_py/grpc/models/Core/RestartCptyResponse.py +20 -0
  16. architect_py/grpc/models/Marketdata/Liquidation.py +0 -1
  17. architect_py/grpc/models/Marketdata/TickersRequest.py +38 -12
  18. architect_py/grpc/models/Marketdata/Trade.py +0 -1
  19. architect_py/grpc/models/Oms/Order.py +33 -24
  20. architect_py/grpc/models/Oms/PlaceOrderRequest.py +33 -24
  21. architect_py/grpc/models/__init__.py +113 -2
  22. architect_py/grpc/models/definitions.py +2 -32
  23. architect_py/grpc/utils.py +1 -4
  24. architect_py/tests/test_order_entry.py +1 -2
  25. architect_py/tests/test_orderflow.py +1 -1
  26. architect_py/utils/pandas.py +4 -3
  27. architect_py-5.1.0b1.dist-info/METADATA +66 -0
  28. {architect_py-5.0.0b3.dist-info → architect_py-5.1.0b1.dist-info}/RECORD +47 -66
  29. {architect_py-5.0.0b3.dist-info → architect_py-5.1.0b1.dist-info}/WHEEL +1 -1
  30. examples/book_subscription.py +1 -2
  31. examples/candles.py +1 -3
  32. examples/common.py +1 -2
  33. examples/external_cpty.py +2 -2
  34. examples/funding_rate_mean_reversion_algo.py +9 -6
  35. examples/order_sending.py +27 -7
  36. examples/stream_l1_marketdata.py +1 -2
  37. examples/stream_l2_marketdata.py +1 -2
  38. examples/trades.py +1 -2
  39. examples/tutorial_async.py +5 -7
  40. examples/tutorial_sync.py +5 -6
  41. scripts/add_imports_to_inits.py +146 -0
  42. scripts/correct_sync_interface.py +143 -0
  43. scripts/postprocess_grpc.py +57 -11
  44. scripts/preprocess_grpc_schema.py +2 -0
  45. scripts/prune_graphql_schema.py +187 -0
  46. architect_py/client_interface.py +0 -63
  47. architect_py/common_types/scalars.py +0 -25
  48. architect_py/graphql_client/cancel_all_orders_mutation.py +0 -17
  49. architect_py/graphql_client/cancel_order_mutation.py +0 -23
  50. architect_py/graphql_client/create_jwt.py +0 -17
  51. architect_py/graphql_client/get_account_history_query.py +0 -27
  52. architect_py/graphql_client/get_account_query.py +0 -23
  53. architect_py/graphql_client/get_account_summaries_query.py +0 -27
  54. architect_py/graphql_client/get_account_summary_query.py +0 -25
  55. architect_py/graphql_client/get_candle_snapshot_query.py +0 -27
  56. architect_py/graphql_client/get_fills_query.py +0 -69
  57. architect_py/graphql_client/get_historical_orders_query.py +0 -27
  58. architect_py/graphql_client/get_l_1_book_snapshot_query.py +0 -21
  59. architect_py/graphql_client/get_l_1_book_snapshots_query.py +0 -23
  60. architect_py/graphql_client/get_l_2_book_snapshot_query.py +0 -25
  61. architect_py/graphql_client/get_market_status_query.py +0 -25
  62. architect_py/graphql_client/get_open_orders_query.py +0 -25
  63. architect_py/graphql_client/list_accounts_query.py +0 -23
  64. architect_py/graphql_client/place_order_mutation.py +0 -23
  65. architect_py/graphql_client/subscribe_candles.py +0 -16
  66. architect_py/graphql_client/subscribe_orderflow.py +0 -100
  67. architect_py/graphql_client/subscribe_trades.py +0 -27
  68. architect_py/graphql_client/user_email_query.py +0 -17
  69. architect_py/internal_utils/__init__.py +0 -0
  70. architect_py/internal_utils/no_pandas.py +0 -3
  71. architect_py-5.0.0b3.dist-info/METADATA +0 -123
  72. scripts/generate_sync_interface.py +0 -226
  73. {architect_py-5.0.0b3.dist-info → architect_py-5.1.0b1.dist-info}/licenses/LICENSE +0 -0
  74. {architect_py-5.0.0b3.dist-info → architect_py-5.1.0b1.dist-info}/top_level.txt +0 -0
@@ -1,55 +1,34 @@
1
- architect_py/__init__.py,sha256=rq7taTogU0hlt8SA9e2p-CRbRhPJyJ2rrCegrThZRdA,318
2
- architect_py/async_client.py,sha256=Ea1Y3ITTeDrXt9H3Ch9gq2jDNRpeHvgP8zzLRI3Z43g,57586
3
- architect_py/client.py,sha256=bpFpYAtLhSPKoCG3bb45GVW55l8iEdozhZefGjXdNc0,5857
4
- architect_py/client_interface.py,sha256=kYMat54f5YJZj8L5L0tG-Ijsanklot3VTxpNmpaYiQ0,5778
5
- architect_py/common_types/__init__.py,sha256=ghDsHR6cjJUVxIY80N_Q6QXhMBJ5JMdTyBQW1mdLnNs,143
1
+ architect_py/__init__.py,sha256=18bhau9o35uBVHpoQlkCgF0aT-qNHYCO3JJpWkDykjM,16077
2
+ architect_py/async_client.py,sha256=Re743h6J6Qax5TAwf8Rv3A1AYTaHTYmcI5y1x5q7Eh8,58787
3
+ architect_py/client.py,sha256=fpgE23nqB9GGsOyGdf0WRhVektOjso-qRm-XiQVF690,6048
4
+ architect_py/client.pyi,sha256=OTlM_F_zANNHKuWV0XNGvcM9vIeENaZjBLSa8VMQXiI,23050
5
+ architect_py/common_types/__init__.py,sha256=fzOdIlKGWVN9V2Onc5z1v2bpvtZ4H9RSFA9ymJcBi3k,197
6
6
  architect_py/common_types/order_dir.py,sha256=ebyWTcXzJWrotkc2D9wNGc6JXbE5I3NLLuAz3I7FTZ8,2191
7
- architect_py/common_types/scalars.py,sha256=YSgSXbw2ONMQF7w1JPY4NiFV2rIjLQNmIMafX57iHPo,919
8
- architect_py/common_types/tradable_product.py,sha256=wZ3HdQWV3P_k_nD964_Gn4LbAP2thNjTODBBiHjRzqA,1929
9
- architect_py/graphql_client/__init__.py,sha256=ANSbh6MKnlSvrVASTtu59qlHRbaHr9ogqrNLI34DLRE,8987
7
+ architect_py/common_types/time_in_force.py,sha256=lzGAQCm_BqJ0mlNdZfhHYcybbHhP-Uc7dlcxrrCwQRo,3051
8
+ architect_py/common_types/tradable_product.py,sha256=S4sFIvG13KA4SVqUI9w2smWwomqL6Qh0xIkvKAIxKH0,2131
9
+ architect_py/graphql_client/__init__.py,sha256=fTZjb1MbdYM80p9dCklWwu5T0c7C3KYMLLGGsF7ZGAA,2306
10
10
  architect_py/graphql_client/base_model.py,sha256=o2d-DixASFCGztr3rTiGX0AwgFu7Awr7EgD70FI8a-I,620
11
- architect_py/graphql_client/cancel_all_orders_mutation.py,sha256=h8S_lUy7rdSu1UgcUloiX2CCnuPIDaPCmfL2X2MOq8Y,352
12
- architect_py/graphql_client/cancel_order_mutation.py,sha256=FGCNrbLFmPXAYQ1vmpGC44viu2K2lZSCtXiO3O214ic,499
13
- architect_py/graphql_client/client.py,sha256=2umynBj67CiQg8PDt4o8S6GAu4eYecxtk5-i_068hLg,43266
14
- architect_py/graphql_client/create_jwt.py,sha256=PiiOOjGnHLXro8AU7FSu_vQA_adEK1iZM6XAzHpJP5E,285
15
- architect_py/graphql_client/enums.py,sha256=ROE1yM0CFL0k2Jb9hUokSWlFPf1Sh9bbQLSrTSxX98Q,1532
11
+ architect_py/graphql_client/client.py,sha256=qsjGZG7M9KwGLL1f6dVLV8-r27vUIYA9al0IDJw4ugo,9976
12
+ architect_py/graphql_client/enums.py,sha256=DWXc19XsyY73AGwhZAMw-3XKxC4I6NYoLeW8F-lkYUw,158
16
13
  architect_py/graphql_client/exceptions.py,sha256=OQu-ZYCCV4VyMWTd1HR8gIjIK2CrA_JMlFxqOAJugWY,2411
17
- architect_py/graphql_client/fragments.py,sha256=Uj__FkVqkaSWeKZimw-_r7wxHZwgNBLfjXaTOlopLMM,6483
18
- architect_py/graphql_client/get_account_history_query.py,sha256=eRx07b_vAroTOMvIxnigtSguQ3GmGBL8l8veS-ABRAM,605
19
- architect_py/graphql_client/get_account_query.py,sha256=l3eUIFkWJXxDWDKmqltJC3qT0UcOlO4BPMRJZ24El8M,478
20
- architect_py/graphql_client/get_account_summaries_query.py,sha256=3ZKIvNFqb4xLOLYuMg4Z4ZGQGZAd7W31yBIyqgKkhbA,627
21
- architect_py/graphql_client/get_account_summary_query.py,sha256=15MgJMzNG8mmDd1-NFZK65E8vvR6LoMRe_5wwRBuXnE,574
22
- architect_py/graphql_client/get_candle_snapshot_query.py,sha256=KjY1gCkfVTIJ-JXmHc2CzHgi9LB51w66Lvc0qHZ-Bok,633
14
+ architect_py/graphql_client/fragments.py,sha256=BR943TWicChGO7NG7VPYuhPBOPevDuqbOWvu0im8F7s,1661
23
15
  architect_py/graphql_client/get_execution_info_query.py,sha256=SFrCAAI3nBOezy0uz7VViWcyLlDgfWjbjdR66-lqSF8,585
24
16
  architect_py/graphql_client/get_execution_infos_query.py,sha256=fa5_sVw2xghrZiX8uSDx5rPbbV4wW_XpE5LxeaTID78,627
25
- architect_py/graphql_client/get_fills_query.py,sha256=4CvsyULxPuDkHQgCuwB2ooIMnCqKmT1aX7gLL1KqbSE,2294
26
17
  architect_py/graphql_client/get_first_notice_date_query.py,sha256=YT9nzW0GihGwr3eQ1_NULnb68RezVnT3xUnQNYcDTn0,665
27
18
  architect_py/graphql_client/get_future_series_query.py,sha256=pRfdJ31gW2bxYotmXvll6PtwFz8K6eNAZSo3DYBj1jI,383
28
- architect_py/graphql_client/get_historical_orders_query.py,sha256=FwxWPICnnfvdcQ7zftOLiROWOvaCrBLEibtaLsG_bnk,609
29
- architect_py/graphql_client/get_l_1_book_snapshot_query.py,sha256=UVfuPb7Rw62S5xwyS2Z8ynpNzY8WKroEmyCcFQ-HUWg,501
30
- architect_py/graphql_client/get_l_1_book_snapshots_query.py,sha256=CejehYMtqbibcat8pO8CICZo3Vhl1N1zRaiPaJWMhVw,542
31
- architect_py/graphql_client/get_l_2_book_snapshot_query.py,sha256=paAIdFw-YWZEFrbD1YdidzgTIyYHuG3AUmxEn3x8oOM,590
32
- architect_py/graphql_client/get_market_status_query.py,sha256=0O5KqC1kgbB5uHqESmZ505ORE5SZdCZT7h2kI0riEVY,578
33
- architect_py/graphql_client/get_open_orders_query.py,sha256=23Qk_RwXrDK8Ub_r-ma3N_YYwm_FWnVjv7QKuVuZE5Y,517
34
19
  architect_py/graphql_client/get_product_info_query.py,sha256=oxDDx3J2jGSnNXQZw-lDHdzZO33XCOC0hpNSofjqKQ0,598
35
20
  architect_py/graphql_client/get_product_infos_query.py,sha256=vZImiKh19LCG0yKiw9aP9y1lnUgxgywW7whj1FeSnGk,601
36
21
  architect_py/graphql_client/input_types.py,sha256=6Obe-vvDm4TDgH3oRZUzbEvkbquaQOHYRK_62B1_0FA,57
37
22
  architect_py/graphql_client/juniper_base_client.py,sha256=njikUx3G2PLqYmx6PGhT_EHALUwD9EHlI2o4W1XMnMk,12609
38
- architect_py/graphql_client/list_accounts_query.py,sha256=C-CpCZfbIfrT_4KJbvQlLIRKQb2DWGQCNWYFJy-K87g,487
39
- architect_py/graphql_client/place_order_mutation.py,sha256=KG45qNafDPvbuy3gfrBtre1zdLanam_gBKMmdf6GtFs,486
40
23
  architect_py/graphql_client/search_symbols_query.py,sha256=hbGa6gF-gMWtRYQm2vlCTPDex8RWrJ4Yn4nT0VRQnCQ,614
41
- architect_py/graphql_client/subscribe_candles.py,sha256=IWc1Rjs8aAPR4nDhDe_IzMYRVjdSSy5k7MpvSsTIH6w,295
42
- architect_py/graphql_client/subscribe_orderflow.py,sha256=64GvkTUsHlkRFtZLa3NLnNs7kmGETxmS8zq6MF_5k8Q,3402
43
- architect_py/graphql_client/subscribe_trades.py,sha256=105LyG0kPvYHk_IsJaEjpEQh2AGP9Wqmp93Q8HF89BA,654
44
- architect_py/graphql_client/user_email_query.py,sha256=KDFLFfLW5YtAptBm6CMQ_dVpcuEBofv4XlaYkW-VmcA,305
45
24
  architect_py/graphql_client/user_id_query.py,sha256=tWKJJLgEINzd8e7rYlGklQCnwcwHzYFpCGQvhxQGX20,334
46
- architect_py/grpc/__init__.py,sha256=jn_7Gbf2xH0nWSqEu259sXWO-0keBbkRCJGLJmFGWVo,5412
47
- architect_py/grpc/client.py,sha256=sHNneD2kVBKdz4Y1j0VEekgME58UY5p76o5kPQiYtbU,3213
25
+ architect_py/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ architect_py/grpc/client.py,sha256=6NolGeMdIxEcx1R0ij_wWW-o1MspS_XqYE2TtQqaxsk,3343
48
27
  architect_py/grpc/resolve_endpoint.py,sha256=HnOYC7n7taeSdnGY5E4TCSArCuY2LTwsGOnt_YLh9vQ,2415
49
28
  architect_py/grpc/server.py,sha256=Abmdfe1eYbctVgzoJYBBBLpd7UD70FbYQLtJImSyRzs,1934
50
- architect_py/grpc/utils.py,sha256=0GV57DFY21ZNX1LWdoL-90W3ge_KuXymEH8bDRdvsfo,760
51
- architect_py/grpc/models/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
52
- architect_py/grpc/models/definitions.py,sha256=yiYTfHLLeZfvJLADrfI7HZ6iKlYNz95wOXtiAFgo_C8,76263
29
+ architect_py/grpc/utils.py,sha256=5sykLExUNZbcQHcxLCCM9DdOOiJJZcpputGrDtaMifY,667
30
+ architect_py/grpc/models/__init__.py,sha256=RrTLZvU7mNykDNp1oOm4-dekzab9ugIXd_my7Sm0Vx4,9153
31
+ architect_py/grpc/models/definitions.py,sha256=R7saySbcFH_OADDO-aWZqlJmF6hjWY-TxopDX_Mu3qk,75743
53
32
  architect_py/grpc/models/Accounts/AccountsRequest.py,sha256=1a88cltSebOb53EdJ0hKEGR7FlmBiibrCtGzLTKqDBY,1524
54
33
  architect_py/grpc/models/Accounts/AccountsResponse.py,sha256=DlXbkd3UbRybblBAfokw-K6nRvLNZgqz7cc0EKiW1zI,636
55
34
  architect_py/grpc/models/Accounts/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
@@ -81,6 +60,8 @@ architect_py/grpc/models/Boss/WithdrawalsResponse.py,sha256=th6r28rjNBUuMBs95lwf
81
60
  architect_py/grpc/models/Boss/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
82
61
  architect_py/grpc/models/Core/ConfigRequest.py,sha256=9taH97J4b-_Co7d-o_zHOPg_vckc_InvnADXYpd_MlM,809
83
62
  architect_py/grpc/models/Core/ConfigResponse.py,sha256=pQimTNwdE-FL2Z1Pq6_YRPmagt-ZgJoub9P1lpj0gVk,556
63
+ architect_py/grpc/models/Core/RestartCptyRequest.py,sha256=Hl_uSGkMFE9yPonClcNE24neeib8LP3fHH6UwpI_WSQ,916
64
+ architect_py/grpc/models/Core/RestartCptyResponse.py,sha256=aCyJfucfFGHieGURjEejeT9HPoaKJ2xCGPVqw5pcCJs,427
84
65
  architect_py/grpc/models/Core/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
85
66
  architect_py/grpc/models/Cpty/CptyRequest.py,sha256=eWBayFNnhAZgszneP7f6hDvzQ82JQrFLDSeOPAyiRlg,1711
86
67
  architect_py/grpc/models/Cpty/CptyResponse.py,sha256=UObbkmbtD3sWWklml4hx-Ggc1RaI1v1-J5QW9doWpe4,2865
@@ -113,7 +94,7 @@ architect_py/grpc/models/Marketdata/L1BookSnapshotsRequest.py,sha256=TFGnuPfTcHM
113
94
  architect_py/grpc/models/Marketdata/L2BookSnapshot.py,sha256=MEyDSZ6LfAtyujGLRZ6pts5o7UNIp8A9_kqV6K7Y-k8,2572
114
95
  architect_py/grpc/models/Marketdata/L2BookSnapshotRequest.py,sha256=9qRKbwY2KLtW2F-40XOvRfT73kVPTymL0Q3JCR2EbtU,1072
115
96
  architect_py/grpc/models/Marketdata/L2BookUpdate.py,sha256=i-kWdJZvAoYEI280TfC3sTH46VIpMoj8N2UxWAkTDLs,2602
116
- architect_py/grpc/models/Marketdata/Liquidation.py,sha256=5cSGGSIwvbr1bsk6-WBJ8tzBuCQAutGZkX5Av2apdDs,2447
97
+ architect_py/grpc/models/Marketdata/Liquidation.py,sha256=cLKfosZl0gdVuL3qoFuJ32UB7Xjk9vVhOxsoc_QNLEw,2420
117
98
  architect_py/grpc/models/Marketdata/MarketStatus.py,sha256=4Kt2z16t7dpjpiELWshJyyH1b-D07YdQchjGMvZkSRM,977
118
99
  architect_py/grpc/models/Marketdata/MarketStatusRequest.py,sha256=ajyI4UlvFusyM0743dukT4KFZTlp9iUh0lTGWl6n7nw,1056
119
100
  architect_py/grpc/models/Marketdata/SubscribeCandlesRequest.py,sha256=ck5pQx54uymlpR-jxFpxcW0LPDLU7R8GvqLqF-7GmoU,1508
@@ -127,9 +108,9 @@ architect_py/grpc/models/Marketdata/SubscribeTradesRequest.py,sha256=7P8FyNx6wij
127
108
  architect_py/grpc/models/Marketdata/Ticker.py,sha256=XOZbaSwCOyE8sDQi4aKA7jc39igXay63JCFOpeQN1Fo,11091
128
109
  architect_py/grpc/models/Marketdata/TickerRequest.py,sha256=Ay--5JKgCfdvlVWD2H6YSa_66NC3Dt6c-XK8JkbWhus,1008
129
110
  architect_py/grpc/models/Marketdata/TickerUpdate.py,sha256=sJ4wvCeGckMV30HwAcAsEMQbCzjN31OxF19q70jdxok,437
130
- architect_py/grpc/models/Marketdata/TickersRequest.py,sha256=Hzjj3vIdLHI3Iyw3NcjDqUl4WElI8y6g3JNemF9hSQ8,1438
111
+ architect_py/grpc/models/Marketdata/TickersRequest.py,sha256=_BYkOO2pk-terLNwyxN8gtHQxIrfPA7klodDeTS5ouM,2200
131
112
  architect_py/grpc/models/Marketdata/TickersResponse.py,sha256=CLzKx-ItwH9-Qq8YruFhXh7TmtHwzNRMEOPJ9LQD9co,574
132
- architect_py/grpc/models/Marketdata/Trade.py,sha256=iJOEhcObcNa9SLVug3rjKnNxDuQRyOpxYQnGi1OA2Rw,2503
113
+ architect_py/grpc/models/Marketdata/Trade.py,sha256=RKZq_HUDLxIE41caDrwf99V0c48kH2pm3XRCn5RLcEQ,2476
133
114
  architect_py/grpc/models/Marketdata/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
134
115
  architect_py/grpc/models/Oms/Cancel.py,sha256=P550abgbBqVbC3UE7YaOaEytF__DsTYWsepNvkHaAQE,2357
135
116
  architect_py/grpc/models/Oms/CancelAllOrdersRequest.py,sha256=oCRbluj6nyoDCHQszPDRIBt4ygFyO7QHZhCf8T8-fYM,1474
@@ -137,10 +118,10 @@ architect_py/grpc/models/Oms/CancelAllOrdersResponse.py,sha256=YM1H_nrV4RhpLMEwS
137
118
  architect_py/grpc/models/Oms/CancelOrderRequest.py,sha256=0yJysCf0IcwUevEqVnAkIm-OkOAbp_vOwh1p1ljSsp8,1939
138
119
  architect_py/grpc/models/Oms/OpenOrdersRequest.py,sha256=5Uv9ndI2WqRJgOWNLeKcIV8czb0ff6wHUW0gokeBktg,1804
139
120
  architect_py/grpc/models/Oms/OpenOrdersResponse.py,sha256=HT4YXjbbwdp2rLLXxoetF33DGe2j403soMLme2p18ts,592
140
- architect_py/grpc/models/Oms/Order.py,sha256=VvWAy9cp3fnKIvjR_ZSTcUZ_-lKZ4EadScE9exdhV9Q,9696
121
+ architect_py/grpc/models/Oms/Order.py,sha256=wcLx5lK_xF3z99Ix1Q1j43Mjk4zvoyBGwgFuYmOB-5E,10257
141
122
  architect_py/grpc/models/Oms/PendingCancelsRequest.py,sha256=jdbBOpCHBlZFAZfF6urJZXXa5Dr5cTRR3AJ9ss4rY6E,1620
142
123
  architect_py/grpc/models/Oms/PendingCancelsResponse.py,sha256=mWRNRDa489Vdg-r7dJMOmfOO8l57yg8lBMynBDcY60A,628
143
- architect_py/grpc/models/Oms/PlaceOrderRequest.py,sha256=U1TJFpyVS5cRGrF-H78RifYkLWqSi1yY7cddbsLSUgI,7732
124
+ architect_py/grpc/models/Oms/PlaceOrderRequest.py,sha256=se2iSEC_TrL5y-m_CRJkk9jsYLFOGnE57QFwz4Dqtck,8317
144
125
  architect_py/grpc/models/Oms/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
145
126
  architect_py/grpc/models/OptionsMarketdata/OptionsChain.py,sha256=8Sdp57aUXlW13X1POlBKxxaEZofwRZ7VGDLzq1l9GoU,732
146
127
  architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py,sha256=Jhb5CM4t84EdETDO3SOakHkuaWG30Dm4lREpKgBFzFM,742
@@ -172,43 +153,43 @@ architect_py/grpc/models/Symbology/UploadProductCatalogResponse.py,sha256=AiUFNc
172
153
  architect_py/grpc/models/Symbology/UploadSymbologyRequest.py,sha256=XRMC6W6LLG0dyAU54RitAD0p0dCZTs16NFxubK_WNI0,1840
173
154
  architect_py/grpc/models/Symbology/UploadSymbologyResponse.py,sha256=LM6iHjta4yZY784qMR5etG9gKjiBsBCntZqAcmaOHac,444
174
155
  architect_py/grpc/models/Symbology/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
175
- architect_py/internal_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
- architect_py/internal_utils/no_pandas.py,sha256=RFlzX85yjI7XnoWHutqvtYlzKVHw8DF2y-DyoeS_vys,44
177
156
  architect_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
157
  architect_py/tests/conftest.py,sha256=5CcEuqakcU-ZapywYZRcLI5y1GicrTeOxiEixt--R0w,3552
179
158
  architect_py/tests/test_book_building.py,sha256=biqs8X9bw1YSb6mrCDS-ELesdD-P5F6bE3MYXP0BeQ4,1236
180
159
  architect_py/tests/test_marketdata.py,sha256=mhYIiNhmsY706PQD3Nvto0l4uDl5dPHn8BcqGPgFCA8,4714
181
- architect_py/tests/test_order_entry.py,sha256=ytfvJVMsl6c0nyKP-oTwquxoOkrI57BlQsC6SKlWfSM,1193
182
- architect_py/tests/test_orderflow.py,sha256=_EN-Y1NM8171KHhZ41xUg8f5ZFO0-r2HGjIWOTTJZ9s,1051
160
+ architect_py/tests/test_order_entry.py,sha256=qRKWa4QvIlurZG96AK2CMF9dpRAKep9RquOuEAdAuRY,1148
161
+ architect_py/tests/test_orderflow.py,sha256=PRCr4Yzaif9OG0Eq1zxCUpTfFsHA3WEWSBiETRDvnIE,1038
183
162
  architect_py/tests/test_portfolio_management.py,sha256=LPlkLP2SllLPm0Un7OptfVo96uqiDI7-osTaHxH5m54,677
184
163
  architect_py/tests/test_rounding.py,sha256=cAQ1-tWOVgxENt0Fzs9YcFDdDDYmCtOHvAA_w76wy9g,1417
185
164
  architect_py/tests/test_symbology.py,sha256=892FN_FGwE8t4lVQtUMGKav69MGzHACeF5RAYrAEdBw,2707
186
165
  architect_py/utils/nearest_tick.py,sha256=i1cCGMSi-sP4Grbp0RCwEsoLzMWN9iC6gPMBm2daDWM,4810
187
166
  architect_py/utils/nearest_tick_2.py,sha256=f-o6b73Mo8epCIaOYBS9F0k_6UHUDSVG1N_VWg7iFBU,3641
188
167
  architect_py/utils/orderbook.py,sha256=JM02NhHbmK3sNaS2Ara8FBY4TvKvtMIzJW1oVd8KC3s,1004
189
- architect_py/utils/pandas.py,sha256=a8P_jKPIhDubAyUjdhKnFMasZM_m_sDGNx4fq5ONOpo,982
168
+ architect_py/utils/pandas.py,sha256=QHz2ynj4T92FobuzRaNoH3ypArHoSDCiGtZ3PVXJ2vo,1017
190
169
  architect_py/utils/price_bands.py,sha256=j7ioSA3dx025CD5E2Vg7XQvmjPvxQb-gzQBfQTovpTw,21874
191
170
  architect_py/utils/symbol_parsing.py,sha256=OjJzk2c6QU2s0aJMSyVEzlWD5Vy-RlakJVW7jNHVDJk,845
192
- architect_py-5.0.0b3.dist-info/licenses/LICENSE,sha256=6P0_5gYN8iPWPZeqA9nxiO3tRQmcSA1ijAVR7C8j1SI,11362
171
+ architect_py-5.1.0b1.dist-info/licenses/LICENSE,sha256=6P0_5gYN8iPWPZeqA9nxiO3tRQmcSA1ijAVR7C8j1SI,11362
193
172
  examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
- examples/book_subscription.py,sha256=jw629X6V0kpIQp2WBBUdBQ_O-lsR6zwnIH1AnyrrINQ,1507
195
- examples/candles.py,sha256=GKQcpsbMfG5gdgwinC1MdYNRGXjb629TFVWzu_raZ3I,850
196
- examples/common.py,sha256=ja1ePszgGhL4cgPW_mlaS_I7iDvX0vD7sSJ00EpTMi4,3031
197
- examples/external_cpty.py,sha256=x47tkdYeVoFuBmfura28BUu282097Pzv-WX_Z6ePgLo,2551
198
- examples/funding_rate_mean_reversion_algo.py,sha256=vkT0ehYOjb4S05pBycja6qWIpEjzHp3lpoXkg4ctkJc,6631
199
- examples/order_sending.py,sha256=agVwqkMCAUvzTu4rFd-cX6fYRajpltMRWXD65UYOm8c,2642
200
- examples/stream_l1_marketdata.py,sha256=WBaiRY5QNBu3p9EkOpL1FvWRyFuoQprSKETnm61QoHQ,774
201
- examples/stream_l2_marketdata.py,sha256=KGNnFoa2CMu3-iuEonjI6NJLWftTOf-zgUGO9cpRGVA,1137
202
- examples/trades.py,sha256=gQDZN5OmbHlfnlB7Zg4V8JCkB9LCABjUBeTv5_cq1CM,607
203
- examples/tutorial_async.py,sha256=jIaPonLpaovonEDjsbFOZQ_XxesqnXekqQsfIpc0u3k,2738
204
- examples/tutorial_sync.py,sha256=AXZnTfr14ppWjH8s11BtWOwqb4W3yVyRgFFVP9xPWec,2881
173
+ examples/book_subscription.py,sha256=eyXEt23dTyyArXt7N7C-XdRmLFSdZSntOYZaL0W-PBU,1440
174
+ examples/candles.py,sha256=AicLj6d-yUVbZVX-mQUBJkI6KEoJeC-BErvxD9-8Z8Y,735
175
+ examples/common.py,sha256=K2ppu4vdlTNsL1oX5RDrNKczljfPVOTPzDia1Abrppg,2987
176
+ examples/external_cpty.py,sha256=xxGXONXwoWIS8ys0SgxHLSmntAi1BlwV2NR9WD1kvpc,2527
177
+ examples/funding_rate_mean_reversion_algo.py,sha256=iP3bghdYMzERfaJMs_QJZ-e3SUVhLgHLNPvOf2sDkIQ,6482
178
+ examples/order_sending.py,sha256=2Wple0qOe1I-9c8nTX9xtOuMjIvPydIezUfn6LQnWlE,3290
179
+ examples/stream_l1_marketdata.py,sha256=Oi7ovb0i4hTdWfkhcRYUJLW5Ou64JxWzZMGhqSL8f_I,707
180
+ examples/stream_l2_marketdata.py,sha256=e5d0z4Hft3X51oZsPwJbb_5VG2iDfCMlbbFv3qOkma4,1070
181
+ examples/trades.py,sha256=AGKX8g7Xaf5r-KPWEeeAfL7XxoVeh8WsZvaWW5kBuMg,540
182
+ examples/tutorial_async.py,sha256=HTh2iVJOlXckenWRJxYxp8awhNGBiFPDgtIe4f8mBYk,2626
183
+ examples/tutorial_sync.py,sha256=egXb184Q-HuSK7G-NHcnOFM8ywmv08tlKr4GUrk75sY,2813
184
+ scripts/add_imports_to_inits.py,sha256=bryhz6RpKAJsSieVMnXnRyLp8evNkpOsNUkBUPkk1WQ,4518
185
+ scripts/correct_sync_interface.py,sha256=O8qxSqNSNIL8KrgZ4C8rjs_pUCdcA1WeqKAggM2DINw,4056
205
186
  scripts/generate_functions_md.py,sha256=-rVRhbHlDodGH2a32UCsMLIpgXtDvOhBmkHa0RqDpCA,6232
206
- scripts/generate_sync_interface.py,sha256=oWR9JfNSP__GJNfDfb7rzGLWw1nFrpRHBX5CT6lMYx4,8349
207
- scripts/postprocess_grpc.py,sha256=-yPbnSnK_JMzMiyCcQQe3Pc76Wu_LQT6Al03UzwyU60,21763
208
- scripts/preprocess_grpc_schema.py,sha256=ZCMdJpOtkL5sZ4n6DxD8198zvsiC9jCFipwZGk3pN80,22828
187
+ scripts/postprocess_grpc.py,sha256=QqFZdOLH6hLPRCLUkf7qvuGooLsXulcpMghCpleHc-A,23198
188
+ scripts/preprocess_grpc_schema.py,sha256=p9LdoMZzixBSsVx7Dy3_8uJzOy_QwCoVMkAABQKUsBA,22894
189
+ scripts/prune_graphql_schema.py,sha256=hmfw5FD_iKGKMFkq6H1neZiXXtljFFrOwi2fiusTWE4,6210
209
190
  templates/exceptions.py,sha256=tIHbiO5Q114h9nPwJXsgHvW_bERLwxuNp9Oj41p6t3A,2379
210
191
  templates/juniper_base_client.py,sha256=x3W5bRmeAK-oznsjJm_4TvrRJJICW23jKHcCKUIj7Vg,12577
211
- architect_py-5.0.0b3.dist-info/METADATA,sha256=2C40fxOMCJCu1muCYIbJ80TblcXBatzAdhUQYIMAeIE,3925
212
- architect_py-5.0.0b3.dist-info/WHEEL,sha256=QZxptf4Y1BKFRCEDxD4h2V0mBFQOVFLFEpvxHmIs52A,91
213
- architect_py-5.0.0b3.dist-info/top_level.txt,sha256=UjtO97OACFQ9z5MzS-X2wBlt5Ovk1vxakQPKfokI454,40
214
- architect_py-5.0.0b3.dist-info/RECORD,,
192
+ architect_py-5.1.0b1.dist-info/METADATA,sha256=gdF0ZucoSHYWHr8320fPwGYKbfaPeFghMQmfLzFX5_I,2369
193
+ architect_py-5.1.0b1.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
194
+ architect_py-5.1.0b1.dist-info/top_level.txt,sha256=UjtO97OACFQ9z5MzS-X2wBlt5Ovk1vxakQPKfokI454,40
195
+ architect_py-5.1.0b1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.6.0)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -3,8 +3,7 @@ import os
3
3
 
4
4
  from pydantic import ValidationError
5
5
 
6
- from architect_py.async_client import AsyncClient
7
- from architect_py.common_types.tradable_product import TradableProduct
6
+ from architect_py import AsyncClient, TradableProduct
8
7
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
9
8
 
10
9
  from .common import connect_async_client
examples/candles.py CHANGED
@@ -1,9 +1,7 @@
1
1
  import asyncio
2
2
 
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.common_types.tradable_product import TradableProduct
3
+ from architect_py import AsyncClient, CandleWidth, TradableProduct
5
4
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
6
- from architect_py.grpc.models.definitions import CandleWidth
7
5
 
8
6
  from .common import connect_async_client
9
7
 
examples/common.py CHANGED
@@ -3,8 +3,7 @@ from dataclasses import dataclass
3
3
 
4
4
  from dotenv import load_dotenv
5
5
 
6
- from architect_py.async_client import AsyncClient
7
- from architect_py.client import Client
6
+ from architect_py import AsyncClient, Client
8
7
 
9
8
 
10
9
  @dataclass
examples/external_cpty.py CHANGED
@@ -5,8 +5,7 @@ from typing import Iterator
5
5
 
6
6
  import grpc
7
7
 
8
- from architect_py.grpc.models.Cpty.CptyResponse import Symbology
9
- from architect_py.grpc.models.definitions import (
8
+ from architect_py import (
10
9
  CptyLoginRequest,
11
10
  CptyLogoutRequest,
12
11
  ExecutionInfo,
@@ -14,6 +13,7 @@ from architect_py.grpc.models.definitions import (
14
13
  SimpleDecimal,
15
14
  Unit,
16
15
  )
16
+ from architect_py.grpc.models.Cpty.CptyResponse import Symbology
17
17
  from architect_py.grpc.models.Orderflow.OrderflowRequest import CancelOrder, PlaceOrder
18
18
  from architect_py.grpc.server import (
19
19
  CptyServicer,
@@ -6,11 +6,14 @@ import asyncio
6
6
  from decimal import Decimal
7
7
  from typing import AsyncIterator, Optional
8
8
 
9
- from architect_py.async_client import AsyncClient
10
- from architect_py.common_types.order_dir import OrderDir
11
- from architect_py.common_types.tradable_product import TradableProduct
9
+ from architect_py import (
10
+ AsyncClient,
11
+ OrderDir,
12
+ OrderType,
13
+ TimeInForce,
14
+ TradableProduct,
15
+ )
12
16
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
13
- from architect_py.grpc.models.definitions import OrderType, TimeInForceEnum
14
17
  from architect_py.grpc.models.Orderflow.Orderflow import (
15
18
  TaggedOrderAck,
16
19
  TaggedOrderOut,
@@ -124,7 +127,7 @@ async def step_to_target_position(
124
127
  quantity=Decimal(1),
125
128
  execution_venue=None,
126
129
  limit_price=best_ask_price,
127
- time_in_force=TimeInForceEnum.DAY,
130
+ time_in_force=TimeInForce.DAY,
128
131
  order_type=OrderType.LIMIT,
129
132
  )
130
133
 
@@ -139,7 +142,7 @@ async def step_to_target_position(
139
142
  quantity=Decimal(1),
140
143
  execution_venue=None,
141
144
  limit_price=best_bid_price,
142
- time_in_force=TimeInForceEnum.DAY,
145
+ time_in_force=TimeInForce.DAY,
143
146
  order_type=OrderType.LIMIT,
144
147
  )
145
148
 
examples/order_sending.py CHANGED
@@ -3,10 +3,7 @@ import logging
3
3
  from datetime import datetime, timedelta, timezone
4
4
  from decimal import Decimal
5
5
 
6
- from architect_py.async_client import AsyncClient
7
- from architect_py.common_types.order_dir import OrderDir
8
- from architect_py.common_types.tradable_product import TradableProduct
9
- from architect_py.grpc.models.definitions import GoodTilDate, OrderType, TimeInForceEnum
6
+ from architect_py import AsyncClient, OrderDir, OrderType, TimeInForce, TradableProduct
10
7
  from examples.common import connect_async_client
11
8
 
12
9
  LOGGER = logging.getLogger(__name__)
@@ -35,7 +32,7 @@ async def test_send_order(client: AsyncClient, account: str):
35
32
  best_bid_price, best_bid_quantity = snapshot.best_bid
36
33
 
37
34
  d = datetime.now(tz=timezone.utc) + timedelta(days=1)
38
- gtd = GoodTilDate(d)
35
+ gtd = TimeInForce.GTD(d)
39
36
 
40
37
  order = await client.place_limit_order(
41
38
  symbol=symbol,
@@ -45,7 +42,8 @@ async def test_send_order(client: AsyncClient, account: str):
45
42
  execution_venue="CME",
46
43
  post_only=True,
47
44
  limit_price=best_bid_price
48
- - (snapshot.best_ask[0] - best_bid_price) * Decimal(10),
45
+ - (snapshot.best_ask[0] - best_bid_price)
46
+ * Decimal(10), # this sends the buy order for way below the market
49
47
  account=account,
50
48
  time_in_force=gtd,
51
49
  )
@@ -72,10 +70,32 @@ async def test_send_market_pro_order(client: AsyncClient, account: str):
72
70
  odir=OrderDir.BUY,
73
71
  quantity=Decimal(1),
74
72
  account=account,
75
- time_in_force=TimeInForceEnum.IOC,
73
+ time_in_force=TimeInForce.IOC,
76
74
  )
77
75
 
78
76
 
77
+ async def send_NQ_buy_for_mid(client: AsyncClient, account: str):
78
+ CME = "CME"
79
+ NQ_lead_future = await client.get_front_future("NQ CME Futures", CME)
80
+
81
+ snapshot = await client.get_l1_book_snapshot(NQ_lead_future, CME)
82
+ if snapshot is None or snapshot.best_ask is None or snapshot.best_bid is None:
83
+ return ValueError(f"Market snapshot for {NQ_lead_future} is None")
84
+
85
+ order = await client.place_limit_order(
86
+ symbol=NQ_lead_future,
87
+ odir=OrderDir.BUY,
88
+ quantity=Decimal(1),
89
+ order_type=OrderType.LIMIT,
90
+ execution_venue=CME,
91
+ post_only=True,
92
+ limit_price=(snapshot.best_ask[0] + snapshot.best_bid[0]) / 2,
93
+ account=account,
94
+ time_in_force=TimeInForce.IOC,
95
+ )
96
+ print(order)
97
+
98
+
79
99
  async def main():
80
100
  client: AsyncClient = await connect_async_client()
81
101
  accounts = await client.list_accounts()
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.common_types.tradable_product import TradableProduct
3
+ from architect_py import AsyncClient, TradableProduct
5
4
 
6
5
  from .common import connect_async_client
7
6
 
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.common_types.tradable_product import TradableProduct
3
+ from architect_py import AsyncClient, TradableProduct
5
4
 
6
5
  from .common import connect_async_client
7
6
 
examples/trades.py CHANGED
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.common_types.tradable_product import TradableProduct
3
+ from architect_py import AsyncClient, TradableProduct
5
4
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
6
5
 
7
6
  from .common import connect_async_client
@@ -1,9 +1,7 @@
1
1
  import asyncio
2
2
  from decimal import Decimal
3
3
 
4
- from architect_py.async_client import OrderDir
5
- from architect_py.common_types.tradable_product import TradableProduct
6
- from architect_py.graphql_client.enums import OrderStatus
4
+ from architect_py import OrderDir, OrderStatus, TradableProduct
7
5
  from examples.common import connect_async_client
8
6
 
9
7
 
@@ -63,7 +61,7 @@ async def main():
63
61
  # Poll order status until rejected or fully executed
64
62
  # After 5 seconds, cancel the order
65
63
  i = 0
66
- while order.status is OrderStatus.OPEN:
64
+ while order.status is OrderStatus.Open:
67
65
  await asyncio.sleep(1)
68
66
  print(f"...order state: {order.status}")
69
67
  order = await c.get_order(order.id)
@@ -73,11 +71,11 @@ async def main():
73
71
  print("Canceling order")
74
72
  await c.cancel_order(order.id)
75
73
 
76
- if order.status is OrderStatus.REJECTED:
74
+ if order.status is OrderStatus.Rejected:
77
75
  print(f"Order was rejected: {order.reject_reason}")
78
- elif order.status is OrderStatus.CANCELED:
76
+ elif order.status is OrderStatus.Canceled:
79
77
  print("Order was canceled")
80
- elif order.status is OrderStatus.OUT:
78
+ elif order.status is OrderStatus.Out:
81
79
  print(f"Order was filled for qty: {order.filled_quantity}")
82
80
  print(f"Average execution price: {order.average_fill_price}")
83
81
 
examples/tutorial_sync.py CHANGED
@@ -2,8 +2,7 @@ import pprint
2
2
  import time
3
3
  from decimal import Decimal
4
4
 
5
- from architect_py.common_types.order_dir import OrderDir
6
- from architect_py.graphql_client.enums import OrderStatus
5
+ from architect_py import OrderDir, OrderStatus
7
6
  from architect_py.utils.nearest_tick import TickRoundMethod
8
7
 
9
8
  from .common import confirm, connect_client, print_book, print_open_orders
@@ -79,17 +78,17 @@ assert order is not None
79
78
  print(f"\nOrder placed with ID: {order.id}")
80
79
 
81
80
  # Poll order status until rejected or fully executed
82
- while order.status is OrderStatus.OPEN:
81
+ while order.status is OrderStatus.Open:
83
82
  time.sleep(1)
84
83
  print(f"...order state: {order.status}")
85
84
  order = c.get_order(order.id)
86
85
  assert order is not None
87
86
 
88
87
  # Print final order state
89
- if order.status is OrderStatus.REJECTED:
88
+ if order.status is OrderStatus.Rejected:
90
89
  print(f"Order was rejected: {order.reject_reason}")
91
- elif order.status is OrderStatus.CANCELED:
90
+ elif order.status is OrderStatus.Canceled:
92
91
  print("Order was canceled")
93
- elif order.status is OrderStatus.OUT:
92
+ elif order.status is OrderStatus.Out:
94
93
  print(f"Order was filled for qty: {order.filled_quantity}")
95
94
  print(f"Average execution price: {order.average_fill_price}")
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ import ast
4
+ from pathlib import Path
5
+
6
+
7
+ def collect_definitions(py_file: Path) -> list[str]:
8
+ """
9
+ Parse the given .py file with ast and return a list of:
10
+ - all top-level class names
11
+ - all top-level names assigned via Annotated[...]
12
+ - all top-level names assigned to a bare type alias (e.g. SomeAlias = str)
13
+ """
14
+ src = py_file.read_text()
15
+ tree = ast.parse(src, filename=str(py_file))
16
+ names: list[str] = []
17
+
18
+ for node in tree.body:
19
+ # 1) class definitions
20
+ if isinstance(node, ast.ClassDef):
21
+ names.append(node.name)
22
+
23
+ # 2) Annotated aliases: e.g. OrderId = Annotated[...]
24
+ elif (
25
+ isinstance(node, ast.Assign)
26
+ and len(node.targets) == 1
27
+ and isinstance(node.targets[0], ast.Name)
28
+ ):
29
+ target = node.targets[0].id
30
+ val = node.value
31
+ # Annotated[...]?
32
+ if (
33
+ isinstance(val, ast.Subscript)
34
+ and isinstance(val.value, ast.Name)
35
+ and val.value.id == "Annotated"
36
+ ):
37
+ names.append(target)
38
+ # simple alias: = SomeType (e.g. = str, = int, = UUID, etc.)
39
+ elif isinstance(val, ast.Name):
40
+ names.append(target)
41
+
42
+ return names
43
+
44
+
45
+ def get_version(py_file: Path) -> str:
46
+ prev = py_file.read_text()
47
+ prev_lines = prev.splitlines()
48
+ for line in prev_lines:
49
+ if line.startswith("__version__"):
50
+ return line
51
+ raise ValueError("Could not find __version__ in the existing __init__.py file.")
52
+
53
+
54
+ def main(architect_path: Path, output: Path):
55
+ """
56
+ Generate static imports + __all__ (including definitions.py) for grpc/models
57
+
58
+ This only works for the main request/response classes that the file is named after.
59
+ The definitions.py file is not included for the grpc __init__ because it causes circular imports.
60
+ """
61
+
62
+ models_root = architect_path / "grpc" / "models"
63
+
64
+ version = get_version(output)
65
+ import_lines: list[str] = [
66
+ "# ruff: noqa:I001\n",
67
+ version,
68
+ "",
69
+ "from .utils.nearest_tick import TickRoundMethod",
70
+ "from .async_client import AsyncClient",
71
+ "from .client import Client",
72
+ "from .common_types import OrderDir, TradableProduct, TimeInForce, Venue",
73
+ ]
74
+
75
+ all_names: list[str] = [
76
+ "TickRoundMethod",
77
+ "AsyncClient",
78
+ "Client",
79
+ "OrderDir",
80
+ "TradableProduct",
81
+ "TimeInForce",
82
+ "Venue",
83
+ ]
84
+
85
+ # 1) definitions.py
86
+ defs = models_root / "definitions.py"
87
+ if defs.exists():
88
+ defs_names = collect_definitions(defs)
89
+ if defs_names:
90
+ import_lines.append(
91
+ f"from .grpc.models.definitions import {', '.join(defs_names)}"
92
+ )
93
+ all_names.extend(defs_names)
94
+
95
+ # 2) sub-packages under models/
96
+
97
+ model_lines: list[str] = []
98
+ model_all: list[str] = []
99
+ for sub in sorted(models_root.iterdir()):
100
+ if not sub.is_dir() or not (sub / "__init__.py").exists():
101
+ continue
102
+
103
+ pkg = f"grpc.models.{sub.name}"
104
+
105
+ for module_path in sorted(sub.iterdir()):
106
+ if module_path.suffix != ".py" or module_path.name.startswith("_"):
107
+ continue
108
+ mod = module_path.stem
109
+
110
+ import_lines.append(f"from .{pkg}.{mod} import {mod}")
111
+ all_names.append(mod)
112
+
113
+ model_lines.append(f"from .{sub.name}.{mod} import {mod}")
114
+ model_all.append(mod)
115
+
116
+ unique = sorted(set(model_all))
117
+ model_lines.append("")
118
+ model_lines.append(f"__all__ = [{', '.join(f'"{n}"' for n in model_all)}]")
119
+ model_lines.append("")
120
+
121
+ (models_root / "__init__.py").write_text("\n".join(model_lines))
122
+
123
+ # 3) write __all__
124
+ unique = sorted(set(all_names))
125
+ import_lines.append("") # blank line
126
+ import_lines.append(f"__all__ = [{', '.join(f'"{n}"' for n in unique)}]")
127
+
128
+ import_lines.append("") # blank line
129
+
130
+ output.write_text("\n".join(import_lines))
131
+
132
+
133
+ if __name__ == "__main__":
134
+ p = argparse.ArgumentParser(
135
+ description="Generate static imports + __all__ (including definitions.py) for grpc/models"
136
+ )
137
+ p.add_argument(
138
+ "--architect-path",
139
+ type=Path,
140
+ default=Path("architect_py"),
141
+ help="Path to your top-level architect_py folder",
142
+ )
143
+ args = p.parse_args()
144
+
145
+ out = args.architect_path / "__init__.py"
146
+ main(args.architect_path, out)