pfun-common 0.1.28__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.
- pfun_common-0.1.28/.gitignore +242 -0
- pfun_common-0.1.28/PKG-INFO +9 -0
- pfun_common-0.1.28/README.md +0 -0
- pfun_common-0.1.28/__init__.py +4 -0
- pfun_common-0.1.28/pfun_common/__init__.py +28 -0
- pfun_common-0.1.28/pfun_common/enums.py +10 -0
- pfun_common-0.1.28/pfun_common/plot.py +12 -0
- pfun_common-0.1.28/pfun_common/settings.py +139 -0
- pfun_common-0.1.28/pfun_common/utils.py +109 -0
- pfun_common-0.1.28/pyproject.toml +25 -0
- pfun_common-0.1.28/uv.lock +328 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/examples/data/
|
|
2
|
+
/generated_clients/
|
|
3
|
+
|
|
4
|
+
# Ignore self-generated certificate files
|
|
5
|
+
certs/
|
|
6
|
+
|
|
7
|
+
# Specifies intentionally untracked files to ignore when using Git
|
|
8
|
+
# http://git-scm.com/docs/gitignore
|
|
9
|
+
|
|
10
|
+
# Gradio specific
|
|
11
|
+
.gradio/
|
|
12
|
+
|
|
13
|
+
# custom
|
|
14
|
+
# nohup logs
|
|
15
|
+
nohup.out
|
|
16
|
+
|
|
17
|
+
# Ignore the .env file
|
|
18
|
+
.env
|
|
19
|
+
.envrc
|
|
20
|
+
/*.env
|
|
21
|
+
/audio_output/
|
|
22
|
+
*.pem
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
#: NPM stuff
|
|
26
|
+
|
|
27
|
+
*~
|
|
28
|
+
*.sw[mnpcod]
|
|
29
|
+
.tmp
|
|
30
|
+
*.tmp
|
|
31
|
+
*.tmp.*
|
|
32
|
+
*.sublime-project
|
|
33
|
+
*.sublime-workspace
|
|
34
|
+
.DS_Store
|
|
35
|
+
Thumbs.db
|
|
36
|
+
UserInterfaceState.xcuserstate
|
|
37
|
+
$RECYCLE.BIN/
|
|
38
|
+
|
|
39
|
+
# Logs:
|
|
40
|
+
nohup.out
|
|
41
|
+
*.log
|
|
42
|
+
log.txt
|
|
43
|
+
npm-debug.log*
|
|
44
|
+
|
|
45
|
+
/.idea
|
|
46
|
+
/.ionic
|
|
47
|
+
/.sass-cache
|
|
48
|
+
/.sourcemaps
|
|
49
|
+
/.versions
|
|
50
|
+
/.vscode/*
|
|
51
|
+
!/.vscode/extensions.json
|
|
52
|
+
/coverage
|
|
53
|
+
/dist
|
|
54
|
+
/node_modules
|
|
55
|
+
/platforms
|
|
56
|
+
/plugins
|
|
57
|
+
/www
|
|
58
|
+
|
|
59
|
+
# # Standard Python ignores
|
|
60
|
+
# Byte-compiled / optimized / DLL files
|
|
61
|
+
__pycache__/
|
|
62
|
+
*.py[cod]
|
|
63
|
+
*$py.class
|
|
64
|
+
|
|
65
|
+
# C extensions
|
|
66
|
+
*.so
|
|
67
|
+
|
|
68
|
+
# Distribution / packaging
|
|
69
|
+
.Python
|
|
70
|
+
_build/
|
|
71
|
+
build/
|
|
72
|
+
develop-eggs/
|
|
73
|
+
dist/
|
|
74
|
+
downloads/
|
|
75
|
+
eggs/
|
|
76
|
+
.eggs/
|
|
77
|
+
lib/
|
|
78
|
+
lib64/
|
|
79
|
+
parts/
|
|
80
|
+
sdist/
|
|
81
|
+
var/
|
|
82
|
+
wheels/
|
|
83
|
+
share/python-wheels/
|
|
84
|
+
*.egg-info/
|
|
85
|
+
.installed.cfg
|
|
86
|
+
*.egg
|
|
87
|
+
MANIFEST
|
|
88
|
+
|
|
89
|
+
# PyInstaller
|
|
90
|
+
# Usually these files are written by a python script from a template
|
|
91
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
92
|
+
*.manifest
|
|
93
|
+
*.spec
|
|
94
|
+
|
|
95
|
+
# Installer logs
|
|
96
|
+
pip-log.txt
|
|
97
|
+
pip-delete-this-directory.txt
|
|
98
|
+
|
|
99
|
+
# Unit test / coverage reports
|
|
100
|
+
htmlcov/
|
|
101
|
+
.tox/
|
|
102
|
+
.nox/
|
|
103
|
+
.coverage
|
|
104
|
+
.coverage.*
|
|
105
|
+
.cache
|
|
106
|
+
nosetests.xml
|
|
107
|
+
coverage.xml
|
|
108
|
+
*.cover
|
|
109
|
+
*.py,cover
|
|
110
|
+
.hypothesis/
|
|
111
|
+
.pytest_cache/
|
|
112
|
+
cover/
|
|
113
|
+
|
|
114
|
+
# Translations
|
|
115
|
+
*.mo
|
|
116
|
+
*.pot
|
|
117
|
+
|
|
118
|
+
# Django stuff:
|
|
119
|
+
*.log
|
|
120
|
+
local_settings.py
|
|
121
|
+
db.sqlite3
|
|
122
|
+
db.sqlite3-journal
|
|
123
|
+
|
|
124
|
+
# Flask stuff:
|
|
125
|
+
instance/
|
|
126
|
+
.webassets-cache
|
|
127
|
+
|
|
128
|
+
# Scrapy stuff:
|
|
129
|
+
.scrapy
|
|
130
|
+
|
|
131
|
+
# Sphinx documentation
|
|
132
|
+
docs/_build/
|
|
133
|
+
|
|
134
|
+
# PyBuilder
|
|
135
|
+
.pybuilder/
|
|
136
|
+
target/
|
|
137
|
+
|
|
138
|
+
# Jupyter Notebook
|
|
139
|
+
.ipynb_checkpoints
|
|
140
|
+
|
|
141
|
+
# IPython
|
|
142
|
+
profile_default/
|
|
143
|
+
ipython_config.py
|
|
144
|
+
|
|
145
|
+
# pyenv
|
|
146
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
147
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
148
|
+
# .python-version
|
|
149
|
+
|
|
150
|
+
# pipenv
|
|
151
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
152
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
153
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
154
|
+
# install all needed dependencies.
|
|
155
|
+
#Pipfile.lock
|
|
156
|
+
|
|
157
|
+
# poetry
|
|
158
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
159
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
160
|
+
# commonly ignored for libraries.
|
|
161
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
162
|
+
#poetry.lock
|
|
163
|
+
|
|
164
|
+
# pdm
|
|
165
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
166
|
+
#pdm.lock
|
|
167
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
168
|
+
# in version control.
|
|
169
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
170
|
+
.pdm.toml
|
|
171
|
+
|
|
172
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
173
|
+
__pypackages__/
|
|
174
|
+
|
|
175
|
+
# Celery stuff
|
|
176
|
+
celerybeat-schedule
|
|
177
|
+
celerybeat.pid
|
|
178
|
+
|
|
179
|
+
# SageMath parsed files
|
|
180
|
+
*.sage.py
|
|
181
|
+
|
|
182
|
+
# Environments
|
|
183
|
+
.env
|
|
184
|
+
.venv
|
|
185
|
+
env/
|
|
186
|
+
venv/
|
|
187
|
+
ENV/
|
|
188
|
+
env.bak/
|
|
189
|
+
venv.bak/
|
|
190
|
+
|
|
191
|
+
# Spyder project settings
|
|
192
|
+
.spyderproject
|
|
193
|
+
.spyproject
|
|
194
|
+
|
|
195
|
+
# Rope project settings
|
|
196
|
+
.ropeproject
|
|
197
|
+
|
|
198
|
+
# mkdocs documentation
|
|
199
|
+
/site
|
|
200
|
+
|
|
201
|
+
# mypy
|
|
202
|
+
.mypy_cache/
|
|
203
|
+
.dmypy.json
|
|
204
|
+
dmypy.json
|
|
205
|
+
|
|
206
|
+
# Pyre type checker
|
|
207
|
+
.pyre/
|
|
208
|
+
|
|
209
|
+
# pytype static type analyzer
|
|
210
|
+
.pytype/
|
|
211
|
+
|
|
212
|
+
# Cython debug symbols
|
|
213
|
+
cython_debug/
|
|
214
|
+
|
|
215
|
+
# PyCharm
|
|
216
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
217
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
218
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
219
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
220
|
+
#.idea/# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
221
|
+
|
|
222
|
+
# dependencies
|
|
223
|
+
/node_modules
|
|
224
|
+
/.pnp
|
|
225
|
+
.pnp.js
|
|
226
|
+
|
|
227
|
+
# testing
|
|
228
|
+
/coverage
|
|
229
|
+
|
|
230
|
+
# production
|
|
231
|
+
/build
|
|
232
|
+
|
|
233
|
+
# misc
|
|
234
|
+
.DS_Store
|
|
235
|
+
.env.local
|
|
236
|
+
.env.development.local
|
|
237
|
+
.env.test.local
|
|
238
|
+
.env.production.local
|
|
239
|
+
|
|
240
|
+
npm-debug.log*
|
|
241
|
+
yarn-debug.log*
|
|
242
|
+
yarn-error.log*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pfun-common
|
|
3
|
+
Version: 0.1.28
|
|
4
|
+
Summary: Common utilities and functions for PFun projects.
|
|
5
|
+
Author-email: Robbie Capps <robbie@pfun.me>
|
|
6
|
+
Requires-Python: ==3.12.11
|
|
7
|
+
Requires-Dist: matplotlib>=3.8.0
|
|
8
|
+
Requires-Dist: pandas>=2.2.0
|
|
9
|
+
Requires-Dist: pydantic-settings>=2.2.1
|
|
File without changes
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"settings",
|
|
5
|
+
"Settings",
|
|
6
|
+
"get_settings",
|
|
7
|
+
"utils",
|
|
8
|
+
"load_environment_variables",
|
|
9
|
+
"setup_logging"
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
import pfun_common.pfun_common.settings as settings
|
|
14
|
+
import pfun_common.pfun_common.utils as utils
|
|
15
|
+
from pfun_common.pfun_common import (
|
|
16
|
+
load_environment_variables,
|
|
17
|
+
setup_logging
|
|
18
|
+
)
|
|
19
|
+
except (ImportError, ModuleNotFoundError):
|
|
20
|
+
import pfun_common.settings as settings
|
|
21
|
+
from pfun_common.settings import (
|
|
22
|
+
Settings, get_settings
|
|
23
|
+
)
|
|
24
|
+
import pfun_common.utils as utils
|
|
25
|
+
from pfun_common.utils import (
|
|
26
|
+
load_environment_variables,
|
|
27
|
+
setup_logging
|
|
28
|
+
)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import matplotlib.pyplot as plt
|
|
2
|
+
from matplotlib.axes import Axes
|
|
3
|
+
import seaborn as sns
|
|
4
|
+
import pandas as pd
|
|
5
|
+
import logging
|
|
6
|
+
logger = logging.getLogger("pfun_cma_model")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def lineplot(df: pd.DataFrame, tcol='ts_local', ycol='sg') -> Axes:
|
|
10
|
+
"""Quality-of-life lineplot function for quick n dirty plots of glucose."""
|
|
11
|
+
axes = sns.lineplot(df, x=tcol, y=ycol)
|
|
12
|
+
return axes
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""pfun_common settings module."""
|
|
2
|
+
import logging
|
|
3
|
+
from base64 import b64encode
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from urllib.parse import urlparse
|
|
6
|
+
from secrets import token_urlsafe
|
|
7
|
+
|
|
8
|
+
from pydantic import field_validator, Field
|
|
9
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def generate_default_secret_key() -> str:
|
|
13
|
+
"""Generate a default secret key based on the current timestamp.
|
|
14
|
+
|
|
15
|
+
Note: This is not secure and should only be used for development purposes.
|
|
16
|
+
In production, set the SECRET_KEY environment variable to a secure value.
|
|
17
|
+
"""
|
|
18
|
+
timestamp = datetime.now().isoformat().encode("utf-8")
|
|
19
|
+
timestamp_nonce = b64encode(timestamp).decode("utf-8")
|
|
20
|
+
rand_token = token_urlsafe(16) # 16 bytes of randomness
|
|
21
|
+
return f"{timestamp_nonce}-{rand_token}"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Settings(BaseSettings):
|
|
25
|
+
"""Application settings"""
|
|
26
|
+
|
|
27
|
+
debug: bool = False
|
|
28
|
+
server_scheme: str = "http"
|
|
29
|
+
server_host: str = "localhost"
|
|
30
|
+
server_port: str | int = "8001"
|
|
31
|
+
gradio_server_scheme: str = "http"
|
|
32
|
+
gradio_server_host: str = "localhost"
|
|
33
|
+
gradio_server_port: str | int = "7860"
|
|
34
|
+
redis_user: str = "default"
|
|
35
|
+
redis_password: str = ""
|
|
36
|
+
redis_host: str = "localhost"
|
|
37
|
+
redis_port: str | int = "6379"
|
|
38
|
+
redis_db: str | int | bool = "0"
|
|
39
|
+
redis_connection_string: str = ""
|
|
40
|
+
perplexity_api_key: str = ""
|
|
41
|
+
secret_key: str = Field(default_factory=lambda: generate_default_secret_key())
|
|
42
|
+
google_cloud_project_id: str = "pfun-cma-model"
|
|
43
|
+
google_cloud_location: str = "us-central1"
|
|
44
|
+
|
|
45
|
+
model_config = SettingsConfigDict(
|
|
46
|
+
case_sensitive=False,
|
|
47
|
+
env_file=(".env",),
|
|
48
|
+
env_file_encoding="utf-8",
|
|
49
|
+
extra="allow",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
@field_validator("redis_connection_string", mode="after")
|
|
53
|
+
@classmethod
|
|
54
|
+
def parse_redis_connection_string(cls, v: str, info) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Parse REDIS_CONNECTION_STRING and override individual Redis settings.
|
|
57
|
+
|
|
58
|
+
Supports URLs in the format: redis://[user[:password]@]host[:port][/db]
|
|
59
|
+
"""
|
|
60
|
+
if not v:
|
|
61
|
+
return v
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# initially, strip any surrounding whitespace
|
|
65
|
+
v = v.strip()
|
|
66
|
+
# somewhat intelligently access the URL itself (without extra params)
|
|
67
|
+
v = [piece for piece in v.split(" ") if "redis://" in piece][0].strip()
|
|
68
|
+
logging.debug("Parsing REDIS_CONNECTION_STRING: %s", v)
|
|
69
|
+
|
|
70
|
+
# parse the URL
|
|
71
|
+
parsed = urlparse(v)
|
|
72
|
+
logging.debug("Parsed Redis URL: %s", parsed)
|
|
73
|
+
|
|
74
|
+
# Extract host (required)
|
|
75
|
+
if parsed.hostname:
|
|
76
|
+
logging.debug("Parsed Redis host: %s", parsed.hostname)
|
|
77
|
+
info.data["redis_host"] = parsed.hostname
|
|
78
|
+
|
|
79
|
+
# Extract port (optional, defaults to 6379)
|
|
80
|
+
if parsed.port:
|
|
81
|
+
info.data["redis_port"] = parsed.port
|
|
82
|
+
elif parsed.hostname: # Only set default if we have a hostname
|
|
83
|
+
info.data["redis_port"] = 6379
|
|
84
|
+
|
|
85
|
+
# Extract username (optional, defaults to "default")
|
|
86
|
+
if parsed.username:
|
|
87
|
+
info.data["redis_user"] = parsed.username
|
|
88
|
+
|
|
89
|
+
# Extract password (optional)
|
|
90
|
+
if parsed.password:
|
|
91
|
+
info.data["redis_password"] = parsed.password
|
|
92
|
+
|
|
93
|
+
# Extract database number from path (optional, e.g., "/0")
|
|
94
|
+
if parsed.path and parsed.path != "/":
|
|
95
|
+
db_str = parsed.path.lstrip("/")
|
|
96
|
+
if db_str:
|
|
97
|
+
try:
|
|
98
|
+
info.data["redis_db"] = int(db_str)
|
|
99
|
+
except ValueError:
|
|
100
|
+
pass # Keep existing value if db is not a valid integer
|
|
101
|
+
|
|
102
|
+
logging.debug("Parsed Redis settings: host=%s, port=%s, user=%s, db=%s",
|
|
103
|
+
info.data.get("redis_host"),
|
|
104
|
+
info.data.get("redis_port"),
|
|
105
|
+
info.data.get("redis_user"),
|
|
106
|
+
info.data.get("redis_db"))
|
|
107
|
+
except Exception as exc:
|
|
108
|
+
logging.warning("Failed to parse REDIS_CONNECTION_STRING: %s", v, exc_info=exc)
|
|
109
|
+
logging.debug("No such REDIS_CONNECTION_STRING: %s", v, exc_info=exc)
|
|
110
|
+
pass # Keep existing values if parsing fails
|
|
111
|
+
|
|
112
|
+
return v
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def llm_gen_scenario_endpoint(self) -> str:
|
|
116
|
+
"""
|
|
117
|
+
LLM generate-scenario endpoint URL.
|
|
118
|
+
|
|
119
|
+
:param self: Description
|
|
120
|
+
:return: Description
|
|
121
|
+
:rtype: str
|
|
122
|
+
"""
|
|
123
|
+
return f"{self.server_scheme}://{self.server_host}:{self.server_port}/llm/generate-scenario"
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def gradio_demo_endpoint(self) -> str:
|
|
127
|
+
"""
|
|
128
|
+
Gradio demo endpoint URL.
|
|
129
|
+
|
|
130
|
+
:param self: Description
|
|
131
|
+
:return: Description
|
|
132
|
+
:rtype: str
|
|
133
|
+
"""
|
|
134
|
+
return f"{self.gradio_server_scheme}://{self.gradio_server_host}:{self.gradio_server_port}/gradio/"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def get_settings() -> Settings:
|
|
138
|
+
"""Initialize the settings object (dependency injection helper method)."""
|
|
139
|
+
return Settings()
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from dotenv import load_dotenv
|
|
4
|
+
from json import dumps
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
import logging
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
# Python 2 fallback
|
|
11
|
+
from urllib import urlencode, unquote # type: ignore
|
|
12
|
+
from urlparse import urlparse, parse_qsl, ParseResult # type: ignore
|
|
13
|
+
except ImportError:
|
|
14
|
+
# Python 3 fallback
|
|
15
|
+
from urllib.parse import (
|
|
16
|
+
urlencode, unquote, urlparse, parse_qsl, ParseResult
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def setup_logging(logger: logging.Logger, debug_mode: bool = False):
|
|
21
|
+
"""Setup logging configuration."""
|
|
22
|
+
# Set the logger to the desired level
|
|
23
|
+
if debug_mode:
|
|
24
|
+
logger.setLevel(logging.DEBUG)
|
|
25
|
+
logger.debug("Debug mode is enabled. Setting logger level to DEBUG.")
|
|
26
|
+
else:
|
|
27
|
+
logger.setLevel(logging.INFO)
|
|
28
|
+
logger.info("Debug mode is disabled. Setting logger level to INFO.")
|
|
29
|
+
logger.info("...Logging setup complete.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def load_environment_variables(
|
|
33
|
+
logger: logging.Logger = logging.getLogger(__name__)
|
|
34
|
+
) -> tuple[bool, Path]:
|
|
35
|
+
"""Load environment variables from .env file."""
|
|
36
|
+
logger.debug("Attempting to load environment variables from .env file...")
|
|
37
|
+
env_file = Path(__file__).parent.parent.parent / ".env"
|
|
38
|
+
logger.debug("Checking for .env file at: %s", str(env_file))
|
|
39
|
+
if not env_file.exists():
|
|
40
|
+
logger.warning(
|
|
41
|
+
"No .env file found at '%s'. Using system environment variables.",
|
|
42
|
+
str(env_file))
|
|
43
|
+
return False, env_file
|
|
44
|
+
logger.debug("...env file exists.")
|
|
45
|
+
loaded = load_dotenv(dotenv_path=env_file)
|
|
46
|
+
if not loaded:
|
|
47
|
+
logger.warning(
|
|
48
|
+
f"Failed to load environment variables from {env_file}.")
|
|
49
|
+
logger.debug(f"Loaded environment variables from {env_file}")
|
|
50
|
+
return loaded, env_file
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def add_url_params(url, params):
|
|
55
|
+
""" Add GET params to provided URL being aware of existing.
|
|
56
|
+
|
|
57
|
+
:param url: string of target URL
|
|
58
|
+
:param params: dict containing requested params to be added
|
|
59
|
+
:return: string with updated URL
|
|
60
|
+
|
|
61
|
+
ref: https://stackoverflow.com/a/25580545/1871569
|
|
62
|
+
|
|
63
|
+
>> url = 'https://stackoverflow.com/test?answers=true'
|
|
64
|
+
>> new_params = {'answers': False, 'data': ['some','values']}
|
|
65
|
+
>> add_url_params(url, new_params)
|
|
66
|
+
'https://stackoverflow.com/test?data=some&data=values&answers=false'
|
|
67
|
+
"""
|
|
68
|
+
# Unquoting URL first so we don't lose existing args
|
|
69
|
+
url = unquote(url)
|
|
70
|
+
# Extracting url info
|
|
71
|
+
parsed_url = urlparse(url)
|
|
72
|
+
# Extracting URL arguments from parsed URL
|
|
73
|
+
get_args = parsed_url.query
|
|
74
|
+
# Converting URL arguments to dict
|
|
75
|
+
parsed_get_args = dict(parse_qsl(get_args))
|
|
76
|
+
# Merging URL arguments dict with new params
|
|
77
|
+
parsed_get_args.update(params)
|
|
78
|
+
|
|
79
|
+
# Bool and Dict values should be converted to json-friendly values
|
|
80
|
+
# you may throw this part away if you don't like it :)
|
|
81
|
+
parsed_get_args.update(
|
|
82
|
+
{k: dumps(v) for k, v in parsed_get_args.items()
|
|
83
|
+
if isinstance(v, (bool, dict))}
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Converting URL argument to proper query string
|
|
87
|
+
encoded_get_args = urlencode(parsed_get_args, doseq=True)
|
|
88
|
+
# Creating new parsed result object based on provided with new
|
|
89
|
+
# URL arguments. Same thing happens inside urlparse.
|
|
90
|
+
new_url = ParseResult(
|
|
91
|
+
parsed_url.scheme, parsed_url.netloc, parsed_url.path,
|
|
92
|
+
parsed_url.params, encoded_get_args, parsed_url.fragment
|
|
93
|
+
).geturl()
|
|
94
|
+
|
|
95
|
+
return new_url
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def append_root_path():
|
|
99
|
+
"""
|
|
100
|
+
adds the root path to the python path
|
|
101
|
+
"""
|
|
102
|
+
#: pfun imports (relative)
|
|
103
|
+
root_path = str(Path(__file__).parents[1])
|
|
104
|
+
mod_path = str(Path(__file__).parent)
|
|
105
|
+
if root_path not in sys.path:
|
|
106
|
+
sys.path.insert(0, root_path)
|
|
107
|
+
if mod_path not in sys.path:
|
|
108
|
+
sys.path.insert(0, mod_path)
|
|
109
|
+
return sys.path
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "pfun-common"
|
|
3
|
+
version = "0.1.28"
|
|
4
|
+
description = "Common utilities and functions for PFun projects."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
authors = [
|
|
7
|
+
{ name = "Robbie Capps", email = "robbie@pfun.me" }
|
|
8
|
+
]
|
|
9
|
+
requires-python = "==3.12.11"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"matplotlib>=3.8.0",
|
|
12
|
+
"pandas>=2.2.0",
|
|
13
|
+
"pydantic-settings>=2.2.1",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[build-system]
|
|
17
|
+
requires = ["hatchling"]
|
|
18
|
+
build-backend = "hatchling.build"
|
|
19
|
+
|
|
20
|
+
[tool.setuptools]
|
|
21
|
+
packages = [
|
|
22
|
+
"pfun_common",
|
|
23
|
+
"pfun_common.utils",
|
|
24
|
+
"pfun_common.settings"
|
|
25
|
+
]
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
version = 1
|
|
2
|
+
revision = 2
|
|
3
|
+
requires-python = "==3.12.11"
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "annotated-types"
|
|
7
|
+
version = "0.7.0"
|
|
8
|
+
source = { registry = "https://pypi.org/simple" }
|
|
9
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
|
|
10
|
+
wheels = [
|
|
11
|
+
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "contourpy"
|
|
16
|
+
version = "1.3.3"
|
|
17
|
+
source = { registry = "https://pypi.org/simple" }
|
|
18
|
+
dependencies = [
|
|
19
|
+
{ name = "numpy" },
|
|
20
|
+
]
|
|
21
|
+
sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
|
|
22
|
+
wheels = [
|
|
23
|
+
{ url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" },
|
|
24
|
+
{ url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" },
|
|
25
|
+
{ url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" },
|
|
26
|
+
{ url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" },
|
|
27
|
+
{ url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" },
|
|
28
|
+
{ url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" },
|
|
29
|
+
{ url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" },
|
|
30
|
+
{ url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" },
|
|
31
|
+
{ url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" },
|
|
32
|
+
{ url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" },
|
|
33
|
+
{ url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" },
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
[[package]]
|
|
37
|
+
name = "cycler"
|
|
38
|
+
version = "0.12.1"
|
|
39
|
+
source = { registry = "https://pypi.org/simple" }
|
|
40
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
|
|
41
|
+
wheels = [
|
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
[[package]]
|
|
46
|
+
name = "fonttools"
|
|
47
|
+
version = "4.61.1"
|
|
48
|
+
source = { registry = "https://pypi.org/simple" }
|
|
49
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" }
|
|
50
|
+
wheels = [
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" },
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" },
|
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" },
|
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" },
|
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" },
|
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" },
|
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" },
|
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" },
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" },
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
[[package]]
|
|
63
|
+
name = "kiwisolver"
|
|
64
|
+
version = "1.4.9"
|
|
65
|
+
source = { registry = "https://pypi.org/simple" }
|
|
66
|
+
sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" }
|
|
67
|
+
wheels = [
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" },
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" },
|
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" },
|
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" },
|
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" },
|
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" },
|
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" },
|
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" },
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" },
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[[package]]
|
|
84
|
+
name = "matplotlib"
|
|
85
|
+
version = "3.10.8"
|
|
86
|
+
source = { registry = "https://pypi.org/simple" }
|
|
87
|
+
dependencies = [
|
|
88
|
+
{ name = "contourpy" },
|
|
89
|
+
{ name = "cycler" },
|
|
90
|
+
{ name = "fonttools" },
|
|
91
|
+
{ name = "kiwisolver" },
|
|
92
|
+
{ name = "numpy" },
|
|
93
|
+
{ name = "packaging" },
|
|
94
|
+
{ name = "pillow" },
|
|
95
|
+
{ name = "pyparsing" },
|
|
96
|
+
{ name = "python-dateutil" },
|
|
97
|
+
]
|
|
98
|
+
sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" }
|
|
99
|
+
wheels = [
|
|
100
|
+
{ url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" },
|
|
101
|
+
{ url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" },
|
|
102
|
+
{ url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" },
|
|
103
|
+
{ url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" },
|
|
104
|
+
{ url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" },
|
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" },
|
|
106
|
+
{ url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" },
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
[[package]]
|
|
110
|
+
name = "numpy"
|
|
111
|
+
version = "2.3.5"
|
|
112
|
+
source = { registry = "https://pypi.org/simple" }
|
|
113
|
+
sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" }
|
|
114
|
+
wheels = [
|
|
115
|
+
{ url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" },
|
|
116
|
+
{ url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" },
|
|
117
|
+
{ url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" },
|
|
118
|
+
{ url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" },
|
|
119
|
+
{ url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" },
|
|
120
|
+
{ url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" },
|
|
121
|
+
{ url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" },
|
|
122
|
+
{ url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" },
|
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" },
|
|
124
|
+
{ url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" },
|
|
125
|
+
{ url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" },
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
[[package]]
|
|
129
|
+
name = "packaging"
|
|
130
|
+
version = "25.0"
|
|
131
|
+
source = { registry = "https://pypi.org/simple" }
|
|
132
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
|
|
133
|
+
wheels = [
|
|
134
|
+
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
[[package]]
|
|
138
|
+
name = "pandas"
|
|
139
|
+
version = "2.3.3"
|
|
140
|
+
source = { registry = "https://pypi.org/simple" }
|
|
141
|
+
dependencies = [
|
|
142
|
+
{ name = "numpy" },
|
|
143
|
+
{ name = "python-dateutil" },
|
|
144
|
+
{ name = "pytz" },
|
|
145
|
+
{ name = "tzdata" },
|
|
146
|
+
]
|
|
147
|
+
sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" }
|
|
148
|
+
wheels = [
|
|
149
|
+
{ url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" },
|
|
150
|
+
{ url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" },
|
|
151
|
+
{ url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" },
|
|
152
|
+
{ url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" },
|
|
153
|
+
{ url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" },
|
|
154
|
+
{ url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" },
|
|
155
|
+
{ url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" },
|
|
156
|
+
]
|
|
157
|
+
|
|
158
|
+
[[package]]
|
|
159
|
+
name = "pfun-common"
|
|
160
|
+
version = "0.1.28"
|
|
161
|
+
source = { editable = "." }
|
|
162
|
+
dependencies = [
|
|
163
|
+
{ name = "matplotlib" },
|
|
164
|
+
{ name = "pandas" },
|
|
165
|
+
{ name = "pydantic-settings" },
|
|
166
|
+
]
|
|
167
|
+
|
|
168
|
+
[package.metadata]
|
|
169
|
+
requires-dist = [
|
|
170
|
+
{ name = "matplotlib", specifier = ">=3.8.0" },
|
|
171
|
+
{ name = "pandas", specifier = ">=2.2.0" },
|
|
172
|
+
{ name = "pydantic-settings", specifier = ">=2.2.1" },
|
|
173
|
+
]
|
|
174
|
+
|
|
175
|
+
[[package]]
|
|
176
|
+
name = "pillow"
|
|
177
|
+
version = "12.0.0"
|
|
178
|
+
source = { registry = "https://pypi.org/simple" }
|
|
179
|
+
sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" }
|
|
180
|
+
wheels = [
|
|
181
|
+
{ url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" },
|
|
182
|
+
{ url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" },
|
|
183
|
+
{ url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" },
|
|
184
|
+
{ url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" },
|
|
185
|
+
{ url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" },
|
|
186
|
+
{ url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" },
|
|
187
|
+
{ url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" },
|
|
188
|
+
{ url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" },
|
|
189
|
+
{ url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" },
|
|
190
|
+
{ url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" },
|
|
191
|
+
{ url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" },
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
[[package]]
|
|
195
|
+
name = "pydantic"
|
|
196
|
+
version = "2.12.5"
|
|
197
|
+
source = { registry = "https://pypi.org/simple" }
|
|
198
|
+
dependencies = [
|
|
199
|
+
{ name = "annotated-types" },
|
|
200
|
+
{ name = "pydantic-core" },
|
|
201
|
+
{ name = "typing-extensions" },
|
|
202
|
+
{ name = "typing-inspection" },
|
|
203
|
+
]
|
|
204
|
+
sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" }
|
|
205
|
+
wheels = [
|
|
206
|
+
{ url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" },
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
[[package]]
|
|
210
|
+
name = "pydantic-core"
|
|
211
|
+
version = "2.41.5"
|
|
212
|
+
source = { registry = "https://pypi.org/simple" }
|
|
213
|
+
dependencies = [
|
|
214
|
+
{ name = "typing-extensions" },
|
|
215
|
+
]
|
|
216
|
+
sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" }
|
|
217
|
+
wheels = [
|
|
218
|
+
{ url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" },
|
|
219
|
+
{ url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" },
|
|
220
|
+
{ url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" },
|
|
221
|
+
{ url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" },
|
|
222
|
+
{ url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" },
|
|
223
|
+
{ url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" },
|
|
224
|
+
{ url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" },
|
|
225
|
+
{ url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" },
|
|
226
|
+
{ url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" },
|
|
227
|
+
{ url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" },
|
|
228
|
+
{ url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" },
|
|
229
|
+
{ url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" },
|
|
230
|
+
{ url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" },
|
|
231
|
+
{ url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" },
|
|
232
|
+
{ url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" },
|
|
233
|
+
{ url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" },
|
|
234
|
+
{ url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" },
|
|
235
|
+
{ url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" },
|
|
236
|
+
]
|
|
237
|
+
|
|
238
|
+
[[package]]
|
|
239
|
+
name = "pydantic-settings"
|
|
240
|
+
version = "2.12.0"
|
|
241
|
+
source = { registry = "https://pypi.org/simple" }
|
|
242
|
+
dependencies = [
|
|
243
|
+
{ name = "pydantic" },
|
|
244
|
+
{ name = "python-dotenv" },
|
|
245
|
+
{ name = "typing-inspection" },
|
|
246
|
+
]
|
|
247
|
+
sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" }
|
|
248
|
+
wheels = [
|
|
249
|
+
{ url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" },
|
|
250
|
+
]
|
|
251
|
+
|
|
252
|
+
[[package]]
|
|
253
|
+
name = "pyparsing"
|
|
254
|
+
version = "3.2.5"
|
|
255
|
+
source = { registry = "https://pypi.org/simple" }
|
|
256
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" }
|
|
257
|
+
wheels = [
|
|
258
|
+
{ url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" },
|
|
259
|
+
]
|
|
260
|
+
|
|
261
|
+
[[package]]
|
|
262
|
+
name = "python-dateutil"
|
|
263
|
+
version = "2.9.0.post0"
|
|
264
|
+
source = { registry = "https://pypi.org/simple" }
|
|
265
|
+
dependencies = [
|
|
266
|
+
{ name = "six" },
|
|
267
|
+
]
|
|
268
|
+
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
|
|
269
|
+
wheels = [
|
|
270
|
+
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
|
271
|
+
]
|
|
272
|
+
|
|
273
|
+
[[package]]
|
|
274
|
+
name = "python-dotenv"
|
|
275
|
+
version = "1.2.1"
|
|
276
|
+
source = { registry = "https://pypi.org/simple" }
|
|
277
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" }
|
|
278
|
+
wheels = [
|
|
279
|
+
{ url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" },
|
|
280
|
+
]
|
|
281
|
+
|
|
282
|
+
[[package]]
|
|
283
|
+
name = "pytz"
|
|
284
|
+
version = "2025.2"
|
|
285
|
+
source = { registry = "https://pypi.org/simple" }
|
|
286
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" }
|
|
287
|
+
wheels = [
|
|
288
|
+
{ url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" },
|
|
289
|
+
]
|
|
290
|
+
|
|
291
|
+
[[package]]
|
|
292
|
+
name = "six"
|
|
293
|
+
version = "1.17.0"
|
|
294
|
+
source = { registry = "https://pypi.org/simple" }
|
|
295
|
+
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
|
|
296
|
+
wheels = [
|
|
297
|
+
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
[[package]]
|
|
301
|
+
name = "typing-extensions"
|
|
302
|
+
version = "4.15.0"
|
|
303
|
+
source = { registry = "https://pypi.org/simple" }
|
|
304
|
+
sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
|
|
305
|
+
wheels = [
|
|
306
|
+
{ url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
|
|
307
|
+
]
|
|
308
|
+
|
|
309
|
+
[[package]]
|
|
310
|
+
name = "typing-inspection"
|
|
311
|
+
version = "0.4.2"
|
|
312
|
+
source = { registry = "https://pypi.org/simple" }
|
|
313
|
+
dependencies = [
|
|
314
|
+
{ name = "typing-extensions" },
|
|
315
|
+
]
|
|
316
|
+
sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" }
|
|
317
|
+
wheels = [
|
|
318
|
+
{ url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
|
|
319
|
+
]
|
|
320
|
+
|
|
321
|
+
[[package]]
|
|
322
|
+
name = "tzdata"
|
|
323
|
+
version = "2025.3"
|
|
324
|
+
source = { registry = "https://pypi.org/simple" }
|
|
325
|
+
sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
|
|
326
|
+
wheels = [
|
|
327
|
+
{ url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
|
|
328
|
+
]
|