ZhengyangZhang commited on
Commit
e5b91e2
·
verified ·
1 Parent(s): 72d7e80

Add files using upload-large-folder tool

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER +1 -0
  2. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA +262 -0
  3. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD +138 -0
  4. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL +7 -0
  5. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt +13 -0
  6. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE +22 -0
  7. lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt +1 -0
  8. lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/INSTALLER +1 -0
  9. lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/METADATA +295 -0
  10. lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/RECORD +10 -0
  11. lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/WHEEL +4 -0
  12. lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE +21 -0
  13. lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/INSTALLER +1 -0
  14. lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/METADATA +15 -0
  15. lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/RECORD +118 -0
  16. lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/WHEEL +5 -0
  17. lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/top_level.txt +1 -0
  18. lib/python3.12/site-packages/contourpy-1.3.3.dist-info/INSTALLER +1 -0
  19. lib/python3.12/site-packages/contourpy-1.3.3.dist-info/LICENSE +29 -0
  20. lib/python3.12/site-packages/contourpy-1.3.3.dist-info/METADATA +94 -0
  21. lib/python3.12/site-packages/contourpy-1.3.3.dist-info/RECORD +42 -0
  22. lib/python3.12/site-packages/contourpy-1.3.3.dist-info/WHEEL +6 -0
  23. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/INSTALLER +1 -0
  24. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/METADATA +306 -0
  25. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/RECORD +82 -0
  26. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/WHEEL +5 -0
  27. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/licenses/AUTHORS +60 -0
  28. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/licenses/LICENSE +29 -0
  29. lib/python3.12/site-packages/gitpython-3.1.46.dist-info/top_level.txt +1 -0
  30. lib/python3.12/site-packages/hydra/__init__.py +23 -0
  31. lib/python3.12/site-packages/hydra/_internal/__init__.py +1 -0
  32. lib/python3.12/site-packages/hydra/_internal/__pycache__/__init__.cpython-312.pyc +0 -0
  33. lib/python3.12/site-packages/hydra/_internal/__pycache__/callbacks.cpython-312.pyc +0 -0
  34. lib/python3.12/site-packages/hydra/_internal/__pycache__/config_loader_impl.cpython-312.pyc +0 -0
  35. lib/python3.12/site-packages/hydra/_internal/__pycache__/config_repository.cpython-312.pyc +0 -0
  36. lib/python3.12/site-packages/hydra/_internal/__pycache__/config_search_path_impl.cpython-312.pyc +0 -0
  37. lib/python3.12/site-packages/hydra/_internal/__pycache__/defaults_list.cpython-312.pyc +0 -0
  38. lib/python3.12/site-packages/hydra/_internal/__pycache__/deprecation_warning.cpython-312.pyc +0 -0
  39. lib/python3.12/site-packages/hydra/_internal/__pycache__/hydra.cpython-312.pyc +0 -0
  40. lib/python3.12/site-packages/hydra/_internal/__pycache__/sources_registry.cpython-312.pyc +0 -0
  41. lib/python3.12/site-packages/hydra/_internal/__pycache__/utils.cpython-312.pyc +0 -0
  42. lib/python3.12/site-packages/hydra/_internal/callbacks.py +65 -0
  43. lib/python3.12/site-packages/hydra/_internal/config_loader_impl.py +600 -0
  44. lib/python3.12/site-packages/hydra/_internal/config_repository.py +366 -0
  45. lib/python3.12/site-packages/hydra/_internal/config_search_path_impl.py +98 -0
  46. lib/python3.12/site-packages/hydra/_internal/core_plugins/__init__.py +1 -0
  47. lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/__init__.cpython-312.pyc +0 -0
  48. lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/bash_completion.cpython-312.pyc +0 -0
  49. lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/basic_launcher.cpython-312.pyc +0 -0
  50. lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/basic_sweeper.cpython-312.pyc +0 -0
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: aiohttp
3
+ Version: 3.13.3
4
+ Summary: Async http client/server framework (asyncio)
5
+ Maintainer-email: aiohttp team <team@aiohttp.org>
6
+ License: Apache-2.0 AND MIT
7
+ Project-URL: Homepage, https://github.com/aio-libs/aiohttp
8
+ Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
9
+ Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
10
+ Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI
11
+ Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp
12
+ Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html
13
+ Project-URL: Docs: RTD, https://docs.aiohttp.org
14
+ Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues
15
+ Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp
16
+ Classifier: Development Status :: 5 - Production/Stable
17
+ Classifier: Framework :: AsyncIO
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: Operating System :: POSIX
20
+ Classifier: Operating System :: MacOS :: MacOS X
21
+ Classifier: Operating System :: Microsoft :: Windows
22
+ Classifier: Programming Language :: Python
23
+ Classifier: Programming Language :: Python :: 3
24
+ Classifier: Programming Language :: Python :: 3.9
25
+ Classifier: Programming Language :: Python :: 3.10
26
+ Classifier: Programming Language :: Python :: 3.11
27
+ Classifier: Programming Language :: Python :: 3.12
28
+ Classifier: Programming Language :: Python :: 3.13
29
+ Classifier: Programming Language :: Python :: 3.14
30
+ Classifier: Topic :: Internet :: WWW/HTTP
31
+ Requires-Python: >=3.9
32
+ Description-Content-Type: text/x-rst
33
+ License-File: LICENSE.txt
34
+ License-File: vendor/llhttp/LICENSE
35
+ Requires-Dist: aiohappyeyeballs>=2.5.0
36
+ Requires-Dist: aiosignal>=1.4.0
37
+ Requires-Dist: async-timeout<6.0,>=4.0; python_version < "3.11"
38
+ Requires-Dist: attrs>=17.3.0
39
+ Requires-Dist: frozenlist>=1.1.1
40
+ Requires-Dist: multidict<7.0,>=4.5
41
+ Requires-Dist: propcache>=0.2.0
42
+ Requires-Dist: yarl<2.0,>=1.17.0
43
+ Provides-Extra: speedups
44
+ Requires-Dist: aiodns>=3.3.0; extra == "speedups"
45
+ Requires-Dist: Brotli>=1.2; platform_python_implementation == "CPython" and extra == "speedups"
46
+ Requires-Dist: brotlicffi>=1.2; platform_python_implementation != "CPython" and extra == "speedups"
47
+ Requires-Dist: backports.zstd; (platform_python_implementation == "CPython" and python_version < "3.14") and extra == "speedups"
48
+ Dynamic: license-file
49
+
50
+ ==================================
51
+ Async http client/server framework
52
+ ==================================
53
+
54
+ .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg
55
+ :height: 64px
56
+ :width: 64px
57
+ :alt: aiohttp logo
58
+
59
+ |
60
+
61
+ .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg
62
+ :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI
63
+ :alt: GitHub Actions status for master branch
64
+
65
+ .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg
66
+ :target: https://codecov.io/gh/aio-libs/aiohttp
67
+ :alt: codecov.io status for master branch
68
+
69
+ .. image:: https://badge.fury.io/py/aiohttp.svg
70
+ :target: https://pypi.org/project/aiohttp
71
+ :alt: Latest PyPI package version
72
+
73
+ .. image:: https://img.shields.io/pypi/dm/aiohttp
74
+ :target: https://pypistats.org/packages/aiohttp
75
+ :alt: Downloads count
76
+
77
+ .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest
78
+ :target: https://docs.aiohttp.org/
79
+ :alt: Latest Read The Docs
80
+
81
+ .. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json
82
+ :target: https://codspeed.io/aio-libs/aiohttp
83
+ :alt: Codspeed.io status for aiohttp
84
+
85
+
86
+ Key Features
87
+ ============
88
+
89
+ - Supports both client and server side of HTTP protocol.
90
+ - Supports both client and server Web-Sockets out-of-the-box and avoids
91
+ Callback Hell.
92
+ - Provides Web-server with middleware and pluggable routing.
93
+
94
+
95
+ Getting started
96
+ ===============
97
+
98
+ Client
99
+ ------
100
+
101
+ To get something from the web:
102
+
103
+ .. code-block:: python
104
+
105
+ import aiohttp
106
+ import asyncio
107
+
108
+ async def main():
109
+
110
+ async with aiohttp.ClientSession() as session:
111
+ async with session.get('http://python.org') as response:
112
+
113
+ print("Status:", response.status)
114
+ print("Content-type:", response.headers['content-type'])
115
+
116
+ html = await response.text()
117
+ print("Body:", html[:15], "...")
118
+
119
+ asyncio.run(main())
120
+
121
+ This prints:
122
+
123
+ .. code-block::
124
+
125
+ Status: 200
126
+ Content-type: text/html; charset=utf-8
127
+ Body: <!doctype html> ...
128
+
129
+ Coming from `requests <https://requests.readthedocs.io/>`_ ? Read `why we need so many lines <https://aiohttp.readthedocs.io/en/latest/http_request_lifecycle.html>`_.
130
+
131
+ Server
132
+ ------
133
+
134
+ An example using a simple server:
135
+
136
+ .. code-block:: python
137
+
138
+ # examples/server_simple.py
139
+ from aiohttp import web
140
+
141
+ async def handle(request):
142
+ name = request.match_info.get('name', "Anonymous")
143
+ text = "Hello, " + name
144
+ return web.Response(text=text)
145
+
146
+ async def wshandle(request):
147
+ ws = web.WebSocketResponse()
148
+ await ws.prepare(request)
149
+
150
+ async for msg in ws:
151
+ if msg.type == web.WSMsgType.text:
152
+ await ws.send_str("Hello, {}".format(msg.data))
153
+ elif msg.type == web.WSMsgType.binary:
154
+ await ws.send_bytes(msg.data)
155
+ elif msg.type == web.WSMsgType.close:
156
+ break
157
+
158
+ return ws
159
+
160
+
161
+ app = web.Application()
162
+ app.add_routes([web.get('/', handle),
163
+ web.get('/echo', wshandle),
164
+ web.get('/{name}', handle)])
165
+
166
+ if __name__ == '__main__':
167
+ web.run_app(app)
168
+
169
+
170
+ Documentation
171
+ =============
172
+
173
+ https://aiohttp.readthedocs.io/
174
+
175
+
176
+ Demos
177
+ =====
178
+
179
+ https://github.com/aio-libs/aiohttp-demos
180
+
181
+
182
+ External links
183
+ ==============
184
+
185
+ * `Third party libraries
186
+ <http://aiohttp.readthedocs.io/en/latest/third_party.html>`_
187
+ * `Built with aiohttp
188
+ <http://aiohttp.readthedocs.io/en/latest/built_with.html>`_
189
+ * `Powered by aiohttp
190
+ <http://aiohttp.readthedocs.io/en/latest/powered_by.html>`_
191
+
192
+ Feel free to make a Pull Request for adding your link to these pages!
193
+
194
+
195
+ Communication channels
196
+ ======================
197
+
198
+ *aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions
199
+
200
+ *Matrix*: `#aio-libs:matrix.org <https://matrix.to/#/#aio-libs:matrix.org>`_
201
+
202
+ We support `Stack Overflow
203
+ <https://stackoverflow.com/questions/tagged/aiohttp>`_.
204
+ Please add *aiohttp* tag to your question there.
205
+
206
+ Requirements
207
+ ============
208
+
209
+ - attrs_
210
+ - multidict_
211
+ - yarl_
212
+ - frozenlist_
213
+
214
+ Optionally you may install the aiodns_ library (highly recommended for sake of speed).
215
+
216
+ .. _aiodns: https://pypi.python.org/pypi/aiodns
217
+ .. _attrs: https://github.com/python-attrs/attrs
218
+ .. _multidict: https://pypi.python.org/pypi/multidict
219
+ .. _frozenlist: https://pypi.org/project/frozenlist/
220
+ .. _yarl: https://pypi.python.org/pypi/yarl
221
+ .. _async-timeout: https://pypi.python.org/pypi/async_timeout
222
+
223
+ License
224
+ =======
225
+
226
+ ``aiohttp`` is offered under the Apache 2 license.
227
+
228
+
229
+ Keepsafe
230
+ ========
231
+
232
+ The aiohttp community would like to thank Keepsafe
233
+ (https://www.getkeepsafe.com) for its support in the early days of
234
+ the project.
235
+
236
+
237
+ Source code
238
+ ===========
239
+
240
+ The latest developer version is available in a GitHub repository:
241
+ https://github.com/aio-libs/aiohttp
242
+
243
+ Benchmarks
244
+ ==========
245
+
246
+ If you are interested in efficiency, the AsyncIO community maintains a
247
+ list of benchmarks on the official wiki:
248
+ https://github.com/python/asyncio/wiki/Benchmarks
249
+
250
+ --------
251
+
252
+ .. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
253
+ :target: https://matrix.to/#/%23aio-libs:matrix.org
254
+ :alt: Matrix Room — #aio-libs:matrix.org
255
+
256
+ .. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
257
+ :target: https://matrix.to/#/%23aio-libs-space:matrix.org
258
+ :alt: Matrix Space — #aio-libs-space:matrix.org
259
+
260
+ .. image:: https://insights.linuxfoundation.org/api/badge/health-score?project=aiohttp
261
+ :target: https://insights.linuxfoundation.org/project/aiohttp
262
+ :alt: LFX Health Score
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiohttp-3.13.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ aiohttp-3.13.3.dist-info/METADATA,sha256=CQROZCStho-eb7xiFIuAzj30JuupEU_jHpYDFiG_HhM,8145
3
+ aiohttp-3.13.3.dist-info/RECORD,,
4
+ aiohttp-3.13.3.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190
5
+ aiohttp-3.13.3.dist-info/licenses/LICENSE.txt,sha256=n4DQ2311WpQdtFchcsJw7L2PCCuiFd3QlZhZQu2Uqes,588
6
+ aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE,sha256=68qFTgE0zSVtZzYnwgSZ9CV363S6zwi58ltianPJEnc,1105
7
+ aiohttp-3.13.3.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8
8
+ aiohttp/.hash/_cparser.pxd.hash,sha256=pjs-sEXNw_eijXGAedwG-BHnlFp8B7sOCgUagIWaU2A,121
9
+ aiohttp/.hash/_find_header.pxd.hash,sha256=_mbpD6vM-CVCKq3ulUvsOAz5Wdo88wrDzfpOsMQaMNA,125
10
+ aiohttp/.hash/_http_parser.pyx.hash,sha256=RKkD9x-EhXksvXrpCaTNWYtffb52urLvuTnxbTN2Lmw,125
11
+ aiohttp/.hash/_http_writer.pyx.hash,sha256=9txOh7t7c3y-vLmiuEY5dltmXvEo0CYyU4U853yyv9E,125
12
+ aiohttp/.hash/hdrs.py.hash,sha256=v6IaKbsxjsdQxBzhb5AjP0x_9G3rUe84D7avf7AI4cs,116
13
+ aiohttp/__init__.py,sha256=QWssFaD-DaFFcwP36lLUQzRmlSZ5KxivJBU-yg5C1wg,8302
14
+ aiohttp/__pycache__/__init__.cpython-312.pyc,,
15
+ aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc,,
16
+ aiohttp/__pycache__/abc.cpython-312.pyc,,
17
+ aiohttp/__pycache__/base_protocol.cpython-312.pyc,,
18
+ aiohttp/__pycache__/client.cpython-312.pyc,,
19
+ aiohttp/__pycache__/client_exceptions.cpython-312.pyc,,
20
+ aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc,,
21
+ aiohttp/__pycache__/client_middlewares.cpython-312.pyc,,
22
+ aiohttp/__pycache__/client_proto.cpython-312.pyc,,
23
+ aiohttp/__pycache__/client_reqrep.cpython-312.pyc,,
24
+ aiohttp/__pycache__/client_ws.cpython-312.pyc,,
25
+ aiohttp/__pycache__/compression_utils.cpython-312.pyc,,
26
+ aiohttp/__pycache__/connector.cpython-312.pyc,,
27
+ aiohttp/__pycache__/cookiejar.cpython-312.pyc,,
28
+ aiohttp/__pycache__/formdata.cpython-312.pyc,,
29
+ aiohttp/__pycache__/hdrs.cpython-312.pyc,,
30
+ aiohttp/__pycache__/helpers.cpython-312.pyc,,
31
+ aiohttp/__pycache__/http.cpython-312.pyc,,
32
+ aiohttp/__pycache__/http_exceptions.cpython-312.pyc,,
33
+ aiohttp/__pycache__/http_parser.cpython-312.pyc,,
34
+ aiohttp/__pycache__/http_websocket.cpython-312.pyc,,
35
+ aiohttp/__pycache__/http_writer.cpython-312.pyc,,
36
+ aiohttp/__pycache__/log.cpython-312.pyc,,
37
+ aiohttp/__pycache__/multipart.cpython-312.pyc,,
38
+ aiohttp/__pycache__/payload.cpython-312.pyc,,
39
+ aiohttp/__pycache__/payload_streamer.cpython-312.pyc,,
40
+ aiohttp/__pycache__/pytest_plugin.cpython-312.pyc,,
41
+ aiohttp/__pycache__/resolver.cpython-312.pyc,,
42
+ aiohttp/__pycache__/streams.cpython-312.pyc,,
43
+ aiohttp/__pycache__/tcp_helpers.cpython-312.pyc,,
44
+ aiohttp/__pycache__/test_utils.cpython-312.pyc,,
45
+ aiohttp/__pycache__/tracing.cpython-312.pyc,,
46
+ aiohttp/__pycache__/typedefs.cpython-312.pyc,,
47
+ aiohttp/__pycache__/web.cpython-312.pyc,,
48
+ aiohttp/__pycache__/web_app.cpython-312.pyc,,
49
+ aiohttp/__pycache__/web_exceptions.cpython-312.pyc,,
50
+ aiohttp/__pycache__/web_fileresponse.cpython-312.pyc,,
51
+ aiohttp/__pycache__/web_log.cpython-312.pyc,,
52
+ aiohttp/__pycache__/web_middlewares.cpython-312.pyc,,
53
+ aiohttp/__pycache__/web_protocol.cpython-312.pyc,,
54
+ aiohttp/__pycache__/web_request.cpython-312.pyc,,
55
+ aiohttp/__pycache__/web_response.cpython-312.pyc,,
56
+ aiohttp/__pycache__/web_routedef.cpython-312.pyc,,
57
+ aiohttp/__pycache__/web_runner.cpython-312.pyc,,
58
+ aiohttp/__pycache__/web_server.cpython-312.pyc,,
59
+ aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc,,
60
+ aiohttp/__pycache__/web_ws.cpython-312.pyc,,
61
+ aiohttp/__pycache__/worker.cpython-312.pyc,,
62
+ aiohttp/_cookie_helpers.py,sha256=_p7y-B8OCAk7FLjByiuwFIpDLGuNoJn3_vixzymAFnE,13659
63
+ aiohttp/_cparser.pxd,sha256=UnbUYCHg4NdXfgyRVYAMv2KTLWClB4P-xCrvtj_r7ew,4295
64
+ aiohttp/_find_header.pxd,sha256=0GfwFCPN2zxEKTO1_MA5sYq2UfzsG8kcV3aTqvwlz3g,68
65
+ aiohttp/_headers.pxi,sha256=n701k28dVPjwRnx5j6LpJhLTfj7dqu2vJt7f0O60Oyg,2007
66
+ aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so,sha256=WZP45rtTvKwOq_1uXO_1L84Kz6I0AnqYZn0b5L-6HkA,2833152
67
+ aiohttp/_http_parser.pyx,sha256=-YI8YIY4uKd_7Bwr0o3FwEPwjHdexZ5-Ji3XS067c4Q,28261
68
+ aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so,sha256=mWC-4rsbntVD1V5ZEKEpSW_sm63V0XRe1fDR0lygipo,539144
69
+ aiohttp/_http_writer.pyx,sha256=VlFEBM6HoVv8a0AAJtc6JwFlsv2-cDE8-gB94p3dfhQ,4664
70
+ aiohttp/_websocket/.hash/mask.pxd.hash,sha256=Y0zBddk_ck3pi9-BFzMcpkcvCKvwvZ4GTtZFb9u1nxQ,128
71
+ aiohttp/_websocket/.hash/mask.pyx.hash,sha256=90owpXYM8_kIma4KUcOxhWSk-Uv4NVMBoCYeFM1B3d0,128
72
+ aiohttp/_websocket/.hash/reader_c.pxd.hash,sha256=5xf3oobk6vx4xbJm-xtZ1_QufB8fYFtLQV2MNdqUc1w,132
73
+ aiohttp/_websocket/__init__.py,sha256=Mar3R9_vBN_Ea4lsW7iTAVXD7OKswKPGqF5xgSyt77k,44
74
+ aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc,,
75
+ aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc,,
76
+ aiohttp/_websocket/__pycache__/models.cpython-312.pyc,,
77
+ aiohttp/_websocket/__pycache__/reader.cpython-312.pyc,,
78
+ aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc,,
79
+ aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc,,
80
+ aiohttp/_websocket/__pycache__/writer.cpython-312.pyc,,
81
+ aiohttp/_websocket/helpers.py,sha256=P-XLv8IUaihKzDenVUqfKU5DJbWE5HvG8uhvUZK8Ic4,5038
82
+ aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so,sha256=EpRwPJm1K1yavMCd9llAWdT4AsqKx_QEN0rb0eJH_Kc,263512
83
+ aiohttp/_websocket/mask.pxd,sha256=sBmZ1Amym9kW4Ge8lj1fLZ7mPPya4LzLdpkQExQXv5M,112
84
+ aiohttp/_websocket/mask.pyx,sha256=BHjOtV0O0w7xp9p0LNADRJvGmgfPn9sGeJvSs0fL__4,1397
85
+ aiohttp/_websocket/models.py,sha256=XAzjs_8JYszWXIgZ6R3ZRrF-tX9Q_6LiD49WRYojopM,2121
86
+ aiohttp/_websocket/reader.py,sha256=eC4qS0c5sOeQ2ebAHLaBpIaTVFaSKX79pY2xvh3Pqyw,1030
87
+ aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so,sha256=GYd-y-IkGkOIp3vmma5BmZgmG9Py9fLTybcmMWyHNf0,1822128
88
+ aiohttp/_websocket/reader_c.pxd,sha256=nl_njtDrzlQU0rjgGGjZDB-swguE0tX_bCPobkShVa4,2625
89
+ aiohttp/_websocket/reader_c.py,sha256=V5YtZ2gj2BjE2Q-W9sR_MdAl1VAm1pB7ZjozVJcOpbg,18868
90
+ aiohttp/_websocket/reader_py.py,sha256=V5YtZ2gj2BjE2Q-W9sR_MdAl1VAm1pB7ZjozVJcOpbg,18868
91
+ aiohttp/_websocket/writer.py,sha256=2OvSktPmNh_g20h1cXJt2Xu8u6IvswnPjdur7OwBbJk,11261
92
+ aiohttp/abc.py,sha256=M66F4S6m00bIEn7y4ha_XLTMDmVQ9dPihfOVB0pGfOo,7149
93
+ aiohttp/base_protocol.py,sha256=Tp8cxUPQvv9kUPk3w6lAzk6d2MAzV3scwI_3Go3C47c,3025
94
+ aiohttp/client.py,sha256=fOQfwcIUL1NGAVRV4DDj6-wipBzeD8KZpmzhO-LLKp4,58357
95
+ aiohttp/client_exceptions.py,sha256=uyKbxI2peZhKl7lELBMx3UeusNkfpemPWpGFq0r6JeM,11367
96
+ aiohttp/client_middleware_digest_auth.py,sha256=G5JM9YtzL9AWklz6NP28xEOBeAvrAZgDzU657JqO4qs,17627
97
+ aiohttp/client_middlewares.py,sha256=kP5N9CMzQPMGPIEydeVUiLUTLsw8Vl8Gr4qAWYdu3vM,1918
98
+ aiohttp/client_proto.py,sha256=56_WtLStZGBFPYKzgEgY6v24JkhV1y6JEmmuxeJT2So,12110
99
+ aiohttp/client_reqrep.py,sha256=eEREDrZ0M8ZFTt1wjHduR-P8_sm40K65gNz-iMGYask,53391
100
+ aiohttp/client_ws.py,sha256=1CIjIXwyzOMIYw6AjUES4-qUwbyVHW1seJKQfg_Rta8,15109
101
+ aiohttp/compression_utils.py,sha256=hJ2LXhN2OWukFHm5b78TJFGKcAiL2kthi9Sf5PRYO-U,11738
102
+ aiohttp/connector.py,sha256=vT22BNuCDtbadE1Uq7HC7zpOWCHMxI4n3PtCz7zZZkw,69004
103
+ aiohttp/cookiejar.py,sha256=e28ZMQwJ5P0vbPX1OX4Se7-k3zeGvocFEqzGhwpG53k,18922
104
+ aiohttp/formdata.py,sha256=xqYMbUo1qoLYPuzY92XeR4pyEe-w-DNcToARDF3GUhA,6384
105
+ aiohttp/hdrs.py,sha256=2rj5MyA-6yRdYPhW5UKkW4iNWhEAlGIOSBH5D4FmKNE,5111
106
+ aiohttp/helpers.py,sha256=Q1307PCEnWz4RP8crUw8dk58c0YF2Ei3JywkKfRxz5E,30629
107
+ aiohttp/http.py,sha256=8o8j8xH70OWjnfTWA9V44NR785QPxEPrUtzMXiAVpwc,1842
108
+ aiohttp/http_exceptions.py,sha256=BjIxD4LtrQgytqoR5lOI9zAttNmSygRgksUsMRy7sss,3069
109
+ aiohttp/http_parser.py,sha256=z6djZDOUs7hdPzplTEsAVyz0of-rQAwT7xz8OpXhnuY,38177
110
+ aiohttp/http_websocket.py,sha256=8VXFKw6KQUEmPg48GtRMB37v0gTK7A0inoxXuDxMZEc,842
111
+ aiohttp/http_writer.py,sha256=fbRtKPYSqRbtAdr_gqpjF2-4sI1ESL8dPDF-xY_mAMY,12446
112
+ aiohttp/log.py,sha256=BbNKx9e3VMIm0xYjZI0IcBBoS7wjdeIeSaiJE7-qK2g,325
113
+ aiohttp/multipart.py,sha256=326npYdWxYI3raoRfmpBeUV_ef3-LRn8sV9WqcIOoPk,40482
114
+ aiohttp/payload.py,sha256=O6nsYNULL7AeM2cyJ6TYX73ncVnL5xJwt5AegxwMKqw,40874
115
+ aiohttp/payload_streamer.py,sha256=ZzEYyfzcjGWkVkK3XR2pBthSCSIykYvY3Wr5cGQ2eTc,2211
116
+ aiohttp/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7
117
+ aiohttp/pytest_plugin.py,sha256=z4XwqmsKdyJCKxbGiA5kFf90zcedvomqk4RqjZbhKNk,12901
118
+ aiohttp/resolver.py,sha256=gsrfUpFf8iHlcHfJvY-1fiBHW3PRvRVNb5lNZBg3zlY,10031
119
+ aiohttp/streams.py,sha256=rlwL7ek6CkMMYil_e_EokWv26uHmtzi3lKqlnLNrXCc,23666
120
+ aiohttp/tcp_helpers.py,sha256=BSadqVWaBpMFDRWnhaaR941N9MiDZ7bdTrxgCb0CW-M,961
121
+ aiohttp/test_utils.py,sha256=ZJSzZWjC76KSbtwddTKcP6vHpUl_ozfAf3F93ewmHRU,23016
122
+ aiohttp/tracing.py,sha256=-6aaW6l0J9uJD45LzR4cijYH0j62pt0U_nn_aVzFku4,14558
123
+ aiohttp/typedefs.py,sha256=wUlqwe9Mw9W8jT3HsYJcYk00qP3EMPz3nTkYXmeNN48,1657
124
+ aiohttp/web.py,sha256=JzSNmejg5G6YeFAnkIgZfytqbU86sNu844yYKmoUpqs,17852
125
+ aiohttp/web_app.py,sha256=lGU_aAMN-h3wy-LTTHi6SeKH8ydt1G51BXcCspgD5ZA,19452
126
+ aiohttp/web_exceptions.py,sha256=7nIuiwhZ39vJJ9KrWqArA5QcWbUdqkz2CLwEpJapeN8,10360
127
+ aiohttp/web_fileresponse.py,sha256=Xzau8EMrWNrFg3u46h4UEteg93G4zYq94CU6vy0HiqE,16362
128
+ aiohttp/web_log.py,sha256=rX5D7xLOX2B6BMdiZ-chme_KfJfW5IXEoFwLfkfkajs,7865
129
+ aiohttp/web_middlewares.py,sha256=sFI0AgeNjdyAjuz92QtMIpngmJSOxrqe2Jfbs4BNUu0,4165
130
+ aiohttp/web_protocol.py,sha256=6s9dMzmaqW77bzM1T111uGNSLFo6gNmfDg7XzYnA8xk,27010
131
+ aiohttp/web_request.py,sha256=KqrOp6AeWB5e6tKrG55Lo7Zbwq49DxdrKniuW2t2u04,29849
132
+ aiohttp/web_response.py,sha256=PKcziNU4LmftXqKVvoRMrAbOeVClpSN-iznHsiWezmU,29341
133
+ aiohttp/web_routedef.py,sha256=VT1GAx6BrawoDh5RwBwBu5wSABSqgWwAe74AUCyZAEo,6110
134
+ aiohttp/web_runner.py,sha256=v1G1nKiOOQgFnTSR4IMc6I9ReEFDMaHtMLvO_roDM-A,11786
135
+ aiohttp/web_server.py,sha256=-9WDKUAiR9ll-rSdwXSqG6YjaoW79d1R4y0BGSqgUMA,2888
136
+ aiohttp/web_urldispatcher.py,sha256=JM-TlriKCNbTLNL43Ra9sdZ0zChxZmIEYQM6ZpbyjI4,44290
137
+ aiohttp/web_ws.py,sha256=lItgmyatkXh0M6EY7JoZnSZkUl6R0wv8B88X4ILqQbU,22739
138
+ aiohttp/worker.py,sha256=zT0iWN5Xze194bO6_VjHou0x7lR_k0MviN6Kadnk22g,8152
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-manylinux_2_17_x86_64
5
+ Tag: cp312-cp312-manylinux2014_x86_64
6
+ Tag: cp312-cp312-manylinux_2_28_x86_64
7
+
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright aio-libs contributors.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ This software is licensed under the MIT License.
2
+
3
+ Copyright Fedor Indutny, 2018.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a
6
+ copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to permit
10
+ persons to whom the Software is furnished to do so, subject to the
11
+ following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included
14
+ in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
19
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ aiohttp
lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/METADATA ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.3
2
+ Name: annotated-types
3
+ Version: 0.7.0
4
+ Summary: Reusable constraint types to use with typing.Annotated
5
+ Project-URL: Homepage, https://github.com/annotated-types/annotated-types
6
+ Project-URL: Source, https://github.com/annotated-types/annotated-types
7
+ Project-URL: Changelog, https://github.com/annotated-types/annotated-types/releases
8
+ Author-email: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin <s@muelcolvin.com>, Zac Hatfield-Dodds <zac@zhd.dev>
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Environment :: MacOS X
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Information Technology
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Operating System :: Unix
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.8
27
+ Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9'
28
+ Description-Content-Type: text/markdown
29
+
30
+ # annotated-types
31
+
32
+ [![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)
33
+ [![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types)
34
+ [![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types)
35
+ [![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE)
36
+
37
+ [PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of
38
+ adding context-specific metadata to existing types, and specifies that
39
+ `Annotated[T, x]` _should_ be treated as `T` by any tool or library without special
40
+ logic for `x`.
41
+
42
+ This package provides metadata objects which can be used to represent common
43
+ constraints such as upper and lower bounds on scalar values and collection sizes,
44
+ a `Predicate` marker for runtime checks, and
45
+ descriptions of how we intend these metadata to be interpreted. In some cases,
46
+ we also note alternative representations which do not require this package.
47
+
48
+ ## Install
49
+
50
+ ```bash
51
+ pip install annotated-types
52
+ ```
53
+
54
+ ## Examples
55
+
56
+ ```python
57
+ from typing import Annotated
58
+ from annotated_types import Gt, Len, Predicate
59
+
60
+ class MyClass:
61
+ age: Annotated[int, Gt(18)] # Valid: 19, 20, ...
62
+ # Invalid: 17, 18, "19", 19.0, ...
63
+ factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ...
64
+ # Invalid: 4, 8, -2, 5.0, "prime", ...
65
+
66
+ my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50]
67
+ # Invalid: (1, 2), ["abc"], [0] * 20
68
+ ```
69
+
70
+ ## Documentation
71
+
72
+ _While `annotated-types` avoids runtime checks for performance, users should not
73
+ construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`.
74
+ Downstream implementors may choose to raise an error, emit a warning, silently ignore
75
+ a metadata item, etc., if the metadata objects described below are used with an
76
+ incompatible type - or for any other reason!_
77
+
78
+ ### Gt, Ge, Lt, Le
79
+
80
+ Express inclusive and/or exclusive bounds on orderable values - which may be numbers,
81
+ dates, times, strings, sets, etc. Note that the boundary value need not be of the
82
+ same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]`
83
+ is fine, for example, and implies that the value is an integer x such that `x > 1.5`.
84
+
85
+ We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)`
86
+ as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on
87
+ the `annotated-types` package.
88
+
89
+ To be explicit, these types have the following meanings:
90
+
91
+ * `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum
92
+ * `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum
93
+ * `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum
94
+ * `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum
95
+
96
+ ### Interval
97
+
98
+ `Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single
99
+ metadata object. `None` attributes should be ignored, and non-`None` attributes
100
+ treated as per the single bounds above.
101
+
102
+ ### MultipleOf
103
+
104
+ `MultipleOf(multiple_of=x)` might be interpreted in two ways:
105
+
106
+ 1. Python semantics, implying `value % multiple_of == 0`, or
107
+ 2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1),
108
+ where `int(value / multiple_of) == value / multiple_of`.
109
+
110
+ We encourage users to be aware of these two common interpretations and their
111
+ distinct behaviours, especially since very large or non-integer numbers make
112
+ it easy to cause silent data corruption due to floating-point imprecision.
113
+
114
+ We encourage libraries to carefully document which interpretation they implement.
115
+
116
+ ### MinLen, MaxLen, Len
117
+
118
+ `Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive.
119
+
120
+ As well as `Len()` which can optionally include upper and lower bounds, we also
121
+ provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)`
122
+ and `Len(max_length=y)` respectively.
123
+
124
+ `Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`.
125
+
126
+ Examples of usage:
127
+
128
+ * `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less
129
+ * `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less
130
+ * `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more
131
+ * `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6
132
+ * `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8
133
+
134
+ #### Changed in v0.4.0
135
+
136
+ * `min_inclusive` has been renamed to `min_length`, no change in meaning
137
+ * `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive**
138
+ * The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic
139
+ meaning of the upper bound in slices vs. `Len`
140
+
141
+ See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion.
142
+
143
+ ### Timezone
144
+
145
+ `Timezone` can be used with a `datetime` or a `time` to express which timezones
146
+ are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime.
147
+ `Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis))
148
+ expresses that any timezone-aware datetime is allowed. You may also pass a specific
149
+ timezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects)
150
+ object such as `Timezone(timezone.utc)` or `Timezone("Africa/Abidjan")` to express that you only
151
+ allow a specific timezone, though we note that this is often a symptom of fragile design.
152
+
153
+ #### Changed in v0.x.x
154
+
155
+ * `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of
156
+ `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries.
157
+
158
+ ### Unit
159
+
160
+ `Unit(unit: str)` expresses that the annotated numeric value is the magnitude of
161
+ a quantity with the specified unit. For example, `Annotated[float, Unit("m/s")]`
162
+ would be a float representing a velocity in meters per second.
163
+
164
+ Please note that `annotated_types` itself makes no attempt to parse or validate
165
+ the unit string in any way. That is left entirely to downstream libraries,
166
+ such as [`pint`](https://pint.readthedocs.io) or
167
+ [`astropy.units`](https://docs.astropy.org/en/stable/units/).
168
+
169
+ An example of how a library might use this metadata:
170
+
171
+ ```python
172
+ from annotated_types import Unit
173
+ from typing import Annotated, TypeVar, Callable, Any, get_origin, get_args
174
+
175
+ # given a type annotated with a unit:
176
+ Meters = Annotated[float, Unit("m")]
177
+
178
+
179
+ # you can cast the annotation to a specific unit type with any
180
+ # callable that accepts a string and returns the desired type
181
+ T = TypeVar("T")
182
+ def cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None:
183
+ if get_origin(tp) is Annotated:
184
+ for arg in get_args(tp):
185
+ if isinstance(arg, Unit):
186
+ return unit_cls(arg.unit)
187
+ return None
188
+
189
+
190
+ # using `pint`
191
+ import pint
192
+ pint_unit = cast_unit(Meters, pint.Unit)
193
+
194
+
195
+ # using `astropy.units`
196
+ import astropy.units as u
197
+ astropy_unit = cast_unit(Meters, u.Unit)
198
+ ```
199
+
200
+ ### Predicate
201
+
202
+ `Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values.
203
+ Users should prefer the statically inspectable metadata above, but if you need
204
+ the full power and flexibility of arbitrary runtime predicates... here it is.
205
+
206
+ For some common constraints, we provide generic types:
207
+
208
+ * `IsLower = Annotated[T, Predicate(str.islower)]`
209
+ * `IsUpper = Annotated[T, Predicate(str.isupper)]`
210
+ * `IsDigit = Annotated[T, Predicate(str.isdigit)]`
211
+ * `IsFinite = Annotated[T, Predicate(math.isfinite)]`
212
+ * `IsNotFinite = Annotated[T, Predicate(Not(math.isfinite))]`
213
+ * `IsNan = Annotated[T, Predicate(math.isnan)]`
214
+ * `IsNotNan = Annotated[T, Predicate(Not(math.isnan))]`
215
+ * `IsInfinite = Annotated[T, Predicate(math.isinf)]`
216
+ * `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]`
217
+
218
+ so that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer
219
+ (but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`.
220
+
221
+ Some libraries might have special logic to handle known or understandable predicates,
222
+ for example by checking for `str.isdigit` and using its presence to both call custom
223
+ logic to enforce digit-only strings, and customise some generated external schema.
224
+ Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in
225
+ favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`.
226
+
227
+ To enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner.
228
+
229
+ We do not specify what behaviour should be expected for predicates that raise
230
+ an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently
231
+ skip invalid constraints, or statically raise an error; or it might try calling it
232
+ and then propagate or discard the resulting
233
+ `TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object`
234
+ exception. We encourage libraries to document the behaviour they choose.
235
+
236
+ ### Doc
237
+
238
+ `doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used.
239
+
240
+ It expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools.
241
+
242
+ It returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`.
243
+
244
+ This is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md).
245
+
246
+ ### Integrating downstream types with `GroupedMetadata`
247
+
248
+ Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata.
249
+ This can help reduce verbosity and cognitive overhead for users.
250
+ For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata:
251
+
252
+ ```python
253
+ from dataclasses import dataclass
254
+ from typing import Iterator
255
+ from annotated_types import GroupedMetadata, Ge
256
+
257
+ @dataclass
258
+ class Field(GroupedMetadata):
259
+ ge: int | None = None
260
+ description: str | None = None
261
+
262
+ def __iter__(self) -> Iterator[object]:
263
+ # Iterating over a GroupedMetadata object should yield annotated-types
264
+ # constraint metadata objects which describe it as fully as possible,
265
+ # and may include other unknown objects too.
266
+ if self.ge is not None:
267
+ yield Ge(self.ge)
268
+ if self.description is not None:
269
+ yield Description(self.description)
270
+ ```
271
+
272
+ Libraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been "unpacked" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently.
273
+
274
+ Libraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself.
275
+
276
+ Our own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`.
277
+
278
+ ### Consuming metadata
279
+
280
+ We intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103).
281
+
282
+ It is up to the implementer to determine how this metadata is used.
283
+ You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases.
284
+
285
+ ## Design & History
286
+
287
+ This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic
288
+ and Hypothesis, with the goal of making it as easy as possible for end-users to
289
+ provide more informative annotations for use by runtime libraries.
290
+
291
+ It is deliberately minimal, and following PEP-593 allows considerable downstream
292
+ discretion in what (if anything!) they choose to support. Nonetheless, we expect
293
+ that staying simple and covering _only_ the most common use-cases will give users
294
+ and maintainers the best experience we can. If you'd like more constraints for your
295
+ types - follow our lead, by defining them and documenting them downstream!
lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/RECORD ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ annotated_types-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ annotated_types-0.7.0.dist-info/METADATA,sha256=7ltqxksJJ0wCYFGBNIQCWTlWQGeAH0hRFdnK3CB895E,15046
3
+ annotated_types-0.7.0.dist-info/RECORD,,
4
+ annotated_types-0.7.0.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
5
+ annotated_types-0.7.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083
6
+ annotated_types/__init__.py,sha256=RynLsRKUEGI0KimXydlD1fZEfEzWwDo0Uon3zOKhG1Q,13819
7
+ annotated_types/__pycache__/__init__.cpython-312.pyc,,
8
+ annotated_types/__pycache__/test_cases.cpython-312.pyc,,
9
+ annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ annotated_types/test_cases.py,sha256=zHFX6EpcMbGJ8FzBYDbO56bPwx_DYIVSKbZM-4B3_lg,6421
lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/WHEEL ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.24.2
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 the contributors
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.
lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/METADATA ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: antlr4-python3-runtime
3
+ Version: 4.9.3
4
+ Summary: ANTLR 4.9.3 runtime for Python 3.7
5
+ Home-page: http://www.antlr.org
6
+ Author: Eric Vergnaud, Terence Parr, Sam Harwell
7
+ Author-email: eric.vergnaud@wanadoo.fr
8
+ License: BSD
9
+ Requires-Dist: typing; python_version < "3.5"
10
+ Dynamic: author
11
+ Dynamic: author-email
12
+ Dynamic: home-page
13
+ Dynamic: license
14
+ Dynamic: requires-dist
15
+ Dynamic: summary
lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/RECORD ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ../../../bin/pygrun,sha256=LgWtiH30lHPY--MI-aimXUxKFRRvz-VBQxIpy-X-8ek,6157
2
+ antlr4/BufferedTokenStream.py,sha256=_BwmzOH1TO6yL2yC_ZaUzkghq8wzc0UPHfI3UpnZUwM,10780
3
+ antlr4/CommonTokenFactory.py,sha256=Tv16zg_pWD1Dv3IphsxFu8nwWdLeXYcqJ8CC5yHwjH8,2110
4
+ antlr4/CommonTokenStream.py,sha256=NNJHXwRg2_Zn46ZhJyDxZtvZzsPWhb6JjXa7BjM45eg,2770
5
+ antlr4/FileStream.py,sha256=-ZR_-jl_If9IIBYLINIwlQrlTSmu5k1VUKDc3ie7WR4,868
6
+ antlr4/InputStream.py,sha256=sggjE2jEGvSgQmxFvqeeuT3aOVgcH5tS7mMybW8wKS4,2334
7
+ antlr4/IntervalSet.py,sha256=Cd0WKhd_kYbiLYKkDNncgSM19GAuS7OaTOC4-5Yubs4,5965
8
+ antlr4/LL1Analyzer.py,sha256=oJBvO7_S8cAlb_D4qWNxd2IlK0qP4ka-oeoDxx16CZ4,7752
9
+ antlr4/Lexer.py,sha256=C72hqayfkympxb46AcSnhPD9kVZ0quWgboGxa6gcIcg,11542
10
+ antlr4/ListTokenSource.py,sha256=IffLMo7YQnD_CjKryrrgNWSk0q5QSYd7puZyyUk7vOk,5356
11
+ antlr4/Parser.py,sha256=F2Q25z0-__KHfa354KQhDu3ZOVzLFfag3s2ixJ4dl_o,22883
12
+ antlr4/ParserInterpreter.py,sha256=-QU9kn4x3WCQ-LSA99R231HoicTqakiHZ5KM72l-hIo,7206
13
+ antlr4/ParserRuleContext.py,sha256=wHAVdOxMAO5jkUqloTXVzn_xYnJhiHbvvuhZpth0ZF8,6762
14
+ antlr4/PredictionContext.py,sha256=cb4KI6EGpS7sRzJ8UvPEkxphINZuWhyiZ95752g3prI,22977
15
+ antlr4/Recognizer.py,sha256=vmKAtSjIgR9LQr5YzuK5OmPZWMJ3x69OuVZQ_FTzQHE,5383
16
+ antlr4/RuleContext.py,sha256=GiviRv2k_al1IBgdJOEEoD0ohJaVd-_h5T_CPG_Bsmg,8099
17
+ antlr4/StdinStream.py,sha256=MMSH4zN8T6i_nu-3_TlN-3E4nPM4b5KgK4GT6n_FUQA,303
18
+ antlr4/Token.py,sha256=OtWCab4Ut52X_nLLAA-8x4Zl6xaF6TEN-0033uaoaEo,5206
19
+ antlr4/TokenStreamRewriter.py,sha256=cuErQTrXwC_0kqVv3MsTWGZSm-E1Vy1yzA-3SOhKd_s,10324
20
+ antlr4/Utils.py,sha256=Oyg8CJCRL1TrF_QSB_LLlVdWOB4loVcKOgFNT-icO7c,931
21
+ antlr4/__init__.py,sha256=g8UGpflnlMWcAyLtihejzrgAP1Uo3b9GhwfI8QnZjtw,1125
22
+ antlr4/__pycache__/BufferedTokenStream.cpython-312.pyc,,
23
+ antlr4/__pycache__/CommonTokenFactory.cpython-312.pyc,,
24
+ antlr4/__pycache__/CommonTokenStream.cpython-312.pyc,,
25
+ antlr4/__pycache__/FileStream.cpython-312.pyc,,
26
+ antlr4/__pycache__/InputStream.cpython-312.pyc,,
27
+ antlr4/__pycache__/IntervalSet.cpython-312.pyc,,
28
+ antlr4/__pycache__/LL1Analyzer.cpython-312.pyc,,
29
+ antlr4/__pycache__/Lexer.cpython-312.pyc,,
30
+ antlr4/__pycache__/ListTokenSource.cpython-312.pyc,,
31
+ antlr4/__pycache__/Parser.cpython-312.pyc,,
32
+ antlr4/__pycache__/ParserInterpreter.cpython-312.pyc,,
33
+ antlr4/__pycache__/ParserRuleContext.cpython-312.pyc,,
34
+ antlr4/__pycache__/PredictionContext.cpython-312.pyc,,
35
+ antlr4/__pycache__/Recognizer.cpython-312.pyc,,
36
+ antlr4/__pycache__/RuleContext.cpython-312.pyc,,
37
+ antlr4/__pycache__/StdinStream.cpython-312.pyc,,
38
+ antlr4/__pycache__/Token.cpython-312.pyc,,
39
+ antlr4/__pycache__/TokenStreamRewriter.cpython-312.pyc,,
40
+ antlr4/__pycache__/Utils.cpython-312.pyc,,
41
+ antlr4/__pycache__/__init__.cpython-312.pyc,,
42
+ antlr4/atn/ATN.py,sha256=LYE8kT-D8FpUd5fpOtyOLqvXLFkUSa83TVFowhCWAiY,5789
43
+ antlr4/atn/ATNConfig.py,sha256=tNdIC6_GrxXllHBx3npAWyDh6KrohLZDV_XyPrydRMY,6565
44
+ antlr4/atn/ATNConfigSet.py,sha256=qRzVsBeMqk2txjG3DrGptwF6Vb2hHC5w3umkSL0GNJw,8312
45
+ antlr4/atn/ATNDeserializationOptions.py,sha256=lUV_bGW6mxj7t20esda5Yv-X9m-U_x1-0xaLifhXIPo,1010
46
+ antlr4/atn/ATNDeserializer.py,sha256=aYLDDtQ-wyo3gId6A-wD1E3QmpfrPZlXxj4_IDm-mUY,22252
47
+ antlr4/atn/ATNSimulator.py,sha256=mDc-G3GF3kSeqpfGDabUOLJ0WLVTqibxZlkvXQYmBRk,2298
48
+ antlr4/atn/ATNState.py,sha256=NbndISWUwFDF_vuBfbTiZZ8GPHoQa6UXdqbD-yjJE7c,7663
49
+ antlr4/atn/ATNType.py,sha256=xgv8AMVU7tc07U73_hRTm1AiZ7MvGhoaP5fTiOrrCGg,422
50
+ antlr4/atn/LexerATNSimulator.py,sha256=kYXRwUvHptSRU8T_K9pSrGlCk9YypWeHlAcjgry1VVo,25465
51
+ antlr4/atn/LexerAction.py,sha256=KUeJwKekBch0m1poSPskHIh-15dcKAG4lR7zlq98tzc,10014
52
+ antlr4/atn/LexerActionExecutor.py,sha256=7rlg17THcwLsuTmh7NsLrTbRH4DTrm8qIdW9_235CEc,6420
53
+ antlr4/atn/ParserATNSimulator.py,sha256=IKCzsDLcznROSVojU-daAygKr3svl0DmK5DhkUllASY,80365
54
+ antlr4/atn/PredictionMode.py,sha256=i8B7MULA7v-qbXeCY_xp6sgi21kHM6kybqIrG6rSrro,22486
55
+ antlr4/atn/SemanticContext.py,sha256=ds0TmM4qenb0LN-rl2Fp_N_xB959abN67I19EF6rs8o,10495
56
+ antlr4/atn/Transition.py,sha256=ZAsEFpa5I_n-zxD6U-DauM5_33jFK65x3PWu6-NW0RA,8762
57
+ antlr4/atn/__init__.py,sha256=gsnQdtTH8IUgCiVUpQfzhxx2pFRvksW76SjwIk3fYSk,28
58
+ antlr4/atn/__pycache__/ATN.cpython-312.pyc,,
59
+ antlr4/atn/__pycache__/ATNConfig.cpython-312.pyc,,
60
+ antlr4/atn/__pycache__/ATNConfigSet.cpython-312.pyc,,
61
+ antlr4/atn/__pycache__/ATNDeserializationOptions.cpython-312.pyc,,
62
+ antlr4/atn/__pycache__/ATNDeserializer.cpython-312.pyc,,
63
+ antlr4/atn/__pycache__/ATNSimulator.cpython-312.pyc,,
64
+ antlr4/atn/__pycache__/ATNState.cpython-312.pyc,,
65
+ antlr4/atn/__pycache__/ATNType.cpython-312.pyc,,
66
+ antlr4/atn/__pycache__/LexerATNSimulator.cpython-312.pyc,,
67
+ antlr4/atn/__pycache__/LexerAction.cpython-312.pyc,,
68
+ antlr4/atn/__pycache__/LexerActionExecutor.cpython-312.pyc,,
69
+ antlr4/atn/__pycache__/ParserATNSimulator.cpython-312.pyc,,
70
+ antlr4/atn/__pycache__/PredictionMode.cpython-312.pyc,,
71
+ antlr4/atn/__pycache__/SemanticContext.cpython-312.pyc,,
72
+ antlr4/atn/__pycache__/Transition.cpython-312.pyc,,
73
+ antlr4/atn/__pycache__/__init__.cpython-312.pyc,,
74
+ antlr4/dfa/DFA.py,sha256=weIh0uaRfakP12mFvHo7U0tqO3GONV3-nHFkc2xk-ZE,5388
75
+ antlr4/dfa/DFASerializer.py,sha256=1st_HO85yXLYy7gInTEnkztgA6am4CT-yReh-mazp9E,2518
76
+ antlr4/dfa/DFAState.py,sha256=R7JwKf0GtAEs9J_MD_Y0WKcuzdt0BVX1sow-uv9yFYc,5583
77
+ antlr4/dfa/__init__.py,sha256=gsnQdtTH8IUgCiVUpQfzhxx2pFRvksW76SjwIk3fYSk,28
78
+ antlr4/dfa/__pycache__/DFA.cpython-312.pyc,,
79
+ antlr4/dfa/__pycache__/DFASerializer.cpython-312.pyc,,
80
+ antlr4/dfa/__pycache__/DFAState.cpython-312.pyc,,
81
+ antlr4/dfa/__pycache__/__init__.cpython-312.pyc,,
82
+ antlr4/error/DiagnosticErrorListener.py,sha256=EwS2D_Ox6CmvCa16NPJ9ud4QYPHmlPXt6-Wdn1h5Kg8,4430
83
+ antlr4/error/ErrorListener.py,sha256=yP_MDguol4Cj0_pEPyNzeH3v4ZvUjW5iwDjhYTVAHbE,2722
84
+ antlr4/error/ErrorStrategy.py,sha256=0mhzFL57ZVnjKkGrtadta93Zm3NXdF-HW10DVD07VXs,30391
85
+ antlr4/error/Errors.py,sha256=hlKngclBfXdkDiAymhYsvh2OCXlvmHM2kTl_A1vgp-w,6759
86
+ antlr4/error/__init__.py,sha256=gsnQdtTH8IUgCiVUpQfzhxx2pFRvksW76SjwIk3fYSk,28
87
+ antlr4/error/__pycache__/DiagnosticErrorListener.cpython-312.pyc,,
88
+ antlr4/error/__pycache__/ErrorListener.cpython-312.pyc,,
89
+ antlr4/error/__pycache__/ErrorStrategy.cpython-312.pyc,,
90
+ antlr4/error/__pycache__/Errors.cpython-312.pyc,,
91
+ antlr4/error/__pycache__/__init__.cpython-312.pyc,,
92
+ antlr4/tree/Chunk.py,sha256=oCIZjolLq9xkxtVDROEDxfUGgndcEnsDW0eUmLM7Gpk,695
93
+ antlr4/tree/ParseTreeMatch.py,sha256=Dc6GVWSUqoIAFXUaUZqUwCUlZfTcgUbGLGzNf6QxQvE,4485
94
+ antlr4/tree/ParseTreePattern.py,sha256=ASBNaQORh3f7f8KnFeZJC2yWFFx4uQlxvC2Y55ifhY0,2825
95
+ antlr4/tree/ParseTreePatternMatcher.py,sha256=HtE9yi1Urr2QPLGLJDBvr0lxv6bjuj9CHl-4clahSe8,16388
96
+ antlr4/tree/RuleTagToken.py,sha256=n4zXcmrrfsGyl91pj5ZYcc_CeKMhPrvYkUdppgMBpbY,2022
97
+ antlr4/tree/TokenTagToken.py,sha256=S3o3DJhfzL5kpClxsKyI-Il-xvuuZQiBAIsLCKFjRHo,1576
98
+ antlr4/tree/Tree.py,sha256=ZI7U_5IxBLm_IrnfJOtb12BCPIWyzfeZtLnhHKVVZIw,5572
99
+ antlr4/tree/Trees.py,sha256=JtQ7cYWmKwI9TIBP6y9XIgjlNS4mYjv3ARwOfwWc5Vg,3968
100
+ antlr4/tree/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ antlr4/tree/__pycache__/Chunk.cpython-312.pyc,,
102
+ antlr4/tree/__pycache__/ParseTreeMatch.cpython-312.pyc,,
103
+ antlr4/tree/__pycache__/ParseTreePattern.cpython-312.pyc,,
104
+ antlr4/tree/__pycache__/ParseTreePatternMatcher.cpython-312.pyc,,
105
+ antlr4/tree/__pycache__/RuleTagToken.cpython-312.pyc,,
106
+ antlr4/tree/__pycache__/TokenTagToken.cpython-312.pyc,,
107
+ antlr4/tree/__pycache__/Tree.cpython-312.pyc,,
108
+ antlr4/tree/__pycache__/Trees.cpython-312.pyc,,
109
+ antlr4/tree/__pycache__/__init__.cpython-312.pyc,,
110
+ antlr4/xpath/XPath.py,sha256=O9s4-EDvLbAbYytP_bae9Z2khLl0iAtRzPAtVbuWUM4,13015
111
+ antlr4/xpath/__init__.py,sha256=gsnQdtTH8IUgCiVUpQfzhxx2pFRvksW76SjwIk3fYSk,28
112
+ antlr4/xpath/__pycache__/XPath.cpython-312.pyc,,
113
+ antlr4/xpath/__pycache__/__init__.cpython-312.pyc,,
114
+ antlr4_python3_runtime-4.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
115
+ antlr4_python3_runtime-4.9.3.dist-info/METADATA,sha256=vzJeUVUxg4Wi_MRoB0LacQu63xOj0cCXmpizSHmA8mE,403
116
+ antlr4_python3_runtime-4.9.3.dist-info/RECORD,,
117
+ antlr4_python3_runtime-4.9.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
118
+ antlr4_python3_runtime-4.9.3.dist-info/top_level.txt,sha256=OsoZsh9bb30wgXb2zBUjdDwYg46MfV-RVZA6Pk8pcB0,7
lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
lib/python3.12/site-packages/antlr4_python3_runtime-4.9.3.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ antlr4
lib/python3.12/site-packages/contourpy-1.3.3.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
lib/python3.12/site-packages/contourpy-1.3.3.dist-info/LICENSE ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2021-2025, ContourPy Developers.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
lib/python3.12/site-packages/contourpy-1.3.3.dist-info/METADATA ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: contourpy
3
+ Version: 1.3.3
4
+ Summary: Python library for calculating contours of 2D quadrilateral grids
5
+ Author-Email: Ian Thomas <ianthomas23@gmail.com>
6
+ License: BSD 3-Clause License
7
+
8
+ Copyright (c) 2021-2025, ContourPy Developers.
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright notice,
18
+ this list of conditions and the following disclaimer in the documentation
19
+ and/or other materials provided with the distribution.
20
+
21
+ 3. Neither the name of the copyright holder nor the names of its
22
+ contributors may be used to endorse or promote products derived from
23
+ this software without specific prior written permission.
24
+
25
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+
36
+ Classifier: Development Status :: 5 - Production/Stable
37
+ Classifier: Intended Audience :: Developers
38
+ Classifier: Intended Audience :: Science/Research
39
+ Classifier: License :: OSI Approved :: BSD License
40
+ Classifier: Programming Language :: C++
41
+ Classifier: Programming Language :: Python :: 3
42
+ Classifier: Programming Language :: Python :: 3.11
43
+ Classifier: Programming Language :: Python :: 3.12
44
+ Classifier: Programming Language :: Python :: 3.13
45
+ Classifier: Programming Language :: Python :: 3.14
46
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
47
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
48
+ Classifier: Topic :: Scientific/Engineering :: Visualization
49
+ Project-URL: Homepage, https://github.com/contourpy/contourpy
50
+ Project-URL: Changelog, https://contourpy.readthedocs.io/en/latest/changelog.html
51
+ Project-URL: Documentation, https://contourpy.readthedocs.io
52
+ Project-URL: Repository, https://github.com/contourpy/contourpy
53
+ Requires-Python: >=3.11
54
+ Requires-Dist: numpy>=1.25
55
+ Provides-Extra: docs
56
+ Requires-Dist: furo; extra == "docs"
57
+ Requires-Dist: sphinx>=7.2; extra == "docs"
58
+ Requires-Dist: sphinx-copybutton; extra == "docs"
59
+ Provides-Extra: bokeh
60
+ Requires-Dist: bokeh; extra == "bokeh"
61
+ Requires-Dist: selenium; extra == "bokeh"
62
+ Provides-Extra: mypy
63
+ Requires-Dist: contourpy[bokeh,docs]; extra == "mypy"
64
+ Requires-Dist: bokeh; extra == "mypy"
65
+ Requires-Dist: docutils-stubs; extra == "mypy"
66
+ Requires-Dist: mypy==1.17.0; extra == "mypy"
67
+ Requires-Dist: types-Pillow; extra == "mypy"
68
+ Provides-Extra: test
69
+ Requires-Dist: contourpy[test-no-images]; extra == "test"
70
+ Requires-Dist: matplotlib; extra == "test"
71
+ Requires-Dist: Pillow; extra == "test"
72
+ Provides-Extra: test-no-images
73
+ Requires-Dist: pytest; extra == "test-no-images"
74
+ Requires-Dist: pytest-cov; extra == "test-no-images"
75
+ Requires-Dist: pytest-rerunfailures; extra == "test-no-images"
76
+ Requires-Dist: pytest-xdist; extra == "test-no-images"
77
+ Requires-Dist: wurlitzer; extra == "test-no-images"
78
+ Description-Content-Type: text/markdown
79
+
80
+ <img alt="ContourPy" src="https://raw.githubusercontent.com/contourpy/contourpy/main/docs/_static/contourpy_logo_horiz.svg" height="90">
81
+
82
+ ContourPy is a Python library for calculating contours of 2D quadrilateral grids. It is written in C++11 and wrapped using pybind11.
83
+
84
+ It contains the 2005 and 2014 algorithms used in Matplotlib as well as a newer algorithm that includes more features and is available in both serial and multithreaded versions. It provides an easy way for Python libraries to use contouring algorithms without having to include Matplotlib as a dependency.
85
+
86
+ * **Documentation**: https://contourpy.readthedocs.io
87
+ * **Source code**: https://github.com/contourpy/contourpy
88
+
89
+ | | |
90
+ | --- | --- |
91
+ | Latest release | [![PyPI version](https://img.shields.io/pypi/v/contourpy.svg?label=pypi&color=fdae61)](https://pypi.python.org/pypi/contourpy) [![conda-forge version](https://img.shields.io/conda/v/conda-forge/contourpy.svg?label=conda-forge&color=a6d96a)](https://anaconda.org/conda-forge/contourpy) |
92
+ | Downloads | [![PyPi downloads](https://img.shields.io/pypi/dm/contourpy?label=pypi&style=flat&color=fdae61)](https://pepy.tech/project/contourpy) |
93
+ | Python version | [![Platforms](https://img.shields.io/pypi/pyversions/contourpy?color=fdae61)](https://pypi.org/project/contourpy/) |
94
+ | Coverage | [![Codecov](https://img.shields.io/codecov/c/gh/contourpy/contourpy?color=fdae61&label=codecov)](https://app.codecov.io/gh/contourpy/contourpy) |
lib/python3.12/site-packages/contourpy-1.3.3.dist-info/RECORD ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ contourpy-1.3.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ contourpy-1.3.3.dist-info/LICENSE,sha256=NBcJefxk9PXm36Zu8n3sMU___FhSAAxg9INuwd-_FW4,1534
3
+ contourpy-1.3.3.dist-info/METADATA,sha256=xDzvhrrvCc_5x3l15Xj6jMoMlFTfQNwXaTi0maY95Uo,5461
4
+ contourpy-1.3.3.dist-info/RECORD,,
5
+ contourpy-1.3.3.dist-info/WHEEL,sha256=rJCplGeGFjRoUvxJWhVONRgyGYGZoOkhyej0s3KyjoI,138
6
+ contourpy/__init__.py,sha256=6sf-K0D4xaEIDhk38USOjszRiLz52rM43-vtcfVrMvY,11765
7
+ contourpy/__pycache__/__init__.cpython-312.pyc,,
8
+ contourpy/__pycache__/_version.cpython-312.pyc,,
9
+ contourpy/__pycache__/array.cpython-312.pyc,,
10
+ contourpy/__pycache__/chunk.cpython-312.pyc,,
11
+ contourpy/__pycache__/convert.cpython-312.pyc,,
12
+ contourpy/__pycache__/dechunk.cpython-312.pyc,,
13
+ contourpy/__pycache__/enum_util.cpython-312.pyc,,
14
+ contourpy/__pycache__/typecheck.cpython-312.pyc,,
15
+ contourpy/__pycache__/types.cpython-312.pyc,,
16
+ contourpy/_contourpy.cpython-312-x86_64-linux-gnu.so,sha256=4LmxkdOIIz_Z3qGsP9JYKLQPZfGdUubdVkeMspJx2lg,954680
17
+ contourpy/_contourpy.pyi,sha256=fvtccxkiZwGb6qYag7Fp4E8bsFmAIjAmobf8LNxqfgc,7122
18
+ contourpy/_version.py,sha256=Vi6om3KImlKsS_Wg5CjUgYffoi2zx7T-SRPnnGL0G7M,22
19
+ contourpy/array.py,sha256=4WwLuiZe30rizn_raymmY13OzE6hlCsDOO8kuVFOP18,8979
20
+ contourpy/chunk.py,sha256=8njDQqlpuD22RjaaCyA75FXQsSQDY5hZGJSrxFpvGGU,3279
21
+ contourpy/convert.py,sha256=mhyn7prEoWCnf0igaH-VqDwlk-CegFsZ4qOy2LL-hpU,26154
22
+ contourpy/dechunk.py,sha256=EgFL6hw5H54ccuof4tJ2ehdnktT7trgZjiZqppsH8QI,7756
23
+ contourpy/enum_util.py,sha256=o8MItJRs08oqzwPP3IwC75BBAY9Qq95saIzjkXBXwqA,1519
24
+ contourpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ contourpy/typecheck.py,sha256=t1nvvCuKMYva1Zx4fc30EpdKFcO0Enz3n_UFfXBsq9o,10747
26
+ contourpy/types.py,sha256=2K4T5tJpMIjYrkkg1Lqh3C2ZKlnOhnMtYmtwz92l_y8,247
27
+ contourpy/util/__init__.py,sha256=eVhJ_crOHL7nkG4Kb0dOo7NL4WHMy_Px665aAN_3d-8,118
28
+ contourpy/util/__pycache__/__init__.cpython-312.pyc,,
29
+ contourpy/util/__pycache__/_build_config.cpython-312.pyc,,
30
+ contourpy/util/__pycache__/bokeh_renderer.cpython-312.pyc,,
31
+ contourpy/util/__pycache__/bokeh_util.cpython-312.pyc,,
32
+ contourpy/util/__pycache__/data.cpython-312.pyc,,
33
+ contourpy/util/__pycache__/mpl_renderer.cpython-312.pyc,,
34
+ contourpy/util/__pycache__/mpl_util.cpython-312.pyc,,
35
+ contourpy/util/__pycache__/renderer.cpython-312.pyc,,
36
+ contourpy/util/_build_config.py,sha256=fyqK0_cupwGvImfUd9AlhzR21EGXN1c_QvByQxD5-D8,1847
37
+ contourpy/util/bokeh_renderer.py,sha256=vSQcq_3zIQWj1E8qoM2j3sI7XlBFJcam9axuhfZle4I,13836
38
+ contourpy/util/bokeh_util.py,sha256=wc-S3ewBUYWyIkEv9jkhFySIergjLQl4Z0UEVnE0HhA,2804
39
+ contourpy/util/data.py,sha256=-7SSGMLX_gN-1H2JzpNSEB_EcEF_uMtYdOo_ePRIcg8,2586
40
+ contourpy/util/mpl_renderer.py,sha256=dhPhSMKwVuFneNGZuBIgXCp9YjffqHpUyPG5C-T-5tU,20092
41
+ contourpy/util/mpl_util.py,sha256=0Jz5f-aA9XMWlpO2pDnHbkVgxIiw4SY_ysxf_gACWEo,3452
42
+ contourpy/util/renderer.py,sha256=8CBHzPmVsFPfqsWxqrxGBhqFpJhVeFHFeDzVXAgT8Fc,5118
lib/python3.12/site-packages/contourpy-1.3.3.dist-info/WHEEL ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: meson
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-manylinux_2_27_x86_64
5
+ Tag: cp312-cp312-manylinux_2_28_x86_64
6
+
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/METADATA ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: GitPython
3
+ Version: 3.1.46
4
+ Summary: GitPython is a Python library used to interact with Git repositories
5
+ Home-page: https://github.com/gitpython-developers/GitPython
6
+ Author: Sebastian Thiel, Michael Trier
7
+ Author-email: byronimo@gmail.com, mtrier@gmail.com
8
+ License: BSD-3-Clause
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Operating System :: POSIX
14
+ Classifier: Operating System :: Microsoft :: Windows
15
+ Classifier: Operating System :: MacOS :: MacOS X
16
+ Classifier: Typing :: Typed
17
+ Classifier: Programming Language :: Python
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.7
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Requires-Python: >=3.7
26
+ Description-Content-Type: text/markdown
27
+ License-File: LICENSE
28
+ License-File: AUTHORS
29
+ Requires-Dist: gitdb<5,>=4.0.1
30
+ Requires-Dist: typing-extensions>=3.10.0.2; python_version < "3.10"
31
+ Provides-Extra: test
32
+ Requires-Dist: coverage[toml]; extra == "test"
33
+ Requires-Dist: ddt!=1.4.3,>=1.1.1; extra == "test"
34
+ Requires-Dist: mock; python_version < "3.8" and extra == "test"
35
+ Requires-Dist: mypy==1.18.2; python_version >= "3.9" and extra == "test"
36
+ Requires-Dist: pre-commit; extra == "test"
37
+ Requires-Dist: pytest>=7.3.1; extra == "test"
38
+ Requires-Dist: pytest-cov; extra == "test"
39
+ Requires-Dist: pytest-instafail; extra == "test"
40
+ Requires-Dist: pytest-mock; extra == "test"
41
+ Requires-Dist: pytest-sugar; extra == "test"
42
+ Requires-Dist: typing-extensions; python_version < "3.11" and extra == "test"
43
+ Provides-Extra: doc
44
+ Requires-Dist: sphinx<7.2,>=7.1.2; extra == "doc"
45
+ Requires-Dist: sphinx_rtd_theme; extra == "doc"
46
+ Requires-Dist: sphinx-autodoc-typehints; extra == "doc"
47
+ Dynamic: author
48
+ Dynamic: author-email
49
+ Dynamic: classifier
50
+ Dynamic: description
51
+ Dynamic: description-content-type
52
+ Dynamic: home-page
53
+ Dynamic: license
54
+ Dynamic: license-file
55
+ Dynamic: provides-extra
56
+ Dynamic: requires-dist
57
+ Dynamic: requires-python
58
+ Dynamic: summary
59
+
60
+ ![Python package](https://github.com/gitpython-developers/GitPython/workflows/Python%20package/badge.svg)
61
+ [![Documentation Status](https://readthedocs.org/projects/gitpython/badge/?version=stable)](https://readthedocs.org/projects/gitpython/?badge=stable)
62
+ [![Packaging status](https://repology.org/badge/tiny-repos/python:gitpython.svg)](https://repology.org/metapackage/python:gitpython/versions)
63
+
64
+ ## [Gitoxide](https://github.com/Byron/gitoxide): A peek into the future…
65
+
66
+ I started working on GitPython in 2009, back in the days when Python was 'my thing' and I had great plans with it.
67
+ Of course, back in the days, I didn't really know what I was doing and this shows in many places. Somewhat similar to
68
+ Python this happens to be 'good enough', but at the same time is deeply flawed and broken beyond repair.
69
+
70
+ By now, GitPython is widely used and I am sure there is a good reason for that, it's something to be proud of and happy about.
71
+ The community is maintaining the software and is keeping it relevant for which I am absolutely grateful. For the time to come I am happy to continue maintaining GitPython, remaining hopeful that one day it won't be needed anymore.
72
+
73
+ More than 15 years after my first meeting with 'git' I am still in excited about it, and am happy to finally have the tools and
74
+ probably the skills to scratch that itch of mine: implement `git` in a way that makes tool creation a piece of cake for most.
75
+
76
+ If you like the idea and want to learn more, please head over to [gitoxide](https://github.com/Byron/gitoxide), an
77
+ implementation of 'git' in [Rust](https://www.rust-lang.org).
78
+
79
+ *(Please note that `gitoxide` is not currently available for use in Python, and that Rust is required.)*
80
+
81
+ ## GitPython
82
+
83
+ GitPython is a python library used to interact with git repositories, high-level like git-porcelain,
84
+ or low-level like git-plumbing.
85
+
86
+ It provides abstractions of git objects for easy access of repository data often backed by calling the `git`
87
+ command-line program.
88
+
89
+ ### DEVELOPMENT STATUS
90
+
91
+ This project is in **maintenance mode**, which means that
92
+
93
+ - …there will be no feature development, unless these are contributed
94
+ - …there will be no bug fixes, unless they are relevant to the safety of users, or contributed
95
+ - …issues will be responded to with waiting times of up to a month
96
+
97
+ The project is open to contributions of all kinds, as well as new maintainers.
98
+
99
+ ### REQUIREMENTS
100
+
101
+ GitPython needs the `git` executable to be installed on the system and available in your
102
+ `PATH` for most operations. If it is not in your `PATH`, you can help GitPython find it
103
+ by setting the `GIT_PYTHON_GIT_EXECUTABLE=<path/to/git>` environment variable.
104
+
105
+ - Git (1.7.x or newer)
106
+ - Python >= 3.7
107
+
108
+ The list of dependencies are listed in `./requirements.txt` and `./test-requirements.txt`.
109
+ The installer takes care of installing them for you.
110
+
111
+ ### INSTALL
112
+
113
+ GitPython and its required package dependencies can be installed in any of the following ways, all of which should typically be done in a [virtual environment](https://docs.python.org/3/tutorial/venv.html).
114
+
115
+ #### From PyPI
116
+
117
+ To obtain and install a copy [from PyPI](https://pypi.org/project/GitPython/), run:
118
+
119
+ ```sh
120
+ pip install GitPython
121
+ ```
122
+
123
+ (A distribution package can also be downloaded for manual installation at [the PyPI page](https://pypi.org/project/GitPython/).)
124
+
125
+ #### From downloaded source code
126
+
127
+ If you have downloaded the source code, run this from inside the unpacked `GitPython` directory:
128
+
129
+ ```sh
130
+ pip install .
131
+ ```
132
+
133
+ #### By cloning the source code repository
134
+
135
+ To clone the [the GitHub repository](https://github.com/gitpython-developers/GitPython) from source to work on the code, you can do it like so:
136
+
137
+ ```sh
138
+ git clone https://github.com/gitpython-developers/GitPython
139
+ cd GitPython
140
+ ./init-tests-after-clone.sh
141
+ ```
142
+
143
+ On Windows, `./init-tests-after-clone.sh` can be run in a Git Bash shell.
144
+
145
+ If you are cloning [your own fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/about-forks), then replace the above `git clone` command with one that gives the URL of your fork. Or use this [`gh`](https://cli.github.com/) command (assuming you have `gh` and your fork is called `GitPython`):
146
+
147
+ ```sh
148
+ gh repo clone GitPython
149
+ ```
150
+
151
+ Having cloned the repo, create and activate your [virtual environment](https://docs.python.org/3/tutorial/venv.html).
152
+
153
+ Then make an [editable install](https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs):
154
+
155
+ ```sh
156
+ pip install -e ".[test]"
157
+ ```
158
+
159
+ In the less common case that you do not want to install test dependencies, `pip install -e .` can be used instead.
160
+
161
+ #### With editable *dependencies* (not preferred, and rarely needed)
162
+
163
+ In rare cases, you may want to work on GitPython and one or both of its [gitdb](https://github.com/gitpython-developers/gitdb) and [smmap](https://github.com/gitpython-developers/smmap) dependencies at the same time, with changes in your local working copy of gitdb or smmap immediately reflected in the behavior of your local working copy of GitPython. This can be done by making editable installations of those dependencies in the same virtual environment where you install GitPython.
164
+
165
+ If you want to do that *and* you want the versions in GitPython's git submodules to be used, then pass `-e git/ext/gitdb` and/or `-e git/ext/gitdb/gitdb/ext/smmap` to `pip install`. This can be done in any order, and in separate `pip install` commands or the same one, so long as `-e` appears before *each* path. For example, you can install GitPython, gitdb, and smmap editably in the currently active virtual environment this way:
166
+
167
+ ```sh
168
+ pip install -e ".[test]" -e git/ext/gitdb -e git/ext/gitdb/gitdb/ext/smmap
169
+ ```
170
+
171
+ The submodules must have been cloned for that to work, but that will already be the case if you have run `./init-tests-after-clone.sh`. You can use `pip list` to check which packages are installed editably and which are installed normally.
172
+
173
+ To reiterate, this approach should only rarely be used. For most development it is preferable to allow the gitdb and smmap dependencices to be retrieved automatically from PyPI in their latest stable packaged versions.
174
+
175
+ ### Limitations
176
+
177
+ #### Leakage of System Resources
178
+
179
+ GitPython is not suited for long-running processes (like daemons) as it tends to
180
+ leak system resources. It was written in a time where destructors (as implemented
181
+ in the `__del__` method) still ran deterministically.
182
+
183
+ In case you still want to use it in such a context, you will want to search the
184
+ codebase for `__del__` implementations and call these yourself when you see fit.
185
+
186
+ Another way assure proper cleanup of resources is to factor out GitPython into a
187
+ separate process which can be dropped periodically.
188
+
189
+ #### Windows support
190
+
191
+ See [Issue #525](https://github.com/gitpython-developers/GitPython/issues/525).
192
+
193
+ ### RUNNING TESTS
194
+
195
+ _Important_: Right after cloning this repository, please be sure to have executed
196
+ the `./init-tests-after-clone.sh` script in the repository root. Otherwise
197
+ you will encounter test failures.
198
+
199
+ #### Install test dependencies
200
+
201
+ Ensure testing libraries are installed. This is taken care of already if you installed with:
202
+
203
+ ```sh
204
+ pip install -e ".[test]"
205
+ ```
206
+
207
+ If you had installed with a command like `pip install -e .` instead, you can still run
208
+ the above command to add the testing dependencies.
209
+
210
+ #### Test commands
211
+
212
+ To test, run:
213
+
214
+ ```sh
215
+ pytest
216
+ ```
217
+
218
+ To lint, and apply some linting fixes as well as automatic code formatting, run:
219
+
220
+ ```sh
221
+ pre-commit run --all-files
222
+ ```
223
+
224
+ This includes the linting and autoformatting done by Ruff, as well as some other checks.
225
+
226
+ To typecheck, run:
227
+
228
+ ```sh
229
+ mypy
230
+ ```
231
+
232
+ #### CI (and tox)
233
+
234
+ Style and formatting checks, and running tests on all the different supported Python versions, will be performed:
235
+
236
+ - Upon submitting a pull request.
237
+ - On each push, *if* you have a fork with GitHub Actions enabled.
238
+ - Locally, if you run [`tox`](https://tox.wiki/) (this skips any Python versions you don't have installed).
239
+
240
+ #### Configuration files
241
+
242
+ Specific tools are all configured in the `./pyproject.toml` file:
243
+
244
+ - `pytest` (test runner)
245
+ - `coverage.py` (code coverage)
246
+ - `ruff` (linter and formatter)
247
+ - `mypy` (type checker)
248
+
249
+ Orchestration tools:
250
+
251
+ - Configuration for `pre-commit` is in the `./.pre-commit-config.yaml` file.
252
+ - Configuration for `tox` is in `./tox.ini`.
253
+ - Configuration for GitHub Actions (CI) is in files inside `./.github/workflows/`.
254
+
255
+ ### Contributions
256
+
257
+ Please have a look at the [contributions file][contributing].
258
+
259
+ ### INFRASTRUCTURE
260
+
261
+ - [User Documentation](http://gitpython.readthedocs.org)
262
+ - [Questions and Answers](http://stackexchange.com/filters/167317/gitpython)
263
+ - Please post on Stack Overflow and use the `gitpython` tag
264
+ - [Issue Tracker](https://github.com/gitpython-developers/GitPython/issues)
265
+ - Post reproducible bugs and feature requests as a new issue.
266
+ Please be sure to provide the following information if posting bugs:
267
+ - GitPython version (e.g. `import git; git.__version__`)
268
+ - Python version (e.g. `python --version`)
269
+ - The encountered stack-trace, if applicable
270
+ - Enough information to allow reproducing the issue
271
+
272
+ ### How to make a new release
273
+
274
+ 1. Update/verify the **version** in the `VERSION` file.
275
+ 2. Update/verify that the `doc/source/changes.rst` changelog file was updated. It should include a link to the forthcoming release page: `https://github.com/gitpython-developers/GitPython/releases/tag/<version>`
276
+ 3. Commit everything.
277
+ 4. Run `git tag -s <version>` to tag the version in Git.
278
+ 5. _Optionally_ create and activate a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment). (Then the next step can install `build` and `twine`.)
279
+ 6. Run `make release`.
280
+ 7. Go to [GitHub Releases](https://github.com/gitpython-developers/GitPython/releases) and publish a new one with the recently pushed tag. Generate the changelog.
281
+
282
+ ### Projects using GitPython
283
+
284
+ - [PyDriller](https://github.com/ishepard/pydriller)
285
+ - [Kivy Designer](https://github.com/kivy/kivy-designer)
286
+ - [Prowl](https://github.com/nettitude/Prowl)
287
+ - [Python Taint](https://github.com/python-security/pyt)
288
+ - [Buster](https://github.com/axitkhurana/buster)
289
+ - [git-ftp](https://github.com/ezyang/git-ftp)
290
+ - [Git-Pandas](https://github.com/wdm0006/git-pandas)
291
+ - [PyGitUp](https://github.com/msiemens/PyGitUp)
292
+ - [PyJFuzz](https://github.com/mseclab/PyJFuzz)
293
+ - [Loki](https://github.com/Neo23x0/Loki)
294
+ - [Omniwallet](https://github.com/OmniLayer/omniwallet)
295
+ - [GitViper](https://github.com/BeayemX/GitViper)
296
+ - [Git Gud](https://github.com/bthayer2365/git-gud)
297
+
298
+ ### LICENSE
299
+
300
+ [3-Clause BSD License](https://opensource.org/license/bsd-3-clause/), also known as the New BSD License. See the [LICENSE file][license].
301
+
302
+ One file exclusively used for fuzz testing is subject to [a separate license, detailed here](./fuzzing/README.md#license).
303
+ This file is not included in the wheel or sdist packages published by the maintainers of GitPython.
304
+
305
+ [contributing]: https://github.com/gitpython-developers/GitPython/blob/main/CONTRIBUTING.md
306
+ [license]: https://github.com/gitpython-developers/GitPython/blob/main/LICENSE
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/RECORD ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ git/__init__.py,sha256=IFCdAVZx_IuQOh_BBdtSkdIrZHsOSd0cj0O50t9orso,8899
2
+ git/__pycache__/__init__.cpython-312.pyc,,
3
+ git/__pycache__/cmd.cpython-312.pyc,,
4
+ git/__pycache__/compat.cpython-312.pyc,,
5
+ git/__pycache__/config.cpython-312.pyc,,
6
+ git/__pycache__/db.cpython-312.pyc,,
7
+ git/__pycache__/diff.cpython-312.pyc,,
8
+ git/__pycache__/exc.cpython-312.pyc,,
9
+ git/__pycache__/remote.cpython-312.pyc,,
10
+ git/__pycache__/types.cpython-312.pyc,,
11
+ git/__pycache__/util.cpython-312.pyc,,
12
+ git/cmd.py,sha256=y01yN8P2JFuFP5dGzHIW9vd-uBQjPzK8yfZMZIZZb34,67472
13
+ git/compat.py,sha256=y1E6y6O2q5r8clSlr8ZNmuIWG9nmHuehQEsVsmBffs8,4526
14
+ git/config.py,sha256=pMrIel6qEqbzC1MLVjoyG9MRDemiEVP-paptgnAV9sA,35505
15
+ git/db.py,sha256=vIW9uWSbqu99zbuU2ZDmOhVOv1UPTmxrnqiCtRHCfjE,2368
16
+ git/diff.py,sha256=xhOeMmFDmXOdpje2vA1mzJpmpBnyX-nrt-mp2RiVR1M,27172
17
+ git/exc.py,sha256=Gc7g1pHpn8OmTse30NHmJVsBJ2CYH8LxaR8y8UA3lIM,7119
18
+ git/index/__init__.py,sha256=i-Nqb8Lufp9aFbmxpQBORmmQnjEVVM1Pn58fsQkyGgQ,406
19
+ git/index/__pycache__/__init__.cpython-312.pyc,,
20
+ git/index/__pycache__/base.cpython-312.pyc,,
21
+ git/index/__pycache__/fun.cpython-312.pyc,,
22
+ git/index/__pycache__/typ.cpython-312.pyc,,
23
+ git/index/__pycache__/util.cpython-312.pyc,,
24
+ git/index/base.py,sha256=QBzkdpNKSjXVRDUqcl08BPyF0VItsO6uXzziclwNPJI,61121
25
+ git/index/fun.py,sha256=v0WnKQxaAffMZxXXC7pQOiMvRRJfODhUNKDMruxKrN4,17110
26
+ git/index/typ.py,sha256=ZjRWp5J79OwFQor1XXN4C6JmHTDclD9H-tKZtAeqyTI,7019
27
+ git/index/util.py,sha256=f0BfE2JPkdypsB2Q_HJ8KU7MC45RRHywL_GWwxa_5hw,3676
28
+ git/objects/__init__.py,sha256=O6ZL_olX7e5-8iIbKviRPkVSJxN37WA-EC0q9d48U5Y,637
29
+ git/objects/__pycache__/__init__.cpython-312.pyc,,
30
+ git/objects/__pycache__/base.cpython-312.pyc,,
31
+ git/objects/__pycache__/blob.cpython-312.pyc,,
32
+ git/objects/__pycache__/commit.cpython-312.pyc,,
33
+ git/objects/__pycache__/fun.cpython-312.pyc,,
34
+ git/objects/__pycache__/tag.cpython-312.pyc,,
35
+ git/objects/__pycache__/tree.cpython-312.pyc,,
36
+ git/objects/__pycache__/util.cpython-312.pyc,,
37
+ git/objects/base.py,sha256=5-p9uSGWvPxX9hidvkGH9tQOJoH2eaRggUbMr9VJiL0,10285
38
+ git/objects/blob.py,sha256=G9PZMNc5CFRQFNnlquBRAM5-jZg8581lRcxkvARobSk,1231
39
+ git/objects/commit.py,sha256=VhfRNpYM-ormwpXjY6cKV6Zur3GHsuDzVn4TP0mSz2I,30565
40
+ git/objects/fun.py,sha256=B4jCqhAjm6Hl79GK58FPzW1H9K6Wc7Tx0rssyWmAcEE,8935
41
+ git/objects/submodule/__init__.py,sha256=6xySp767LVz3UylWgUalntS_nGXRuVzXxDuFAv_Wc2c,303
42
+ git/objects/submodule/__pycache__/__init__.cpython-312.pyc,,
43
+ git/objects/submodule/__pycache__/base.cpython-312.pyc,,
44
+ git/objects/submodule/__pycache__/root.cpython-312.pyc,,
45
+ git/objects/submodule/__pycache__/util.cpython-312.pyc,,
46
+ git/objects/submodule/base.py,sha256=EWkbiJsFSpCt5zacoVrq-9JQFJWn4BWA7kdsXtjL5PU,64412
47
+ git/objects/submodule/root.py,sha256=5eTtYNHasqdPq6q0oDCPr7IaO6uAHL3b4DxMoiO2LhE,20246
48
+ git/objects/submodule/util.py,sha256=sQqAYaiSJdFkZa9NlAuK_wTsMNiS-kkQnQjvIoJtc_o,3509
49
+ git/objects/tag.py,sha256=jAGESnpmTEv-dLakPzheT5ILZFFArcItnXYqfxfDrgc,4441
50
+ git/objects/tree.py,sha256=MmExcS59Iamb2cBqUvoHPdzgixabyvv5voHabossrl8,13898
51
+ git/objects/util.py,sha256=Nlza4zLgdPmr_Yasyvvs6c1rKtW_wMxI6wDmQpQ3ufw,23846
52
+ git/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ git/refs/__init__.py,sha256=DWlJNnsx-4jM_E-VycbP-FZUdn6iWhjnH_uZ_pZXBro,509
54
+ git/refs/__pycache__/__init__.cpython-312.pyc,,
55
+ git/refs/__pycache__/head.cpython-312.pyc,,
56
+ git/refs/__pycache__/log.cpython-312.pyc,,
57
+ git/refs/__pycache__/reference.cpython-312.pyc,,
58
+ git/refs/__pycache__/remote.cpython-312.pyc,,
59
+ git/refs/__pycache__/symbolic.cpython-312.pyc,,
60
+ git/refs/__pycache__/tag.cpython-312.pyc,,
61
+ git/refs/head.py,sha256=59MUMVu9phmE_ImkmNw0sDDSCc75s7TxkQj_cKzRhbo,10397
62
+ git/refs/log.py,sha256=ooqlw_mn14FSQGvZXDC0Tt4MQG-4Hob8T92SDH9ZzfY,12517
63
+ git/refs/reference.py,sha256=uzrvNTZ5fg7A0Aq4VC3KLSMbksgYUf4KvmHau0tFYIM,5646
64
+ git/refs/remote.py,sha256=WwqV9T7BbYf3F_WZNUQivu9xktIIKGklCjDpwQrhD-A,2806
65
+ git/refs/symbolic.py,sha256=seRKwWw7eegQyGoObE-PuuVpSvNyQRUAXqFRq0wI6yA,34892
66
+ git/refs/tag.py,sha256=AKrFrMhkNzX8e9x5WmDRtHovbN9zYQghuKoneVW-TJg,5002
67
+ git/remote.py,sha256=pYn9dAlz-QwvNMWXD1M57pMPQitthOM86qTRK_cpTqU,46786
68
+ git/repo/__init__.py,sha256=CILSVH36fX_WxVFSjD9o1WF5LgsNedPiJvSngKZqfVU,210
69
+ git/repo/__pycache__/__init__.cpython-312.pyc,,
70
+ git/repo/__pycache__/base.cpython-312.pyc,,
71
+ git/repo/__pycache__/fun.cpython-312.pyc,,
72
+ git/repo/base.py,sha256=WB-tKymX1pCWJS6NJvk8nrc9uwjPKOswfIjIB4Piylg,59900
73
+ git/repo/fun.py,sha256=sjzJH8jy18nacsJjKKIqRBKadhhhxiyjmZKWXDErNnw,13787
74
+ git/types.py,sha256=d3oDduUGjfoqffcUL_GOD-3qroF8m3r9ai6Xi9_FraM,10279
75
+ git/util.py,sha256=T1M3Nv-AbKSeZ3if33bpJFX450EeoGK67tr3SrEkjlU,44057
76
+ gitpython-3.1.46.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
77
+ gitpython-3.1.46.dist-info/METADATA,sha256=2SpjTUkbQB5rdgU7bSkG9Bd27Cx-JRgdWGEMZ8MKHgs,13492
78
+ gitpython-3.1.46.dist-info/RECORD,,
79
+ gitpython-3.1.46.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
+ gitpython-3.1.46.dist-info/licenses/AUTHORS,sha256=_upJOkW3eLK_ZywFzQDkKDp4JtF6xBf_Qk0ObAqTPvE,2347
81
+ gitpython-3.1.46.dist-info/licenses/LICENSE,sha256=hvyUwyGpr7wRUUcTURuv3tIl8lEA3MD3NQ6CvCMbi-s,1503
82
+ gitpython-3.1.46.dist-info/top_level.txt,sha256=0hzDuIp8obv624V3GmbqsagBWkk8ohtGU-Bc1PmTT0o,4
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/licenses/AUTHORS ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GitPython was originally written by Michael Trier.
2
+ GitPython 0.2 was partially (re)written by Sebastian Thiel, based on 0.1.6 and git-dulwich.
3
+
4
+ Contributors are:
5
+
6
+ -Michael Trier <mtrier _at_ gmail.com>
7
+ -Alan Briolat
8
+ -Florian Apolloner <florian _at_ apolloner.eu>
9
+ -David Aguilar <davvid _at_ gmail.com>
10
+ -Jelmer Vernooij <jelmer _at_ samba.org>
11
+ -Steve Frécinaux <code _at_ istique.net>
12
+ -Kai Lautaportti <kai _at_ lautaportti.fi>
13
+ -Paul Sowden <paul _at_ idontsmoke.co.uk>
14
+ -Sebastian Thiel <byronimo _at_ gmail.com>
15
+ -Jonathan Chu <jonathan.chu _at_ me.com>
16
+ -Vincent Driessen <me _at_ nvie.com>
17
+ -Phil Elson <pelson _dot_ pub _at_ gmail.com>
18
+ -Bernard `Guyzmo` Pratz <guyzmo+gitpython+pub@m0g.net>
19
+ -Timothy B. Hartman <tbhartman _at_ gmail.com>
20
+ -Konstantin Popov <konstantin.popov.89 _at_ yandex.ru>
21
+ -Peter Jones <pjones _at_ redhat.com>
22
+ -Anson Mansfield <anson.mansfield _at_ gmail.com>
23
+ -Ken Odegard <ken.odegard _at_ gmail.com>
24
+ -Alexis Horgix Chotard
25
+ -Piotr Babij <piotr.babij _at_ gmail.com>
26
+ -Mikuláš Poul <mikulaspoul _at_ gmail.com>
27
+ -Charles Bouchard-Légaré <cblegare.atl _at_ ntis.ca>
28
+ -Yaroslav Halchenko <debian _at_ onerussian.com>
29
+ -Tim Swast <swast _at_ google.com>
30
+ -William Luc Ritchie
31
+ -David Host <hostdm _at_ outlook.com>
32
+ -A. Jesse Jiryu Davis <jesse _at_ emptysquare.net>
33
+ -Steven Whitman <ninloot _at_ gmail.com>
34
+ -Stefan Stancu <stefan.stancu _at_ gmail.com>
35
+ -César Izurieta <cesar _at_ caih.org>
36
+ -Arthur Milchior <arthur _at_ milchior.fr>
37
+ -Anil Khatri <anil.soccer.khatri _at_ gmail.com>
38
+ -JJ Graham <thetwoj _at_ gmail.com>
39
+ -Ben Thayer <ben _at_ benthayer.com>
40
+ -Dries Kennes <admin _at_ dries007.net>
41
+ -Pratik Anurag <panurag247365 _at_ gmail.com>
42
+ -Harmon <harmon.public _at_ gmail.com>
43
+ -Liam Beguin <liambeguin _at_ gmail.com>
44
+ -Ram Rachum <ram _at_ rachum.com>
45
+ -Alba Mendez <me _at_ alba.sh>
46
+ -Robert Westman <robert _at_ byteflux.io>
47
+ -Hugo van Kemenade
48
+ -Hiroki Tokunaga <tokusan441 _at_ gmail.com>
49
+ -Julien Mauroy <pro.julien.mauroy _at_ gmail.com>
50
+ -Patrick Gerard
51
+ -Luke Twist <itsluketwist@gmail.com>
52
+ -Joseph Hale <me _at_ jhale.dev>
53
+ -Santos Gallegos <stsewd _at_ proton.me>
54
+ -Wenhan Zhu <wzhu.cosmos _at_ gmail.com>
55
+ -Eliah Kagan <eliah.kagan _at_ gmail.com>
56
+ -Ethan Lin <et.repositories _at_ gmail.com>
57
+ -Jonas Scharpf <jonas.scharpf _at_ checkmk.com>
58
+ -Gordon Marx
59
+
60
+ Portions derived from other open source works and are clearly marked.
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/licenses/LICENSE ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2008, 2009 Michael Trier and contributors
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions
6
+ are met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the distribution.
14
+
15
+ * Neither the name of the GitPython project nor the names of
16
+ its contributors may be used to endorse or promote products derived
17
+ from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
25
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
lib/python3.12/site-packages/gitpython-3.1.46.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ git
lib/python3.12/site-packages/hydra/__init__.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
2
+
3
+ # Source of truth for Hydra's version
4
+ __version__ = "1.3.2"
5
+ from hydra import utils
6
+ from hydra.errors import MissingConfigException
7
+ from hydra.main import main
8
+ from hydra.types import TaskFunction
9
+
10
+ from .compose import compose
11
+ from .initialize import initialize, initialize_config_dir, initialize_config_module
12
+
13
+ __all__ = [
14
+ "__version__",
15
+ "MissingConfigException",
16
+ "main",
17
+ "utils",
18
+ "TaskFunction",
19
+ "compose",
20
+ "initialize",
21
+ "initialize_config_module",
22
+ "initialize_config_dir",
23
+ ]
lib/python3.12/site-packages/hydra/_internal/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
lib/python3.12/site-packages/hydra/_internal/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (194 Bytes). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/callbacks.cpython-312.pyc ADDED
Binary file (3.8 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/config_loader_impl.cpython-312.pyc ADDED
Binary file (26.8 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/config_repository.cpython-312.pyc ADDED
Binary file (17 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/config_search_path_impl.cpython-312.pyc ADDED
Binary file (4.86 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/defaults_list.cpython-312.pyc ADDED
Binary file (31.5 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/deprecation_warning.cpython-312.pyc ADDED
Binary file (800 Bytes). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/hydra.cpython-312.pyc ADDED
Binary file (33.2 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/sources_registry.cpython-312.pyc ADDED
Binary file (2.28 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/__pycache__/utils.cpython-312.pyc ADDED
Binary file (26 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/callbacks.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
2
+ import warnings
3
+ from typing import TYPE_CHECKING, Any, Optional
4
+
5
+ from omegaconf import DictConfig, OmegaConf
6
+
7
+ from hydra.types import TaskFunction
8
+
9
+ if TYPE_CHECKING:
10
+ from hydra.core.utils import JobReturn
11
+
12
+
13
+ class Callbacks:
14
+ def __init__(self, config: Optional[DictConfig] = None) -> None:
15
+ self.callbacks = []
16
+ from hydra.utils import instantiate
17
+
18
+ if config is not None and OmegaConf.select(config, "hydra.callbacks"):
19
+ for params in config.hydra.callbacks.values():
20
+ self.callbacks.append(instantiate(params))
21
+
22
+ def _notify(self, function_name: str, reverse: bool = False, **kwargs: Any) -> None:
23
+ callbacks = reversed(self.callbacks) if reverse else self.callbacks
24
+ for c in callbacks:
25
+ try:
26
+ getattr(c, function_name)(**kwargs)
27
+ except Exception as e:
28
+ warnings.warn(
29
+ f"Callback {type(c).__name__}.{function_name} raised {type(e).__name__}: {e}"
30
+ )
31
+
32
+ def on_run_start(self, config: DictConfig, **kwargs: Any) -> None:
33
+ self._notify(function_name="on_run_start", config=config, **kwargs)
34
+
35
+ def on_run_end(self, config: DictConfig, **kwargs: Any) -> None:
36
+ self._notify(function_name="on_run_end", config=config, reverse=True, **kwargs)
37
+
38
+ def on_multirun_start(self, config: DictConfig, **kwargs: Any) -> None:
39
+ self._notify(function_name="on_multirun_start", config=config, **kwargs)
40
+
41
+ def on_multirun_end(self, config: DictConfig, **kwargs: Any) -> None:
42
+ self._notify(
43
+ function_name="on_multirun_end", reverse=True, config=config, **kwargs
44
+ )
45
+
46
+ def on_job_start(
47
+ self, config: DictConfig, *, task_function: TaskFunction, **kwargs: Any
48
+ ) -> None:
49
+ self._notify(
50
+ function_name="on_job_start",
51
+ config=config,
52
+ task_function=task_function,
53
+ **kwargs,
54
+ )
55
+
56
+ def on_job_end(
57
+ self, config: DictConfig, job_return: "JobReturn", **kwargs: Any
58
+ ) -> None:
59
+ self._notify(
60
+ function_name="on_job_end",
61
+ config=config,
62
+ job_return=job_return,
63
+ reverse=True,
64
+ **kwargs,
65
+ )
lib/python3.12/site-packages/hydra/_internal/config_loader_impl.py ADDED
@@ -0,0 +1,600 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
2
+ import copy
3
+ import os
4
+ import re
5
+ import sys
6
+ import warnings
7
+ from textwrap import dedent
8
+ from typing import Any, List, MutableSequence, Optional, Tuple
9
+
10
+ from omegaconf import Container, DictConfig, OmegaConf, flag_override, open_dict
11
+ from omegaconf.errors import (
12
+ ConfigAttributeError,
13
+ ConfigKeyError,
14
+ OmegaConfBaseException,
15
+ )
16
+
17
+ from hydra._internal.config_repository import (
18
+ CachingConfigRepository,
19
+ ConfigRepository,
20
+ IConfigRepository,
21
+ )
22
+ from hydra._internal.defaults_list import DefaultsList, create_defaults_list
23
+ from hydra.conf import ConfigSourceInfo
24
+ from hydra.core.config_loader import ConfigLoader
25
+ from hydra.core.config_search_path import ConfigSearchPath
26
+ from hydra.core.default_element import ResultDefault
27
+ from hydra.core.object_type import ObjectType
28
+ from hydra.core.override_parser.overrides_parser import OverridesParser
29
+ from hydra.core.override_parser.types import Override, ValueType
30
+ from hydra.core.utils import JobRuntime
31
+ from hydra.errors import ConfigCompositionException, MissingConfigException
32
+ from hydra.plugins.config_source import ConfigLoadError, ConfigResult, ConfigSource
33
+ from hydra.types import RunMode
34
+
35
+ from .deprecation_warning import deprecation_warning
36
+
37
+
38
+ class ConfigLoaderImpl(ConfigLoader):
39
+ """
40
+ Configuration loader
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ config_search_path: ConfigSearchPath,
46
+ ) -> None:
47
+ self.config_search_path = config_search_path
48
+ self.repository = ConfigRepository(config_search_path=config_search_path)
49
+
50
+ @staticmethod
51
+ def validate_sweep_overrides_legal(
52
+ overrides: List[Override],
53
+ run_mode: RunMode,
54
+ from_shell: bool,
55
+ ) -> None:
56
+ for x in overrides:
57
+ if x.is_sweep_override():
58
+ if run_mode == RunMode.MULTIRUN:
59
+ if x.is_hydra_override():
60
+ raise ConfigCompositionException(
61
+ "Sweeping over Hydra's configuration is not supported :"
62
+ f" '{x.input_line}'"
63
+ )
64
+ elif run_mode == RunMode.RUN:
65
+ if x.value_type == ValueType.SIMPLE_CHOICE_SWEEP:
66
+ vals = "value1,value2"
67
+ if from_shell:
68
+ example_override = f"key=\\'{vals}\\'"
69
+ else:
70
+ example_override = f"key='{vals}'"
71
+
72
+ msg = dedent(
73
+ f"""\
74
+ Ambiguous value for argument '{x.input_line}'
75
+ 1. To use it as a list, use key=[value1,value2]
76
+ 2. To use it as string, quote the value: {example_override}
77
+ 3. To sweep over it, add --multirun to your command line"""
78
+ )
79
+ raise ConfigCompositionException(msg)
80
+ else:
81
+ raise ConfigCompositionException(
82
+ f"Sweep parameters '{x.input_line}' requires --multirun"
83
+ )
84
+ else:
85
+ assert False
86
+
87
+ def _missing_config_error(
88
+ self, config_name: Optional[str], msg: str, with_search_path: bool
89
+ ) -> None:
90
+ def add_search_path() -> str:
91
+ descs = []
92
+ for src in self.repository.get_sources():
93
+ if src.provider != "schema":
94
+ descs.append(f"\t{repr(src)}")
95
+ lines = "\n".join(descs)
96
+
97
+ if with_search_path:
98
+ return msg + "\nSearch path:" + f"\n{lines}"
99
+ else:
100
+ return msg
101
+
102
+ raise MissingConfigException(
103
+ missing_cfg_file=config_name, message=add_search_path()
104
+ )
105
+
106
+ def ensure_main_config_source_available(self) -> None:
107
+ for source in self.get_sources():
108
+ # if specified, make sure main config search path exists
109
+ if source.provider == "main":
110
+ if not source.available():
111
+ if source.scheme() == "pkg":
112
+ if source.path == "":
113
+ msg = (
114
+ "Primary config module is empty.\nPython requires"
115
+ " resources to be in a module with an __init__.py file"
116
+ )
117
+ else:
118
+ msg = (
119
+ f"Primary config module '{source.path}' not"
120
+ " found.\nCheck that it's correct and contains an"
121
+ " __init__.py file"
122
+ )
123
+ else:
124
+ msg = (
125
+ "Primary config directory not found.\nCheck that the"
126
+ f" config directory '{source.path}' exists and readable"
127
+ )
128
+
129
+ self._missing_config_error(
130
+ config_name=None, msg=msg, with_search_path=False
131
+ )
132
+
133
+ def load_configuration(
134
+ self,
135
+ config_name: Optional[str],
136
+ overrides: List[str],
137
+ run_mode: RunMode,
138
+ from_shell: bool = True,
139
+ validate_sweep_overrides: bool = True,
140
+ ) -> DictConfig:
141
+ try:
142
+ return self._load_configuration_impl(
143
+ config_name=config_name,
144
+ overrides=overrides,
145
+ run_mode=run_mode,
146
+ from_shell=from_shell,
147
+ validate_sweep_overrides=validate_sweep_overrides,
148
+ )
149
+ except OmegaConfBaseException as e:
150
+ raise ConfigCompositionException().with_traceback(sys.exc_info()[2]) from e
151
+
152
+ def _process_config_searchpath(
153
+ self,
154
+ config_name: Optional[str],
155
+ parsed_overrides: List[Override],
156
+ repo: CachingConfigRepository,
157
+ ) -> None:
158
+ if config_name is not None:
159
+ loaded = repo.load_config(config_path=config_name)
160
+ primary_config: Container
161
+ if loaded is None:
162
+ primary_config = OmegaConf.create()
163
+ else:
164
+ primary_config = loaded.config
165
+ else:
166
+ primary_config = OmegaConf.create()
167
+
168
+ if not OmegaConf.is_dict(primary_config):
169
+ raise ConfigCompositionException(
170
+ f"primary config '{config_name}' must be a DictConfig, got"
171
+ f" {type(primary_config).__name__}"
172
+ )
173
+
174
+ def is_searchpath_override(v: Override) -> bool:
175
+ return v.get_key_element() == "hydra.searchpath"
176
+
177
+ override = None
178
+ for v in parsed_overrides:
179
+ if is_searchpath_override(v):
180
+ override = v.value()
181
+ break
182
+
183
+ searchpath = OmegaConf.select(primary_config, "hydra.searchpath")
184
+ if override is not None:
185
+ provider = "hydra.searchpath in command-line"
186
+ searchpath = override
187
+ else:
188
+ provider = "hydra.searchpath in main"
189
+
190
+ def _err() -> None:
191
+ raise ConfigCompositionException(
192
+ f"hydra.searchpath must be a list of strings. Got: {searchpath}"
193
+ )
194
+
195
+ if searchpath is None:
196
+ return
197
+
198
+ # validate hydra.searchpath.
199
+ # Note that we cannot rely on OmegaConf validation here because we did not yet merge with the Hydra schema node
200
+ if not isinstance(searchpath, MutableSequence):
201
+ _err()
202
+ for v in searchpath:
203
+ if not isinstance(v, str):
204
+ _err()
205
+
206
+ new_csp = copy.deepcopy(self.config_search_path)
207
+ schema = new_csp.get_path().pop(-1)
208
+ assert schema.provider == "schema"
209
+ for sp in searchpath:
210
+ new_csp.append(provider=provider, path=sp)
211
+ new_csp.append("schema", "structured://")
212
+ repo.initialize_sources(new_csp)
213
+
214
+ for source in repo.get_sources():
215
+ if not source.available():
216
+ warnings.warn(
217
+ category=UserWarning,
218
+ message=(
219
+ f"provider={source.provider}, path={source.path} is not"
220
+ " available."
221
+ ),
222
+ )
223
+
224
+ def _parse_overrides_and_create_caching_repo(
225
+ self, config_name: Optional[str], overrides: List[str]
226
+ ) -> Tuple[List[Override], CachingConfigRepository]:
227
+ parser = OverridesParser.create()
228
+ parsed_overrides = parser.parse_overrides(overrides=overrides)
229
+ caching_repo = CachingConfigRepository(self.repository)
230
+ self._process_config_searchpath(config_name, parsed_overrides, caching_repo)
231
+ return parsed_overrides, caching_repo
232
+
233
+ def _load_configuration_impl(
234
+ self,
235
+ config_name: Optional[str],
236
+ overrides: List[str],
237
+ run_mode: RunMode,
238
+ from_shell: bool = True,
239
+ validate_sweep_overrides: bool = True,
240
+ ) -> DictConfig:
241
+ from hydra import __version__, version
242
+
243
+ self.ensure_main_config_source_available()
244
+ parsed_overrides, caching_repo = self._parse_overrides_and_create_caching_repo(
245
+ config_name, overrides
246
+ )
247
+
248
+ if validate_sweep_overrides:
249
+ self.validate_sweep_overrides_legal(
250
+ overrides=parsed_overrides, run_mode=run_mode, from_shell=from_shell
251
+ )
252
+
253
+ defaults_list = create_defaults_list(
254
+ repo=caching_repo,
255
+ config_name=config_name,
256
+ overrides_list=parsed_overrides,
257
+ prepend_hydra=True,
258
+ skip_missing=run_mode == RunMode.MULTIRUN,
259
+ )
260
+
261
+ config_overrides = defaults_list.config_overrides
262
+
263
+ cfg = self._compose_config_from_defaults_list(
264
+ defaults=defaults_list.defaults, repo=caching_repo
265
+ )
266
+
267
+ # Set config root to struct mode.
268
+ # Note that this will close any dictionaries (including dicts annotated as Dict[K, V].
269
+ # One must use + to add new fields to them.
270
+ OmegaConf.set_struct(cfg, True)
271
+
272
+ # The Hydra node should not be read-only even if the root config is read-only.
273
+ OmegaConf.set_readonly(cfg.hydra, False)
274
+
275
+ # Apply command line overrides after enabling strict flag
276
+ ConfigLoaderImpl._apply_overrides_to_config(config_overrides, cfg)
277
+ app_overrides = []
278
+ for override in parsed_overrides:
279
+ if override.is_hydra_override():
280
+ cfg.hydra.overrides.hydra.append(override.input_line)
281
+ else:
282
+ cfg.hydra.overrides.task.append(override.input_line)
283
+ app_overrides.append(override)
284
+
285
+ with open_dict(cfg.hydra):
286
+ cfg.hydra.runtime.choices.update(defaults_list.overrides.known_choices)
287
+ for key in cfg.hydra.job.env_copy:
288
+ cfg.hydra.job.env_set[key] = os.environ[key]
289
+
290
+ cfg.hydra.runtime.version = __version__
291
+ cfg.hydra.runtime.version_base = version.getbase()
292
+ cfg.hydra.runtime.cwd = os.getcwd()
293
+
294
+ cfg.hydra.runtime.config_sources = [
295
+ ConfigSourceInfo(path=x.path, schema=x.scheme(), provider=x.provider)
296
+ for x in caching_repo.get_sources()
297
+ ]
298
+
299
+ if "name" not in cfg.hydra.job:
300
+ cfg.hydra.job.name = JobRuntime().get("name")
301
+
302
+ cfg.hydra.job.override_dirname = get_overrides_dirname(
303
+ overrides=app_overrides,
304
+ kv_sep=cfg.hydra.job.config.override_dirname.kv_sep,
305
+ item_sep=cfg.hydra.job.config.override_dirname.item_sep,
306
+ exclude_keys=cfg.hydra.job.config.override_dirname.exclude_keys,
307
+ )
308
+ cfg.hydra.job.config_name = config_name
309
+
310
+ return cfg
311
+
312
+ def load_sweep_config(
313
+ self, master_config: DictConfig, sweep_overrides: List[str]
314
+ ) -> DictConfig:
315
+ # Recreate the config for this sweep instance with the appropriate overrides
316
+ overrides = OmegaConf.to_container(master_config.hydra.overrides.hydra)
317
+ assert isinstance(overrides, list)
318
+ overrides = overrides + sweep_overrides
319
+ sweep_config = self.load_configuration(
320
+ config_name=master_config.hydra.job.config_name,
321
+ overrides=overrides,
322
+ run_mode=RunMode.RUN,
323
+ )
324
+
325
+ # Copy old config cache to ensure we get the same resolved values (for things
326
+ # like timestamps etc). Since `oc.env` does not cache environment variables
327
+ # (but the deprecated `env` resolver did), the entire config should be copied
328
+ OmegaConf.copy_cache(from_config=master_config, to_config=sweep_config)
329
+
330
+ return sweep_config
331
+
332
+ def get_search_path(self) -> ConfigSearchPath:
333
+ return self.config_search_path
334
+
335
+ @staticmethod
336
+ def _apply_overrides_to_config(overrides: List[Override], cfg: DictConfig) -> None:
337
+ for override in overrides:
338
+ if override.package is not None:
339
+ raise ConfigCompositionException(
340
+ f"Override {override.input_line} looks like a config group"
341
+ f" override, but config group '{override.key_or_group}' does not"
342
+ " exist."
343
+ )
344
+
345
+ key = override.key_or_group
346
+ value = override.value()
347
+ try:
348
+ if override.is_delete():
349
+ config_val = OmegaConf.select(cfg, key, throw_on_missing=False)
350
+ if config_val is None:
351
+ raise ConfigCompositionException(
352
+ f"Could not delete from config. '{override.key_or_group}'"
353
+ " does not exist."
354
+ )
355
+ elif value is not None and value != config_val:
356
+ raise ConfigCompositionException(
357
+ "Could not delete from config. The value of"
358
+ f" '{override.key_or_group}' is {config_val} and not"
359
+ f" {value}."
360
+ )
361
+
362
+ last_dot = key.rfind(".")
363
+ with open_dict(cfg):
364
+ if last_dot == -1:
365
+ del cfg[key]
366
+ else:
367
+ node = OmegaConf.select(cfg, key[0:last_dot])
368
+ del node[key[last_dot + 1 :]]
369
+
370
+ elif override.is_add():
371
+ if OmegaConf.select(
372
+ cfg, key, throw_on_missing=False
373
+ ) is None or isinstance(value, (dict, list)):
374
+ OmegaConf.update(cfg, key, value, merge=True, force_add=True)
375
+ else:
376
+ assert override.input_line is not None
377
+ raise ConfigCompositionException(
378
+ dedent(
379
+ f"""\
380
+ Could not append to config. An item is already at '{override.key_or_group}'.
381
+ Either remove + prefix: '{override.input_line[1:]}'
382
+ Or add a second + to add or override '{override.key_or_group}': '+{override.input_line}'
383
+ """
384
+ )
385
+ )
386
+ elif override.is_force_add():
387
+ OmegaConf.update(cfg, key, value, merge=True, force_add=True)
388
+ else:
389
+ try:
390
+ OmegaConf.update(cfg, key, value, merge=True)
391
+ except (ConfigAttributeError, ConfigKeyError) as ex:
392
+ raise ConfigCompositionException(
393
+ f"Could not override '{override.key_or_group}'."
394
+ f"\nTo append to your config use +{override.input_line}"
395
+ ) from ex
396
+ except OmegaConfBaseException as ex:
397
+ raise ConfigCompositionException(
398
+ f"Error merging override {override.input_line}"
399
+ ).with_traceback(sys.exc_info()[2]) from ex
400
+
401
+ def _load_single_config(
402
+ self, default: ResultDefault, repo: IConfigRepository
403
+ ) -> ConfigResult:
404
+ config_path = default.config_path
405
+
406
+ assert config_path is not None
407
+ ret = repo.load_config(config_path=config_path)
408
+ assert ret is not None
409
+
410
+ if not OmegaConf.is_config(ret.config):
411
+ raise ValueError(
412
+ f"Config {config_path} must be an OmegaConf config, got"
413
+ f" {type(ret.config).__name__}"
414
+ )
415
+
416
+ if not ret.is_schema_source:
417
+ schema = None
418
+ try:
419
+ schema_source = repo.get_schema_source()
420
+ cname = ConfigSource._normalize_file_name(filename=config_path)
421
+ schema = schema_source.load_config(cname)
422
+ except ConfigLoadError:
423
+ # schema not found, ignore
424
+ pass
425
+
426
+ if schema is not None:
427
+ try:
428
+ url = "https://hydra.cc/docs/1.2/upgrades/1.0_to_1.1/automatic_schema_matching"
429
+ if "defaults" in schema.config:
430
+ raise ConfigCompositionException(
431
+ dedent(
432
+ f"""\
433
+ '{config_path}' is validated against ConfigStore schema with the same name.
434
+ This behavior is deprecated in Hydra 1.1 and will be removed in Hydra 1.2.
435
+ In addition, the automatically matched schema contains a defaults list.
436
+ This combination is no longer supported.
437
+ See {url} for migration instructions."""
438
+ )
439
+ )
440
+ else:
441
+ deprecation_warning(
442
+ dedent(
443
+ f"""\
444
+
445
+ '{config_path}' is validated against ConfigStore schema with the same name.
446
+ This behavior is deprecated in Hydra 1.1 and will be removed in Hydra 1.2.
447
+ See {url} for migration instructions."""
448
+ ),
449
+ stacklevel=11,
450
+ )
451
+
452
+ # if primary config has a hydra node, remove it during validation and add it back.
453
+ # This allows overriding Hydra's configuration without declaring it's node
454
+ # in the schema of every primary config
455
+ hydra = None
456
+ hydra_config_group = (
457
+ default.config_path is not None
458
+ and default.config_path.startswith("hydra/")
459
+ )
460
+ config = ret.config
461
+ if (
462
+ default.primary
463
+ and isinstance(config, DictConfig)
464
+ and "hydra" in config
465
+ and not hydra_config_group
466
+ ):
467
+ hydra = config.pop("hydra")
468
+
469
+ merged = OmegaConf.merge(schema.config, config)
470
+ assert isinstance(merged, DictConfig)
471
+
472
+ if hydra is not None:
473
+ with open_dict(merged):
474
+ merged.hydra = hydra
475
+ ret.config = merged
476
+ except OmegaConfBaseException as e:
477
+ raise ConfigCompositionException(
478
+ f"Error merging '{config_path}' with schema"
479
+ ) from e
480
+
481
+ assert isinstance(merged, DictConfig)
482
+
483
+ res = self._embed_result_config(ret, default.package)
484
+ if (
485
+ not default.primary
486
+ and config_path != "hydra/config"
487
+ and isinstance(res.config, DictConfig)
488
+ and OmegaConf.select(res.config, "hydra.searchpath") is not None
489
+ ):
490
+ raise ConfigCompositionException(
491
+ f"In '{config_path}': Overriding hydra.searchpath is only supported"
492
+ " from the primary config"
493
+ )
494
+
495
+ return res
496
+
497
+ @staticmethod
498
+ def _embed_result_config(
499
+ ret: ConfigResult, package_override: Optional[str]
500
+ ) -> ConfigResult:
501
+ package = ret.header["package"]
502
+ if package_override is not None:
503
+ package = package_override
504
+
505
+ if package is not None and package != "":
506
+ cfg = OmegaConf.create()
507
+ OmegaConf.update(cfg, package, ret.config, merge=False)
508
+ ret = copy.copy(ret)
509
+ ret.config = cfg
510
+
511
+ return ret
512
+
513
+ def list_groups(self, parent_name: str) -> List[str]:
514
+ return self.get_group_options(
515
+ group_name=parent_name, results_filter=ObjectType.GROUP
516
+ )
517
+
518
+ def get_group_options(
519
+ self,
520
+ group_name: str,
521
+ results_filter: Optional[ObjectType] = ObjectType.CONFIG,
522
+ config_name: Optional[str] = None,
523
+ overrides: Optional[List[str]] = None,
524
+ ) -> List[str]:
525
+ if overrides is None:
526
+ overrides = []
527
+ _, caching_repo = self._parse_overrides_and_create_caching_repo(
528
+ config_name, overrides
529
+ )
530
+ return caching_repo.get_group_options(group_name, results_filter)
531
+
532
+ def _compose_config_from_defaults_list(
533
+ self,
534
+ defaults: List[ResultDefault],
535
+ repo: IConfigRepository,
536
+ ) -> DictConfig:
537
+ cfg = OmegaConf.create()
538
+ with flag_override(cfg, "no_deepcopy_set_nodes", True):
539
+ for default in defaults:
540
+ loaded = self._load_single_config(default=default, repo=repo)
541
+ try:
542
+ cfg.merge_with(loaded.config)
543
+ except OmegaConfBaseException as e:
544
+ raise ConfigCompositionException(
545
+ f"In '{default.config_path}': {type(e).__name__} raised while"
546
+ f" composing config:\n{e}"
547
+ ).with_traceback(sys.exc_info()[2])
548
+
549
+ # # remove remaining defaults lists from all nodes.
550
+ def strip_defaults(cfg: Any) -> None:
551
+ if isinstance(cfg, DictConfig):
552
+ if cfg._is_missing() or cfg._is_none():
553
+ return
554
+ with flag_override(cfg, ["readonly", "struct"], False):
555
+ if cfg._get_flag("HYDRA_REMOVE_TOP_LEVEL_DEFAULTS"):
556
+ cfg._set_flag("HYDRA_REMOVE_TOP_LEVEL_DEFAULTS", None)
557
+ cfg.pop("defaults", None)
558
+
559
+ for _key, value in cfg.items_ex(resolve=False):
560
+ strip_defaults(value)
561
+
562
+ strip_defaults(cfg)
563
+
564
+ return cfg
565
+
566
+ def get_sources(self) -> List[ConfigSource]:
567
+ return self.repository.get_sources()
568
+
569
+ def compute_defaults_list(
570
+ self,
571
+ config_name: Optional[str],
572
+ overrides: List[str],
573
+ run_mode: RunMode,
574
+ ) -> DefaultsList:
575
+ parsed_overrides, caching_repo = self._parse_overrides_and_create_caching_repo(
576
+ config_name, overrides
577
+ )
578
+ defaults_list = create_defaults_list(
579
+ repo=caching_repo,
580
+ config_name=config_name,
581
+ overrides_list=parsed_overrides,
582
+ prepend_hydra=True,
583
+ skip_missing=run_mode == RunMode.MULTIRUN,
584
+ )
585
+ return defaults_list
586
+
587
+
588
+ def get_overrides_dirname(
589
+ overrides: List[Override], exclude_keys: List[str], item_sep: str, kv_sep: str
590
+ ) -> str:
591
+ lines = []
592
+ for override in overrides:
593
+ if override.key_or_group not in exclude_keys:
594
+ line = override.input_line
595
+ assert line is not None
596
+ lines.append(line)
597
+
598
+ lines.sort()
599
+ ret = re.sub(pattern="[=]", repl=kv_sep, string=item_sep.join(lines))
600
+ return ret
lib/python3.12/site-packages/hydra/_internal/config_repository.py ADDED
@@ -0,0 +1,366 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
2
+ import copy
3
+ from abc import ABC, abstractmethod
4
+ from dataclasses import dataclass
5
+ from textwrap import dedent
6
+ from typing import Dict, List, Optional, Tuple
7
+
8
+ from omegaconf import (
9
+ Container,
10
+ DictConfig,
11
+ ListConfig,
12
+ Node,
13
+ OmegaConf,
14
+ open_dict,
15
+ read_write,
16
+ )
17
+
18
+ from hydra import version
19
+ from hydra.core.config_search_path import ConfigSearchPath
20
+ from hydra.core.object_type import ObjectType
21
+ from hydra.plugins.config_source import ConfigResult, ConfigSource
22
+
23
+ from ..core.default_element import ConfigDefault, GroupDefault, InputDefault
24
+ from .deprecation_warning import deprecation_warning
25
+ from .sources_registry import SourcesRegistry
26
+
27
+
28
+ class IConfigRepository(ABC):
29
+ @abstractmethod
30
+ def get_schema_source(self) -> ConfigSource:
31
+ ...
32
+
33
+ @abstractmethod
34
+ def load_config(self, config_path: str) -> Optional[ConfigResult]:
35
+ ...
36
+
37
+ @abstractmethod
38
+ def group_exists(self, config_path: str) -> bool:
39
+ ...
40
+
41
+ @abstractmethod
42
+ def config_exists(self, config_path: str) -> bool:
43
+ ...
44
+
45
+ @abstractmethod
46
+ def get_group_options(
47
+ self, group_name: str, results_filter: Optional[ObjectType] = ObjectType.CONFIG
48
+ ) -> List[str]:
49
+ ...
50
+
51
+ @abstractmethod
52
+ def get_sources(self) -> List[ConfigSource]:
53
+ ...
54
+
55
+ @abstractmethod
56
+ def initialize_sources(self, config_search_path: ConfigSearchPath) -> None:
57
+ ...
58
+
59
+
60
+ class ConfigRepository(IConfigRepository):
61
+ config_search_path: ConfigSearchPath
62
+ sources: List[ConfigSource]
63
+
64
+ def __init__(self, config_search_path: ConfigSearchPath) -> None:
65
+ self.initialize_sources(config_search_path)
66
+
67
+ def initialize_sources(self, config_search_path: ConfigSearchPath) -> None:
68
+ self.sources = []
69
+ for search_path in config_search_path.get_path():
70
+ assert search_path.path is not None
71
+ assert search_path.provider is not None
72
+ scheme = self._get_scheme(search_path.path)
73
+ source_type = SourcesRegistry.instance().resolve(scheme)
74
+ source = source_type(search_path.provider, search_path.path)
75
+ self.sources.append(source)
76
+
77
+ def get_schema_source(self) -> ConfigSource:
78
+ source = self.sources[-1] # should always be last
79
+ assert (
80
+ source.__class__.__name__ == "StructuredConfigSource"
81
+ and source.provider == "schema"
82
+ ), "schema config source must be last"
83
+ return source
84
+
85
+ def load_config(self, config_path: str) -> Optional[ConfigResult]:
86
+ source = self._find_object_source(
87
+ config_path=config_path, object_type=ObjectType.CONFIG
88
+ )
89
+ ret = None
90
+ if source is not None:
91
+ ret = source.load_config(config_path=config_path)
92
+ # if this source is THE schema source, flag the result as coming from it.
93
+ ret.is_schema_source = (
94
+ source.__class__.__name__ == "StructuredConfigSource"
95
+ and source.provider == "schema"
96
+ )
97
+
98
+ if ret is not None:
99
+ raw_defaults = self._extract_defaults_list(config_path, ret.config)
100
+ ret.defaults_list = self._create_defaults_list(config_path, raw_defaults)
101
+
102
+ return ret
103
+
104
+ def group_exists(self, config_path: str) -> bool:
105
+ return self._find_object_source(config_path, ObjectType.GROUP) is not None
106
+
107
+ def config_exists(self, config_path: str) -> bool:
108
+ return self._find_object_source(config_path, ObjectType.CONFIG) is not None
109
+
110
+ def get_group_options(
111
+ self, group_name: str, results_filter: Optional[ObjectType] = ObjectType.CONFIG
112
+ ) -> List[str]:
113
+ options: List[str] = []
114
+ for source in self.sources:
115
+ if source.is_group(config_path=group_name):
116
+ options.extend(
117
+ source.list(config_path=group_name, results_filter=results_filter)
118
+ )
119
+ return sorted(list(set(options)))
120
+
121
+ def get_sources(self) -> List[ConfigSource]:
122
+ return self.sources
123
+
124
+ def _find_object_source(
125
+ self, config_path: str, object_type: Optional[ObjectType]
126
+ ) -> Optional[ConfigSource]:
127
+ found_source = None
128
+ for source in self.sources:
129
+ if object_type == ObjectType.CONFIG:
130
+ if source.is_config(config_path):
131
+ found_source = source
132
+ break
133
+ elif object_type == ObjectType.GROUP:
134
+ if source.is_group(config_path):
135
+ found_source = source
136
+ break
137
+ else:
138
+ raise ValueError("Unexpected object_type")
139
+ return found_source
140
+
141
+ @staticmethod
142
+ def _get_scheme(path: str) -> str:
143
+ idx = path.find("://")
144
+ if idx == -1:
145
+ return "file"
146
+ else:
147
+ return path[0:idx]
148
+
149
+ def _split_group(
150
+ self,
151
+ group_with_package: str,
152
+ ) -> Tuple[str, Optional[str], Optional[str]]:
153
+ idx = group_with_package.find("@")
154
+ if idx == -1:
155
+ # group
156
+ group = group_with_package
157
+ package = None
158
+ else:
159
+ # group@package
160
+ group = group_with_package[0:idx]
161
+ package = group_with_package[idx + 1 :]
162
+
163
+ package2 = None
164
+ if package is not None:
165
+ # if we have a package, break it down if it's a rename
166
+ idx = package.find(":")
167
+ if idx != -1:
168
+ package2 = package[idx + 1 :]
169
+ package = package[0:idx]
170
+
171
+ return group, package, package2
172
+
173
+ def _create_defaults_list(
174
+ self,
175
+ config_path: str,
176
+ defaults: ListConfig,
177
+ ) -> List[InputDefault]:
178
+ def issue_deprecated_name_warning() -> None:
179
+ # DEPRECATED: remove in 1.2
180
+ url = "https://hydra.cc/docs/1.2/upgrades/1.0_to_1.1/changes_to_package_header"
181
+ deprecation_warning(
182
+ message=dedent(
183
+ f"""\
184
+ In {config_path}: Defaults List contains deprecated keyword _name_, see {url}
185
+ """
186
+ ),
187
+ )
188
+
189
+ res: List[InputDefault] = []
190
+ for item in defaults._iter_ex(resolve=False):
191
+ default: InputDefault
192
+ if isinstance(item, DictConfig):
193
+ if not version.base_at_least("1.2"):
194
+ old_optional = None
195
+ if len(item) > 1:
196
+ if "optional" in item:
197
+ old_optional = item.pop("optional")
198
+ keys = list(item.keys())
199
+
200
+ if len(keys) > 1:
201
+ raise ValueError(
202
+ f"In {config_path}: Too many keys in default item {item}"
203
+ )
204
+ if len(keys) == 0:
205
+ raise ValueError(f"In {config_path}: Missing group name in {item}")
206
+
207
+ key = keys[0]
208
+ assert isinstance(key, str)
209
+ config_group, package, _package2 = self._split_group(key)
210
+ keywords = ConfigRepository.Keywords()
211
+ self._extract_keywords_from_config_group(config_group, keywords)
212
+
213
+ if not version.base_at_least("1.2"):
214
+ if not keywords.optional and old_optional is not None:
215
+ keywords.optional = old_optional
216
+
217
+ node = item._get_node(key)
218
+ assert node is not None and isinstance(node, Node)
219
+ config_value = node._value()
220
+
221
+ if not version.base_at_least("1.2"):
222
+ if old_optional is not None:
223
+ msg = dedent(
224
+ f"""
225
+ In {config_path}: 'optional: true' is deprecated.
226
+ Use 'optional {key}: {config_value}' instead.
227
+ Support for the old style is removed for Hydra version_base >= 1.2"""
228
+ )
229
+
230
+ deprecation_warning(msg)
231
+
232
+ if config_value is not None and not isinstance(
233
+ config_value, (str, list)
234
+ ):
235
+ raise ValueError(
236
+ f"Unsupported item value in defaults : {type(config_value).__name__}."
237
+ " Supported: string or list"
238
+ )
239
+
240
+ if isinstance(config_value, list):
241
+ options = []
242
+ for v in config_value:
243
+ vv = v._value()
244
+ if not isinstance(vv, str):
245
+ raise ValueError(
246
+ f"Unsupported item value in defaults : {type(vv).__name__},"
247
+ " nested list items must be strings"
248
+ )
249
+ options.append(vv)
250
+ config_value = options
251
+
252
+ if not version.base_at_least("1.2"):
253
+ if package is not None and "_name_" in package:
254
+ issue_deprecated_name_warning()
255
+
256
+ default = GroupDefault(
257
+ group=keywords.group,
258
+ value=config_value,
259
+ package=package,
260
+ optional=keywords.optional,
261
+ override=keywords.override,
262
+ )
263
+
264
+ elif isinstance(item, str):
265
+ path, package, _package2 = self._split_group(item)
266
+ if not version.base_at_least("1.2"):
267
+ if package is not None and "_name_" in package:
268
+ issue_deprecated_name_warning()
269
+
270
+ default = ConfigDefault(path=path, package=package)
271
+ else:
272
+ raise ValueError(
273
+ f"Unsupported type in defaults : {type(item).__name__}"
274
+ )
275
+ res.append(default)
276
+ return res
277
+
278
+ def _extract_defaults_list(self, config_path: str, cfg: Container) -> ListConfig:
279
+ empty = OmegaConf.create([])
280
+ if not OmegaConf.is_dict(cfg):
281
+ return empty
282
+ assert isinstance(cfg, DictConfig)
283
+ with read_write(cfg):
284
+ with open_dict(cfg):
285
+ if not cfg._is_typed():
286
+ defaults = cfg.pop("defaults", empty)
287
+ else:
288
+ # If node is a backed by Structured Config, flag it and temporarily keep the defaults list in.
289
+ # It will be removed later.
290
+ # This is addressing an edge case where the defaults list re-appears once the dataclass is used
291
+ # as a prototype during OmegaConf merge.
292
+ cfg._set_flag("HYDRA_REMOVE_TOP_LEVEL_DEFAULTS", True)
293
+ defaults = cfg.get("defaults", empty)
294
+ if not isinstance(defaults, ListConfig):
295
+ if isinstance(defaults, DictConfig):
296
+ type_str = "mapping"
297
+ else:
298
+ type_str = type(defaults).__name__
299
+ raise ValueError(
300
+ f"Invalid defaults list in '{config_path}', defaults must be a list (got {type_str})"
301
+ )
302
+
303
+ return defaults
304
+
305
+ @dataclass
306
+ class Keywords:
307
+ optional: bool = False
308
+ override: bool = False
309
+ group: str = ""
310
+
311
+ @staticmethod
312
+ def _extract_keywords_from_config_group(
313
+ group: str, keywords: "ConfigRepository.Keywords"
314
+ ) -> None:
315
+ elements = group.split(" ")
316
+ group = elements[-1]
317
+ elements = elements[0:-1]
318
+ for idx, e in enumerate(elements):
319
+ if e == "optional":
320
+ keywords.optional = True
321
+ elif e == "override":
322
+ keywords.override = True
323
+ else:
324
+ break
325
+ keywords.group = group
326
+
327
+
328
+ class CachingConfigRepository(IConfigRepository):
329
+ def __init__(self, delegate: IConfigRepository):
330
+ # copy the underlying repository to avoid mutating it with initialize_sources()
331
+ self.delegate = copy.deepcopy(delegate)
332
+ self.cache: Dict[str, Optional[ConfigResult]] = {}
333
+
334
+ def get_schema_source(self) -> ConfigSource:
335
+ return self.delegate.get_schema_source()
336
+
337
+ def initialize_sources(self, config_search_path: ConfigSearchPath) -> None:
338
+ self.delegate.initialize_sources(config_search_path)
339
+ # not clearing the cache.
340
+ # For the use case this is used, the only thing in the cache is the primary config
341
+ # and we want to keep it even though we re-initialized the sources.
342
+
343
+ def load_config(self, config_path: str) -> Optional[ConfigResult]:
344
+ cache_key = f"config_path={config_path}"
345
+ if cache_key in self.cache:
346
+ return self.cache[cache_key]
347
+ else:
348
+ ret = self.delegate.load_config(config_path=config_path)
349
+ self.cache[cache_key] = ret
350
+ return ret
351
+
352
+ def group_exists(self, config_path: str) -> bool:
353
+ return self.delegate.group_exists(config_path=config_path)
354
+
355
+ def config_exists(self, config_path: str) -> bool:
356
+ return self.delegate.config_exists(config_path=config_path)
357
+
358
+ def get_group_options(
359
+ self, group_name: str, results_filter: Optional[ObjectType] = ObjectType.CONFIG
360
+ ) -> List[str]:
361
+ return self.delegate.get_group_options(
362
+ group_name=group_name, results_filter=results_filter
363
+ )
364
+
365
+ def get_sources(self) -> List[ConfigSource]:
366
+ return self.delegate.get_sources()
lib/python3.12/site-packages/hydra/_internal/config_search_path_impl.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
2
+ from typing import List, MutableSequence, Optional, Union
3
+
4
+ from hydra.core.config_search_path import (
5
+ ConfigSearchPath,
6
+ SearchPathElement,
7
+ SearchPathQuery,
8
+ )
9
+
10
+
11
+ class ConfigSearchPathImpl(ConfigSearchPath):
12
+ config_search_path: List[SearchPathElement]
13
+
14
+ def __init__(self) -> None:
15
+ self.config_search_path = []
16
+
17
+ def get_path(self) -> MutableSequence[SearchPathElement]:
18
+ return self.config_search_path
19
+
20
+ def find_last_match(self, reference: SearchPathQuery) -> int:
21
+ return self.find_match(reference, reverse=True)
22
+
23
+ def find_first_match(self, reference: SearchPathQuery) -> int:
24
+ return self.find_match(reference, reverse=False)
25
+
26
+ def find_match(self, reference: SearchPathQuery, reverse: bool) -> int:
27
+ p = self.config_search_path
28
+ if reverse:
29
+ iterator = zip(reversed(range(len(p))), reversed(p))
30
+ else:
31
+ iterator = zip(range(len(p)), p)
32
+ for idx, sp in iterator:
33
+ has_prov = reference.provider is not None
34
+ has_path = reference.path is not None
35
+ if has_prov and has_path:
36
+ if reference.provider == sp.provider and reference.path == sp.path:
37
+ return idx
38
+ elif has_prov:
39
+ if reference.provider == sp.provider:
40
+ return idx
41
+ elif has_path:
42
+ if reference.path == sp.path:
43
+ return idx
44
+ else:
45
+ assert False
46
+ return -1
47
+
48
+ def append(
49
+ self, provider: str, path: str, anchor: Optional[SearchPathQuery] = None
50
+ ) -> None:
51
+ if anchor is None:
52
+ self.config_search_path.append(SearchPathElement(provider, path))
53
+ else:
54
+ if isinstance(anchor, str):
55
+ anchor = SearchPathQuery(anchor, None)
56
+
57
+ idx = self.find_last_match(anchor)
58
+ if idx != -1:
59
+ self.config_search_path.insert(
60
+ idx + 1, SearchPathElement(provider, path)
61
+ )
62
+ else:
63
+ self.append(provider, path, anchor=None)
64
+
65
+ def prepend(
66
+ self,
67
+ provider: str,
68
+ path: str,
69
+ anchor: Optional[Union[SearchPathQuery, str]] = None,
70
+ ) -> None:
71
+ """
72
+ Prepends to the search path.
73
+ Note, this currently only takes effect if called before the ConfigRepository is instantiated.
74
+
75
+ :param provider: who is providing this search path, can be Hydra,
76
+ the @hydra.main() function, or individual plugins or libraries.
77
+ :param path: path element, can be a file system path or a package path (For example pkg://hydra.conf)
78
+ :param anchor: if string, acts as provider. if SearchPath can be used to match against provider and / or path
79
+ """
80
+ if anchor is None:
81
+ self.config_search_path.insert(0, SearchPathElement(provider, path))
82
+ else:
83
+ if isinstance(anchor, str):
84
+ anchor = SearchPathQuery(anchor, None)
85
+
86
+ idx = self.find_first_match(anchor)
87
+ if idx != -1:
88
+ if idx > 0:
89
+ self.config_search_path.insert(
90
+ idx, SearchPathElement(provider, path)
91
+ )
92
+ else:
93
+ self.prepend(provider, path, None)
94
+ else:
95
+ self.prepend(provider, path, None)
96
+
97
+ def __str__(self) -> str:
98
+ return str(self.config_search_path)
lib/python3.12/site-packages/hydra/_internal/core_plugins/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (207 Bytes). View file
 
lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/bash_completion.cpython-312.pyc ADDED
Binary file (4.09 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/basic_launcher.cpython-312.pyc ADDED
Binary file (4.52 kB). View file
 
lib/python3.12/site-packages/hydra/_internal/core_plugins/__pycache__/basic_sweeper.cpython-312.pyc ADDED
Binary file (9.13 kB). View file