curious-pyapi 0.1.4__tar.gz → 0.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.github/workflows/publish_to_pypi.yaml +2 -2
  2. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.pre-commit-config.yaml +1 -1
  3. curious_pyapi-0.1.6/.python-version +1 -0
  4. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/CHANGELOG.md +6 -0
  5. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/PKG-INFO +6 -4
  6. curious_pyapi-0.1.6/S0-CuriousAccountCreation.ipynb +287 -0
  7. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/pyproject.toml +10 -8
  8. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/uv.lock +38 -3
  9. curious_pyapi-0.1.4/.python-version +0 -1
  10. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.github/dependabot.yaml +0 -0
  11. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.gitignore +0 -0
  12. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.markdownlint.yaml +0 -0
  13. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/.vscode/settings.json +0 -0
  14. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/LICENSE +0 -0
  15. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/README.md +0 -0
  16. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/__init__.py +0 -0
  17. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/api/__init__.py +0 -0
  18. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/api/curious.py +0 -0
  19. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/exceptions/__init__.py +0 -0
  20. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/exceptions/exceptions.py +0 -0
  21. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/py.typed +0 -0
  22. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/schema/__init__.py +0 -0
  23. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/schema/curious.py +0 -0
  24. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/schema/pyapi.py +0 -0
  25. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/schema/regex.py +0 -0
  26. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/utils/__init__.py +0 -0
  27. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/utils/data.py +0 -0
  28. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/utils/defaults.py +0 -0
  29. {curious_pyapi-0.1.4 → curious_pyapi-0.1.6}/src/curious_pyapi/utils/logging.py +0 -0
@@ -25,10 +25,10 @@ jobs:
25
25
  with:
26
26
  enable-cache: true
27
27
 
28
- - name: Set up Python 3.14
28
+ - name: Set up Python 3.12
29
29
  uses: actions/setup-python@v7
30
30
  with:
31
- python-version: "3.14"
31
+ python-version: "3.12"
32
32
 
33
33
  - name: Build package
34
34
  run: uv build
@@ -47,4 +47,4 @@ repos:
47
47
  - pydantic>=2.0.0
48
48
  - types-pytz
49
49
  - types-requests
50
- language_version: python3.14
50
+ language_version: python3.12
@@ -0,0 +1 @@
1
+ 3.12
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.6]
9
+
10
+ ### Added
11
+
12
+ - Support for Python 3.12, 3.13
13
+
8
14
  ## [0.1.4]
9
15
 
10
16
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: curious-pyapi
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: Python interface for Curious API.
5
5
  Project-URL: Repository, https://github.com/childmindresearch/curious-pyapi
6
6
  Project-URL: Issues, https://github.com/childmindresearch/curious-pyapi/issues
@@ -14,14 +14,16 @@ Classifier: Intended Audience :: Science/Research
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
17
19
  Classifier: Programming Language :: Python :: 3.14
18
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
21
  Classifier: Typing :: Typed
20
- Requires-Python: >=3.14
22
+ Requires-Python: >=3.12
21
23
  Requires-Dist: fastexcel>=0.21.0
22
24
  Requires-Dist: httpx>=0.28.1
23
- Requires-Dist: polars>=1.44.0
24
- Requires-Dist: pydantic[email]>=2.13.4
25
+ Requires-Dist: polars>=1.44.1
26
+ Requires-Dist: pydantic[email]>=2.13.5
25
27
  Description-Content-Type: text/markdown
26
28
 
27
29
  # Curious-PyAPI
@@ -0,0 +1,287 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "f06b51dd-6552-4b22-91b9-e6d68880186c",
6
+ "metadata": {
7
+ "microsoft": {
8
+ "language": "python",
9
+ "language_group": "synapse_pyspark"
10
+ },
11
+ "nteract": {
12
+ "transient": {
13
+ "deleting": false
14
+ }
15
+ }
16
+ },
17
+ "source": [
18
+ "# Curious Account Creation\n",
19
+ "\n",
20
+ "1. Load file of IDs and passwords.\n",
21
+ "2. Invite each ID to applet.\n",
22
+ "3. Create an account for each ID using password from file.\n",
23
+ "4. As each account, log in and accept invitation."
24
+ ]
25
+ },
26
+ {
27
+ "cell_type": "code",
28
+ "execution_count": null,
29
+ "id": "a7500f61-2e8c-4f08-ba11-6a2749fc4000",
30
+ "metadata": {
31
+ "microsoft": {
32
+ "language": "python",
33
+ "language_group": "jupyter_python"
34
+ }
35
+ },
36
+ "outputs": [],
37
+ "source": [
38
+ "from pathlib import Path\n",
39
+ "\n",
40
+ "from azure.identity import DefaultAzureCredential\n",
41
+ "from azure.keyvault.secrets import SecretClient\n",
42
+ "import httpx\n",
43
+ "import notebookutils\n",
44
+ "import polars as pl\n",
45
+ "\n",
46
+ "from curious_pyapi.api.curious import CuriousApiClient\n",
47
+ "from curious_pyapi.exceptions.exceptions import allow_existing\n",
48
+ "from curious_pyapi.schema.curious import CuriousId\n",
49
+ "from curious_pyapi.schema.pyapi import CuriousAuth\n",
50
+ "from curious_pyapi.utils.logging import get_logger\n",
51
+ "\n",
52
+ "conf = notebookutils.variableLibrary.getLibrary(\"ConfigurationVariables\")\n",
53
+ "\n",
54
+ "LOGGER = get_logger(__name__)\n",
55
+ "\n",
56
+ "APPLET_ID = conf.getVariable(\"AppletIdProlificMentalStateModelingStudy\")\n",
57
+ "EMAIL_FORMAT = \"msm+Z{}@childmind.org\"\n",
58
+ "TEMPORARY_NAME_FORMAT = \"_{}\"\n",
59
+ "\n",
60
+ "\n",
61
+ "def map_prolific_to_curious(df: pl.DataFrame, pl_namespace: str) -> pl.DataFrame:\n",
62
+ " \"\"\"Transform a username-password DataFrame into a CuriousAccount DataFrame.\"\"\"\n",
63
+ " record_id_str = pl.col(\"record_id\").cast(pl.String).str.zfill(6)\n",
64
+ " match pl_namespace:\n",
65
+ " case \"new_curious_user\":\n",
66
+ " _name_expr = pl.format(TEMPORARY_NAME_FORMAT, record_id_str)\n",
67
+ " case _:\n",
68
+ " _name_expr = pl.lit(\"\")\n",
69
+ "\n",
70
+ " return getattr(\n",
71
+ " df.with_columns(\n",
72
+ " email=pl.format(EMAIL_FORMAT, record_id_str),\n",
73
+ " password=pl.col(\"password\").cast(pl.String),\n",
74
+ " firstName=_name_expr,\n",
75
+ " lastName=_name_expr,\n",
76
+ " language=pl.lit(\"en\"),\n",
77
+ " secretUserId=pl.col(\"record_id\").cast(pl.String),\n",
78
+ " nickname=pl.col(\"record_id\").cast(pl.String),\n",
79
+ " tag=pl.lit(\"Prolific\"),\n",
80
+ " ),\n",
81
+ " pl_namespace,\n",
82
+ " ).enforce_schema()\n",
83
+ "\n",
84
+ "\n",
85
+ "def create_accounts_from_df(\n",
86
+ " client: CuriousApiClient,\n",
87
+ " df: pl.DataFrame,\n",
88
+ " applet_id: CuriousId,\n",
89
+ " user_type: str = \"respondent\",\n",
90
+ " *,\n",
91
+ " limit=None,\n",
92
+ ") -> None:\n",
93
+ " \"\"\"For each row in DataFrame, create an account in Curious.\"\"\"\n",
94
+ " invitations: dict[str, CuriousId] = {}\n",
95
+ " api_df = map_prolific_to_curious(df, \"curious_account\")\n",
96
+ " if limit:\n",
97
+ " api_df = api_df.head(limit)\n",
98
+ " for record in api_df.to_dicts():\n",
99
+ " invitation = allow_existing(\n",
100
+ " client.invite_user(applet_id=applet_id, user_type=user_type).post,\n",
101
+ " json=record,\n",
102
+ " )\n",
103
+ " if invitation:\n",
104
+ " invitation = invitation.json().get(\"result\")\n",
105
+ " if not invitation:\n",
106
+ " all_invitations = (\n",
107
+ " client.invitations()\n",
108
+ " .get(params={\"appletId\": applet_id, \"userType\": \"respondent\"})\n",
109
+ " .json()\n",
110
+ " .get(\"result\", [])\n",
111
+ " )\n",
112
+ " this_user_invitations = [\n",
113
+ " i\n",
114
+ " for i in all_invitations\n",
115
+ " if all(\n",
116
+ " [\n",
117
+ " i.get(\"appletId\") == applet_id,\n",
118
+ " i.get(\"secretUserId\") == record[\"secretUserId\"],\n",
119
+ " ]\n",
120
+ " )\n",
121
+ " ]\n",
122
+ " if this_user_invitations:\n",
123
+ " invitation = this_user_invitations[0]\n",
124
+ " if invitation and \"key\" in invitation:\n",
125
+ " invitations[record[\"secretUserId\"]] = invitation[\"key\"]\n",
126
+ " new_user_df = map_prolific_to_curious(df, \"new_curious_user\")\n",
127
+ " for user in new_user_df.head(limit).to_dicts():\n",
128
+ " response = allow_existing(client.user_create.post, json=user)\n",
129
+ " secret_id = user[\"firstName\"][1:]\n",
130
+ " if secret_id in invitations:\n",
131
+ " user_client = CuriousApiClient(\n",
132
+ " auth=CuriousAuth(\n",
133
+ " curious_email=user[\"email\"], curious_password=user[\"password\"]\n",
134
+ " )\n",
135
+ " )\n",
136
+ " response = user_client.invitation_accept(key=invitations[secret_id]).post()\n",
137
+ " if not httpx.codes.is_success(response.status_code):\n",
138
+ " response.raise_for_status()\n",
139
+ " del user_client"
140
+ ]
141
+ },
142
+ {
143
+ "cell_type": "code",
144
+ "execution_count": null,
145
+ "id": "23eee694-1869-4893-9afe-6ef54c259090",
146
+ "metadata": {
147
+ "microsoft": {
148
+ "language": "python",
149
+ "language_group": "jupyter_python"
150
+ }
151
+ },
152
+ "outputs": [],
153
+ "source": [
154
+ "secret_client = SecretClient(\n",
155
+ " vault_url=conf.getVariable(\"KeyVaultUri\"),\n",
156
+ " credential=DefaultAzureCredential(),\n",
157
+ ")\n",
158
+ "admin_credentials = CuriousAuth(\n",
159
+ " curious_email=secret_client.get_secret(\"CuriousEmail\").value,\n",
160
+ " curious_password=secret_client.get_secret(\"CuriousPassword\").value,\n",
161
+ " applet_id=APPLET_ID,\n",
162
+ " applet_password=secret_client.get_secret(\"MsmProlificAppletPassword\").value,\n",
163
+ ")"
164
+ ]
165
+ },
166
+ {
167
+ "cell_type": "markdown",
168
+ "id": "426252e6-31f2-4091-b6a7-7fe5d7fa3c37",
169
+ "metadata": {
170
+ "microsoft": {
171
+ "language": "python",
172
+ "language_group": "synapse_pyspark"
173
+ },
174
+ "nteract": {
175
+ "transient": {
176
+ "deleting": false
177
+ }
178
+ }
179
+ },
180
+ "source": [
181
+ "## 1. Load file of IDs and passwords"
182
+ ]
183
+ },
184
+ {
185
+ "cell_type": "code",
186
+ "execution_count": null,
187
+ "id": "1a55d086-9f84-491d-aeb5-d997df3557a9",
188
+ "metadata": {
189
+ "microsoft": {
190
+ "language": "python",
191
+ "language_group": "jupyter_python"
192
+ }
193
+ },
194
+ "outputs": [],
195
+ "source": [
196
+ "df = pl.read_excel(Path(\"Files/study_passwords.xlsx\"))\n",
197
+ "\"\"\"Raw DataFrame of IDs and passwords.\"\"\""
198
+ ]
199
+ },
200
+ {
201
+ "cell_type": "markdown",
202
+ "id": "0f3b308c-dabc-42fa-9d6e-b11494dcc59a",
203
+ "metadata": {
204
+ "microsoft": {
205
+ "language": "python",
206
+ "language_group": "jupyter_python"
207
+ },
208
+ "nteract": {
209
+ "transient": {
210
+ "deleting": false
211
+ }
212
+ }
213
+ },
214
+ "source": [
215
+ "## 2‒4\n",
216
+ "### 2. Invite each ID to applet\n",
217
+ "### 3. Create an account for each ID using password from file.\n",
218
+ "### 4. As each account, log in and accept invitation."
219
+ ]
220
+ },
221
+ {
222
+ "cell_type": "code",
223
+ "execution_count": null,
224
+ "id": "73f61305-9847-493f-af33-04787d3afecb",
225
+ "metadata": {
226
+ "microsoft": {
227
+ "language": "python",
228
+ "language_group": "jupyter_python"
229
+ }
230
+ },
231
+ "outputs": [],
232
+ "source": [
233
+ "admin_client = CuriousApiClient(auth=admin_credentials)\n",
234
+ "create_accounts_from_df(admin_client, df, applet_id=APPLET_ID)"
235
+ ]
236
+ }
237
+ ],
238
+ "metadata": {
239
+ "dependencies": {
240
+ "environment": {
241
+ "environmentId": "e11945f7-786a-451b-aeee-5ddebde287a4",
242
+ "workspaceId": "ea346909-a97e-43b1-b6ad-0670fd81ece4"
243
+ },
244
+ "lakehouse": {
245
+ "default_lakehouse": "cbe8c20b-e1f4-4b58-a6fa-f40541aade33",
246
+ "default_lakehouse_name": "MsmDevBronze",
247
+ "default_lakehouse_workspace_id": "879f45c2-2a52-471e-ab5b-abf825258afb",
248
+ "known_lakehouses": [
249
+ {
250
+ "id": "cbe8c20b-e1f4-4b58-a6fa-f40541aade33"
251
+ }
252
+ ]
253
+ }
254
+ },
255
+ "kernel_info": {
256
+ "jupyter_kernel_name": "python3.12",
257
+ "name": "jupyter"
258
+ },
259
+ "kernelspec": {
260
+ "display_name": "Jupyter",
261
+ "name": "jupyter"
262
+ },
263
+ "language_info": {
264
+ "name": "python"
265
+ },
266
+ "microsoft": {
267
+ "language": "python",
268
+ "language_group": "jupyter_python",
269
+ "ms_spell_check": {
270
+ "ms_spell_check_language": "en"
271
+ }
272
+ },
273
+ "nteract": {
274
+ "version": "nteract-front-end@1.0.0"
275
+ },
276
+ "spark_compute": {
277
+ "compute_id": "/trident/default",
278
+ "session_options": {
279
+ "conf": {
280
+ "spark.synapse.nbs.session.timeout": "1200000"
281
+ }
282
+ }
283
+ }
284
+ },
285
+ "nbformat": 4,
286
+ "nbformat_minor": 5
287
+ }
@@ -10,13 +10,7 @@ readme = "README.md"
10
10
  authors = [
11
11
  { name = "Jon Cluce", email = "jon.clucas@childmind.org" }
12
12
  ]
13
- requires-python = ">=3.14"
14
- dependencies = [
15
- "fastexcel>=0.21.0",
16
- "httpx>=0.28.1",
17
- "polars>=1.44.0",
18
- "pydantic[email]>=2.13.4",
19
- ]
13
+ requires-python = ">=3.12"
20
14
  license-files = ["LICENSE"]
21
15
  license = "MIT"
22
16
  classifiers = [
@@ -26,10 +20,18 @@ classifiers = [
26
20
  "License :: OSI Approved :: MIT License",
27
21
  "Programming Language :: Python :: 3",
28
22
  "Programming Language :: Python :: 3 :: Only",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
29
25
  "Programming Language :: Python :: 3.14",
30
26
  "Topic :: Software Development :: Libraries :: Python Modules",
31
27
  "Typing :: Typed",
32
28
  ]
29
+ dependencies = [
30
+ "fastexcel>=0.21.0",
31
+ "httpx>=0.28.1",
32
+ "polars>=1.44.1",
33
+ "pydantic[email]>=2.13.5",
34
+ ]
33
35
 
34
36
  [project.urls]
35
37
  Repository = "https://github.com/childmindresearch/curious-pyapi"
@@ -44,7 +46,7 @@ reportUnknownMemberType = false
44
46
 
45
47
  [tool.ruff]
46
48
  line-length = 88
47
- target-version = "py314"
49
+ target-version = "py312"
48
50
 
49
51
  [tool.ruff.lint]
50
52
  extend-select = ["A", "B904", "C4", "D", "E", "EM", "F541", "G", "I", "ICN", "LOG007", "N", "NPY", "PL", "RET", "RSE", "RUF", "Q", "T20", "TRY002", "TRY201", "TRY400", "TRY401", "UP032", "W"]
@@ -1,6 +1,6 @@
1
1
  version = 1
2
2
  revision = 3
3
- requires-python = ">=3.14"
3
+ requires-python = ">=3.12"
4
4
 
5
5
  [[package]]
6
6
  name = "annotated-types"
@@ -17,6 +17,7 @@ version = "4.14.2"
17
17
  source = { registry = "https://pypi.org/simple" }
18
18
  dependencies = [
19
19
  { name = "idna" },
20
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
20
21
  ]
21
22
  sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" }
22
23
  wheels = [
@@ -46,8 +47,8 @@ dependencies = [
46
47
  requires-dist = [
47
48
  { name = "fastexcel", specifier = ">=0.21.0" },
48
49
  { name = "httpx", specifier = ">=0.28.1" },
49
- { name = "polars", specifier = ">=1.44.0" },
50
- { name = "pydantic", extras = ["email"], specifier = ">=2.13.4" },
50
+ { name = "polars", specifier = ">=1.44.1" },
51
+ { name = "pydantic", extras = ["email"], specifier = ">=2.13.5" },
51
52
  ]
52
53
 
53
54
  [[package]]
@@ -198,6 +199,36 @@ dependencies = [
198
199
  ]
199
200
  sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" }
200
201
  wheels = [
202
+ { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" },
203
+ { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" },
204
+ { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" },
205
+ { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" },
206
+ { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" },
207
+ { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" },
208
+ { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" },
209
+ { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" },
210
+ { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" },
211
+ { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" },
212
+ { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" },
213
+ { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" },
214
+ { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" },
215
+ { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" },
216
+ { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" },
217
+ { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" },
218
+ { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" },
219
+ { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" },
220
+ { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" },
221
+ { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" },
222
+ { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" },
223
+ { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" },
224
+ { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" },
225
+ { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" },
226
+ { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" },
227
+ { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" },
228
+ { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" },
229
+ { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" },
230
+ { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" },
231
+ { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" },
201
232
  { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" },
202
233
  { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" },
203
234
  { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" },
@@ -228,6 +259,10 @@ wheels = [
228
259
  { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" },
229
260
  { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" },
230
261
  { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" },
262
+ { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" },
263
+ { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" },
264
+ { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" },
265
+ { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" },
231
266
  ]
232
267
 
233
268
  [[package]]
@@ -1 +0,0 @@
1
- 3.14
File without changes
File without changes
File without changes