UncountablePythonSDK 0.0.74__py3-none-any.whl → 0.0.76__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.

Potentially problematic release.


This version of UncountablePythonSDK might be problematic. Click here for more details.

Files changed (35) hide show
  1. {UncountablePythonSDK-0.0.74.dist-info → UncountablePythonSDK-0.0.76.dist-info}/METADATA +2 -2
  2. {UncountablePythonSDK-0.0.74.dist-info → UncountablePythonSDK-0.0.76.dist-info}/RECORD +35 -29
  3. {UncountablePythonSDK-0.0.74.dist-info → UncountablePythonSDK-0.0.76.dist-info}/WHEEL +1 -1
  4. docs/requirements.txt +1 -1
  5. examples/async_batch.py +3 -3
  6. pkgs/serialization/serial_class.py +3 -0
  7. pkgs/type_spec/builder.py +7 -8
  8. pkgs/type_spec/emit_python.py +6 -6
  9. pkgs/type_spec/emit_typescript.py +7 -237
  10. pkgs/type_spec/emit_typescript_util.py +235 -0
  11. uncountable/core/environment.py +15 -2
  12. uncountable/integration/construct_client.py +3 -4
  13. uncountable/integration/queue_runner/job_scheduler.py +1 -1
  14. uncountable/integration/queue_runner/worker.py +17 -22
  15. uncountable/integration/scan_profiles.py +39 -15
  16. uncountable/integration/server.py +4 -12
  17. uncountable/integration/telemetry.py +2 -2
  18. uncountable/integration/webhook_server/entrypoint.py +4 -10
  19. uncountable/types/__init__.py +8 -0
  20. uncountable/types/api/entity/create_entities.py +4 -2
  21. uncountable/types/api/entity/create_entity.py +4 -2
  22. uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  23. uncountable/types/api/recipes/get_column_calculation_values.py +58 -0
  24. uncountable/types/async_batch_processor.py +43 -0
  25. uncountable/types/async_batch_t.py +1 -0
  26. uncountable/types/auth_retrieval.py +12 -0
  27. uncountable/types/auth_retrieval_t.py +75 -0
  28. uncountable/types/client_base.py +62 -4
  29. uncountable/types/entity.py +3 -0
  30. uncountable/types/entity_t.py +20 -0
  31. uncountable/types/integration_server.py +9 -0
  32. uncountable/types/integration_server_t.py +37 -0
  33. uncountable/types/job_definition.py +1 -5
  34. uncountable/types/job_definition_t.py +20 -60
  35. {UncountablePythonSDK-0.0.74.dist-info → UncountablePythonSDK-0.0.76.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.74
3
+ Version: 0.0.76
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -16,7 +16,7 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
- Requires-Dist: aiotus ==0.*
19
+ Requires-Dist: aiotus ==1.*
20
20
  Requires-Dist: aiohttp ==3.*
21
21
  Requires-Dist: requests ==2.*
22
22
  Requires-Dist: SQLAlchemy >=1.4.0
@@ -3,7 +3,7 @@ docs/conf.py,sha256=YF5J-9g_Wg8wXmyHsGaE8xYlDEzqocNl3UWUmP0CwBg,1702
3
3
  docs/index.md,sha256=eEdirX_Ds6ICTRtIS5iT4irCquHcQyKN7E4M5QP9T8A,257
4
4
  docs/justfile,sha256=cvNcpb-ByPOF2aCrFlg3DDZBoYMx5W8xGdr13m9HcnI,215
5
5
  docs/quickstart.md,sha256=3GuJ0MB1O5kjlsrgAmdSkDq0rYqATrYy-tzEHDy8H-c,422
6
- docs/requirements.txt,sha256=pHca02KQbB3qx4V6MUrwtctgvIheT--jGQvs6OVqaUg,138
6
+ docs/requirements.txt,sha256=XNw3eJfJPf6Z2DpwtcNgEJpoEKS0g5v3vY6UBFtiEKM,138
7
7
  docs/static/logo_blue.png,sha256=SyYpMTVhhBbhF5Wl8lWaVwz-_p1MIR6dW6bVhufQRME,46708
8
8
  docs/static/favicons/android-chrome-192x192.png,sha256=XoF-AhD55JlSBDGsEPJKfT_VeXT-awhwKyZnxLhrwvk,1369
9
9
  docs/static/favicons/android-chrome-512x512.png,sha256=1S4xwY9YtJQ5ifFsZ-DOzssoyBYs0t9uwdOUmYx0Xso,3888
@@ -14,7 +14,7 @@ docs/static/favicons/favicon-32x32.png,sha256=U4UU652zGnSeU3P9kUqxPeEnVf6zhtdNdN
14
14
  docs/static/favicons/manifest.json,sha256=6q_3nZkcg_x0xut4eE-xpdeMY1TydwiZIcbXlLAq9X8,437
15
15
  docs/static/favicons/mstile-150x150.png,sha256=eAK4QdEofhdLtfmjuPTpnX3MJqYnvGXsHYUjlcQekyY,1035
16
16
  docs/static/favicons/safari-pinned-tab.svg,sha256=S84fRnz0ZxLnQrKtmmFZytiRyu1xLtMR_RVy5jmwU7k,1926
17
- examples/async_batch.py,sha256=CffQ8O9drJ-Mdd6S5DnMIOBsHv5aVkTZrD3l3xBnB4s,1094
17
+ examples/async_batch.py,sha256=tEyvgxk2uf681mKlN4TDuPMkb1OHyM9oO8pYW4A7HvM,1142
18
18
  examples/create_entity.py,sha256=t6WBZsWRDbWZgFCWXKGgKL5LAB6-38oaiNYGxMAa2No,686
19
19
  examples/edit_recipe_inputs.py,sha256=mtk_oSkN-OT2hKkb1XKXrRiUaGYTJstXuOKyTR51Fjo,1663
20
20
  examples/invoke_uploader.py,sha256=rEvmVY5TjigN_-4PTQdkjY-bC5DrYMcJgquyZ4Tt5FM,748
@@ -41,7 +41,7 @@ pkgs/filesystem_utils/filesystem_session.py,sha256=BQ2Go8Mu9-GcnaWh2Pm4x7ugLVsre
41
41
  pkgs/serialization/__init__.py,sha256=LifasRW0a50A3qRFmo2bf3FQ6TXhZWOTz2-CVTgPjcQ,753
42
42
  pkgs/serialization/missing_sentry.py,sha256=aM_9KxbCk9dVvXvcOKgkIQBqFWvLhv8QlIUCiuFEXMo,806
43
43
  pkgs/serialization/opaque_key.py,sha256=FIfXEE0DA1U8R_taFbQ1RCoTSgehrPjP06-qvo-GeNQ,177
44
- pkgs/serialization/serial_class.py,sha256=D7vSnfJw4rWEDFbDd07pxgzyfTFZT5SKeQEv4C1c4H0,6057
44
+ pkgs/serialization/serial_class.py,sha256=xURwC05-ImnHU1pKM8BBYpzbrhTtiZr30UlzaA0T7zY,6110
45
45
  pkgs/serialization/serial_union.py,sha256=xpdeqCrRd0sNCaUwBQRzje6V40ndCbJpZrLX2K0d5xo,2741
46
46
  pkgs/serialization/yaml.py,sha256=yoJtu7_ixnJV6uTxA_U1PpK5F_ixT08AKVh5ocyYwXM,1466
47
47
  pkgs/serialization_util/__init__.py,sha256=MVKqHTUl2YnWZAFG9xCxu1SgmkQ5xPofrAGlYg6h7rI,330
@@ -52,14 +52,14 @@ pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpG
52
52
  pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
53
53
  pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
54
54
  pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
55
- pkgs/type_spec/builder.py,sha256=nuHdVNOmwbHbHV5_8nqtsrxOfzIII6jcQO7eLOljT4c,48856
55
+ pkgs/type_spec/builder.py,sha256=mG796Y15_xr_i0Ffl0XYI-CsqRlssO0mjKYt7lXTSqU,48790
56
56
  pkgs/type_spec/config.py,sha256=ZUmPWCzTwjesAqlqeL1_E_yoIUZE_8g0kI2yXtbU0Zc,4811
57
57
  pkgs/type_spec/emit_io_ts.py,sha256=U03sQBpgRqYOaMKrPCRnYb70YboiCgaZfseCXSzW5NY,5707
58
58
  pkgs/type_spec/emit_open_api.py,sha256=5a0iAHBbgFD4wfKuyjPvxCYYHNTjKxEHA0aYjMGSqe4,24596
59
59
  pkgs/type_spec/emit_open_api_util.py,sha256=x4GCiZSGdypJ9Qtm6I5W_3UvwdJyMs8_OGhJ8_THznA,2401
60
- pkgs/type_spec/emit_python.py,sha256=eBct7PMYgcv35POo2JU089lLggPrgLfTOrKpqAukn1E,47370
61
- pkgs/type_spec/emit_typescript.py,sha256=w9DUpksc4QP0CatUU9NYSZN4IBNNXVXkMnKMCFQmL58,18274
62
- pkgs/type_spec/emit_typescript_util.py,sha256=StCDbJ5mU23MBb2LGu847yJN2fuiogjoQqZu6q3E6FY,797
60
+ pkgs/type_spec/emit_python.py,sha256=JQgOF4afkf-VjTa2-yAHMZpEkEKzi6H1T-5d085wjvM,47371
61
+ pkgs/type_spec/emit_typescript.py,sha256=PL1h2UvTp1PRMkTXH893ZYS3cPUrrupjnLg_9ndZGDQ,8838
62
+ pkgs/type_spec/emit_typescript_util.py,sha256=e2rGSs9OTD-iXwcHfU4V9E35jwMc5qVshhOKMknGrJ8,10319
63
63
  pkgs/type_spec/load_types.py,sha256=vO8VLI7aTKzzHQIla-WO-5Z_mfTuwUqH4ZSKN9E9n5U,3688
64
64
  pkgs/type_spec/open_api_util.py,sha256=IGh-_snGPST_P_8FdYtO8MTEa9PUxRW6Rzg9X9EgQik,7114
65
65
  pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
@@ -81,19 +81,19 @@ uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  uncountable/core/__init__.py,sha256=RFv0kO6rKFf1PtBPu83hCGmxqkJamRtsgQ9_-ztw7tA,341
82
82
  uncountable/core/async_batch.py,sha256=Gur0VOS0AH2ugwvk65hwoX-iqwQAAyJaejY_LyAZZPo,1210
83
83
  uncountable/core/client.py,sha256=qTM61IJV4DTE2LsTZyv4kePBZAv55vncWt2rtBf-SLQ,10632
84
- uncountable/core/environment.py,sha256=n46mWvG5uBOy6H_aetu_iuaYmO_d23uSbQBRgb6xStw,677
84
+ uncountable/core/environment.py,sha256=K2TtE52JbW5UOBkBSc2Ee2l9rDIoRNoFDXDqRha1fJI,1036
85
85
  uncountable/core/file_upload.py,sha256=qR7BBBWVxFNrb1_WICreo3dkZygE9lcE1fmZCQrDZU0,3469
86
86
  uncountable/core/types.py,sha256=s2CjqYJpsmbC7xMwxxT7kJ_V9bwokrjjWVVjpMcQpKI,333
87
87
  uncountable/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  uncountable/integration/cli.py,sha256=h3RE0l1SdjkveOKeY2amlmrJppK4HEQJXk8VG9UJRWg,1359
89
- uncountable/integration/construct_client.py,sha256=I2XTamht13vs-JYkV4PpNS_Pc4FJm-KVYqNNvxI4qNk,1916
89
+ uncountable/integration/construct_client.py,sha256=u_vKLG3uMjk-8mM8SbHMn1-Sh-jMeYEGHrOaU_X2b3c,1949
90
90
  uncountable/integration/cron.py,sha256=6eH-kIs3sdYPCyb62_L2M7U_uQTdMTdwY5hreEJb0hw,887
91
91
  uncountable/integration/entrypoint.py,sha256=BHOYPQgKvZE6HG8Rv15MkdYl8lRkvfDgv1OdLo0oQ9Q,433
92
92
  uncountable/integration/job.py,sha256=af197JUceIKzpIN5C2z8zeZOPhIQ16ipyC6qVt1WXv0,2386
93
- uncountable/integration/scan_profiles.py,sha256=ro4u5_1ClUeyW4vcWJ9epf2UQaJrjtc7S1R5bZpuHTM,1430
93
+ uncountable/integration/scan_profiles.py,sha256=760zbv7O7wXxHUHqUkFBpd1Afe8hqxMPU3ugwZGdhEo,2925
94
94
  uncountable/integration/scheduler.py,sha256=sVe7V5zlUbSzSMyC30rAlWR30w0jurhrYYCgK8-lVRo,4546
95
- uncountable/integration/server.py,sha256=zUDj2W45ih_UyvGou0Dsep9RVXb5m0o8i6mkm4BQCrg,5066
96
- uncountable/integration/telemetry.py,sha256=MwQLmgCoxpmA_UTp3e2ZB37wcDzKM0qzm5MrmaiJWhU,7142
95
+ uncountable/integration/server.py,sha256=Hwi3fpdhcSK2HynI6Zwi7A3mWTTCaK_ic53M5-4IEp4,4716
96
+ uncountable/integration/telemetry.py,sha256=bX68_a2PyG23n1QtIFxcH30JynUoovMz6HgA_jgUb1A,7132
97
97
  uncountable/integration/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  uncountable/integration/db/connect.py,sha256=mE3bdV0huclH2iT_dXCQdRL4LkjIuf_myAR64RTWXEs,498
99
99
  uncountable/integration/db/session.py,sha256=96cGQXpe6IugBTdSsjdP0S5yhJ6toSmbVB6qhc3FJzE,693
@@ -102,10 +102,10 @@ uncountable/integration/executors/executors.py,sha256=CbwatKkHrLhnqYr_nsBjr0KYeO
102
102
  uncountable/integration/executors/generic_upload_executor.py,sha256=NlW5WcYePPA7_fwp5uW_2afAiQLKK7rCkKF06wQ948E,10375
103
103
  uncountable/integration/executors/script_executor.py,sha256=OmSBOtU48G3mqza9c2lCm84pGGyaDk-ZBJCx3RsdJXc,846
104
104
  uncountable/integration/queue_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- uncountable/integration/queue_runner/job_scheduler.py,sha256=n6bM6ZqVOPD0PoJuZV5Y5tuhmw2gI-_p6JbnVlK42uI,5016
105
+ uncountable/integration/queue_runner/job_scheduler.py,sha256=5Z74Wb17oohz7EFN40JBymH1UWW7-Dnk9HhOz3wZ08E,5005
106
106
  uncountable/integration/queue_runner/queue_runner.py,sha256=0BmYu5zHdothTevGsB-nXg6MBd1UD-WkP3h1WCKMdQg,710
107
107
  uncountable/integration/queue_runner/types.py,sha256=8qTq29BTSa5rmW6CBlBntP0pNIiDcwu1wHa78pjroS0,219
108
- uncountable/integration/queue_runner/worker.py,sha256=wS_Mv12MtG9ULz2K4nUdivUAxJdZmd6B6GEUhqysG2A,4403
108
+ uncountable/integration/queue_runner/worker.py,sha256=pYLd6D3-ZSM3zcd7UKwyYUADVYEAUK9Hfi0PprwkNqo,4170
109
109
  uncountable/integration/queue_runner/command_server/__init__.py,sha256=gQPVILGpWzCr2i5GJyoqna7AOSFvtn4tav69gB78mTQ,571
110
110
  uncountable/integration/queue_runner/command_server/command_client.py,sha256=DJb0TUVFkiiLBEQzHSN94sTRnuEbutNEgdN39XmnOXI,2046
111
111
  uncountable/integration/queue_runner/command_server/command_server.py,sha256=yyXryhiEC2eGS0yFElLGsVzSKwOuYvj-zp22jQorkv0,2138
@@ -121,24 +121,26 @@ uncountable/integration/queue_runner/datastore/interface.py,sha256=j4D-zVvLq-48V
121
121
  uncountable/integration/queue_runner/datastore/model.py,sha256=8-RI5A2yPZVGBLWINVmMd6VOl_oHtqGtnaNXcapAChw,577
122
122
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
123
123
  uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=eoPWbkUtCn_63A4TFlK_nvEDvfm4u2fiOoglmAkBG3U,3004
124
- uncountable/integration/webhook_server/entrypoint.py,sha256=hgbEtdVo3QU3odlHSygxmrsxR9g7rgU0yKt-o9nVAHE,5686
125
- uncountable/types/__init__.py,sha256=KSsSEBnGhn88NPex5q9MZtY4kj8PRqVTbaKtko4hxUU,8561
124
+ uncountable/integration/webhook_server/entrypoint.py,sha256=aaulH6GS7uvBw1jPrZwPDS3mRE9NY-lKxuX7vtoJcGg,5407
125
+ uncountable/types/__init__.py,sha256=mjJX5fo0Oq8_CRx6eo3NbY6ycKaB3rTb8EXH4vXY5ok,8965
126
126
  uncountable/types/async_batch.py,sha256=_OhT25_dEVts_z_n1kqfJH3xlZg3btLqR6TNkfFLlXE,609
127
- uncountable/types/async_batch_processor.py,sha256=esKBP56RiRH-VjAFBr8wgfcgKsRkUfiLBmQmYGx4XXY,11462
128
- uncountable/types/async_batch_t.py,sha256=CZ-rltFUiKVowvL5BhMfWaFxgf-Z0KPsghvjsg-PweY,2493
127
+ uncountable/types/async_batch_processor.py,sha256=DJn9KdgUv_l7ojCVJ_d9wCS3GUNc21b5cOrpunty2KU,13129
128
+ uncountable/types/async_batch_t.py,sha256=niXgIM7FQXb_1RLX8CBXiGaYSa8nqd-jqX68p7gMgJo,2558
129
+ uncountable/types/auth_retrieval.py,sha256=FY8Vr_BWD4O8PsauPNt_7_08YZSHFaUlTT72L5XJ-4o,570
130
+ uncountable/types/auth_retrieval_t.py,sha256=D2ptCIsuCecJa_P8K2qrNk2-zz1WuBpOrsZ65BRP-Dw,2221
129
131
  uncountable/types/base.py,sha256=xVSjWvA_fUUnkCg83EjoYEFvAfmskinKFMeYFOxNc9E,359
130
132
  uncountable/types/base_t.py,sha256=XXjZXexx0xWFUxMMhW8i9nIL6n8dsZVsHwdgnhZ0zJ4,2714
131
133
  uncountable/types/calculations.py,sha256=FFO_D3BbKoGDZnqWvTKpW4KF359i2vrKjpdFCLYzJC0,284
132
134
  uncountable/types/calculations_t.py,sha256=157qD0VqijD5kNDF5BRsfGli3WaPGnNjoo2o2CPX-Ik,669
133
135
  uncountable/types/chemical_structure.py,sha256=E-LnikTFDoVQ1b2zKaVUIO_PAKm-7aZZYJi8I8SDSic,302
134
136
  uncountable/types/chemical_structure_t.py,sha256=zDJ6WkeT3YwWZRZT21znQn2ZYelv3L7yv7kJiGoNZCw,824
135
- uncountable/types/client_base.py,sha256=16W0EnH7kyy_sRL_fNn4NBvNhE8NCmmrSad-grKhLus,67489
137
+ uncountable/types/client_base.py,sha256=fpVHWPifRToIiaBPKcM_YT8WQFrK-SW58muGnCTX3d0,68780
136
138
  uncountable/types/client_config.py,sha256=4h5Liko9uKCo9_0gdbPhoK6Jr2Kv7tioLiQ8iKeq-_4,301
137
139
  uncountable/types/client_config_t.py,sha256=6dStfR0IEHiPW8f9_aF3DD_tHmXXw2rEVrgpebzq8Fg,747
138
140
  uncountable/types/curves.py,sha256=W6uMpG5SyW1MS82szNpxkFEn1MnxNpBFyFbQb2Ysfng,366
139
141
  uncountable/types/curves_t.py,sha256=lKhRM-2cZ_sFaW7pa_I_Ipz_pJhm3_yTFehRXI79pKk,1416
140
- uncountable/types/entity.py,sha256=3XhLteFDRDZvHejDuYh-KvB65hpwrBygljFfiUcOAM8,315
141
- uncountable/types/entity_t.py,sha256=8OkFVgvrItdA1ysyWB21mLL85JTPdcdzAmb6CNBUVI0,15003
142
+ uncountable/types/entity.py,sha256=ECvhswTj9xp4gUEKTZoZYyxHvx1oyvE5FNiGNfSyUgk,528
143
+ uncountable/types/entity_t.py,sha256=8Ju0wEpg-R3QhykoL6nlfogQwL214E_pqE4k1fIWn1I,16208
142
144
  uncountable/types/experiment_groups.py,sha256=_0OXcPzSAbkE-rfKt5tPx178YJ4pcEKZvrCxUHgDnvw,309
143
145
  uncountable/types/experiment_groups_t.py,sha256=qEs8YW0eJOJ_sCOObT5v9QRx9wsjLYpJqJhCJXa-vNA,721
144
146
  uncountable/types/field_values.py,sha256=uuIWX-xmfvcinYPdfkWJeb56zzQY01mc9rmotMPMh24,503
@@ -155,8 +157,10 @@ uncountable/types/input_attributes.py,sha256=IrIKQnHqHdS1Utdfzr9GnOe17a8riaqYcO1
155
157
  uncountable/types/input_attributes_t.py,sha256=mD9JIagE8TQ0KVwGkl-hinKz_gcunV3y30w_dW5sfeU,884
156
158
  uncountable/types/inputs.py,sha256=jFZHyo0ZOGJ3bb4TOPXovhE3Fo1-kf7B7T3usk4Sqg8,467
157
159
  uncountable/types/inputs_t.py,sha256=CpuuKRduZGET_wvkGUpUFN6rbZCHsdOIp1veEM-hspI,2143
158
- uncountable/types/job_definition.py,sha256=HXfaYl5Nafm9C0teQLBtqzroe1HlfKJtfGVm2-40hvg,1937
159
- uncountable/types/job_definition_t.py,sha256=A62fgHEK5JHTekDQ-UXCLJIEbWx64MJMk2Hlo64p8rg,8895
160
+ uncountable/types/integration_server.py,sha256=61NuGs1pbgovU5Vuje7oN9HpLwOGCCw9Q_CcUvt_0qI,385
161
+ uncountable/types/integration_server_t.py,sha256=wa45RWChRsj2oAvWcOfZXA2xZxyEEkzltuJqZwKTna8,1048
162
+ uncountable/types/job_definition.py,sha256=DEma_s-0oBo2tPI5u9IU_UDw-9MWbn4mTZsd_RHiYGE,1667
163
+ uncountable/types/job_definition_t.py,sha256=N9080NAzwfYQKTusY2vs3z1UrM5s_QGtzWyoFxr2_iM,7931
160
164
  uncountable/types/outputs.py,sha256=sUZx_X-TKCZtLm1YCEH8OISX9DdPlv9ZuUfM3-askCc,281
161
165
  uncountable/types/outputs_t.py,sha256=AdJZvIzqikHV9CnlC24WEo0OUe-5vrD4cjMqc2txEs0,765
162
166
  uncountable/types/overrides.py,sha256=Mv-smwK1B3pvbt48fNOiqkeQn9wMgYlBFJKUBOJqceE,431
@@ -204,9 +208,10 @@ uncountable/types/api/batch/execute_batch_load_async.py,sha256=j5a5dk0_lTJ-YslrB
204
208
  uncountable/types/api/chemical/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
205
209
  uncountable/types/api/chemical/convert_chemical_formats.py,sha256=xLpma1W1O9MzgxM4CCl5GPnpj3dpqRHhKcXr3b_ToAo,1589
206
210
  uncountable/types/api/entity/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
207
- uncountable/types/api/entity/create_entities.py,sha256=3zBPO3_CM9fU2R1EFWQcFcXxCVCNNU2NIsnJLYnojzI,2219
208
- uncountable/types/api/entity/create_entity.py,sha256=elMRdi8VT7CTrPhypQsL9P5gvCLlk5_D_1CUxulnXzA,2331
211
+ uncountable/types/api/entity/create_entities.py,sha256=XJXLcKgpiYpNLVNtkDAAe6Q09rNJSW_h2wu3i7OmFxw,1630
212
+ uncountable/types/api/entity/create_entity.py,sha256=N69a-4dymv2tg_Dhj6OBdnWPodFrJtn05JvLRQwoHp8,1742
209
213
  uncountable/types/api/entity/get_entities_data.py,sha256=gTEZ7Z7T-DWP8BZPNDF4c__EHtf9kAb1sGtHmiGOgnM,1454
214
+ uncountable/types/api/entity/grant_entity_permissions.py,sha256=YAXyJ3I_nqDQYFYGEO3MmD20vYyhoFZzID9tpVpgryM,1442
210
215
  uncountable/types/api/entity/list_entities.py,sha256=ykbdq4DD31uiRz4i8LH-8LLeA2Lpp_5fWfb5fdyx248,2000
211
216
  uncountable/types/api/entity/lock_entity.py,sha256=mMZx2tWOtuYg0sIftdPsFWgZO5LCav2ubqTw97dCtDU,1197
212
217
  uncountable/types/api/entity/resolve_entity_ids.py,sha256=GnQjeoTdzL0PIubrLay-PpaRsYFFWVGrTxhzSmP4hhw,1387
@@ -257,6 +262,7 @@ uncountable/types/api/recipes/create_recipe.py,sha256=Gh6Z_7wBfYBMGUgUSixw57ucRj
257
262
  uncountable/types/api/recipes/create_recipes.py,sha256=kmTDi0nF5OK5wYIErg_4CY3YsF3pDbrj4LLFqgDNRoU,1940
258
263
  uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=YcLCle-yQ8A7hPmFg8wPfW4dyJwpMQXNKzJxCEr8xlw,1127
259
264
  uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=7TBjzA8-yXYIko_jx0AvKMs8SnIkiQukhQFWyf2fkxk,7815
265
+ uncountable/types/api/recipes/get_column_calculation_values.py,sha256=u_KBiGpXnVLwRruEG-FmopiR8UDkuX6i47B4OY-IYWU,1702
260
266
  uncountable/types/api/recipes/get_curve.py,sha256=SPD9kx4m95KPXAD0MawX52IFl8W7gVKj-WmA4Wx2YtU,1126
261
267
  uncountable/types/api/recipes/get_recipe_calculations.py,sha256=_sBE5M2xzwagh1beTW32D_HTxqu9OrZTPZBGMba6Myk,1730
262
268
  uncountable/types/api/recipes/get_recipe_links.py,sha256=IIA_LV-iPayZRAsVmDCpSA8jgFnzcgGpk0lAnygyi-s,1180
@@ -277,7 +283,7 @@ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr
277
283
  uncountable/types/api/triggers/run_trigger.py,sha256=-oZgPyn43xEKSCs81DVNzwaYMCdRJxbM9GY6fsqKwf4,1090
278
284
  uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
279
285
  uncountable/types/api/uploader/invoke_uploader.py,sha256=6mwVG136oLp9JcbB2I-kZnrcm3aeZzYZB-SFjEImY2o,1314
280
- UncountablePythonSDK-0.0.74.dist-info/METADATA,sha256=cvY7ALGHYsY6rqK3qLdaXGE_8joz1ouiGFKtbPaOsFw,2051
281
- UncountablePythonSDK-0.0.74.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
282
- UncountablePythonSDK-0.0.74.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
283
- UncountablePythonSDK-0.0.74.dist-info/RECORD,,
286
+ UncountablePythonSDK-0.0.76.dist-info/METADATA,sha256=pbI1_WLh03O7-B_Ju3p0vJNqOVftjnYaZ1zWJ0O2vFI,2051
287
+ UncountablePythonSDK-0.0.76.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
288
+ UncountablePythonSDK-0.0.76.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
289
+ UncountablePythonSDK-0.0.76.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
docs/requirements.txt CHANGED
@@ -2,6 +2,6 @@ furo==2024.8.6
2
2
  myst-parser==4.0.0
3
3
  sphinx-autoapi==3.3.0
4
4
  sphinx-copybutton==0.5.2
5
- Sphinx==8.0.0
5
+ Sphinx==8.1.3
6
6
  sphinx_design==0.6.1
7
7
  sphinx-favicon==1.0.1
examples/async_batch.py CHANGED
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from decimal import Decimal
2
3
 
3
4
  from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
@@ -11,10 +12,9 @@ from uncountable.types.recipe_identifiers import (
11
12
  )
12
13
 
13
14
  client = Client(
14
- base_url="https://app.uncountable.com",
15
+ base_url=os.environ["UNC_BASE_URL"],
15
16
  auth_details=AuthDetailsApiKey(
16
- api_id="X",
17
- api_secret_key="X",
17
+ api_id=os.environ["UNC_API_ID"], api_secret_key=os.environ["UNC_API_SECRET_KEY"]
18
18
  ),
19
19
  )
20
20
  batch_loader = AsyncBatchProcessor(client=client)
@@ -103,6 +103,9 @@ def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | N
103
103
  if hasattr(type_class, "__unc_serial_data")
104
104
  else None
105
105
  )
106
+ if base_class_data is None:
107
+ return None
108
+
106
109
  if type_class.__bases__ is not None:
107
110
  for base in type_class.__bases__:
108
111
  curr_base_class_data = _get_merged_serial_class_data(base)
pkgs/type_spec/builder.py CHANGED
@@ -535,13 +535,8 @@ class SpecTypeDefnObject(SpecTypeDefn):
535
535
  base_type: list[SpecType] = [self.base] if self.base is not None else []
536
536
  return base_type + prop_types
537
537
 
538
- def get_generic(self) -> Optional[str]:
539
- if len(self.parameters) > 0:
540
- assert (
541
- len(self.parameters) == 1
542
- ), "Only single generic parameters current supported"
543
- return self.parameters[0]
544
- return None
538
+ def get_generics(self) -> list[str]:
539
+ return self.parameters
545
540
 
546
541
 
547
542
  class SpecTypeDefnAlias(SpecTypeDefn):
@@ -1134,7 +1129,11 @@ class SpecNamespace:
1134
1129
  spec_type = SpecTypeDefnStringEnum(self, name)
1135
1130
  else:
1136
1131
  parameters = (
1137
- [parameter.name for parameter in parsed_name.parameters[0]]
1132
+ [
1133
+ parameter.name
1134
+ for name_parameters in parsed_name.parameters
1135
+ for parameter in name_parameters
1136
+ ]
1138
1137
  if parsed_name.parameters is not None
1139
1138
  else None
1140
1139
  )
@@ -814,11 +814,11 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
814
814
 
815
815
  class_out = io.StringIO()
816
816
  base_class = ""
817
- generic = stype.get_generic()
817
+ generics = stype.get_generics()
818
818
  if not stype.base.is_base:
819
819
  base_class = f"({refer_to(ctx, stype.base)})"
820
- elif generic is not None:
821
- base_class = f"(typing.Generic[{generic}])"
820
+ elif len(generics) > 0:
821
+ base_class = f"(typing.Generic[{", ".join(generics)}])"
822
822
  class_out.write(f"class {stype.name}{base_class}:\n")
823
823
 
824
824
  emitted_properties_metadata = _emit_type_properties(
@@ -829,7 +829,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
829
829
  to_string_values = emitted_properties_metadata.to_string_values
830
830
  parse_require = emitted_properties_metadata.parse_require
831
831
 
832
- _emit_generic(ctx, stype.get_generic())
832
+ _emit_generics(ctx, generics)
833
833
 
834
834
  # Emit serial_class decorator
835
835
  ctx.out.write("@serial_class(\n")
@@ -864,8 +864,8 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
864
864
  ctx.out.write(class_out.getvalue())
865
865
 
866
866
 
867
- def _emit_generic(ctx: Context, generic: Optional[str]) -> None:
868
- if generic is not None:
867
+ def _emit_generics(ctx: Context, generics: list[str]) -> None:
868
+ for generic in generics:
869
869
  ctx.out.write(f'{generic} = typing.TypeVar("{generic}")\n')
870
870
  ctx.out.write(f"{LINE_BREAK}{LINE_BREAK}")
871
871
 
@@ -1,106 +1,26 @@
1
1
  import io
2
2
  import os
3
- from typing import Any
4
3
 
5
4
  from . import builder, util
6
- from .builder import SpecTypeDefnObject
7
5
  from .config import TypeScriptConfig
8
6
  from .emit_io_ts import emit_type_io_ts
9
7
  from .emit_typescript_util import (
10
- INDENT,
11
8
  MODIFY_NOTICE,
12
9
  EmitTypescriptContext,
10
+ emit_namespace_imports_ts,
11
+ emit_type_ts,
12
+ emit_value_ts,
13
+ resolve_namespace_name,
13
14
  resolve_namespace_ref,
14
- ts_name,
15
15
  ts_type_name,
16
16
  )
17
17
 
18
18
 
19
- def ts_enum_name(name: str, name_case: builder.NameCase) -> str:
20
- if name_case == builder.NameCase.js_upper:
21
- return name.upper()
22
- return ts_name(name, name_case)
23
-
24
-
25
- def _resolve_namespace_name(namespace: builder.SpecNamespace) -> str:
26
- return namespace.name
27
-
28
-
29
- def _emit_value(ctx: EmitTypescriptContext, stype: builder.SpecType, value: Any) -> str:
30
- """Mimics emit_python even if not all types are used in TypeScript yet"""
31
- literal = builder.unwrap_literal_type(stype)
32
- if literal is not None:
33
- return _emit_value(ctx, literal.value_type, literal.value)
34
-
35
- if stype.is_base_type(builder.BaseTypeName.s_string):
36
- assert isinstance(value, str)
37
- return util.encode_common_string(value)
38
- elif stype.is_base_type(builder.BaseTypeName.s_integer):
39
- assert isinstance(value, int)
40
- return str(value)
41
- elif stype.is_base_type(builder.BaseTypeName.s_boolean):
42
- assert isinstance(value, bool)
43
- return "true" if value else "false"
44
- elif stype.is_base_type(builder.BaseTypeName.s_lossy_decimal):
45
- return str(value)
46
- elif stype.is_base_type(builder.BaseTypeName.s_decimal):
47
- return f"'{value}'"
48
- elif isinstance(stype, builder.SpecTypeInstance):
49
- if stype.defn_type.is_base_type(builder.BaseTypeName.s_list):
50
- sub_type = stype.parameters[0]
51
- return "[" + ", ".join([_emit_value(ctx, sub_type, x) for x in value]) + "]"
52
-
53
- if stype.defn_type.is_base_type(builder.BaseTypeName.s_dict):
54
- key_type = stype.parameters[0]
55
- value_type = stype.parameters[1]
56
- return (
57
- "{\n\t"
58
- + ",\n\t".join(
59
- "["
60
- + _emit_value(ctx, key_type, dkey)
61
- + "]: "
62
- + _emit_value(ctx, value_type, dvalue)
63
- for dkey, dvalue in value.items()
64
- )
65
- + "\n}"
66
- )
67
-
68
- if stype.defn_type.is_base_type(builder.BaseTypeName.s_optional):
69
- sub_type = stype.parameters[0]
70
- if value is None:
71
- return "null"
72
- return _emit_value(ctx, sub_type, value)
73
-
74
- elif isinstance(stype, builder.SpecTypeDefnStringEnum):
75
- return f"{refer_to(ctx, stype)}.{ts_enum_name(value, stype.name_case)}"
76
-
77
- raise Exception("invalid constant type", value, stype)
78
-
79
-
80
19
  def emit_typescript(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
81
20
  _emit_types(builder, config)
82
21
  _emit_id_source(builder, config)
83
22
 
84
23
 
85
- def emit_namespace_imports_ts(
86
- namespaces: set[builder.SpecNamespace],
87
- out: io.StringIO,
88
- current_namespace: builder.SpecNamespace,
89
- ) -> None:
90
- for ns in sorted(
91
- namespaces,
92
- key=lambda name: _resolve_namespace_name(name),
93
- ):
94
- import_as = resolve_namespace_ref(ns)
95
- import_path = (
96
- "./"
97
- if len(current_namespace.path) == 1
98
- else "../" * (len(current_namespace.path) - 1)
99
- )
100
- import_from = f"{import_path}{_resolve_namespace_name(ns)}"
101
- out.write(f'import * as {import_as} from "{import_from}"\n') # noqa: E501
102
-
103
-
104
24
  def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
105
25
  index_out = io.StringIO()
106
26
  index_out.write(MODIFY_NOTICE)
@@ -109,7 +29,7 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
109
29
 
110
30
  for namespace in sorted(
111
31
  builder.namespaces.values(),
112
- key=lambda ns: _resolve_namespace_name(ns),
32
+ key=lambda ns: resolve_namespace_name(ns),
113
33
  ):
114
34
  ctx = EmitTypescriptContext(out=io.StringIO(), namespace=namespace)
115
35
 
@@ -160,7 +80,7 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
160
80
 
161
81
  if len(namespace.path) == 1:
162
82
  index_out.write(
163
- f"import * as {resolve_namespace_ref(namespace)} from './{_resolve_namespace_name(namespace)}'\n"
83
+ f"import * as {resolve_namespace_ref(namespace)} from './{resolve_namespace_name(namespace)}'\n"
164
84
  ) # noqa: E501
165
85
  index_out_end.write(f"export {{{resolve_namespace_ref(namespace)}}}\n")
166
86
 
@@ -297,164 +217,14 @@ export const apiCall = {wrap_call}(
297
217
  index.write(f"export {{ {api_name} }}\n")
298
218
 
299
219
 
300
- def emit_type_ts(ctx: EmitTypescriptContext, stype: builder.SpecType) -> None:
301
- if not isinstance(stype, builder.SpecTypeDefn):
302
- return
303
-
304
- if stype.is_base or stype.is_predefined:
305
- return
306
-
307
- ctx.out.write("\n")
308
- ctx.out.write(MODIFY_NOTICE)
309
-
310
- if isinstance(stype, builder.SpecTypeDefnExternal):
311
- assert not stype.is_exported, "expecting private names"
312
- ctx.out.write(stype.external_map["ts"])
313
- ctx.out.write("\n")
314
- return
315
-
316
- assert stype.is_exported, "expecting exported names"
317
- if isinstance(stype, builder.SpecTypeDefnAlias):
318
- ctx.out.write(f"export type {stype.name} = {refer_to(ctx, stype.alias)}\n")
319
- return
320
-
321
- if isinstance(stype, builder.SpecTypeDefnUnion):
322
- ctx.out.write(
323
- f"export type {stype.name} = {refer_to(ctx, stype.get_backing_type())}\n"
324
- )
325
- return
326
-
327
- if isinstance(stype, builder.SpecTypeDefnStringEnum):
328
- ctx.out.write(f"export enum {stype.name} {{\n")
329
- assert stype.values
330
- for name, entry in stype.values.items():
331
- ctx.out.write(
332
- f'{INDENT}{ts_enum_name(name, stype.name_case)} = "{entry.value}",\n'
333
- )
334
- ctx.out.write("}\n")
335
- return
336
-
337
- assert isinstance(stype, builder.SpecTypeDefnObject)
338
- assert stype.base is not None
339
-
340
- base_type = ""
341
- if not stype.base.is_base:
342
- base_type = f"{refer_to(ctx, stype.base)} & "
343
-
344
- if stype.properties is None and base_type == "":
345
- ctx.out.write(f"export type {stype.name} = TEmpty\n")
346
- elif stype.properties is None:
347
- ctx.out.write(f"export type {stype.name} = {base_type}{{}}\n")
348
- else:
349
- if isinstance(stype, SpecTypeDefnObject) and len(stype.parameters) > 0:
350
- full_type_name = f'{stype.name}<{", ".join(stype.parameters)}>'
351
- else:
352
- full_type_name = stype.name
353
- ctx.out.write(f"export type {full_type_name} = {base_type}{{")
354
- ctx.out.write("\n")
355
- for prop in stype.properties.values():
356
- ref_type = refer_to(ctx, prop.spec_type)
357
- prop_name = ts_name(prop.name, prop.name_case)
358
- if prop.has_default and not prop.parse_require:
359
- # For now, we'll assume the generated types with defaults are meant as
360
- # arguments, thus treat like extant==missing
361
- # IMPROVE: if we can decide they are meant as output instead, then
362
- # they should be marked as required
363
- ctx.out.write(f"{INDENT}{prop_name}?: {ref_type}")
364
- elif prop.extant == builder.PropertyExtant.missing:
365
- # Unlike optional below, missing does not imply null is possible. They
366
- # treated distinctly.
367
- ctx.out.write(f"{INDENT}{prop_name}?: {ref_type}")
368
- elif prop.extant == builder.PropertyExtant.optional:
369
- # Need to add in |null since Python side can produce null's right now
370
- # IMPROVE: It would be better if the serializer could instead omit the None's
371
- # Dropping the null should be forward compatible
372
- ctx.out.write(f"{INDENT}{prop_name}?: {ref_type} | null")
373
- else:
374
- ctx.out.write(f"{INDENT}{prop_name}: {ref_type}")
375
- ctx.out.write("\n")
376
- ctx.out.write("}\n")
377
-
378
-
379
220
  def _emit_constant(ctx: EmitTypescriptContext, sconst: builder.SpecConstant) -> None:
380
221
  ctx.out.write("\n\n")
381
222
  ctx.out.write(MODIFY_NOTICE)
382
- value = _emit_value(ctx, sconst.value_type, sconst.value)
223
+ value = emit_value_ts(ctx, sconst.value_type, sconst.value)
383
224
  const_name = sconst.name.upper()
384
225
  ctx.out.write(f"export const {const_name} = {value}\n")
385
226
 
386
227
 
387
- base_name_map = {
388
- builder.BaseTypeName.s_boolean: "boolean",
389
- builder.BaseTypeName.s_date: "string", # IMPROVE: Aliased DateStr
390
- builder.BaseTypeName.s_date_time: "string", # IMPROVE: Aliased DateTimeStr
391
- # Decimal's are marked as to_string_values thus are strings in the front-end
392
- builder.BaseTypeName.s_decimal: "string",
393
- builder.BaseTypeName.s_dict: "PartialRecord",
394
- builder.BaseTypeName.s_integer: "number",
395
- builder.BaseTypeName.s_lossy_decimal: "number",
396
- builder.BaseTypeName.s_opaque_key: "string",
397
- builder.BaseTypeName.s_none: "null",
398
- builder.BaseTypeName.s_string: "string",
399
- # UNC: global types
400
- builder.BaseTypeName.s_json_value: "JsonValue",
401
- }
402
-
403
-
404
- def refer_to(ctx: EmitTypescriptContext, stype: builder.SpecType) -> str:
405
- return refer_to_impl(ctx, stype)[0]
406
-
407
-
408
- def refer_to_impl(
409
- ctx: EmitTypescriptContext, stype: builder.SpecType
410
- ) -> tuple[str, bool]:
411
- """
412
- @return (string-specific, multiple-types)
413
- """
414
- if isinstance(stype, builder.SpecTypeInstance):
415
- if stype.defn_type.name == builder.BaseTypeName.s_list:
416
- spec, multi = refer_to_impl(ctx, stype.parameters[0])
417
- return f"({spec})[]" if multi else f"{spec}[]", False
418
- if stype.defn_type.name == builder.BaseTypeName.s_readonly_array:
419
- spec, multi = refer_to_impl(ctx, stype.parameters[0])
420
- return f"readonly ({spec})[]" if multi else f"readonly {spec}[]", False
421
- if stype.defn_type.name == builder.BaseTypeName.s_union:
422
- return (
423
- f'({" | ".join([refer_to(ctx, p) for p in stype.parameters])})',
424
- False,
425
- )
426
- if stype.defn_type.name == builder.BaseTypeName.s_literal:
427
- parts = []
428
- for parameter in stype.parameters:
429
- assert isinstance(parameter, builder.SpecTypeLiteralWrapper)
430
- parts.append(refer_to(ctx, parameter))
431
- return f'({" | ".join(parts)})', False
432
- if stype.defn_type.name == builder.BaseTypeName.s_optional:
433
- return f"{refer_to(ctx, stype.parameters[0])} | null", True
434
- if stype.defn_type.name == builder.BaseTypeName.s_tuple:
435
- return f"[{", ".join([refer_to(ctx, p) for p in stype.parameters])}]", False
436
- params = ", ".join([refer_to(ctx, p) for p in stype.parameters])
437
- return f"{refer_to(ctx, stype.defn_type)}<{params}>", False
438
-
439
- if isinstance(stype, builder.SpecTypeLiteralWrapper):
440
- return _emit_value(ctx, stype.value_type, stype.value), False
441
-
442
- if isinstance(stype, builder.SpecTypeGenericParameter):
443
- return stype.name, False
444
-
445
- assert isinstance(stype, builder.SpecTypeDefn)
446
- if stype.is_base: # assume correct namespace
447
- if stype.name == builder.BaseTypeName.s_list:
448
- return "any[]", False # TODO: generic type
449
- return base_name_map[builder.BaseTypeName(stype.name)], False
450
-
451
- if stype.namespace == ctx.namespace:
452
- return stype.name, False
453
-
454
- ctx.namespaces.add(stype.namespace)
455
- return f"{resolve_namespace_ref(stype.namespace)}.{stype.name}", False
456
-
457
-
458
228
  def _emit_id_source(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
459
229
  id_source_output = config.id_source_output
460
230
  if id_source_output is None: