lionagi 0.15.13__py3-none-any.whl → 0.16.0__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.
- lionagi/config.py +1 -0
- lionagi/libs/validate/fuzzy_match_keys.py +5 -182
- lionagi/libs/validate/string_similarity.py +6 -331
- lionagi/ln/__init__.py +56 -66
- lionagi/ln/_async_call.py +13 -10
- lionagi/ln/_hash.py +33 -8
- lionagi/ln/_list_call.py +2 -35
- lionagi/ln/_to_list.py +51 -28
- lionagi/ln/_utils.py +156 -0
- lionagi/ln/concurrency/__init__.py +39 -31
- lionagi/ln/concurrency/_compat.py +65 -0
- lionagi/ln/concurrency/cancel.py +92 -109
- lionagi/ln/concurrency/errors.py +17 -17
- lionagi/ln/concurrency/patterns.py +249 -206
- lionagi/ln/concurrency/primitives.py +257 -216
- lionagi/ln/concurrency/resource_tracker.py +42 -155
- lionagi/ln/concurrency/task.py +55 -73
- lionagi/ln/concurrency/throttle.py +3 -0
- lionagi/ln/concurrency/utils.py +1 -0
- lionagi/ln/fuzzy/__init__.py +15 -0
- lionagi/ln/{_extract_json.py → fuzzy/_extract_json.py} +22 -9
- lionagi/ln/{_fuzzy_json.py → fuzzy/_fuzzy_json.py} +14 -8
- lionagi/ln/fuzzy/_fuzzy_match.py +172 -0
- lionagi/ln/fuzzy/_fuzzy_validate.py +46 -0
- lionagi/ln/fuzzy/_string_similarity.py +332 -0
- lionagi/ln/{_models.py → types.py} +153 -4
- lionagi/operations/flow.py +2 -1
- lionagi/operations/operate/operate.py +26 -16
- lionagi/protocols/contracts.py +46 -0
- lionagi/protocols/generic/event.py +6 -6
- lionagi/protocols/generic/processor.py +9 -5
- lionagi/protocols/ids.py +82 -0
- lionagi/protocols/types.py +10 -12
- lionagi/service/connections/match_endpoint.py +9 -0
- lionagi/service/connections/providers/nvidia_nim_.py +100 -0
- lionagi/utils.py +34 -64
- lionagi/version.py +1 -1
- {lionagi-0.15.13.dist-info → lionagi-0.16.0.dist-info}/METADATA +4 -2
- {lionagi-0.15.13.dist-info → lionagi-0.16.0.dist-info}/RECORD +41 -33
- lionagi/ln/_types.py +0 -146
- {lionagi-0.15.13.dist-info → lionagi-0.16.0.dist-info}/WHEEL +0 -0
- {lionagi-0.15.13.dist-info → lionagi-0.16.0.dist-info}/licenses/LICENSE +0 -0
@@ -2,11 +2,11 @@ lionagi/__init__.py,sha256=HZmhhYeplh06qAJQ7cW8JUlJsqG_Q4JKJ3GGFW_ZQnw,682
|
|
2
2
|
lionagi/_class_registry.py,sha256=pfUO1DjFZIqr3OwnNMkFqL_fiEBrrf8-swkGmP_KDLE,3112
|
3
3
|
lionagi/_errors.py,sha256=ia_VWhPSyr5FIJLSdPpl04SrNOLI2skN40VC8ePmzeQ,3748
|
4
4
|
lionagi/_types.py,sha256=j8XwSGeGrYwfmSJ8o-80bsfoalLWJgQH41ZkVevc4wk,75
|
5
|
-
lionagi/config.py,sha256=
|
5
|
+
lionagi/config.py,sha256=D13nnjpgJKz_LlQrzaKKVefm4hqesz_dP9ROjWmGuLE,3811
|
6
6
|
lionagi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
7
|
lionagi/settings.py,sha256=HDuKCEJCpc4HudKodBnhoQUGuTGhRHdlIFhbtf3VBtY,1633
|
8
|
-
lionagi/utils.py,sha256=
|
9
|
-
lionagi/version.py,sha256=
|
8
|
+
lionagi/utils.py,sha256=cFUhOL2clDwsRnBjNdysnK-_0Z9SmejPIkg6_i2jLXE,27512
|
9
|
+
lionagi/version.py,sha256=3Msc5baw88UJubVj5AVFB8tExkT2OFIsNWe2leaoHhc,23
|
10
10
|
lionagi/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
lionagi/adapters/_utils.py,sha256=n4DS27CZfC-0O_UFaYtlUdjiMx9IeYsGpP7MVaFO5ZA,885
|
12
12
|
lionagi/adapters/async_postgres_adapter.py,sha256=OEJd9ie8prxRQK2_-W9qmdI3Sl6Q7xxRs7Vey16G3pQ,3172
|
@@ -75,31 +75,36 @@ lionagi/libs/unstructured/pdf_to_image.py,sha256=lJ2CVxOYh61-3-55nusHXMOGqtEyLXs
|
|
75
75
|
lionagi/libs/unstructured/read_image_to_base64.py,sha256=EJXWBJxCTa9vHBIFPRqQj0jeFXyDv1cs2oPBrWt-waQ,897
|
76
76
|
lionagi/libs/validate/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
77
77
|
lionagi/libs/validate/common_field_validators.py,sha256=1BHznXnJYcLQrHqvHKUnP6aqCptuQ0qN7KJRCExcJBU,4778
|
78
|
-
lionagi/libs/validate/fuzzy_match_keys.py,sha256=
|
78
|
+
lionagi/libs/validate/fuzzy_match_keys.py,sha256=Nec5W1CVdmUgzcyDHcHiaELY6tFsicjbVsMI5dsIilk,190
|
79
79
|
lionagi/libs/validate/fuzzy_validate_mapping.py,sha256=MZpRop3whCQQtgYwJgg66nbN0KxNuKXqulaAgA0Y1_g,4935
|
80
|
-
lionagi/libs/validate/string_similarity.py,sha256=
|
80
|
+
lionagi/libs/validate/string_similarity.py,sha256=kuOQFNnI773bV8KKj_PUYxx8vLRdWay8PhuvkOWsU9E,186
|
81
81
|
lionagi/libs/validate/to_num.py,sha256=ZRHDjpTCykPfDIZZa4rZKNaR_8ZHbPDFlw9rc02DrII,11610
|
82
82
|
lionagi/libs/validate/validate_boolean.py,sha256=bjiX_WZ3Bg8XcqoWLzE1G9BpO0AisrlZUxrpye_mlGk,3614
|
83
83
|
lionagi/libs/validate/xml_parser.py,sha256=PHBYAre4hhthPpDP9Yrp3UYSWdANPx60F1qhxe0m4uw,7004
|
84
|
-
lionagi/ln/__init__.py,sha256=
|
85
|
-
lionagi/ln/_async_call.py,sha256=
|
86
|
-
lionagi/ln/
|
87
|
-
lionagi/ln/_fuzzy_json.py,sha256=zJGyyBoEidLFSIF9i8sactTrQOhyAecQhtvhls9w4mU,3541
|
88
|
-
lionagi/ln/_hash.py,sha256=g20yJfuVhAsfsBOWlkO889DHte6cbUCl6vV5QMT8nUo,3499
|
84
|
+
lionagi/ln/__init__.py,sha256=w38jHMfmmdUJc6_ZVo5x7Ieh2ugmbcTxkb4yLlmmAHI,1487
|
85
|
+
lionagi/ln/_async_call.py,sha256=mnqq5l-hNIBWrWh7X7CtmwPafg1kT-lnWWm3nJnbPoI,9384
|
86
|
+
lionagi/ln/_hash.py,sha256=WLwKsbJISE7KtOrpiE30AFtfwyOCSBjb1GslBlvj5ac,4529
|
89
87
|
lionagi/ln/_json_dump.py,sha256=M4ceccjkU7AN6wd5fUWKFmHytE-EVe8wqoQEFP0OkoA,2026
|
90
|
-
lionagi/ln/_list_call.py,sha256=
|
91
|
-
lionagi/ln/
|
92
|
-
lionagi/ln/
|
93
|
-
lionagi/ln/
|
94
|
-
lionagi/ln/concurrency/__init__.py,sha256=
|
95
|
-
lionagi/ln/concurrency/
|
96
|
-
lionagi/ln/concurrency/
|
97
|
-
lionagi/ln/concurrency/
|
98
|
-
lionagi/ln/concurrency/
|
99
|
-
lionagi/ln/concurrency/
|
100
|
-
lionagi/ln/concurrency/
|
101
|
-
lionagi/ln/concurrency/
|
102
|
-
lionagi/ln/concurrency/
|
88
|
+
lionagi/ln/_list_call.py,sha256=zvISmCeNAH7yjBcusQI1s17n556tILgePhRMdAM2plA,2831
|
89
|
+
lionagi/ln/_to_list.py,sha256=YOlrMplSpQhXDSTK4fkMF7Mhuw1wS0jGip5mS88Otro,6610
|
90
|
+
lionagi/ln/_utils.py,sha256=5Z_AsDxdtH5wNB-P4IiihhH0dYUcZMT-hTxFQBQPwL0,4303
|
91
|
+
lionagi/ln/types.py,sha256=MfLUa5iZnOdAJI4owNXA-w41l1ZL7Fs8DVE4OGXQPF8,8517
|
92
|
+
lionagi/ln/concurrency/__init__.py,sha256=xt_GLZ1Zb-nC-RnrNt8jOBWb_uf1md__B1R5cplMShg,1190
|
93
|
+
lionagi/ln/concurrency/_compat.py,sha256=itxdRzl95PLEBQvNY0zTriF39kymaNRpKncT8QsOomA,2065
|
94
|
+
lionagi/ln/concurrency/cancel.py,sha256=8JlWy_EVto4Fls1yQLBteCbpn4zP6ydnqIa_EL5kxZc,3313
|
95
|
+
lionagi/ln/concurrency/errors.py,sha256=Tg76ods-CG_9rz7TksTiRGqpTzWHi-Wm9JPotGB9iEM,869
|
96
|
+
lionagi/ln/concurrency/patterns.py,sha256=08eebVxbBxkcMFgJqZB-cXS7lRZduH1Y-zorb8fTTZs,9447
|
97
|
+
lionagi/ln/concurrency/primitives.py,sha256=-mXU-mUThbr9YUH2viw8mY5iOuKn5E5CoiTlG41NO3k,9543
|
98
|
+
lionagi/ln/concurrency/resource_tracker.py,sha256=ffLr0FkHyaHsUa4UDyWwse-8wGLaLMnAyfyeTDyzrDA,1512
|
99
|
+
lionagi/ln/concurrency/task.py,sha256=VS5keFI3Ct0fqCKbFl4kEWT5I2CgjIYizPU-S2YjGKo,2675
|
100
|
+
lionagi/ln/concurrency/throttle.py,sha256=yUAM4hnone6VzlFEos0fWERkZU9YC4J6TncZL-MqkG4,2319
|
101
|
+
lionagi/ln/concurrency/utils.py,sha256=MUWupnFtWxR15hWnligLZrS4Z1SAQ7j3cuCG08cK3GQ,431
|
102
|
+
lionagi/ln/fuzzy/__init__.py,sha256=_OE6Scyw99uU7gcCmYS4mB29LrpPayUJXeYlGhZTjlg,445
|
103
|
+
lionagi/ln/fuzzy/_extract_json.py,sha256=rYHaK36yzRpie8qO-T7mZKOue2yqCLx3ixiuKhsaKvg,2224
|
104
|
+
lionagi/ln/fuzzy/_fuzzy_json.py,sha256=S0lCkNvprn7XZHoYdRfzXueexSbjxTeLPkpyJ9IAO3A,3860
|
105
|
+
lionagi/ln/fuzzy/_fuzzy_match.py,sha256=MBL2qB180MsGkIvhiHQpVObfikBFjcLcFWG9T6vLZQ0,5915
|
106
|
+
lionagi/ln/fuzzy/_fuzzy_validate.py,sha256=ISC6EulV9VhIfR5Hh8JIq6WMcZOqt3AJPLUY6ZqpM1Y,1458
|
107
|
+
lionagi/ln/fuzzy/_string_similarity.py,sha256=axgLjDgDfBT-soxZFU2iH2bZYmGePSzc9Mxl3WlOxAA,8718
|
103
108
|
lionagi/models/__init__.py,sha256=R7DEGWuhH-izP7eN6SOw24-I4Mr2IVPXF4gNysmF2zQ,457
|
104
109
|
lionagi/models/field_model.py,sha256=JdmCp2pmwoy5HuduF21ivqyvMaJ04CTXu6Un-AeSwLU,23652
|
105
110
|
lionagi/models/hashable_model.py,sha256=oOqR3OJCU9cJfWHiG0WaEw0GMqfE2WTt4cy7WsAsiRg,829
|
@@ -109,7 +114,7 @@ lionagi/models/operable_model.py,sha256=Zm_Hxdauqyh0za3_TJLCZ3g6nR4F45Rrnc0ZM3d5
|
|
109
114
|
lionagi/models/schema_model.py,sha256=ghRIM8aBNaToAknwNlhQKpuKXcwzyCw5pDE31bVKxs0,667
|
110
115
|
lionagi/operations/__init__.py,sha256=a1EqxC5jRgVM1z_srZsxXtTC2Q6iA79ofpcd7cyT3B8,632
|
111
116
|
lionagi/operations/builder.py,sha256=tMl3zZkp-dQAdR27chrAmjmYVaJGshP7tf6AyNJyCUw,23177
|
112
|
-
lionagi/operations/flow.py,sha256=
|
117
|
+
lionagi/operations/flow.py,sha256=ZfCN_xlPuI2ZJAPL4opYNkTvNMaVQxTq-HKRZ4Lybjk,22248
|
113
118
|
lionagi/operations/manager.py,sha256=YZr3VjPAZVVFd_bIjF1aoQqzzKZHNA1kcqefNi5QFFM,683
|
114
119
|
lionagi/operations/node.py,sha256=qmjhv-8UzQMO5ocBlNWuv9nqQiLh5CV7AW_tno8jIUM,3183
|
115
120
|
lionagi/operations/types.py,sha256=fM8HphnbBifMzhoKKvdl3JxGCBHlEGPJEYkLWj9b7vE,704
|
@@ -131,7 +136,7 @@ lionagi/operations/instruct/instruct.py,sha256=7pxhyP5jxwpgqjmQNb1rnGF4QAVlbMENp
|
|
131
136
|
lionagi/operations/interpret/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
132
137
|
lionagi/operations/interpret/interpret.py,sha256=yl1NSp2iOm3dbycVLEcnV3absnqKoubfH15v6lQgySU,1500
|
133
138
|
lionagi/operations/operate/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
134
|
-
lionagi/operations/operate/operate.py,sha256=
|
139
|
+
lionagi/operations/operate/operate.py,sha256=SHk-BqjUWnN5aT7Xrm3lzR6yDppq_i2sbN8Iny8PelE,7512
|
135
140
|
lionagi/operations/parse/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
136
141
|
lionagi/operations/parse/parse.py,sha256=xS9uIxBzHLGD-1VpBVgGUhxF-tQDkF2KLmIpErM47RQ,6661
|
137
142
|
lionagi/operations/plan/__init__.py,sha256=yGBPll6lOqVjadbTvDLGrTlMx3FfBW-e00z7AMvg7Uo,156
|
@@ -144,7 +149,9 @@ lionagi/operations/translate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
144
149
|
lionagi/operations/translate/translate.py,sha256=6eBVoQRarGEJ8Tfcl6Z__PLHQTTIbM5MaPVYNeKHRIs,1397
|
145
150
|
lionagi/protocols/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
146
151
|
lionagi/protocols/_concepts.py,sha256=ZBN5OYpLMWLrl9uZqSg9GD4uwf60V4VHcxRnBTRWIRc,1555
|
147
|
-
lionagi/protocols/
|
152
|
+
lionagi/protocols/contracts.py,sha256=ii7luaPJsEKOb3J-rcaNysPDGU3nEzpgy_8g1z5_CCA,1398
|
153
|
+
lionagi/protocols/ids.py,sha256=RM40pP_4waMJcfCGmEK_PfS8-k_DuDbC1fG-2Peuf6s,2472
|
154
|
+
lionagi/protocols/types.py,sha256=EEmgYcaMCbgLU2rk7lTyKyRh_B15BeMccciv097j3Eg,2828
|
148
155
|
lionagi/protocols/action/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
149
156
|
lionagi/protocols/action/function_calling.py,sha256=rfuzIowjJpyqO5Ynfs5fGnxsDIU5aKinTj1NI6bGlEU,5106
|
150
157
|
lionagi/protocols/action/manager.py,sha256=XmdQIaVgSpmFBFW9kbW_rdwdQmlBteP4VRanxh_f918,8549
|
@@ -156,10 +163,10 @@ lionagi/protocols/forms/form.py,sha256=B4903km_Ljz-OxYkb1ZT_cpHZSaAYYJpZMsffWloo
|
|
156
163
|
lionagi/protocols/forms/report.py,sha256=SvJJjOSCTfVuqK7AKaY8ldQIGJeSK2zoyPWUV41ge2c,1609
|
157
164
|
lionagi/protocols/generic/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
158
165
|
lionagi/protocols/generic/element.py,sha256=5R9cLodaPzSPbellgFEudRxZIOMJDiCV8emyQKuEbPI,18621
|
159
|
-
lionagi/protocols/generic/event.py,sha256=
|
166
|
+
lionagi/protocols/generic/event.py,sha256=n5EraAJ5bPiwegTdkxsILs7-vFJwmnXhB2om4xMQnK0,6529
|
160
167
|
lionagi/protocols/generic/log.py,sha256=Y06zAQewkNlaIWjut_c6c45KY_LJfLHwzUaDGLULaas,8212
|
161
168
|
lionagi/protocols/generic/pile.py,sha256=mc10zh9RdqfozPEBOgRdkrTgIWUHBz8enAcQ-8pFhRQ,37046
|
162
|
-
lionagi/protocols/generic/processor.py,sha256=
|
169
|
+
lionagi/protocols/generic/processor.py,sha256=uiNIldAYPEujuboLFyrIJADMlhRghy3H86hYintj5D4,11705
|
163
170
|
lionagi/protocols/generic/progression.py,sha256=HCV_EnQCFvjg6D7eF4ygGrZNQPEOtu75zvW1sJbAVrM,15190
|
164
171
|
lionagi/protocols/graph/__init__.py,sha256=UPu3OmUpjSgX2aBuBJUdG2fppGlfqAH96hU0qIMBMp0,253
|
165
172
|
lionagi/protocols/graph/_utils.py,sha256=mts4M2wcGKdY9hC-1917lxIJT5oycW9VnRgfRx8ydbI,605
|
@@ -203,12 +210,13 @@ lionagi/service/connections/api_calling.py,sha256=fY-fzwSJvQKpUT27TF0MTfE5TxroYK
|
|
203
210
|
lionagi/service/connections/endpoint.py,sha256=UYjryqKF4uEaGzDP9vYrav-0Xr6tDR6J9FM_kwqR87Q,14832
|
204
211
|
lionagi/service/connections/endpoint_config.py,sha256=6sA06uCzriT6p0kFxhDCFH8N6V6MVp8ytlOw5ctBhDI,5169
|
205
212
|
lionagi/service/connections/header_factory.py,sha256=IYeTQQk7r8FXcdhmW7orCxHjNO-Nb1EOXhgNK7CAp-I,1821
|
206
|
-
lionagi/service/connections/match_endpoint.py,sha256=
|
213
|
+
lionagi/service/connections/match_endpoint.py,sha256=Df5v3bprnJq5CqOzuK0KzwawOIfAsGZZM4CnE-sliu4,2850
|
207
214
|
lionagi/service/connections/providers/__init__.py,sha256=3lzOakDoBWmMaNnT2g-YwktPKa_Wme4lnPRSmOQfayY,105
|
208
215
|
lionagi/service/connections/providers/anthropic_.py,sha256=vok8mIyFiuV3K83tOjdYfruA6cv1h_57ML6RtpuW-bU,3157
|
209
216
|
lionagi/service/connections/providers/claude_code_.py,sha256=dix4VoR2YwRabJ0F8I3mV8sVtRQEquExqP6mfbE_rGk,10435
|
210
217
|
lionagi/service/connections/providers/claude_code_cli.py,sha256=kqEOnCUOOh2O_3NGi6W7r-gdLsbW-Jcp11tm30VEv4Q,4455
|
211
218
|
lionagi/service/connections/providers/exa_.py,sha256=kuWD7yyYRqIa4ChSn0TsxFA5V5LwvFUD-w8TZ6mx4rk,1048
|
219
|
+
lionagi/service/connections/providers/nvidia_nim_.py,sha256=95vmo0DSONYBVHkR9SGJ5BiHNKFZNZBrjw4_7ShOXQA,3154
|
212
220
|
lionagi/service/connections/providers/oai_.py,sha256=3x5d6Ei1hKu8Mix0N2V2K21O9dd-2jtAELHhHXj5iHk,6071
|
213
221
|
lionagi/service/connections/providers/ollama_.py,sha256=oqYLWn81KrWoQgId4e4GD_bgrDjQLPOmhqlc5uBuFGk,4569
|
214
222
|
lionagi/service/connections/providers/perplexity_.py,sha256=1GMmxAXsKGsB-xlqxO6hW-QdqoqkU2705NLyejetFSw,1646
|
@@ -235,7 +243,7 @@ lionagi/tools/types.py,sha256=XtJLY0m-Yi_ZLWhm0KycayvqMCZd--HxfQ0x9vFUYDE,230
|
|
235
243
|
lionagi/tools/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
236
244
|
lionagi/tools/file/reader.py,sha256=2YKgU3VKo76zfL_buDAUQJoPLC56f6WJ4_mdJjlMDIM,9509
|
237
245
|
lionagi/tools/memory/tools.py,sha256=earYkKxSOz_iXkqVZYTEDfE3dwZYIWPXZrqQ1DYGz4I,15941
|
238
|
-
lionagi-0.
|
239
|
-
lionagi-0.
|
240
|
-
lionagi-0.
|
241
|
-
lionagi-0.
|
246
|
+
lionagi-0.16.0.dist-info/METADATA,sha256=GGDAE5nFDfUE01hTZxmw1FWJ8XwSnPSsxNoNuHHQR1g,23119
|
247
|
+
lionagi-0.16.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
248
|
+
lionagi-0.16.0.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
|
249
|
+
lionagi-0.16.0.dist-info/RECORD,,
|
lionagi/ln/_types.py
DELETED
@@ -1,146 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from enum import Enum as _Enum
|
4
|
-
from typing import Any, Final, Literal, TypeVar, Union
|
5
|
-
|
6
|
-
from typing_extensions import TypedDict
|
7
|
-
|
8
|
-
__all__ = (
|
9
|
-
"Undefined",
|
10
|
-
"Unset",
|
11
|
-
"MaybeUndefined",
|
12
|
-
"MaybeUnset",
|
13
|
-
"MaybeSentinel",
|
14
|
-
"SingletonType",
|
15
|
-
"UndefinedType",
|
16
|
-
"UnsetType",
|
17
|
-
"KeysDict",
|
18
|
-
"T",
|
19
|
-
"Enum",
|
20
|
-
"is_sentinel",
|
21
|
-
"not_sentinel",
|
22
|
-
)
|
23
|
-
|
24
|
-
T = TypeVar("T")
|
25
|
-
|
26
|
-
|
27
|
-
class _SingletonMeta(type):
|
28
|
-
"""Metaclass that guarantees exactly one instance per subclass.
|
29
|
-
|
30
|
-
This ensures that sentinel values maintain identity across the entire application,
|
31
|
-
allowing safe identity checks with 'is' operator.
|
32
|
-
"""
|
33
|
-
|
34
|
-
_cache: dict[type, SingletonType] = {}
|
35
|
-
|
36
|
-
def __call__(cls, *a, **kw):
|
37
|
-
if cls not in cls._cache:
|
38
|
-
cls._cache[cls] = super().__call__(*a, **kw)
|
39
|
-
return cls._cache[cls]
|
40
|
-
|
41
|
-
|
42
|
-
class SingletonType(metaclass=_SingletonMeta):
|
43
|
-
"""Base class for singleton sentinel types.
|
44
|
-
|
45
|
-
Provides consistent interface for sentinel values with:
|
46
|
-
- Identity preservation across deepcopy
|
47
|
-
- Falsy boolean evaluation
|
48
|
-
- Clear string representation
|
49
|
-
"""
|
50
|
-
|
51
|
-
__slots__: tuple[str, ...] = ()
|
52
|
-
|
53
|
-
def __deepcopy__(self, memo): # copy & deepcopy both noop
|
54
|
-
return self
|
55
|
-
|
56
|
-
def __copy__(self):
|
57
|
-
return self
|
58
|
-
|
59
|
-
# concrete classes *must* override the two methods below
|
60
|
-
def __bool__(self) -> bool: ...
|
61
|
-
def __repr__(self) -> str: ...
|
62
|
-
|
63
|
-
|
64
|
-
class UndefinedType(SingletonType):
|
65
|
-
"""Sentinel for a key or field entirely missing from a namespace.
|
66
|
-
|
67
|
-
Use this when:
|
68
|
-
- A field has never been set
|
69
|
-
- A key doesn't exist in a mapping
|
70
|
-
- A value is conceptually undefined (not just unset)
|
71
|
-
|
72
|
-
Example:
|
73
|
-
>>> d = {"a": 1}
|
74
|
-
>>> d.get("b", Undefined) is Undefined
|
75
|
-
True
|
76
|
-
"""
|
77
|
-
|
78
|
-
__slots__ = ()
|
79
|
-
|
80
|
-
def __bool__(self) -> Literal[False]:
|
81
|
-
return False
|
82
|
-
|
83
|
-
def __repr__(self) -> Literal["Undefined"]:
|
84
|
-
return "Undefined"
|
85
|
-
|
86
|
-
def __str__(self) -> Literal["Undefined"]:
|
87
|
-
return "Undefined"
|
88
|
-
|
89
|
-
|
90
|
-
class UnsetType(SingletonType):
|
91
|
-
"""Sentinel for a key present but value not yet provided.
|
92
|
-
|
93
|
-
Use this when:
|
94
|
-
- A parameter exists but hasn't been given a value
|
95
|
-
- Distinguishing between None and "not provided"
|
96
|
-
- API parameters that are optional but need explicit handling
|
97
|
-
|
98
|
-
Example:
|
99
|
-
>>> def func(param=Unset):
|
100
|
-
... if param is not Unset:
|
101
|
-
... # param was explicitly provided
|
102
|
-
... process(param)
|
103
|
-
"""
|
104
|
-
|
105
|
-
__slots__ = ()
|
106
|
-
|
107
|
-
def __bool__(self) -> Literal[False]:
|
108
|
-
return False
|
109
|
-
|
110
|
-
def __repr__(self) -> Literal["Unset"]:
|
111
|
-
return "Unset"
|
112
|
-
|
113
|
-
def __str__(self) -> Literal["Unset"]:
|
114
|
-
return "Unset"
|
115
|
-
|
116
|
-
|
117
|
-
Undefined: Final = UndefinedType()
|
118
|
-
"""A key or field entirely missing from a namespace"""
|
119
|
-
Unset: Final = UnsetType()
|
120
|
-
"""A key present but value not yet provided."""
|
121
|
-
|
122
|
-
MaybeUndefined = Union[T, UndefinedType]
|
123
|
-
MaybeUnset = Union[T, UnsetType]
|
124
|
-
MaybeSentinel = Union[T, UndefinedType, UnsetType]
|
125
|
-
|
126
|
-
|
127
|
-
def is_sentinel(value: Any) -> bool:
|
128
|
-
"""Check if a value is any sentinel (Undefined or Unset)."""
|
129
|
-
return value is Undefined or value is Unset
|
130
|
-
|
131
|
-
|
132
|
-
def not_sentinel(value: Any) -> bool:
|
133
|
-
"""Check if a value is NOT a sentinel. Useful for filtering operations."""
|
134
|
-
return value is not Undefined and value is not Unset
|
135
|
-
|
136
|
-
|
137
|
-
class Enum(_Enum):
|
138
|
-
@classmethod
|
139
|
-
def allowed(cls) -> tuple[str, ...]:
|
140
|
-
return tuple(e.value for e in cls)
|
141
|
-
|
142
|
-
|
143
|
-
class KeysDict(TypedDict, total=False):
|
144
|
-
"""TypedDict for keys dictionary."""
|
145
|
-
|
146
|
-
key: Any # Represents any key-type pair
|
File without changes
|
File without changes
|