From bf95909fa9fb96cf93cd4c87a57f49a28e64f4ee Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Mon, 29 Dec 2025 18:20:49 +0530 Subject: [PATCH 01/17] remove streamlit --- src/sample/__main__.py | 90 ++++++++----------------------------- src/sample/streamlit_app.py | 60 ------------------------- templates/index.html | 25 +++++++++++ templates/style.css | 49 ++++++++++++++++++++ 4 files changed, 93 insertions(+), 131 deletions(-) delete mode 100644 src/sample/streamlit_app.py create mode 100644 templates/index.html create mode 100644 templates/style.css diff --git a/src/sample/__main__.py b/src/sample/__main__.py index c8ff3c2..f1d78e2 100644 --- a/src/sample/__main__.py +++ b/src/sample/__main__.py @@ -1,86 +1,34 @@ -# sample/__main__.py - -from . import __version__ -import sys import logging -import subprocess from pathlib import Path -import click - -logging.basicConfig(level=logging.INFO) - +from http.server import SimpleHTTPRequestHandler +from socketserver import TCPServer +import os -@click.group(invoke_without_command=True) -@click.option("--version", is_flag=True, help="Show the Sample version and exit.") -@click.pass_context -def cli(ctx, version): - """Sample command-line tools.""" - if version: - click.echo(__version__) - ctx.exit() - - -@cli.command() -def dev(): - """Run the Sample Streamlit app.""" - main() - - -@cli.command() -def api(): - """Run the Sample FastAPI backend.""" - from api.fast_api import start - - start() +__version__ = "0.1.0" +PORT = 8000 def main(): - """ - Entrypoint for the Streamlit 'dev' app. - """ print("🏷️ Sample version:", __version__) - logging.info("Starting sample dev script...") + logging.info("Starting static HTML server...") - # Paths - Sample_dir = Path(__file__).resolve().parent - dev_root = Sample_dir.parent # src/ - wheel_root = Sample_dir.parent # same in wheel + sample_dir = Path(__file__).resolve().parent.parent - # Add correct root to sys.path - if "site-packages" in str(Sample_dir): # running from wheel - if str(wheel_root) not in sys.path: - sys.path.append(str(wheel_root)) - logging.info(f"Added wheel root to sys.path: {wheel_root}") - else: # dev mode - if str(dev_root) not in sys.path: - sys.path.append(str(dev_root)) - logging.info(f"Added dev src root to sys.path: {dev_root}") + if "site-packages" in str(sample_dir): + root = sample_dir + logging.info("Running from wheel") + else: + root = sample_dir.parent + logging.info("Running in dev mode") - # Locate streamlit_app.py - streamlit_app_path = Sample_dir / "streamlit_app.py" - logging.info(f"Streamlit app path: {streamlit_app_path}") + logging.info(f"Serving from root: {root}") - if not streamlit_app_path.exists(): - logging.error(f"Streamlit app not found at: {streamlit_app_path}") - return + os.chdir(root) - # Run Streamlit app - python_path = sys.executable - logging.info(f"Using Python executable: {python_path}") - - subprocess.run( - [ - python_path, - "-m", - "streamlit", - "run", - str(streamlit_app_path.resolve()), - "--server.port", - "8501", - ], - check=True, - ) + with TCPServer(("", PORT), SimpleHTTPRequestHandler) as httpd: + print(f"🌐 Open http://localhost:{PORT}/templates/index.html") + httpd.serve_forever() if __name__ == "__main__": - cli() + main() diff --git a/src/sample/streamlit_app.py b/src/sample/streamlit_app.py deleted file mode 100644 index 5095189..0000000 --- a/src/sample/streamlit_app.py +++ /dev/null @@ -1,60 +0,0 @@ -import sys -from pathlib import Path -import streamlit as st - -# --- Path setup --- -package_root = str(Path(__file__).parent) -if package_root not in sys.path: - sys.path.append(package_root) - -# --- Imports --- -from utils.constants import COMPANY_LOGO, FAQ_TITLE -from utils.faq import faq_page -from utils.load_messages import get_msg -from features.greeting import greet - -MSG = get_msg("MAIN_APP") - - -def main(): - st.set_page_config( - page_title=MSG.title.page, - ) - - # Apply global sidebar CSS - st.markdown(MSG.html.sidebar_style, unsafe_allow_html=True) - st.markdown( - """ - -""", - unsafe_allow_html=True, - ) - - # Define navigation pages from config - pages = [ - st.Page(greet, title="Greeting Page", icon="πŸ–ŒοΈ", url_path="/greet"), - st.Page( - faq_page, - title=FAQ_TITLE, - icon="❓", - url_path="/faq", - ), - ] - - # Sidebar with logo on top - with st.sidebar: - st.image(COMPANY_LOGO, width="stretch") - nav = st.navigation(pages) - - nav.run() - - # Footer - st.markdown(MSG.html.footer, unsafe_allow_html=True) - - -if __name__ == "__main__": - main() diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..50c25e6 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,25 @@ + + + + + + Greeting Page + + + + + +
+ +

Welcome

+
+ +

This is a plain HTML greeting page.

+ + + + + + \ No newline at end of file diff --git a/templates/style.css b/templates/style.css new file mode 100644 index 0000000..8f3ccb8 --- /dev/null +++ b/templates/style.css @@ -0,0 +1,49 @@ +/* Reset basic styling */ +body { + margin: 0; + font-family: Arial, Helvetica, sans-serif; + background-color: #f5f5f5; + color: #333; +} + +/* Header styling */ +header { + display: flex; + align-items: center; + gap: 15px; + padding: 15px 25px; + background-color: #1e1e2f; + color: white; +} + +/* Logo */ +header img { + border-radius: 8px; +} + +/* Heading */ +header h1 { + margin: 0; + font-size: 24px; +} + +/* Paragraph */ +p { + padding: 20px 25px; + font-size: 16px; +} + +/* Navigation */ +nav { + padding: 0 25px 25px; +} + +nav a { + text-decoration: none; + color: #0066cc; + font-weight: bold; +} + +nav a:hover { + text-decoration: underline; +} \ No newline at end of file From 11b2e1c0f2618d5f508d2bfe14053c21b9db1959 Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Mon, 29 Dec 2025 18:37:26 +0530 Subject: [PATCH 02/17] remove streamlit dependency --- poetry.lock | 753 +-------------------------------------- pyproject.toml | 1 - src/features/__init__.py | 0 src/features/greeting.py | 18 - templates/faq.html | 33 +- 5 files changed, 20 insertions(+), 785 deletions(-) delete mode 100644 src/features/__init__.py delete mode 100644 src/features/greeting.py diff --git a/poetry.lock b/poetry.lock index f74b406..24b84da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,30 +1,5 @@ # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. -[[package]] -name = "altair" -version = "6.0.0" -description = "Vega-Altair: A declarative statistical visualization library for Python." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "altair-6.0.0-py3-none-any.whl", hash = "sha256:09ae95b53d5fe5b16987dccc785a7af8588f2dca50de1e7a156efa8a461515f8"}, - {file = "altair-6.0.0.tar.gz", hash = "sha256:614bf5ecbe2337347b590afb111929aa9c16c9527c4887d96c9bc7f6640756b4"}, -] - -[package.dependencies] -jinja2 = "*" -jsonschema = ">=3.0" -narwhals = ">=1.27.1" -packaging = "*" -typing-extensions = {version = ">=4.12.0", markers = "python_version < \"3.15\""} - -[package.extras] -all = ["altair-tiles (>=0.3.0)", "anywidget (>=0.9.0)", "numpy", "pandas (>=1.1.3)", "pyarrow (>=11)", "vegafusion (>=2.0.3)", "vl-convert-python (>=1.8.0)"] -dev = ["duckdb (>=1.0) ; python_version < \"3.14\"", "geopandas (>=0.14.3) ; python_version < \"3.14\"", "hatch (>=1.13.0)", "ipykernel", "ipython", "mistune", "mypy", "pandas (>=1.1.3)", "pandas-stubs", "polars (>=0.20.3)", "pyarrow-stubs", "pytest", "pytest-cov", "pytest-xdist[psutil] (>=3.5,<4.0)", "ruff (>=0.9.5)", "taskipy (>=1.14.1)", "tomli (>=2.2.1)", "types-jsonschema", "types-setuptools"] -doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme (>=0.14.1)", "scipy", "scipy-stubs ; python_version >= \"3.10\"", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] -save = ["vl-convert-python (>=1.8.0)"] - [[package]] name = "annotated-doc" version = "0.0.4" @@ -104,7 +79,7 @@ version = "25.4.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, @@ -129,7 +104,7 @@ description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -228,18 +203,6 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.5)"] -[[package]] -name = "blinker" -version = "1.9.0" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, - {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, -] - [[package]] name = "boolean-py" version = "5.0" @@ -280,25 +243,13 @@ dev = ["cachecontrol[filecache,redis]", "cheroot (>=11.1.2)", "cherrypy", "codes filecache = ["filelock (>=3.8.0)"] redis = ["redis (>=2.10.5)"] -[[package]] -name = "cachetools" -version = "6.2.4" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "cachetools-6.2.4-py3-none-any.whl", hash = "sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51"}, - {file = "cachetools-6.2.4.tar.gz", hash = "sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607"}, -] - [[package]] name = "certifi" version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, @@ -408,7 +359,7 @@ version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, @@ -804,40 +755,6 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.14.0,<2.15.0" pyflakes = ">=3.4.0,<3.5.0" -[[package]] -name = "gitdb" -version = "4.0.12" -description = "Git Object Database" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, - {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.45" -description = "GitPython is a Python library used to interact with Git repositories" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, - {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[package.extras] -doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] - [[package]] name = "h11" version = "0.16.0" @@ -892,7 +809,7 @@ description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\"" files = [ {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, @@ -1060,7 +977,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1078,7 +995,7 @@ version = "4.25.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, @@ -1100,7 +1017,7 @@ version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, @@ -1330,7 +1247,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -1639,31 +1556,6 @@ files = [ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] -[[package]] -name = "narwhals" -version = "2.14.0" -description = "Extremely lightweight compatibility layer between dataframe libraries" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "narwhals-2.14.0-py3-none-any.whl", hash = "sha256:b56796c9a00179bd757d15282c540024e1d5c910b19b8c9944d836566c030acf"}, - {file = "narwhals-2.14.0.tar.gz", hash = "sha256:98be155c3599db4d5c211e565c3190c398c87e7bf5b3cdb157dece67641946e0"}, -] - -[package.extras] -cudf = ["cudf (>=24.10.0)"] -dask = ["dask[dataframe] (>=2024.8)"] -duckdb = ["duckdb (>=1.1)"] -ibis = ["ibis-framework (>=6.0.0)", "packaging", "pyarrow-hotfix", "rich"] -modin = ["modin"] -pandas = ["pandas (>=1.1.3)"] -polars = ["polars (>=0.20.4)"] -pyarrow = ["pyarrow (>=13.0.0)"] -pyspark = ["pyspark (>=3.5.0)"] -pyspark-connect = ["pyspark[connect] (>=3.5.0)"] -sqlframe = ["sqlframe (>=3.22.0,!=3.39.3)"] - [[package]] name = "nbclient" version = "0.10.4" @@ -1782,155 +1674,6 @@ files = [ {file = "nh3-0.3.2.tar.gz", hash = "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376"}, ] -[[package]] -name = "numpy" -version = "2.2.6" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, - {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, - {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, - {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, - {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, - {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, - {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, - {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, - {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, - {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, - {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, - {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, - {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, - {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, - {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, - {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, - {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, - {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, - {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, - {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, - {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, - {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, - {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, - {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, - {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, - {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, - {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, - {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, - {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, - {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, - {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, - {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, - {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, - {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, - {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, - {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, - {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, - {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, - {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, - {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, - {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, - {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, - {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, - {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, - {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, - {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, - {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, - {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, - {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, - {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, - {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, - {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, - {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, - {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, - {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, -] - -[[package]] -name = "numpy" -version = "2.4.0" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.11\"" -files = [ - {file = "numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b"}, - {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7"}, - {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548"}, - {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346"}, - {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25"}, - {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a"}, - {file = "numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53"}, - {file = "numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479"}, - {file = "numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344"}, - {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6"}, - {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb"}, - {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63"}, - {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95"}, - {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6"}, - {file = "numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c"}, - {file = "numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98"}, - {file = "numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee"}, - {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e"}, - {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2"}, - {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a"}, - {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681"}, - {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475"}, - {file = "numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344"}, - {file = "numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d"}, - {file = "numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5"}, - {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3"}, - {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d"}, - {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3"}, - {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa"}, - {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c"}, - {file = "numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93"}, - {file = "numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4"}, - {file = "numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e"}, - {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51"}, - {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce"}, - {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f"}, - {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded"}, - {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059"}, - {file = "numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db"}, - {file = "numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e"}, - {file = "numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9"}, - {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9"}, - {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471"}, - {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544"}, - {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c"}, - {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac"}, - {file = "numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f"}, - {file = "numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4"}, - {file = "numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98"}, - {file = "numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b"}, - {file = "numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934"}, -] - [[package]] name = "packageurl-python" version = "0.17.6" @@ -1955,112 +1698,12 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] -[[package]] -name = "pandas" -version = "2.3.3" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, - {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, - {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, - {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, - {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, - {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, - {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, - {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, - {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, - {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, - {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, - {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, - {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, - {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, - {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, - {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, - {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, - {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, - {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, - {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, - {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, - {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, - {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, - {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, - {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, - {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, - {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, - {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, - {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, - {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, - {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, - {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, - {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, - {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, - {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, - {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, - {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, - {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, - {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, - {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, - {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, - {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, - {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, - {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, - {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, - {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, - {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, - {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, - {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, - {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, - {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, - {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, - {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, - {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, - {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.7" - -[package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -pyarrow = ["pyarrow (>=10.0.1)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] - [[package]] name = "pandocfilters" version = "1.5.1" @@ -2129,115 +1772,6 @@ files = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] -[[package]] -name = "pillow" -version = "12.0.0" -description = "Python Imaging Library (fork)" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b"}, - {file = "pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e"}, - {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782"}, - {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10"}, - {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa"}, - {file = "pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275"}, - {file = "pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d"}, - {file = "pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7"}, - {file = "pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc"}, - {file = "pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c"}, - {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227"}, - {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b"}, - {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e"}, - {file = "pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739"}, - {file = "pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e"}, - {file = "pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d"}, - {file = "pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371"}, - {file = "pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953"}, - {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8"}, - {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79"}, - {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba"}, - {file = "pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0"}, - {file = "pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a"}, - {file = "pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4"}, - {file = "pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399"}, - {file = "pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5"}, - {file = "pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e"}, - {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344"}, - {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27"}, - {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79"}, - {file = "pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098"}, - {file = "pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905"}, - {file = "pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a"}, - {file = "pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3"}, - {file = "pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a"}, - {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe"}, - {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee"}, - {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef"}, - {file = "pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9"}, - {file = "pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b"}, - {file = "pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2"}, - {file = "pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a"}, - {file = "pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b"}, - {file = "pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e"}, - {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e"}, - {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9"}, - {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab"}, - {file = "pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b"}, - {file = "pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b"}, - {file = "pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0"}, - {file = "pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6"}, - {file = "pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca"}, - {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925"}, - {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8"}, - {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4"}, - {file = "pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52"}, - {file = "pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a"}, - {file = "pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76"}, - {file = "pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5"}, - {file = "pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] -fpx = ["olefile"] -mic = ["olefile"] -test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] -xmp = ["defusedxml"] - [[package]] name = "pip" version = "25.3" @@ -2366,26 +1900,6 @@ files = [ [package.dependencies] wcwidth = "*" -[[package]] -name = "protobuf" -version = "6.33.2" -description = "" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "protobuf-6.33.2-cp310-abi3-win32.whl", hash = "sha256:87eb388bd2d0f78febd8f4c8779c79247b26a5befad525008e49a6955787ff3d"}, - {file = "protobuf-6.33.2-cp310-abi3-win_amd64.whl", hash = "sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4"}, - {file = "protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43"}, - {file = "protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5d3b5625192214066d99b2b605f5783483575656784de223f00a8d00754fc0e"}, - {file = "protobuf-6.33.2-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8cd7640aee0b7828b6d03ae518b5b4806fdfc1afe8de82f79c3454f8aef29872"}, - {file = "protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:1f8017c48c07ec5859106533b682260ba3d7c5567b1ca1f24297ce03384d1b4f"}, - {file = "protobuf-6.33.2-cp39-cp39-win32.whl", hash = "sha256:7109dcc38a680d033ffb8bf896727423528db9163be1b6a02d6a49606dcadbfe"}, - {file = "protobuf-6.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:2981c58f582f44b6b13173e12bb8656711189c2a70250845f264b877f00b1913"}, - {file = "protobuf-6.33.2-py3-none-any.whl", hash = "sha256:7636aad9bb01768870266de5dc009de2d1b936771b38a793f73cbbf279c91c5c"}, - {file = "protobuf-6.33.2.tar.gz", hash = "sha256:56dc370c91fbb8ac85bc13582c9e373569668a290aa2e66a590c2a0d35ddb9e4"}, -] - [[package]] name = "ptyprocess" version = "0.7.0" @@ -2429,66 +1943,6 @@ files = [ [package.dependencies] defusedxml = ">=0.7.1,<0.8.0" -[[package]] -name = "pyarrow" -version = "22.0.0" -description = "Python library for Apache Arrow" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "pyarrow-22.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:77718810bd3066158db1e95a63c160ad7ce08c6b0710bc656055033e39cdad88"}, - {file = "pyarrow-22.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:44d2d26cda26d18f7af7db71453b7b783788322d756e81730acb98f24eb90ace"}, - {file = "pyarrow-22.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b9d71701ce97c95480fecb0039ec5bb889e75f110da72005743451339262f4ce"}, - {file = "pyarrow-22.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:710624ab925dc2b05a6229d47f6f0dac1c1155e6ed559be7109f684eba048a48"}, - {file = "pyarrow-22.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340"}, - {file = "pyarrow-22.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd0d42297ace400d8febe55f13fdf46e86754842b860c978dfec16f081e5c653"}, - {file = "pyarrow-22.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:00626d9dc0f5ef3a75fe63fd68b9c7c8302d2b5bbc7f74ecaedba83447a24f84"}, - {file = "pyarrow-22.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a"}, - {file = "pyarrow-22.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e"}, - {file = "pyarrow-22.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215"}, - {file = "pyarrow-22.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d"}, - {file = "pyarrow-22.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8"}, - {file = "pyarrow-22.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016"}, - {file = "pyarrow-22.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c"}, - {file = "pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d"}, - {file = "pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8"}, - {file = "pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5"}, - {file = "pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe"}, - {file = "pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e"}, - {file = "pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9"}, - {file = "pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d"}, - {file = "pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a"}, - {file = "pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901"}, - {file = "pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691"}, - {file = "pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a"}, - {file = "pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6"}, - {file = "pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941"}, - {file = "pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145"}, - {file = "pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1"}, - {file = "pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f"}, - {file = "pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d"}, - {file = "pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f"}, - {file = "pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746"}, - {file = "pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95"}, - {file = "pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc"}, - {file = "pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d"}, - {file = "pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9"}, - {file = "pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7"}, - {file = "pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde"}, - {file = "pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc"}, - {file = "pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0"}, - {file = "pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730"}, - {file = "pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2"}, - {file = "pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70"}, - {file = "pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754"}, - {file = "pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91"}, - {file = "pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c"}, - {file = "pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80"}, - {file = "pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae"}, - {file = "pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9"}, -] - [[package]] name = "pycodestyle" version = "2.14.0" @@ -2670,26 +2124,6 @@ files = [ [package.dependencies] typing-extensions = ">=4.14.1" -[[package]] -name = "pydeck" -version = "0.9.1" -description = "Widget for deck.gl maps" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038"}, - {file = "pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605"}, -] - -[package.dependencies] -jinja2 = ">=2.10.1" -numpy = ">=1.16.4" - -[package.extras] -carto = ["pydeck-carto"] -jupyter = ["ipykernel (>=5.1.2) ; python_version >= \"3.4\"", "ipython (>=5.8.0) ; python_version < \"3.4\"", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] - [[package]] name = "pyflakes" version = "3.4.0" @@ -2774,7 +2208,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -2783,18 +2217,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "pytz" -version = "2025.2" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, - {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, -] - [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -2939,7 +2361,7 @@ version = "0.37.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, @@ -2956,7 +2378,7 @@ version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -3027,7 +2449,7 @@ version = "0.30.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, @@ -3197,24 +2619,12 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[[package]] -name = "smmap" -version = "5.0.2" -description = "A pure Python implementation of a sliding window memory map manager" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, - {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, -] - [[package]] name = "sortedcontainers" version = "2.4.0" @@ -3278,63 +2688,6 @@ typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\"" [package.extras] full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] -[[package]] -name = "streamlit" -version = "1.52.2" -description = "A faster way to build and share data apps" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "streamlit-1.52.2-py3-none-any.whl", hash = "sha256:a16bb4fbc9781e173ce9dfbd8ffb189c174f148f9ca4fb8fa56423e84e193fc8"}, - {file = "streamlit-1.52.2.tar.gz", hash = "sha256:64a4dda8bc5cdd37bfd490e93bb53da35aaef946fcfc283a7980dacdf165108b"}, -] - -[package.dependencies] -altair = ">=4.0,<5.4.0 || >5.4.0,<5.4.1 || >5.4.1,<7" -blinker = ">=1.5.0,<2" -cachetools = ">=4.0,<7" -click = ">=7.0,<9" -gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" -numpy = ">=1.23,<3" -packaging = ">=20" -pandas = ">=1.4.0,<3" -pillow = ">=7.1.0,<13" -protobuf = ">=3.20,<7" -pyarrow = ">=7.0" -pydeck = ">=0.8.0b4,<1" -requests = ">=2.27,<3" -tenacity = ">=8.1.0,<10" -toml = ">=0.10.1,<2" -tornado = ">=6.0.3,<6.5.0 || >6.5.0,<7" -typing-extensions = ">=4.4.0,<5" -watchdog = {version = ">=2.1.5,<7", markers = "platform_system != \"Darwin\""} - -[package.extras] -all = ["rich (>=11.0.0)", "streamlit[auth,charts,pdf,performance,snowflake,sql]"] -auth = ["Authlib (>=1.3.2)"] -charts = ["graphviz (>=0.19.0)", "matplotlib (>=3.0.0)", "orjson (>=3.5.0)", "plotly (>=4.0.0)"] -pdf = ["streamlit-pdf (>=1.0.0)"] -performance = ["orjson (>=3.5.0)", "uvloop (>=0.15.2) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\""] -snowflake = ["snowflake-connector-python (>=3.3.0) ; python_version < \"3.12\"", "snowflake-snowpark-python[modin] (>=1.17.0) ; python_version < \"3.12\""] -sql = ["SQLAlchemy (>=2.0.0)"] - -[[package]] -name = "tenacity" -version = "9.1.2" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, - {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - [[package]] name = "tinycss2" version = "1.4.0" @@ -3354,18 +2707,6 @@ webencodings = ">=0.4" doc = ["sphinx", "sphinx_rtd_theme"] test = ["pytest", "ruff"] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main"] -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tomli" version = "2.3.0" @@ -3436,7 +2777,7 @@ version = "6.5.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, @@ -3521,25 +2862,13 @@ files = [ [package.dependencies] typing-extensions = ">=4.12.0" -[[package]] -name = "tzdata" -version = "2025.3" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -groups = ["main"] -files = [ - {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, - {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, -] - [[package]] name = "urllib3" version = "2.6.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd"}, {file = "urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797"}, @@ -3586,50 +2915,6 @@ files = [ [package.dependencies] tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -[[package]] -name = "watchdog" -version = "6.0.0" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "platform_system != \"Darwin\"" -files = [ - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, - {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, - {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, - {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, - {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - [[package]] name = "wcwidth" version = "0.2.14" @@ -3676,7 +2961,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version < \"3.12\" and platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\"" files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, @@ -3693,4 +2978,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "32aa0aa94eebb2c55c01a741b97a4dd4cc922224b86ac310bf8eb96d11c841bc" +content-hash = "f28d781f820d77804635faa9e8147bd630ebae3c3bf1716225ddcb90a9787bc7" diff --git a/pyproject.toml b/pyproject.toml index 4189c5c..71945a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ classifiers = [ ] dependencies = [ "fastapi (>=0.121.1,<0.122.0)", - "streamlit>=1.49.0", "python-box (>=7.3.2,<8.0.0)", "uvicorn (>=0.40.0,<0.41.0)", ] diff --git a/src/features/__init__.py b/src/features/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/features/greeting.py b/src/features/greeting.py deleted file mode 100644 index f580f9a..0000000 --- a/src/features/greeting.py +++ /dev/null @@ -1,18 +0,0 @@ -import streamlit as st - -from utils.constants import ( - APP_TITLE, - DEFAULT_GREETING -) -from utils.helper import normalize_name - - -def greet(): - st.header(APP_TITLE) - - name = st.text_input("Enter your name") - - clean_name = normalize_name(name) - - if clean_name: - st.success(f"{DEFAULT_GREETING}, {clean_name} πŸ‘‹") diff --git a/templates/faq.html b/templates/faq.html index e779c95..6291ea5 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -5,7 +5,7 @@
What is sample? -

This is a Sample repo with minimal setup with streamlit and poetry with fast api. go through README and start. +

This is a Sample repo with minimal setup of poetry with fast api. go through README and start.

@@ -28,35 +28,4 @@ How it is different from others?

This is a useful to start the development with pre-defined template and best practices

- - - - - -
- -
- What image formats are supported? -

JPEG and PNG are supported...

-
- -
- Why does color extraction fail sometimes? -

Low contrast or corrupted profiles cause extraction errors.

-
- -
- Why does processing take time? -

Resolution, CPU/GPU load, and complexity affect speed.

-
-
- Is my data secure? -

Yes, we takes data security seriously.

-
- -
- What happens if an upload fails? -

If an upload fails, it will display errors.

-
-
\ No newline at end of file From 555009f7b5e0bb7e57c1b089999013c37a5f6806 Mon Sep 17 00:00:00 2001 From: recursivezero Date: Fri, 2 Jan 2026 23:45:16 +0530 Subject: [PATCH 03/17] [core]: update poetry lock --- poetry.lock | 162 +++++++++++++++++++-------------------- src/features/__init__.py | 0 2 files changed, 81 insertions(+), 81 deletions(-) create mode 100644 src/features/__init__.py diff --git a/poetry.lock b/poetry.lock index fb82a07..2239278 100644 --- a/poetry.lock +++ b/poetry.lock @@ -749,14 +749,14 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.20.1" +version = "3.20.2" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a"}, - {file = "filelock-3.20.1.tar.gz", hash = "sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c"}, + {file = "filelock-3.20.2-py3-none-any.whl", hash = "sha256:fbba7237d6ea277175a32c54bb71ef814a8546d8601269e1bfc388de333974e8"}, + {file = "filelock-3.20.2.tar.gz", hash = "sha256:a2241ff4ddde2a7cebddf78e39832509cb045d18ec1a09d7248d6bfc6bfbbe64"}, ] [[package]] @@ -1135,89 +1135,89 @@ type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] [[package]] name = "librt" -version = "0.7.5" +version = "0.7.7" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.7.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26"}, - {file = "librt-0.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a"}, - {file = "librt-0.7.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd"}, - {file = "librt-0.7.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169"}, - {file = "librt-0.7.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276"}, - {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023"}, - {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96"}, - {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d"}, - {file = "librt-0.7.5-cp310-cp310-win32.whl", hash = "sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904"}, - {file = "librt-0.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b"}, - {file = "librt-0.7.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc"}, - {file = "librt-0.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4"}, - {file = "librt-0.7.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4"}, - {file = "librt-0.7.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d"}, - {file = "librt-0.7.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805"}, - {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b"}, - {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419"}, - {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f"}, - {file = "librt-0.7.5-cp311-cp311-win32.whl", hash = "sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad"}, - {file = "librt-0.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409"}, - {file = "librt-0.7.5-cp311-cp311-win_arm64.whl", hash = "sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa"}, - {file = "librt-0.7.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203"}, - {file = "librt-0.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe"}, - {file = "librt-0.7.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982"}, - {file = "librt-0.7.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775"}, - {file = "librt-0.7.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233"}, - {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db"}, - {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57"}, - {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a"}, - {file = "librt-0.7.5-cp312-cp312-win32.whl", hash = "sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b"}, - {file = "librt-0.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4"}, - {file = "librt-0.7.5-cp312-cp312-win_arm64.whl", hash = "sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544"}, - {file = "librt-0.7.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a"}, - {file = "librt-0.7.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0"}, - {file = "librt-0.7.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5"}, - {file = "librt-0.7.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325"}, - {file = "librt-0.7.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec"}, - {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89"}, - {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25"}, - {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b"}, - {file = "librt-0.7.5-cp313-cp313-win32.whl", hash = "sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee"}, - {file = "librt-0.7.5-cp313-cp313-win_amd64.whl", hash = "sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e"}, - {file = "librt-0.7.5-cp313-cp313-win_arm64.whl", hash = "sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45"}, - {file = "librt-0.7.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2"}, - {file = "librt-0.7.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f"}, - {file = "librt-0.7.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6"}, - {file = "librt-0.7.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361"}, - {file = "librt-0.7.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e"}, - {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2"}, - {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760"}, - {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2"}, - {file = "librt-0.7.5-cp314-cp314-win32.whl", hash = "sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8"}, - {file = "librt-0.7.5-cp314-cp314-win_amd64.whl", hash = "sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e"}, - {file = "librt-0.7.5-cp314-cp314-win_arm64.whl", hash = "sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d"}, - {file = "librt-0.7.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802"}, - {file = "librt-0.7.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4"}, - {file = "librt-0.7.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2"}, - {file = "librt-0.7.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5"}, - {file = "librt-0.7.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416"}, - {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899"}, - {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7"}, - {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf"}, - {file = "librt-0.7.5-cp314-cp314t-win32.whl", hash = "sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d"}, - {file = "librt-0.7.5-cp314-cp314t-win_amd64.whl", hash = "sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d"}, - {file = "librt-0.7.5-cp314-cp314t-win_arm64.whl", hash = "sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1"}, - {file = "librt-0.7.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1"}, - {file = "librt-0.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3"}, - {file = "librt-0.7.5-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717"}, - {file = "librt-0.7.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335"}, - {file = "librt-0.7.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6"}, - {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7"}, - {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49"}, - {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af"}, - {file = "librt-0.7.5-cp39-cp39-win32.whl", hash = "sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b"}, - {file = "librt-0.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6"}, - {file = "librt-0.7.5.tar.gz", hash = "sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa"}, + {file = "librt-0.7.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4836c5645f40fbdc275e5670819bde5ab5f2e882290d304e3c6ddab1576a6d0"}, + {file = "librt-0.7.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae8aec43117a645a31e5f60e9e3a0797492e747823b9bda6972d521b436b4e8"}, + {file = "librt-0.7.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:aea05f701ccd2a76b34f0daf47ca5068176ff553510b614770c90d76ac88df06"}, + {file = "librt-0.7.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b16ccaeff0ed4355dfb76fe1ea7a5d6d03b5ad27f295f77ee0557bc20a72495"}, + {file = "librt-0.7.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c48c7e150c095d5e3cea7452347ba26094be905d6099d24f9319a8b475fcd3e0"}, + {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dcee2f921a8632636d1c37f1bbdb8841d15666d119aa61e5399c5268e7ce02e"}, + {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14ef0f4ac3728ffd85bfc58e2f2f48fb4ef4fa871876f13a73a7381d10a9f77c"}, + {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4ab69fa37f8090f2d971a5d2bc606c7401170dbdae083c393d6cbf439cb45b8"}, + {file = "librt-0.7.7-cp310-cp310-win32.whl", hash = "sha256:4bf3cc46d553693382d2abf5f5bd493d71bb0f50a7c0beab18aa13a5545c8900"}, + {file = "librt-0.7.7-cp310-cp310-win_amd64.whl", hash = "sha256:f0c8fe5aeadd8a0e5b0598f8a6ee3533135ca50fd3f20f130f9d72baf5c6ac58"}, + {file = "librt-0.7.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a487b71fbf8a9edb72a8c7a456dda0184642d99cd007bc819c0b7ab93676a8ee"}, + {file = "librt-0.7.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f4d4efb218264ecf0f8516196c9e2d1a0679d9fb3bb15df1155a35220062eba8"}, + {file = "librt-0.7.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b8bb331aad734b059c4b450cd0a225652f16889e286b2345af5e2c3c625c3d85"}, + {file = "librt-0.7.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:467dbd7443bda08338fc8ad701ed38cef48194017554f4c798b0a237904b3f99"}, + {file = "librt-0.7.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50d1d1ee813d2d1a3baf2873634ba506b263032418d16287c92ec1cc9c1a00cb"}, + {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e5070cf3ec92d98f57574da0224f8c73faf1ddd6d8afa0b8c9f6e86997bc74"}, + {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bdb9f3d865b2dafe7f9ad7f30ef563c80d0ddd2fdc8cc9b8e4f242f475e34d75"}, + {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8185c8497d45164e256376f9da5aed2bb26ff636c798c9dabe313b90e9f25b28"}, + {file = "librt-0.7.7-cp311-cp311-win32.whl", hash = "sha256:44d63ce643f34a903f09ff7ca355aae019a3730c7afd6a3c037d569beeb5d151"}, + {file = "librt-0.7.7-cp311-cp311-win_amd64.whl", hash = "sha256:7d13cc340b3b82134f8038a2bfe7137093693dcad8ba5773da18f95ad6b77a8a"}, + {file = "librt-0.7.7-cp311-cp311-win_arm64.whl", hash = "sha256:983de36b5a83fe9222f4f7dcd071f9b1ac6f3f17c0af0238dadfb8229588f890"}, + {file = "librt-0.7.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a85a1fc4ed11ea0eb0a632459ce004a2d14afc085a50ae3463cd3dfe1ce43fc"}, + {file = "librt-0.7.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c87654e29a35938baead1c4559858f346f4a2a7588574a14d784f300ffba0efd"}, + {file = "librt-0.7.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c9faaebb1c6212c20afd8043cd6ed9de0a47d77f91a6b5b48f4e46ed470703fe"}, + {file = "librt-0.7.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1908c3e5a5ef86b23391448b47759298f87f997c3bd153a770828f58c2bb4630"}, + {file = "librt-0.7.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbc4900e95a98fc0729523be9d93a8fedebb026f32ed9ffc08acd82e3e181503"}, + {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7ea4e1fbd253e5c68ea0fe63d08577f9d288a73f17d82f652ebc61fa48d878d"}, + {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef7699b7a5a244b1119f85c5bbc13f152cd38240cbb2baa19b769433bae98e50"}, + {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:955c62571de0b181d9e9e0a0303c8bc90d47670a5eff54cf71bf5da61d1899cf"}, + {file = "librt-0.7.7-cp312-cp312-win32.whl", hash = "sha256:1bcd79be209313b270b0e1a51c67ae1af28adad0e0c7e84c3ad4b5cb57aaa75b"}, + {file = "librt-0.7.7-cp312-cp312-win_amd64.whl", hash = "sha256:4353ee891a1834567e0302d4bd5e60f531912179578c36f3d0430f8c5e16b456"}, + {file = "librt-0.7.7-cp312-cp312-win_arm64.whl", hash = "sha256:a76f1d679beccccdf8c1958e732a1dfcd6e749f8821ee59d7bec009ac308c029"}, + {file = "librt-0.7.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f4a0b0a3c86ba9193a8e23bb18f100d647bf192390ae195d84dfa0a10fb6244"}, + {file = "librt-0.7.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5335890fea9f9e6c4fdf8683061b9ccdcbe47c6dc03ab8e9b68c10acf78be78d"}, + {file = "librt-0.7.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b4346b1225be26def3ccc6c965751c74868f0578cbcba293c8ae9168483d811"}, + {file = "librt-0.7.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a10b8eebdaca6e9fdbaf88b5aefc0e324b763a5f40b1266532590d5afb268a4c"}, + {file = "librt-0.7.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:067be973d90d9e319e6eb4ee2a9b9307f0ecd648b8a9002fa237289a4a07a9e7"}, + {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:23d2299ed007812cccc1ecef018db7d922733382561230de1f3954db28433977"}, + {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6b6f8ea465524aa4c7420c7cc4ca7d46fe00981de8debc67b1cc2e9957bb5b9d"}, + {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8df32a99cc46eb0ee90afd9ada113ae2cafe7e8d673686cf03ec53e49635439"}, + {file = "librt-0.7.7-cp313-cp313-win32.whl", hash = "sha256:86f86b3b785487c7760247bcdac0b11aa8bf13245a13ed05206286135877564b"}, + {file = "librt-0.7.7-cp313-cp313-win_amd64.whl", hash = "sha256:4862cb2c702b1f905c0503b72d9d4daf65a7fdf5a9e84560e563471e57a56949"}, + {file = "librt-0.7.7-cp313-cp313-win_arm64.whl", hash = "sha256:0996c83b1cb43c00e8c87835a284f9057bc647abd42b5871e5f941d30010c832"}, + {file = "librt-0.7.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:23daa1ab0512bafdd677eb1bfc9611d8ffbe2e328895671e64cb34166bc1b8c8"}, + {file = "librt-0.7.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:558a9e5a6f3cc1e20b3168fb1dc802d0d8fa40731f6e9932dcc52bbcfbd37111"}, + {file = "librt-0.7.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2567cb48dc03e5b246927ab35cbb343376e24501260a9b5e30b8e255dca0d1d2"}, + {file = "librt-0.7.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6066c638cdf85ff92fc6f932d2d73c93a0e03492cdfa8778e6d58c489a3d7259"}, + {file = "librt-0.7.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a609849aca463074c17de9cda173c276eb8fee9e441053529e7b9e249dc8b8ee"}, + {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:add4e0a000858fe9bb39ed55f31085506a5c38363e6eb4a1e5943a10c2bfc3d1"}, + {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a3bfe73a32bd0bdb9a87d586b05a23c0a1729205d79df66dee65bb2e40d671ba"}, + {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0ecce0544d3db91a40f8b57ae26928c02130a997b540f908cefd4d279d6c5848"}, + {file = "librt-0.7.7-cp314-cp314-win32.whl", hash = "sha256:8f7a74cf3a80f0c3b0ec75b0c650b2f0a894a2cec57ef75f6f72c1e82cdac61d"}, + {file = "librt-0.7.7-cp314-cp314-win_amd64.whl", hash = "sha256:3d1fe2e8df3268dd6734dba33ededae72ad5c3a859b9577bc00b715759c5aaab"}, + {file = "librt-0.7.7-cp314-cp314-win_arm64.whl", hash = "sha256:2987cf827011907d3dfd109f1be0d61e173d68b1270107bb0e89f2fca7f2ed6b"}, + {file = "librt-0.7.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8e92c8de62b40bfce91d5e12c6e8b15434da268979b1af1a6589463549d491e6"}, + {file = "librt-0.7.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f683dcd49e2494a7535e30f779aa1ad6e3732a019d80abe1309ea91ccd3230e3"}, + {file = "librt-0.7.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b15e5d17812d4d629ff576699954f74e2cc24a02a4fc401882dd94f81daba45"}, + {file = "librt-0.7.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c084841b879c4d9b9fa34e5d5263994f21aea7fd9c6add29194dbb41a6210536"}, + {file = "librt-0.7.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c8fb9966f84737115513fecbaf257f9553d067a7dd45a69c2c7e5339e6a8dc"}, + {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5fb1ecb2c35362eab2dbd354fd1efa5a8440d3e73a68be11921042a0edc0ff"}, + {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d1454899909d63cc9199a89fcc4f81bdd9004aef577d4ffc022e600c412d57f3"}, + {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7ef28f2e7a016b29792fe0a2dd04dec75725b32a1264e390c366103f834a9c3a"}, + {file = "librt-0.7.7-cp314-cp314t-win32.whl", hash = "sha256:5e419e0db70991b6ba037b70c1d5bbe92b20ddf82f31ad01d77a347ed9781398"}, + {file = "librt-0.7.7-cp314-cp314t-win_amd64.whl", hash = "sha256:d6b7d93657332c817b8d674ef6bf1ab7796b4f7ce05e420fd45bd258a72ac804"}, + {file = "librt-0.7.7-cp314-cp314t-win_arm64.whl", hash = "sha256:142c2cd91794b79fd0ce113bd658993b7ede0fe93057668c2f98a45ca00b7e91"}, + {file = "librt-0.7.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c8ffe3431d98cc043a14e88b21288b5ec7ee12cb01260e94385887f285ef9389"}, + {file = "librt-0.7.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e40d20ae1722d6b8ea6acf4597e789604649dcd9c295eb7361a28225bc2e9e12"}, + {file = "librt-0.7.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f2cb63c49bc96847c3bb8dca350970e4dcd19936f391cfdfd057dcb37c4fa97e"}, + {file = "librt-0.7.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f2f8dcf5ab9f80fb970c6fd780b398efb2f50c1962485eb8d3ab07788595a48"}, + {file = "librt-0.7.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1f5cc41a570269d1be7a676655875e3a53de4992a9fa38efb7983e97cf73d7c"}, + {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff1fb2dfef035549565a4124998fadcb7a3d4957131ddf004a56edeb029626b3"}, + {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab2a2a9cd7d044e1a11ca64a86ad3361d318176924bbe5152fbc69f99be20b8c"}, + {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3fc2d859a709baf9dd9607bb72f599b1cfb8a39eafd41307d0c3c4766763cb"}, + {file = "librt-0.7.7-cp39-cp39-win32.whl", hash = "sha256:f83c971eb9d2358b6a18da51dc0ae00556ac7c73104dde16e9e14c15aaf685ca"}, + {file = "librt-0.7.7-cp39-cp39-win_amd64.whl", hash = "sha256:264720fc288c86039c091a4ad63419a5d7cabbf1c1c9933336a957ed2483e570"}, + {file = "librt-0.7.7.tar.gz", hash = "sha256:81d957b069fed1890953c3b9c3895c7689960f233eea9a1d9607f71ce7f00b2c"}, ] [[package]] @@ -3093,4 +3093,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "f28d781f820d77804635faa9e8147bd630ebae3c3bf1716225ddcb90a9787bc7" +content-hash = "85ffa98c0d062ead14488595fb74718250e99a649e0a755de303abc001acf8ff" diff --git a/src/features/__init__.py b/src/features/__init__.py new file mode 100644 index 0000000..e69de29 From 62e018e438de0a5ef1266a33a90097b072f6790c Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Sat, 3 Jan 2026 08:00:19 +0530 Subject: [PATCH 04/17] refactor: move PORT constant to utils.constants module --- src/sample/__main__.py | 5 +++-- src/utils/constants.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sample/__main__.py b/src/sample/__main__.py index f1d78e2..1890b20 100644 --- a/src/sample/__main__.py +++ b/src/sample/__main__.py @@ -4,8 +4,9 @@ from socketserver import TCPServer import os -__version__ = "0.1.0" -PORT = 8000 +from utils.constants import PORT +from . import __version__ + def main(): diff --git a/src/utils/constants.py b/src/utils/constants.py index 5fc28ea..33a8c60 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -9,7 +9,7 @@ APP_TITLE = ":blue[Greeting Feature]" DEFAULT_GREETING = "Hello" FAQ_TITLE = "FAQs" - +PORT = 8000 # --- Asset paths --- PROJECT_ROOT = Path(__file__).parent.parent ASSETS_DIR = PROJECT_ROOT / "assets" / "images" From 717fddb8fb69b633aa3365715415afd85aec67b3 Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Thu, 15 Jan 2026 20:24:20 +0530 Subject: [PATCH 05/17] remove streamlit dependency --- README.md | 8 +++---- docs/BUILD.md | 2 +- docs/CLOUD.md | 5 ++--- docs/DEPLOYMENT.md | 2 +- docs/INSTALL.md | 3 +-- docs/USAGE.md | 2 +- docs/setup-for-osx.md | 2 +- poetry.lock | 31 ++++++++++++++++++++++++- pyproject.toml | 5 +++-- src/sample/cli.py | 2 +- src/utils/constants.py | 51 ++++++++---------------------------------- src/utils/faq.py | 27 ---------------------- src/utils/messages.py | 11 --------- templates/faq.html | 4 ++-- 14 files changed, 55 insertions(+), 100 deletions(-) delete mode 100644 src/utils/faq.py delete mode 100644 src/utils/messages.py diff --git a/README.md b/README.md index 044da87..85f08aa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fabric Generator and Search Utility -A Streamlit template for Recursive Zero repository +A Sample template for Recursive Zero repository ## Installation Guide @@ -8,7 +8,6 @@ A Streamlit template for Recursive Zero repository - Python β‰₯ 3.11 - Poetry β‰₯ 2.2.1 -- Streamlit β‰₯ 1.49.1 ## Getting Started @@ -34,7 +33,6 @@ Ensure below files are configured (create if not exist) properly to run the proj - `.env.local`, - `.env`, and -- `.streamlit/secrets.toml` ## Install Dependencies @@ -51,7 +49,7 @@ poetry install ## How to Run -## Run Streamlit App +## Run Sample App ```bash poetry run sample dev @@ -120,7 +118,7 @@ pip install sample ## CLI Shortcuts -`sample dev` β†’ Launch Streamlit UI +`sample dev` β†’ Launch Sample UI `sample api` β†’ Launch FastAPI diff --git a/docs/BUILD.md b/docs/BUILD.md index 48b1e00..659faac 100644 --- a/docs/BUILD.md +++ b/docs/BUILD.md @@ -40,7 +40,7 @@ pip show sample ## CLI Shortcuts -`sample dev` β†’ Launch Streamlit UI +`sample dev` β†’ Launch frontend `sample api` β†’ Launch FastAPI diff --git a/docs/CLOUD.md b/docs/CLOUD.md index e86c15a..69334ca 100644 --- a/docs/CLOUD.md +++ b/docs/CLOUD.md @@ -1,10 +1,9 @@ # Cloud Deployment -- Install python v 3.12, streamlit and poetry using pip +- Install python v 3.12,poetry using pip ```sh sudo apt install python3-pip python3-venv -pip install streamlit curl -sSL https://install.python-poetry.org | python3.12 - echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # install additional required packages @@ -27,7 +26,7 @@ poetry env info ``` - copy sample repo in a folder -- copy `.env` and `.streamlit/config.toml` to that folder +- copy `.env` to that folder - go to folder and install package dependencies ```sh diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 5a9fccd..edafa60 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -1,6 +1,6 @@ # Deployment Guide -## Export Requirements for Streamlit +## Export Requirements ```bash poetry export -f requirements.txt --without-hashes --output requirements.txt \ diff --git a/docs/INSTALL.md b/docs/INSTALL.md index c6a7e7e..c361567 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -4,7 +4,6 @@ - Python β‰₯ 3.11 - Poetry β‰₯ 2.2.1 -- Streamlit β‰₯ 1.49.1 ## Getting Started @@ -26,7 +25,7 @@ pip install poetry>=1.5.0 poetry config virtualenvs.path /your/desired/path ``` -Ensure `.env.local`, `.env`, and `.streamlit/secrets.toml` are configured with appropriate keys. +Ensure `.env.local`, `.env` are configured with appropriate keys. ## Install Dependencies diff --git a/docs/USAGE.md b/docs/USAGE.md index aea36eb..8052f38 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -1,6 +1,6 @@ # How to Run -## Run Streamlit App +## Run Sample app ```bash poetry run sample dev diff --git a/docs/setup-for-osx.md b/docs/setup-for-osx.md index 56ad1af..d973495 100644 --- a/docs/setup-for-osx.md +++ b/docs/setup-for-osx.md @@ -76,7 +76,7 @@ poetry run ruff check poetry show --tree ``` -3. **Run the Streamlit application:** +3. **Run the Sample app:** ```sh poetry run sample dev diff --git a/poetry.lock b/poetry.lock index 2239278..de2afe4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -675,6 +675,20 @@ files = [ {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, ] +[[package]] +name = "dotenv" +version = "0.9.9" +description = "Deprecated package" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9"}, +] + +[package.dependencies] +python-dotenv = "*" + [[package]] name = "exceptiongroup" version = "1.3.1" @@ -2332,6 +2346,21 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.2.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, + {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -3093,4 +3122,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "85ffa98c0d062ead14488595fb74718250e99a649e0a755de303abc001acf8ff" +content-hash = "6244093cdcc1a22bb8dbdaa3d0173d0694e6d1c74fe5306cd50ad887301a528d" diff --git a/pyproject.toml b/pyproject.toml index 44aea7d..190a948 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "sample" version = "1.0.0" -description = "A python template for fastapi and streamlit projects." +description = "A python template for fastapi and projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" readme = "README.md" requires-python = ">=3.10,<3.13" -keywords = ["python", "fastapi", "streamlit"] +keywords = ["python", "fastapi"] classifiers = [ "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Image Recognition", @@ -16,6 +16,7 @@ dependencies = [ "python-box (>=7.3.2,<8.0.0)", "uvicorn (>=0.40.0,<0.41.0)", "pymongo (>=4.15.5,<5.0.0)", + "dotenv (>=0.9.9,<0.10.0)", ] diff --git a/src/sample/cli.py b/src/sample/cli.py index 93d1a1f..49ac79e 100644 --- a/src/sample/cli.py +++ b/src/sample/cli.py @@ -14,7 +14,7 @@ def cli(ctx, version): @cli.command() def dev(): - """Run the Sample Streamlit app.""" + """Run the Sample app.""" from sample.__main__ import main main() diff --git a/src/utils/constants.py b/src/utils/constants.py index 33a8c60..39ce36d 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -1,9 +1,9 @@ import os from pathlib import Path -from typing import Any -import streamlit as st import logging +from dotenv import load_dotenv +load_dotenv() APP_TITLE = ":blue[Greeting Feature]" @@ -15,50 +15,17 @@ ASSETS_DIR = PROJECT_ROOT / "assets" / "images" COMPANY_LOGO = ASSETS_DIR / "logo.png" -def safe_get(secret_path: str, env_key: str = "", default: str = "") -> str: - """ - Safely retrieve a configuration value from: - 1. Streamlit secrets (if secrets.toml exists) - 2. Environment variable - 3. Default fallback +def safe_get(env_key: str) -> str: + value = os.getenv(env_key) - Logs the source used for each config value. - """ - value = default - source = "default" - secrets_file = Path(".streamlit/secrets.toml") + if not value: + raise RuntimeError(f"Missing required environment variable: {env_key}") - # Only try accessing secrets if the file exists - if secrets_file.exists(): - try: - secrets_dict: dict[str, Any] = dict(st.secrets) # Convert to plain dict - val = secrets_dict - - for key in secret_path.split("."): - val = ( - val.get(key, {}) if isinstance(val, dict) else getattr(val, key, {}) - ) - if val and val != {}: - value = str(val) - source = "secrets" - except Exception as e: - logging.debug(f"Could not retrieve secret '{secret_path}': {e}") - - # If secrets not used, fallback to env - if source != "secrets" and env_key: - env_val = os.getenv(env_key) - if env_val: - value = env_val - source = "env" - - logging.info( - f"Loaded config for '{env_key or secret_path}' from [{source}]", - extra={"color": "yellow"}, - ) + logging.info(f"Loaded config '{env_key}' from [env]") return value -MONGODB_URI = safe_get("mongodb.MONGODB_URI", "MONGODB_URI") -DATABASE_NAME = safe_get("mongodb.DATABASE_NAME", "DATABASE_NAME") +MONGODB_URI = safe_get("MONGODB_URI") +DATABASE_NAME = safe_get("DATABASE_NAME") print("MongoDB URI:", MONGODB_URI) print("Database Name:", DATABASE_NAME) diff --git a/src/utils/faq.py b/src/utils/faq.py deleted file mode 100644 index 07f8fc0..0000000 --- a/src/utils/faq.py +++ /dev/null @@ -1,27 +0,0 @@ -from pathlib import Path -import streamlit as st -from bs4 import BeautifulSoup - - -def faq_page(): - # Load CSS - st.title(":blue[❓FAQs]") - css = Path(r"templates/faq.css").read_text() - st.markdown(f"", unsafe_allow_html=True) - - # Load full HTML - html = Path(r"templates/faq.html").read_text() - - # Parse and split sections using BeautifulSoup - soup = BeautifulSoup(html, "html.parser") - general_faq = str(soup.find(id="general-faq")) - technical_faq = str(soup.find(id="technical-faq")) - - # Create Streamlit tabs - tab1, tab2 = st.tabs(["General", "Technical"]) - - with tab1: - st.markdown(general_faq, unsafe_allow_html=True) - - with tab2: - st.markdown(technical_faq, unsafe_allow_html=True) diff --git a/src/utils/messages.py b/src/utils/messages.py deleted file mode 100644 index 5d70dbf..0000000 --- a/src/utils/messages.py +++ /dev/null @@ -1,11 +0,0 @@ -# General Header and Descriptions -from box import Box - -MAIN_APP_TEXT = Box( - { - "title": { - "page": "Streamlit Boilerplate", - "subtitle": "Clean, minimal, extensible", - } - } -) diff --git a/templates/faq.html b/templates/faq.html index aff30fd..c9ff04d 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -11,7 +11,7 @@

Frequently Asked Questions

What are the main packages and libraries?
    -
  • we are using streamlit for front end and Fast API for backend.
  • +
  • we are using d Fast API for backend.
  • we also have versioning system, if you change version in `pyproject.toml`, it will automatically reflected in api
  • using `Box` for centralized messaged which later can be changed using i18n support.
  • @@ -20,7 +20,7 @@

    Frequently Asked Questions

    What are method to run? -

    run `poetry run sample dev` for streamlit UI.

    +

    run `poetry run sample dev` for sample

    run `poetry run sample api` and /version` is one endpoint.

    run `poetry run lint` to lint the code.

    From 6bad03e4f770c855b047e1a2ec65880f009650f3 Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Thu, 15 Jan 2026 20:24:42 +0530 Subject: [PATCH 06/17] remove MongoDB connection check from utils module --- src/utils/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/utils/__init__.py b/src/utils/__init__.py index 42ca9c6..e69de29 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -1,4 +0,0 @@ -from db.connection import mongo_client - -if mongo_client: - print("MongoDB connected successfully.") \ No newline at end of file From 765de0dc3ece95100fe7cadf06c7c7c156e5b6ee Mon Sep 17 00:00:00 2001 From: recursivezero Date: Thu, 15 Jan 2026 23:13:53 +0530 Subject: [PATCH 07/17] [TZS-260115]: remove streamlit; added clean command --- .vscode/extensions.json | 3 +- README.md | 1 - docs/INSTALL.md | 2 +- poetry.lock | 485 +++++++++++++++++++++------------------ pyproject.toml | 7 +- requirements.txt | 53 ----- sample-py.code-workspace | 8 - src/db/connection.py | 50 ++-- src/sample/__main__.py | 12 +- src/utils/__init__.py | 4 - src/utils/clean.py | 45 ++++ src/utils/constants.py | 48 ++-- src/utils/faq.py | 27 --- templates/faq.html | 4 +- 14 files changed, 362 insertions(+), 387 deletions(-) delete mode 100644 requirements.txt create mode 100644 src/utils/clean.py delete mode 100644 src/utils/faq.py diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 7ade341..f7df18a 100755 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -14,6 +14,7 @@ "GitHub.github-vscode-theme", "yzhang.markdown-all-in-one", "tamasfe.even-better-toml", - "ms-python.vscode-python-envs" + "ms-python.vscode-python-envs", + "arturock.gitstash" ] } diff --git a/README.md b/README.md index 044da87..af8c9d7 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ Ensure below files are configured (create if not exist) properly to run the proj - `.env.local`, - `.env`, and -- `.streamlit/secrets.toml` ## Install Dependencies diff --git a/docs/INSTALL.md b/docs/INSTALL.md index c6a7e7e..7ca3a13 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -26,7 +26,7 @@ pip install poetry>=1.5.0 poetry config virtualenvs.path /your/desired/path ``` -Ensure `.env.local`, `.env`, and `.streamlit/secrets.toml` are configured with appropriate keys. +Ensure `.env.local`, `.env` are configured with appropriate keys. ## Install Dependencies diff --git a/poetry.lock b/poetry.lock index 2239278..d8e82bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -26,14 +26,14 @@ files = [ [[package]] name = "anyio" -version = "4.12.0" +version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb"}, - {file = "anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] @@ -245,14 +245,14 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, - {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] @@ -749,14 +749,14 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.20.2" +version = "3.20.3" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.20.2-py3-none-any.whl", hash = "sha256:fbba7237d6ea277175a32c54bb71ef814a8546d8601269e1bfc388de333974e8"}, - {file = "filelock-3.20.2.tar.gz", hash = "sha256:a2241ff4ddde2a7cebddf78e39832509cb045d18ec1a09d7248d6bfc6bfbbe64"}, + {file = "filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1"}, + {file = "filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1"}, ] [[package]] @@ -909,15 +909,15 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [[package]] name = "jaraco-context" -version = "6.0.2" +version = "6.1.0" description = "Useful decorators and context managers" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ - {file = "jaraco_context-6.0.2-py3-none-any.whl", hash = "sha256:55fc21af4b4f9ca94aa643b6ee7fe13b1e4c01abf3aeb98ca4ad9c80b741c786"}, - {file = "jaraco_context-6.0.2.tar.gz", hash = "sha256:953ae8dddb57b1d791bf72ea1009b32088840a7dd19b9ba16443f62be919ee57"}, + {file = "jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda"}, + {file = "jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f"}, ] [package.dependencies] @@ -1012,21 +1012,21 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.25.1" +version = "4.26.0" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, - {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, ] [package.dependencies] attrs = ">=22.2.0" jsonschema-specifications = ">=2023.03.6" referencing = ">=0.28.4" -rpds-py = ">=0.7.1" +rpds-py = ">=0.25.0" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -1049,14 +1049,14 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.7.0" +version = "8.8.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jupyter_client-8.7.0-py3-none-any.whl", hash = "sha256:3671a94fd25e62f5f2f554f5e95389c2294d89822378a5f2dd24353e1494a9e0"}, - {file = "jupyter_client-8.7.0.tar.gz", hash = "sha256:3357212d9cbe01209e59190f67a3a7e1f387a4f4e88d1e0433ad84d7b262531d"}, + {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, + {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, ] [package.dependencies] @@ -1068,7 +1068,8 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["anyio", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.6.2)", "pytest-timeout"] +orjson = ["orjson"] +test = ["anyio", "coverage", "ipykernel (>=6.14)", "msgpack", "mypy ; platform_python_implementation != \"PyPy\"", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.6.2)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1135,89 +1136,89 @@ type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] [[package]] name = "librt" -version = "0.7.7" +version = "0.7.8" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.7.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4836c5645f40fbdc275e5670819bde5ab5f2e882290d304e3c6ddab1576a6d0"}, - {file = "librt-0.7.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae8aec43117a645a31e5f60e9e3a0797492e747823b9bda6972d521b436b4e8"}, - {file = "librt-0.7.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:aea05f701ccd2a76b34f0daf47ca5068176ff553510b614770c90d76ac88df06"}, - {file = "librt-0.7.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b16ccaeff0ed4355dfb76fe1ea7a5d6d03b5ad27f295f77ee0557bc20a72495"}, - {file = "librt-0.7.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c48c7e150c095d5e3cea7452347ba26094be905d6099d24f9319a8b475fcd3e0"}, - {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dcee2f921a8632636d1c37f1bbdb8841d15666d119aa61e5399c5268e7ce02e"}, - {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14ef0f4ac3728ffd85bfc58e2f2f48fb4ef4fa871876f13a73a7381d10a9f77c"}, - {file = "librt-0.7.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4ab69fa37f8090f2d971a5d2bc606c7401170dbdae083c393d6cbf439cb45b8"}, - {file = "librt-0.7.7-cp310-cp310-win32.whl", hash = "sha256:4bf3cc46d553693382d2abf5f5bd493d71bb0f50a7c0beab18aa13a5545c8900"}, - {file = "librt-0.7.7-cp310-cp310-win_amd64.whl", hash = "sha256:f0c8fe5aeadd8a0e5b0598f8a6ee3533135ca50fd3f20f130f9d72baf5c6ac58"}, - {file = "librt-0.7.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a487b71fbf8a9edb72a8c7a456dda0184642d99cd007bc819c0b7ab93676a8ee"}, - {file = "librt-0.7.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f4d4efb218264ecf0f8516196c9e2d1a0679d9fb3bb15df1155a35220062eba8"}, - {file = "librt-0.7.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b8bb331aad734b059c4b450cd0a225652f16889e286b2345af5e2c3c625c3d85"}, - {file = "librt-0.7.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:467dbd7443bda08338fc8ad701ed38cef48194017554f4c798b0a237904b3f99"}, - {file = "librt-0.7.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50d1d1ee813d2d1a3baf2873634ba506b263032418d16287c92ec1cc9c1a00cb"}, - {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e5070cf3ec92d98f57574da0224f8c73faf1ddd6d8afa0b8c9f6e86997bc74"}, - {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bdb9f3d865b2dafe7f9ad7f30ef563c80d0ddd2fdc8cc9b8e4f242f475e34d75"}, - {file = "librt-0.7.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8185c8497d45164e256376f9da5aed2bb26ff636c798c9dabe313b90e9f25b28"}, - {file = "librt-0.7.7-cp311-cp311-win32.whl", hash = "sha256:44d63ce643f34a903f09ff7ca355aae019a3730c7afd6a3c037d569beeb5d151"}, - {file = "librt-0.7.7-cp311-cp311-win_amd64.whl", hash = "sha256:7d13cc340b3b82134f8038a2bfe7137093693dcad8ba5773da18f95ad6b77a8a"}, - {file = "librt-0.7.7-cp311-cp311-win_arm64.whl", hash = "sha256:983de36b5a83fe9222f4f7dcd071f9b1ac6f3f17c0af0238dadfb8229588f890"}, - {file = "librt-0.7.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a85a1fc4ed11ea0eb0a632459ce004a2d14afc085a50ae3463cd3dfe1ce43fc"}, - {file = "librt-0.7.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c87654e29a35938baead1c4559858f346f4a2a7588574a14d784f300ffba0efd"}, - {file = "librt-0.7.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c9faaebb1c6212c20afd8043cd6ed9de0a47d77f91a6b5b48f4e46ed470703fe"}, - {file = "librt-0.7.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1908c3e5a5ef86b23391448b47759298f87f997c3bd153a770828f58c2bb4630"}, - {file = "librt-0.7.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbc4900e95a98fc0729523be9d93a8fedebb026f32ed9ffc08acd82e3e181503"}, - {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7ea4e1fbd253e5c68ea0fe63d08577f9d288a73f17d82f652ebc61fa48d878d"}, - {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef7699b7a5a244b1119f85c5bbc13f152cd38240cbb2baa19b769433bae98e50"}, - {file = "librt-0.7.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:955c62571de0b181d9e9e0a0303c8bc90d47670a5eff54cf71bf5da61d1899cf"}, - {file = "librt-0.7.7-cp312-cp312-win32.whl", hash = "sha256:1bcd79be209313b270b0e1a51c67ae1af28adad0e0c7e84c3ad4b5cb57aaa75b"}, - {file = "librt-0.7.7-cp312-cp312-win_amd64.whl", hash = "sha256:4353ee891a1834567e0302d4bd5e60f531912179578c36f3d0430f8c5e16b456"}, - {file = "librt-0.7.7-cp312-cp312-win_arm64.whl", hash = "sha256:a76f1d679beccccdf8c1958e732a1dfcd6e749f8821ee59d7bec009ac308c029"}, - {file = "librt-0.7.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f4a0b0a3c86ba9193a8e23bb18f100d647bf192390ae195d84dfa0a10fb6244"}, - {file = "librt-0.7.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5335890fea9f9e6c4fdf8683061b9ccdcbe47c6dc03ab8e9b68c10acf78be78d"}, - {file = "librt-0.7.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b4346b1225be26def3ccc6c965751c74868f0578cbcba293c8ae9168483d811"}, - {file = "librt-0.7.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a10b8eebdaca6e9fdbaf88b5aefc0e324b763a5f40b1266532590d5afb268a4c"}, - {file = "librt-0.7.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:067be973d90d9e319e6eb4ee2a9b9307f0ecd648b8a9002fa237289a4a07a9e7"}, - {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:23d2299ed007812cccc1ecef018db7d922733382561230de1f3954db28433977"}, - {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6b6f8ea465524aa4c7420c7cc4ca7d46fe00981de8debc67b1cc2e9957bb5b9d"}, - {file = "librt-0.7.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8df32a99cc46eb0ee90afd9ada113ae2cafe7e8d673686cf03ec53e49635439"}, - {file = "librt-0.7.7-cp313-cp313-win32.whl", hash = "sha256:86f86b3b785487c7760247bcdac0b11aa8bf13245a13ed05206286135877564b"}, - {file = "librt-0.7.7-cp313-cp313-win_amd64.whl", hash = "sha256:4862cb2c702b1f905c0503b72d9d4daf65a7fdf5a9e84560e563471e57a56949"}, - {file = "librt-0.7.7-cp313-cp313-win_arm64.whl", hash = "sha256:0996c83b1cb43c00e8c87835a284f9057bc647abd42b5871e5f941d30010c832"}, - {file = "librt-0.7.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:23daa1ab0512bafdd677eb1bfc9611d8ffbe2e328895671e64cb34166bc1b8c8"}, - {file = "librt-0.7.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:558a9e5a6f3cc1e20b3168fb1dc802d0d8fa40731f6e9932dcc52bbcfbd37111"}, - {file = "librt-0.7.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2567cb48dc03e5b246927ab35cbb343376e24501260a9b5e30b8e255dca0d1d2"}, - {file = "librt-0.7.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6066c638cdf85ff92fc6f932d2d73c93a0e03492cdfa8778e6d58c489a3d7259"}, - {file = "librt-0.7.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a609849aca463074c17de9cda173c276eb8fee9e441053529e7b9e249dc8b8ee"}, - {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:add4e0a000858fe9bb39ed55f31085506a5c38363e6eb4a1e5943a10c2bfc3d1"}, - {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a3bfe73a32bd0bdb9a87d586b05a23c0a1729205d79df66dee65bb2e40d671ba"}, - {file = "librt-0.7.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0ecce0544d3db91a40f8b57ae26928c02130a997b540f908cefd4d279d6c5848"}, - {file = "librt-0.7.7-cp314-cp314-win32.whl", hash = "sha256:8f7a74cf3a80f0c3b0ec75b0c650b2f0a894a2cec57ef75f6f72c1e82cdac61d"}, - {file = "librt-0.7.7-cp314-cp314-win_amd64.whl", hash = "sha256:3d1fe2e8df3268dd6734dba33ededae72ad5c3a859b9577bc00b715759c5aaab"}, - {file = "librt-0.7.7-cp314-cp314-win_arm64.whl", hash = "sha256:2987cf827011907d3dfd109f1be0d61e173d68b1270107bb0e89f2fca7f2ed6b"}, - {file = "librt-0.7.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8e92c8de62b40bfce91d5e12c6e8b15434da268979b1af1a6589463549d491e6"}, - {file = "librt-0.7.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f683dcd49e2494a7535e30f779aa1ad6e3732a019d80abe1309ea91ccd3230e3"}, - {file = "librt-0.7.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b15e5d17812d4d629ff576699954f74e2cc24a02a4fc401882dd94f81daba45"}, - {file = "librt-0.7.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c084841b879c4d9b9fa34e5d5263994f21aea7fd9c6add29194dbb41a6210536"}, - {file = "librt-0.7.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c8fb9966f84737115513fecbaf257f9553d067a7dd45a69c2c7e5339e6a8dc"}, - {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5fb1ecb2c35362eab2dbd354fd1efa5a8440d3e73a68be11921042a0edc0ff"}, - {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d1454899909d63cc9199a89fcc4f81bdd9004aef577d4ffc022e600c412d57f3"}, - {file = "librt-0.7.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7ef28f2e7a016b29792fe0a2dd04dec75725b32a1264e390c366103f834a9c3a"}, - {file = "librt-0.7.7-cp314-cp314t-win32.whl", hash = "sha256:5e419e0db70991b6ba037b70c1d5bbe92b20ddf82f31ad01d77a347ed9781398"}, - {file = "librt-0.7.7-cp314-cp314t-win_amd64.whl", hash = "sha256:d6b7d93657332c817b8d674ef6bf1ab7796b4f7ce05e420fd45bd258a72ac804"}, - {file = "librt-0.7.7-cp314-cp314t-win_arm64.whl", hash = "sha256:142c2cd91794b79fd0ce113bd658993b7ede0fe93057668c2f98a45ca00b7e91"}, - {file = "librt-0.7.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c8ffe3431d98cc043a14e88b21288b5ec7ee12cb01260e94385887f285ef9389"}, - {file = "librt-0.7.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e40d20ae1722d6b8ea6acf4597e789604649dcd9c295eb7361a28225bc2e9e12"}, - {file = "librt-0.7.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f2cb63c49bc96847c3bb8dca350970e4dcd19936f391cfdfd057dcb37c4fa97e"}, - {file = "librt-0.7.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f2f8dcf5ab9f80fb970c6fd780b398efb2f50c1962485eb8d3ab07788595a48"}, - {file = "librt-0.7.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1f5cc41a570269d1be7a676655875e3a53de4992a9fa38efb7983e97cf73d7c"}, - {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff1fb2dfef035549565a4124998fadcb7a3d4957131ddf004a56edeb029626b3"}, - {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab2a2a9cd7d044e1a11ca64a86ad3361d318176924bbe5152fbc69f99be20b8c"}, - {file = "librt-0.7.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3fc2d859a709baf9dd9607bb72f599b1cfb8a39eafd41307d0c3c4766763cb"}, - {file = "librt-0.7.7-cp39-cp39-win32.whl", hash = "sha256:f83c971eb9d2358b6a18da51dc0ae00556ac7c73104dde16e9e14c15aaf685ca"}, - {file = "librt-0.7.7-cp39-cp39-win_amd64.whl", hash = "sha256:264720fc288c86039c091a4ad63419a5d7cabbf1c1c9933336a957ed2483e570"}, - {file = "librt-0.7.7.tar.gz", hash = "sha256:81d957b069fed1890953c3b9c3895c7689960f233eea9a1d9607f71ce7f00b2c"}, + {file = "librt-0.7.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b45306a1fc5f53c9330fbee134d8b3227fe5da2ab09813b892790400aa49352d"}, + {file = "librt-0.7.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:864c4b7083eeee250ed55135d2127b260d7eb4b5e953a9e5df09c852e327961b"}, + {file = "librt-0.7.8-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6938cc2de153bc927ed8d71c7d2f2ae01b4e96359126c602721340eb7ce1a92d"}, + {file = "librt-0.7.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:66daa6ac5de4288a5bbfbe55b4caa7bf0cd26b3269c7a476ffe8ce45f837f87d"}, + {file = "librt-0.7.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4864045f49dc9c974dadb942ac56a74cd0479a2aafa51ce272c490a82322ea3c"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a36515b1328dc5b3ffce79fe204985ca8572525452eacabee2166f44bb387b2c"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b7e7f140c5169798f90b80d6e607ed2ba5059784968a004107c88ad61fb3641d"}, + {file = "librt-0.7.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff71447cb778a4f772ddc4ce360e6ba9c95527ed84a52096bd1bbf9fee2ec7c0"}, + {file = "librt-0.7.8-cp310-cp310-win32.whl", hash = "sha256:047164e5f68b7a8ebdf9fae91a3c2161d3192418aadd61ddd3a86a56cbe3dc85"}, + {file = "librt-0.7.8-cp310-cp310-win_amd64.whl", hash = "sha256:d6f254d096d84156a46a84861183c183d30734e52383602443292644d895047c"}, + {file = "librt-0.7.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3e9c11aa260c31493d4b3197d1e28dd07768594a4f92bec4506849d736248f"}, + {file = "librt-0.7.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb52499d0b3ed4aa88746aaf6f36a08314677d5c346234c3987ddc506404eac"}, + {file = "librt-0.7.8-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e9c0afebbe6ce177ae8edba0c7c4d626f2a0fc12c33bb993d163817c41a7a05c"}, + {file = "librt-0.7.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:631599598e2c76ded400c0a8722dec09217c89ff64dc54b060f598ed68e7d2a8"}, + {file = "librt-0.7.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c1ba843ae20db09b9d5c80475376168feb2640ce91cd9906414f23cc267a1ff"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b5b007bb22ea4b255d3ee39dfd06d12534de2fcc3438567d9f48cdaf67ae1ae3"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbd79caaf77a3f590cbe32dc2447f718772d6eea59656a7dcb9311161b10fa75"}, + {file = "librt-0.7.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:87808a8d1e0bd62a01cafc41f0fd6818b5a5d0ca0d8a55326a81643cdda8f873"}, + {file = "librt-0.7.8-cp311-cp311-win32.whl", hash = "sha256:31724b93baa91512bd0a376e7cf0b59d8b631ee17923b1218a65456fa9bda2e7"}, + {file = "librt-0.7.8-cp311-cp311-win_amd64.whl", hash = "sha256:978e8b5f13e52cf23a9e80f3286d7546baa70bc4ef35b51d97a709d0b28e537c"}, + {file = "librt-0.7.8-cp311-cp311-win_arm64.whl", hash = "sha256:20e3946863d872f7cabf7f77c6c9d370b8b3d74333d3a32471c50d3a86c0a232"}, + {file = "librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63"}, + {file = "librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93"}, + {file = "librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592"}, + {file = "librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850"}, + {file = "librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714"}, + {file = "librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449"}, + {file = "librt-0.7.8-cp312-cp312-win32.whl", hash = "sha256:0241a6ed65e6666236ea78203a73d800dbed896cf12ae25d026d75dc1fcd1dac"}, + {file = "librt-0.7.8-cp312-cp312-win_amd64.whl", hash = "sha256:6db5faf064b5bab9675c32a873436b31e01d66ca6984c6f7f92621656033a708"}, + {file = "librt-0.7.8-cp312-cp312-win_arm64.whl", hash = "sha256:57175aa93f804d2c08d2edb7213e09276bd49097611aefc37e3fa38d1fb99ad0"}, + {file = "librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc"}, + {file = "librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2"}, + {file = "librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3"}, + {file = "librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6"}, + {file = "librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca"}, + {file = "librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93"}, + {file = "librt-0.7.8-cp313-cp313-win32.whl", hash = "sha256:b09c52ed43a461994716082ee7d87618096851319bf695d57ec123f2ab708951"}, + {file = "librt-0.7.8-cp313-cp313-win_amd64.whl", hash = "sha256:f8f4a901a3fa28969d6e4519deceab56c55a09d691ea7b12ca830e2fa3461e34"}, + {file = "librt-0.7.8-cp313-cp313-win_arm64.whl", hash = "sha256:43d4e71b50763fcdcf64725ac680d8cfa1706c928b844794a7aa0fa9ac8e5f09"}, + {file = "librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418"}, + {file = "librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611"}, + {file = "librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758"}, + {file = "librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea"}, + {file = "librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81"}, + {file = "librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83"}, + {file = "librt-0.7.8-cp314-cp314-win32.whl", hash = "sha256:7aa7d5457b6c542ecaed79cec4ad98534373c9757383973e638ccced0f11f46d"}, + {file = "librt-0.7.8-cp314-cp314-win_amd64.whl", hash = "sha256:3d1322800771bee4a91f3b4bd4e49abc7d35e65166821086e5afd1e6c0d9be44"}, + {file = "librt-0.7.8-cp314-cp314-win_arm64.whl", hash = "sha256:5363427bc6a8c3b1719f8f3845ea53553d301382928a86e8fab7984426949bce"}, + {file = "librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f"}, + {file = "librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b"}, + {file = "librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a"}, + {file = "librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca"}, + {file = "librt-0.7.8-cp314-cp314t-win32.whl", hash = "sha256:171ca3a0a06c643bd0a2f62a8944e1902c94aa8e5da4db1ea9a8daf872685365"}, + {file = "librt-0.7.8-cp314-cp314t-win_amd64.whl", hash = "sha256:445b7304145e24c60288a2f172b5ce2ca35c0f81605f5299f3fa567e189d2e32"}, + {file = "librt-0.7.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8766ece9de08527deabcd7cb1b4f1a967a385d26e33e536d6d8913db6ef74f06"}, + {file = "librt-0.7.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c7e8f88f79308d86d8f39c491773cbb533d6cb7fa6476f35d711076ee04fceb6"}, + {file = "librt-0.7.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:389bd25a0db916e1d6bcb014f11aa9676cedaa485e9ec3752dfe19f196fd377b"}, + {file = "librt-0.7.8-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73fd300f501a052f2ba52ede721232212f3b06503fa12665408ecfc9d8fd149c"}, + {file = "librt-0.7.8-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d772edc6a5f7835635c7562f6688e031f0b97e31d538412a852c49c9a6c92d5"}, + {file = "librt-0.7.8-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde8a130bd0f239e45503ab39fab239ace094d63ee1d6b67c25a63d741c0f71"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fdec6e2368ae4f796fc72fad7fd4bd1753715187e6d870932b0904609e7c878e"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:00105e7d541a8f2ee5be52caacea98a005e0478cfe78c8080fbb7b5d2b340c63"}, + {file = "librt-0.7.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c6f8947d3dfd7f91066c5b4385812c18be26c9d5a99ca56667547f2c39149d94"}, + {file = "librt-0.7.8-cp39-cp39-win32.whl", hash = "sha256:41d7bb1e07916aeb12ae4a44e3025db3691c4149ab788d0315781b4d29b86afb"}, + {file = "librt-0.7.8-cp39-cp39-win_amd64.whl", hash = "sha256:e90a8e237753c83b8e484d478d9a996dc5e39fd5bd4c6ce32563bc8123f132be"}, + {file = "librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862"}, ] [[package]] @@ -1755,16 +1756,22 @@ testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.3" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-1.0.3-py3-none-any.whl", hash = "sha256:e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c"}, + {file = "pathspec-1.0.3.tar.gz", hash = "sha256:bac5cf97ae2c2876e2d25ebb15078eb04d76e4b98921ee31c6f85ade8b59444d"}, ] +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + [[package]] name = "pexpect" version = "4.9.0" @@ -2174,97 +2181,97 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.15.5" +version = "4.16.0" description = "PyMongo - the Official MongoDB Python driver" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pymongo-4.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a01a2054d50b50c121c720739a2216d855c48726b0002894de9b991cdd68a2a5"}, - {file = "pymongo-4.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e57968139d81367117ed7b75d921445a575d4d7e61536f5e860475df92ac0a9"}, - {file = "pymongo-4.15.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:266aa37e3673e5dcfdd359a81d27131fc133e49cf8e5d9f9f27a5845fac2cd1f"}, - {file = "pymongo-4.15.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2883da6bd0545cc2f12672f6a609b33d48e099a220872ca2bf9bf29fe96a32c3"}, - {file = "pymongo-4.15.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2fc32b354a608ec748d89bbe236b74b967890667eea1af54e92dfd8fbf26df52"}, - {file = "pymongo-4.15.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3c006cbaa4b40d296dd2bb8828976866c876ead4c39032b761dcf26f1ba56fde"}, - {file = "pymongo-4.15.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce21e3dc5939b83d03f871090d83ac29fef055bd057f8d3074b6cad10f86b04c"}, - {file = "pymongo-4.15.5-cp310-cp310-win32.whl", hash = "sha256:1b545dcf66a9f06e9b501bfb0438e1eb9af67336e8a5cf36c4bc0a5d3fbe7a37"}, - {file = "pymongo-4.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:1ecc544f515f828f05d3c56cd98063ba3ef8b75f534c63de43306d59f1e93fcd"}, - {file = "pymongo-4.15.5-cp310-cp310-win_arm64.whl", hash = "sha256:1151968ab90db146f0591b6c7db27ce4f73c7ffa0bbddc1d7fb7cb14c9f0b967"}, - {file = "pymongo-4.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:57157a4b936e28e2fbe7017b2f6a751da5e284675cab371f2c596d4e0e4f58f3"}, - {file = "pymongo-4.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2a34a7391f4cc54fc584e49db6f7c3929221a9da08b3af2d2689884a5943843"}, - {file = "pymongo-4.15.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:be040c8cdaf9c2d5ae9ab60a67ecab453ec19d9ccd457a678053fdceab5ee4c8"}, - {file = "pymongo-4.15.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:defe93944526b1774265c16acf014689cb1b0b18eb84a7b370083b214f9e18cd"}, - {file = "pymongo-4.15.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:816e66116f0ef868eff0463a8b28774af8b547466dbad30c8e82bf0325041848"}, - {file = "pymongo-4.15.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66c7b332532e0f021d784d04488dbf7ed39b7e7d6d5505e282ec8e9cf1025791"}, - {file = "pymongo-4.15.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:acc46a9e47efad8c5229e644a3774169013a46ee28ac72d1fa4edd67c0b7ee9b"}, - {file = "pymongo-4.15.5-cp311-cp311-win32.whl", hash = "sha256:b9836c28ba350d8182a51f32ef9bb29f0c40e82ba1dfb9e4371cd4d94338a55d"}, - {file = "pymongo-4.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:3a45876c5c2ab44e2a249fb542eba2a026f60d6ab04c7ef3924eae338d9de790"}, - {file = "pymongo-4.15.5-cp311-cp311-win_arm64.whl", hash = "sha256:e4a48fc5c712b3db85c9987cfa7fde0366b7930018de262919afd9e52cfbc375"}, - {file = "pymongo-4.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c33477af1a50d1b4d86555e098fc2cf5992d839ad538dea0c00a8682162b7a75"}, - {file = "pymongo-4.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e6b30defa4a52d3698cd84d608963a8932f7e9b6ec5130087e7082552ac685e5"}, - {file = "pymongo-4.15.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:45fec063f5672e6173bcb09b492431e3641cc74399c2b996fcb995881c2cac61"}, - {file = "pymongo-4.15.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8c6813110c0d9fde18674b7262f47a2270ae46c0ddd05711e6770caa3c9a3fb"}, - {file = "pymongo-4.15.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8ec48d1db9f44c737b13be4299a1782d5fde3e75423acbbbe927cb37ebbe87d"}, - {file = "pymongo-4.15.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f410694fdd76631ead7df6544cdeadaf2407179196c3642fced8e48bb21d0a6"}, - {file = "pymongo-4.15.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8c46765d6ac5727a899190aacdeec7a57f8c93346124ddd7e12633b573e2e65"}, - {file = "pymongo-4.15.5-cp312-cp312-win32.whl", hash = "sha256:647118a58dca7d3547714fc0b383aebf81f5852f4173dfd77dd34e80eea9d29b"}, - {file = "pymongo-4.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:099d3e2dddfc75760c6a8fadfb99c1e88824a99c2c204a829601241dff9da049"}, - {file = "pymongo-4.15.5-cp312-cp312-win_arm64.whl", hash = "sha256:649cb906882c4058f467f334fb277083998ba5672ffec6a95d6700db577fd31a"}, - {file = "pymongo-4.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b736226f9001bbbd02f822acb9b9b6d28319f362f057672dfae2851f7da6125"}, - {file = "pymongo-4.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:60ea9f07fbbcc7c88f922082eb27436dce6756730fdef76a3a9b4c972d0a57a3"}, - {file = "pymongo-4.15.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:20af63218ae42870eaee31fb8cc4ce9e3af7f04ea02fc98ad751fb7a9c8d7be3"}, - {file = "pymongo-4.15.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20d9c11625392f1f8dec7688de5ce344e110ca695344efa313ae4839f13bd017"}, - {file = "pymongo-4.15.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1202b3e5357b161acb7b7cc98e730288a5c15544e5ef7254b33931cb9a27c36e"}, - {file = "pymongo-4.15.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:63af710e9700dbf91abccf119c5f5533b9830286d29edb073803d3b252862c0d"}, - {file = "pymongo-4.15.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22eeb86861cf7b8ee6886361d52abb88e3cd96c6f6d102e45e2604fc6e9e316"}, - {file = "pymongo-4.15.5-cp313-cp313-win32.whl", hash = "sha256:aad6efe82b085bf77cec2a047ded2c810e93eced3ccf1a8e3faec3317df3cd52"}, - {file = "pymongo-4.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:ccc801f6d71ebee2ec2fb3acc64b218fa7cdb7f57933b2f8eee15396b662a0a0"}, - {file = "pymongo-4.15.5-cp313-cp313-win_arm64.whl", hash = "sha256:f043abdf20845bf29a554e95e4fe18d7d7a463095d6a1547699a12f80da91e02"}, - {file = "pymongo-4.15.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba0e75a390334221744e2666fd2d4c82419b580c9bc8d6e0d2d61459d263f3af"}, - {file = "pymongo-4.15.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:853ec7da97642eabaf94d3de4453a86365729327d920af167bf14b2e87b24dce"}, - {file = "pymongo-4.15.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7631304106487480ebbd8acbe44ff1e69d1fdc27e83d9753dc1fd227cea10761"}, - {file = "pymongo-4.15.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50505181365eba5d4d35c462870b3614c8eddd0b2407c89377c1a59380640dd9"}, - {file = "pymongo-4.15.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b75ec7006471299a571d6db1c5609ea4aa9c847a701e9b2953a8ede705d82db"}, - {file = "pymongo-4.15.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c3fc24cb1f4ec60ed83162d4bba0c26abc6c9ae78c928805583673f3b3ea6984"}, - {file = "pymongo-4.15.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21d17bb2934b0640863361c08dd06991f128a97f9bee19425a499227be9ae6b4"}, - {file = "pymongo-4.15.5-cp314-cp314-win32.whl", hash = "sha256:5a3974236cb842b4ef50a5a6bfad9c7d83a713af68ea3592ba240bbcb863305a"}, - {file = "pymongo-4.15.5-cp314-cp314-win_amd64.whl", hash = "sha256:73fa8a7eee44fd95ba7d5cf537340ff3ff34efeb1f7d6790532d0a6ed4dee575"}, - {file = "pymongo-4.15.5-cp314-cp314-win_arm64.whl", hash = "sha256:d41288ca2a3eb9ac7c8cad4ea86ef8d63b69dc46c9b65c2bbd35331ec2a0fc57"}, - {file = "pymongo-4.15.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:552670f0c8bff103656d4e4b1f2c018f789c9de03f7615ed5e547d5b1b83cda0"}, - {file = "pymongo-4.15.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:41891b45f6ff1e23cfd1b7fbe40286664ad4507e2d2aa61c6d8c40eb6e11dded"}, - {file = "pymongo-4.15.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:524a8a593ae2eb1ec6db761daf0c03f98824e9882ab7df3d458d0c76c7ade255"}, - {file = "pymongo-4.15.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e7ceb35c41b86711a1b284c604e2b944a2d46cb1b8dd3f8b430a9155491378f2"}, - {file = "pymongo-4.15.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3be2336715924be3a861b5e40c634376fd6bfe6dd1892d391566aa5a88a31307"}, - {file = "pymongo-4.15.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d65df9c015e33f74ea9d1abf474971abca21e347a660384f8227dbdab75a33ca"}, - {file = "pymongo-4.15.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83c05bea05e151754357f8e6bbb80d5accead5110dc58f64e283173c71ec9de2"}, - {file = "pymongo-4.15.5-cp314-cp314t-win32.whl", hash = "sha256:7c285614a3e8570b03174a25db642e449b0e7f77a6c9e487b73b05c9bf228ee6"}, - {file = "pymongo-4.15.5-cp314-cp314t-win_amd64.whl", hash = "sha256:aae7d96f7b2b1a2753349130797543e61e93ee2ace8faa7fbe0565e2eb5d815f"}, - {file = "pymongo-4.15.5-cp314-cp314t-win_arm64.whl", hash = "sha256:576a7d4b99465d38112c72f7f3d345f9d16aeeff0f923a3b298c13e15ab4f0ad"}, - {file = "pymongo-4.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:092ed5f3a53b546f8350a77976dabb0a11105d6b7c0f86a39934464168c97cff"}, - {file = "pymongo-4.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5762f6445a611b34eb500260303483520bd73e6816a39503378444d551e92f7c"}, - {file = "pymongo-4.15.5-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:397fa40b6d331949debd3e0892c420a81a44e7e0f5a570661910b0c57a7e7431"}, - {file = "pymongo-4.15.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d5710c0e04c37932984241282d3011304c35eb798a0026d84e1bd3525266d026"}, - {file = "pymongo-4.15.5-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a476310f3c9bdba08ab4b1d4309ee308a1b9e22823210fd7b48c83709e95ac4"}, - {file = "pymongo-4.15.5-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db5689bd2c1cf1dc4f4e94ec8a012ea521f9892a85b3c694fa9ace7cdc2d0416"}, - {file = "pymongo-4.15.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e2623deb5be1b5bc23319ba5ab435b5a526a1e92739ff0e0e9048823f295460"}, - {file = "pymongo-4.15.5-cp39-cp39-win32.whl", hash = "sha256:addaaa62c357e8de3d0fca2fce1acf5b72f4bbf4e7bb35ce1dd68e40e73880f9"}, - {file = "pymongo-4.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:1e4070593ea98bc6def3c84cfc6de28da289e4ed944bb20845f9de9beefb0921"}, - {file = "pymongo-4.15.5-cp39-cp39-win_arm64.whl", hash = "sha256:01227e6bc75a949f7d3303005e27707a0e14a941dc63a183cd449c80e7853fe3"}, - {file = "pymongo-4.15.5.tar.gz", hash = "sha256:3a8d6bf2610abe0c97c567cf98bf5bba3e90ccc93cc03c9dde75fa11e4267b42"}, + {file = "pymongo-4.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ed162b2227f98d5b270ecbe1d53be56c8c81db08a1a8f5f02d89c7bb4d19591d"}, + {file = "pymongo-4.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a9390dce61d705a88218f0d7b54d7e1fa1b421da8129fc7c009e029a9a6b81e"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:92a232af9927710de08a6c16a9710cc1b175fb9179c0d946cd4e213b92b2a69a"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d79aa147ce86aef03079096d83239580006ffb684eead593917186aee407767"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:19a1c96e7f39c7a59a9cfd4d17920cf9382f6f684faeff4649bf587dc59f8edc"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efe020c46ce3c3a89af6baec6569635812129df6fb6cf76d4943af3ba6ee2069"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dc2c00bed568732b89e211b6adca389053d5e6d2d5a8979e80b813c3ec4d1f9"}, + {file = "pymongo-4.16.0-cp310-cp310-win32.whl", hash = "sha256:5b9c6d689bbe5beb156374508133218610e14f8c81e35bc17d7a14e30ab593e6"}, + {file = "pymongo-4.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:2290909275c9b8f637b0a92eb9b89281e18a72922749ebb903403ab6cc7da914"}, + {file = "pymongo-4.16.0-cp310-cp310-win_arm64.whl", hash = "sha256:6af1aaa26f0835175d2200e62205b78e7ec3ffa430682e322cc91aaa1a0dbf28"}, + {file = "pymongo-4.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f2077ec24e2f1248f9cac7b9a2dfb894e50cc7939fcebfb1759f99304caabef"}, + {file = "pymongo-4.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d4f7ba040f72a9f43a44059872af5a8c8c660aa5d7f90d5344f2ed1c3c02721"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8a0f73af1ea56c422b2dcfc0437459148a799ef4231c6aee189d2d4c59d6728f"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa30cd16ddd2f216d07ba01d9635c873e97ddb041c61cf0847254edc37d1c60e"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d638b0b1b294d95d0fdc73688a3b61e05cc4188872818cd240d51460ccabcb5"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:21d02cc10a158daa20cb040985e280e7e439832fc6b7857bff3d53ef6914ad50"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fbb8d3552c2ad99d9e236003c0b5f96d5f05e29386ba7abae73949bfebc13dd"}, + {file = "pymongo-4.16.0-cp311-cp311-win32.whl", hash = "sha256:be1099a8295b1a722d03fb7b48be895d30f4301419a583dcf50e9045968a041c"}, + {file = "pymongo-4.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:61567f712bda04c7545a037e3284b4367cad8d29b3dec84b4bf3b2147020a75b"}, + {file = "pymongo-4.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:c53338613043038005bf2e41a2fafa08d29cdbc0ce80891b5366c819456c1ae9"}, + {file = "pymongo-4.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bd4911c40a43a821dfd93038ac824b756b6e703e26e951718522d29f6eb166a8"}, + {file = "pymongo-4.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25a6b03a68f9907ea6ec8bc7cf4c58a1b51a18e23394f962a6402f8e46d41211"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:91ac0cb0fe2bf17616c2039dac88d7c9a5088f5cb5829b27c9d250e053664d31"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf0ec79e8ca7077f455d14d915d629385153b6a11abc0b93283ed73a8013e376"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2d0082631a7510318befc2b4fdab140481eb4b9dd62d9245e042157085da2a70"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85dc2f3444c346ea019a371e321ac868a4fab513b7a55fe368f0cc78de8177cc"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dabbf3c14de75a20cc3c30bf0c6527157224a93dfb605838eabb1a2ee3be008d"}, + {file = "pymongo-4.16.0-cp312-cp312-win32.whl", hash = "sha256:60307bb91e0ab44e560fe3a211087748b2b5f3e31f403baf41f5b7b0a70bd104"}, + {file = "pymongo-4.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:f513b2c6c0d5c491f478422f6b5b5c27ac1af06a54c93ef8631806f7231bd92e"}, + {file = "pymongo-4.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:dfc320f08ea9a7ec5b2403dc4e8150636f0d6150f4b9792faaae539c88e7db3b"}, + {file = "pymongo-4.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d15f060bc6d0964a8bb70aba8f0cb6d11ae99715438f640cff11bbcf172eb0e8"}, + {file = "pymongo-4.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a19ea46a0fe71248965305a020bc076a163311aefbaa1d83e47d06fa30ac747"}, + {file = "pymongo-4.16.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:311d4549d6bf1f8c61d025965aebb5ba29d1481dc6471693ab91610aaffbc0eb"}, + {file = "pymongo-4.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46ffb728d92dd5b09fc034ed91acf5595657c7ca17d4cf3751322cd554153c17"}, + {file = "pymongo-4.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:acda193f440dd88c2023cb00aa8bd7b93a9df59978306d14d87a8b12fe426b05"}, + {file = "pymongo-4.16.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d9fdb386cf958e6ef6ff537d6149be7edb76c3268cd6833e6c36aa447e4443f"}, + {file = "pymongo-4.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91899dd7fb9a8c50f09c3c1cf0cb73bfbe2737f511f641f19b9650deb61c00ca"}, + {file = "pymongo-4.16.0-cp313-cp313-win32.whl", hash = "sha256:2cd60cd1e05de7f01927f8e25ca26b3ea2c09de8723241e5d3bcfdc70eaff76b"}, + {file = "pymongo-4.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3ead8a0050c53eaa55935895d6919d393d0328ec24b2b9115bdbe881aa222673"}, + {file = "pymongo-4.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:dbbc5b254c36c37d10abb50e899bc3939bbb7ab1e7c659614409af99bd3e7675"}, + {file = "pymongo-4.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8a254d49a9ffe9d7f888e3c677eed3729b14ce85abb08cd74732cead6ccc3c66"}, + {file = "pymongo-4.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a1bf44e13cf2d44d2ea2e928a8140d5d667304abe1a61c4d55b4906f389fbe64"}, + {file = "pymongo-4.16.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f1c5f1f818b669875d191323a48912d3fcd2e4906410e8297bb09ac50c4d5ccc"}, + {file = "pymongo-4.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77cfd37a43a53b02b7bd930457c7994c924ad8bbe8dff91817904bcbf291b371"}, + {file = "pymongo-4.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:36ef2fee50eee669587d742fb456e349634b4fcf8926208766078b089054b24b"}, + {file = "pymongo-4.16.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55f8d5a6fe2fa0b823674db2293f92d74cd5f970bc0360f409a1fc21003862d3"}, + {file = "pymongo-4.16.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9caacac0dd105e2555521002e2d17afc08665187017b466b5753e84c016628e6"}, + {file = "pymongo-4.16.0-cp314-cp314-win32.whl", hash = "sha256:c789236366525c3ee3cd6e4e450a9ff629a7d1f4d88b8e18a0aea0615fd7ecf8"}, + {file = "pymongo-4.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:2b0714d7764efb29bf9d3c51c964aed7c4c7237b341f9346f15ceaf8321fdb35"}, + {file = "pymongo-4.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:12762e7cc0f8374a8cae3b9f9ed8dabb5d438c7b33329232dd9b7de783454033"}, + {file = "pymongo-4.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1c01e8a7cd0ea66baf64a118005535ab5bf9f9eb63a1b50ac3935dccf9a54abe"}, + {file = "pymongo-4.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4c4872299ebe315a79f7f922051061634a64fda95b6b17677ba57ef00b2ba2a4"}, + {file = "pymongo-4.16.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:78037d02389745e247fe5ab0bcad5d1ab30726eaac3ad79219c7d6bbb07eec53"}, + {file = "pymongo-4.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c126fb72be2518395cc0465d4bae03125119136462e1945aea19840e45d89cfc"}, + {file = "pymongo-4.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f3867dc225d9423c245a51eaac2cfcd53dde8e0a8d8090bb6aed6e31bd6c2d4f"}, + {file = "pymongo-4.16.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f25001a955073b80510c0c3db0e043dbbc36904fd69e511c74e3d8640b8a5111"}, + {file = "pymongo-4.16.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d9885aad05f82fd7ea0c9ca505d60939746b39263fa273d0125170da8f59098"}, + {file = "pymongo-4.16.0-cp314-cp314t-win32.whl", hash = "sha256:948152b30eddeae8355495f9943a3bf66b708295c0b9b6f467de1c620f215487"}, + {file = "pymongo-4.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f6e42c1bc985d9beee884780ae6048790eb4cd565c46251932906bdb1630034a"}, + {file = "pymongo-4.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6b2a20edb5452ac8daa395890eeb076c570790dfce6b7a44d788af74c2f8cf96"}, + {file = "pymongo-4.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e2d509786344aa844ae243f68f833ca1ac92ac3e35a92ae038e2ceb44aa355ef"}, + {file = "pymongo-4.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:15bb062c0d6d4b0be650410032152de656a2a9a2aa4e1a7443a22695afacb103"}, + {file = "pymongo-4.16.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4cd047ba6cc83cc24193b9208c93e134a985ead556183077678c59af7aacc725"}, + {file = "pymongo-4.16.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96aa7ab896889bf330209d26459e493d00f8855772a9453bfb4520bb1f495baf"}, + {file = "pymongo-4.16.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66af44ed23686dd5422307619a6db4b56733c5e36fe8c4adf91326dcf993a043"}, + {file = "pymongo-4.16.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:03f42396c1b2c6f46f5401c5b185adc25f6113716e16d9503977ee5386fca0fb"}, + {file = "pymongo-4.16.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d284bf68daffc57516535f752e290609b3b643f4bd54b28fc13cb16a89a8bda6"}, + {file = "pymongo-4.16.0-cp39-cp39-win32.whl", hash = "sha256:7902882ed0efb7f0e991458ab3b8cf0eb052957264949ece2f09b63c58b04f78"}, + {file = "pymongo-4.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:e37469602473f41221cea93fd3736708f561f0fa08ab6b2873dd962014390d52"}, + {file = "pymongo-4.16.0-cp39-cp39-win_arm64.whl", hash = "sha256:2a3ba6be3d8acf64b77cdcd4e36f0e4a8e87965f14a8b09b90ca86f10a1dd2f2"}, + {file = "pymongo-4.16.0.tar.gz", hash = "sha256:8ba8405065f6e258a6f872fe62d797a28f383a12178c7153c01ed04e845c600c"}, ] [package.dependencies] -dnspython = ">=1.16.0,<3.0.0" +dnspython = ">=2.6.1,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] -docs = ["furo (==2025.7.19)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<9)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<4)", "sphinxcontrib-shellcheck (>=1,<2)"] -encryption = ["certifi ; os_name == \"nt\" or sys_platform == \"darwin\"", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.13.0,<2.0.0)"] -gssapi = ["pykerberos ; os_name != \"nt\"", "winkerberos (>=0.5.0) ; os_name == \"nt\""] -ocsp = ["certifi ; os_name == \"nt\" or sys_platform == \"darwin\"", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] -snappy = ["python-snappy"] -test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] -zstd = ["zstandard"] +docs = ["furo (==2025.12.19)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<9)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<4)", "sphinxcontrib-shellcheck (>=1,<2)"] +encryption = ["certifi (>=2023.7.22) ; os_name == \"nt\" or sys_platform == \"darwin\"", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.13.0,<2.0.0)"] +gssapi = ["pykerberos (>=1.2.4) ; os_name != \"nt\"", "winkerberos (>=0.5.0) ; os_name == \"nt\""] +ocsp = ["certifi (>=2023.7.22) ; os_name == \"nt\" or sys_platform == \"darwin\"", "cryptography (>=42.0.0)", "pyopenssl (>=23.2.0)", "requests (>=2.23.0,<3.0)", "service-identity (>=23.1.0)"] +snappy = ["python-snappy (>=0.6.0)"] +test = ["importlib-metadata (>=7.0) ; python_version < \"3.13\"", "pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "pyparsing" @@ -2332,6 +2339,21 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.2.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, + {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -2824,54 +2846,59 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.3.0" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, - {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, - {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, - {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, - {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, - {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, - {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, - {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, - {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, - {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, - {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, - {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, - {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, - {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, - {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, - {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, - {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, - {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, - {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, - {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, - {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, - {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, - {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, - {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, - {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, - {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, - {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, - {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] [[package]] @@ -2979,14 +3006,14 @@ typing-extensions = ">=4.12.0" [[package]] name = "urllib3" -version = "2.6.2" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd"}, - {file = "urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] @@ -3093,4 +3120,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "85ffa98c0d062ead14488595fb74718250e99a649e0a755de303abc001acf8ff" +content-hash = "a41f7de47bcddbb0ed7a559241446d68956eb926c495c712f28aecfaea005326" diff --git a/pyproject.toml b/pyproject.toml index 44aea7d..0cc0fe0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "sample" version = "1.0.0" -description = "A python template for fastapi and streamlit projects." +description = "A python template for fastapi and mongo projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" readme = "README.md" requires-python = ">=3.10,<3.13" -keywords = ["python", "fastapi", "streamlit"] +keywords = ["python", "fastapi", "mongo", "template"] classifiers = [ "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Image Recognition", @@ -16,6 +16,7 @@ dependencies = [ "python-box (>=7.3.2,<8.0.0)", "uvicorn (>=0.40.0,<0.41.0)", "pymongo (>=4.15.5,<5.0.0)", + "python-dotenv (>=1.2.1,<2.0.0)", ] @@ -32,6 +33,8 @@ packages = [ [project.scripts] sample = "sample.cli:cli" lint = "utils.lint:main" +clean = "utils.clean:clean" +reset = "utils.clean:reset" [tool.poetry.group.dev.dependencies] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 37482ef..0000000 --- a/requirements.txt +++ /dev/null @@ -1,53 +0,0 @@ -altair==6.0.0 ; python_version >= "3.10" and python_version < "3.13" -annotated-doc==0.0.4 ; python_version >= "3.10" and python_version < "3.13" -annotated-types==0.7.0 ; python_version >= "3.10" and python_version < "3.13" -anyio==4.12.0 ; python_version >= "3.10" and python_version < "3.13" -attrs==25.4.0 ; python_version >= "3.10" and python_version < "3.13" -blinker==1.9.0 ; python_version >= "3.10" and python_version < "3.13" -cachetools==6.2.4 ; python_version >= "3.10" and python_version < "3.13" -certifi==2025.11.12 ; python_version >= "3.10" and python_version < "3.13" -charset-normalizer==3.4.4 ; python_version >= "3.10" and python_version < "3.13" -click==8.3.1 ; python_version >= "3.10" and python_version < "3.13" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.13" and platform_system == "Windows" -dnspython==2.8.0 ; python_version >= "3.10" and python_version < "3.13" -exceptiongroup==1.3.1 ; python_version == "3.10" -fastapi==0.121.3 ; python_version >= "3.10" and python_version < "3.13" -gitdb==4.0.12 ; python_version >= "3.10" and python_version < "3.13" -gitpython==3.1.45 ; python_version >= "3.10" and python_version < "3.13" -h11==0.16.0 ; python_version >= "3.10" and python_version < "3.13" -idna==3.11 ; python_version >= "3.10" and python_version < "3.13" -jinja2==3.1.6 ; python_version >= "3.10" and python_version < "3.13" -jsonschema-specifications==2025.9.1 ; python_version >= "3.10" and python_version < "3.13" -jsonschema==4.25.1 ; python_version >= "3.10" and python_version < "3.13" -markupsafe==3.0.3 ; python_version >= "3.10" and python_version < "3.13" -narwhals==2.14.0 ; python_version >= "3.10" and python_version < "3.13" -numpy==2.2.6 ; python_version == "3.10" -numpy==2.4.0 ; python_version >= "3.11" and python_version < "3.13" -packaging==25.0 ; python_version >= "3.10" and python_version < "3.13" -pandas==2.3.3 ; python_version >= "3.10" and python_version < "3.13" -pillow==12.0.0 ; python_version >= "3.10" and python_version < "3.13" -protobuf==6.33.2 ; python_version >= "3.10" and python_version < "3.13" -pyarrow==22.0.0 ; python_version >= "3.10" and python_version < "3.13" -pydantic-core==2.41.5 ; python_version >= "3.10" and python_version < "3.13" -pydantic==2.12.5 ; python_version >= "3.10" and python_version < "3.13" -pydeck==0.9.1 ; python_version >= "3.10" and python_version < "3.13" -pymongo==4.15.5 ; python_version >= "3.10" and python_version < "3.13" -python-box==7.3.2 ; python_version >= "3.10" and python_version < "3.13" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.13" -pytz==2025.2 ; python_version >= "3.10" and python_version < "3.13" -referencing==0.37.0 ; python_version >= "3.10" and python_version < "3.13" -requests==2.32.5 ; python_version >= "3.10" and python_version < "3.13" -rpds-py==0.30.0 ; python_version >= "3.10" and python_version < "3.13" -six==1.17.0 ; python_version >= "3.10" and python_version < "3.13" -smmap==5.0.2 ; python_version >= "3.10" and python_version < "3.13" -starlette==0.50.0 ; python_version >= "3.10" and python_version < "3.13" -streamlit==1.52.2 ; python_version >= "3.10" and python_version < "3.13" -tenacity==9.1.2 ; python_version >= "3.10" and python_version < "3.13" -toml==0.10.2 ; python_version >= "3.10" and python_version < "3.13" -tornado==6.5.4 ; python_version >= "3.10" and python_version < "3.13" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "3.13" -typing-inspection==0.4.2 ; python_version >= "3.10" and python_version < "3.13" -tzdata==2025.3 ; python_version >= "3.10" and python_version < "3.13" -urllib3==2.6.2 ; python_version >= "3.10" and python_version < "3.13" -uvicorn==0.40.0 ; python_version >= "3.10" and python_version < "3.13" -watchdog==6.0.0 ; python_version >= "3.10" and python_version < "3.13" and platform_system != "Darwin" diff --git a/sample-py.code-workspace b/sample-py.code-workspace index a5116b1..ab37bf3 100644 --- a/sample-py.code-workspace +++ b/sample-py.code-workspace @@ -154,14 +154,6 @@ "inputs": [], "servers": {} }, - "chat.mcp.serverSampling": { - "tz-script.code-workspace: my-mcp-server-c37295de": { - "allowedModels": [ - "copilot/gpt-4.1", - "copilot/claude-3.5-sonnet" - ] - } - }, "gitstash.explorer.display.fileSorting": "tree", "files.insertFinalNewline": true, } diff --git a/src/db/connection.py b/src/db/connection.py index a7a824e..af9a697 100644 --- a/src/db/connection.py +++ b/src/db/connection.py @@ -1,35 +1,41 @@ +import io from datetime import datetime from typing import Optional + from pymongo import MongoClient from pymongo.database import Database -from pymongo.collection import Collection -import io from utils.constants import MONGO_CONFIG -mongo_client: Optional[MongoClient] -db: Optional[Database] -collection: Optional[Collection] -fabric_collection: Optional[Collection] -processing_times_collection: Optional[Collection] +_mongo_client: Optional[MongoClient] = None +_db: Optional[Database] = None + + +def connect_db() -> Database: + global _mongo_client, _db -# Initialize MongoDB connections with error handling -try: - mongo_client = MongoClient(MONGO_CONFIG["MONGODB_URI"]) - db = mongo_client[MONGO_CONFIG["DATABASE_NAME"]] -except KeyError as e: - print(f"MongoDB Configuration Error: Missing key {e}") - mongo_client = None - db = None - collection = None + if _db is not None: + return _db -except Exception as e: - print(f"MongoDB Connection Error: {e}") - mongo_client = None - db = None + try: + uri = MONGO_CONFIG["MONGODB_URI"] + name = MONGO_CONFIG["DATABASE_NAME"] + print("Mongo URI =", repr(uri)) + + _mongo_client = MongoClient(uri, serverSelectionTimeoutMS=3000) + # This forces an actual connection attempt + _mongo_client.admin.command("ping") + _db = _mongo_client[name] + print("MongoDB connected successfully.") + return _db + + except KeyError as e: + raise RuntimeError(f"MongoDB Configuration Error: Missing key {e}") + + except Exception as e: + raise RuntimeError(f"MongoDB Connection Error: {e}") def save_to_mongodb(data: dict, collection): - """Insert processed JSON data into MongoDB""" try: data["created_at"] = datetime.now() result = collection.insert_one(data) @@ -43,4 +49,4 @@ def pil_to_bytes(pil_image): buf = io.BytesIO() pil_image.save(buf, format="PNG") buf.seek(0) - return buf \ No newline at end of file + return buf diff --git a/src/sample/__main__.py b/src/sample/__main__.py index 1890b20..54dc458 100644 --- a/src/sample/__main__.py +++ b/src/sample/__main__.py @@ -1,17 +1,23 @@ import logging -from pathlib import Path +import os from http.server import SimpleHTTPRequestHandler +from pathlib import Path from socketserver import TCPServer -import os +from db.connection import connect_db from utils.constants import PORT -from . import __version__ +from . import __version__ def main(): print("🏷️ Sample version:", __version__) logging.info("Starting static HTML server...") + db = connect_db() + + # Future app bootstrapping goes here + print(f"Using database: {db.name}") + print("App is ready.") sample_dir = Path(__file__).resolve().parent.parent diff --git a/src/utils/__init__.py b/src/utils/__init__.py index 42ca9c6..e69de29 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -1,4 +0,0 @@ -from db.connection import mongo_client - -if mongo_client: - print("MongoDB connected successfully.") \ No newline at end of file diff --git a/src/utils/clean.py b/src/utils/clean.py new file mode 100644 index 0000000..18bac97 --- /dev/null +++ b/src/utils/clean.py @@ -0,0 +1,45 @@ +import os +import shutil +import subprocess +from pathlib import Path + + +def _remove_artifacts(): + for path in ["dist", "build"]: + shutil.rmtree(path, ignore_errors=True) + + for p in Path(".").glob("*.egg-info"): + shutil.rmtree(p, ignore_errors=True) + + +def clean(): + print("Cleaning build artifacts...") + _remove_artifacts() + print("Done ✨") + + +def reset(): + print("Cleaning build artifacts...") + _remove_artifacts() + + if "VIRTUAL_ENV" in os.environ: + print("You are inside a Poetry env. Cannot delete active env.") + print("Run this instead:") + print(" deactivate && poetry run reset") + return + + print("Removing virtualenv...") + subprocess.run(["poetry", "env", "remove", "--all"], check=False) + + print("Reinstalling dependencies...") + subprocess.run(["poetry", "install"], check=True) + + print("Environment fully reset ✨") + + +def main(): + clean() + + +if __name__ == "__main__": + main() diff --git a/src/utils/constants.py b/src/utils/constants.py index 33a8c60..3206de5 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -1,55 +1,34 @@ +import logging import os from pathlib import Path -from typing import Any -import streamlit as st -import logging - +from dotenv import load_dotenv APP_TITLE = ":blue[Greeting Feature]" DEFAULT_GREETING = "Hello" FAQ_TITLE = "FAQs" PORT = 8000 # --- Asset paths --- -PROJECT_ROOT = Path(__file__).parent.parent +PROJECT_ROOT = Path(__file__).parent.parent.resolve() ASSETS_DIR = PROJECT_ROOT / "assets" / "images" COMPANY_LOGO = ASSETS_DIR / "logo.png" -def safe_get(secret_path: str, env_key: str = "", default: str = "") -> str: - """ - Safely retrieve a configuration value from: - 1. Streamlit secrets (if secrets.toml exists) - 2. Environment variable - 3. Default fallback +load_dotenv(Path(__file__).resolve().parents[2] / ".env") + - Logs the source used for each config value. - """ +def safe_get(secret_path: str, env_key: str = "", default: str = "") -> str: value = default source = "default" - secrets_file = Path(".streamlit/secrets.toml") - # Only try accessing secrets if the file exists - if secrets_file.exists(): - try: - secrets_dict: dict[str, Any] = dict(st.secrets) # Convert to plain dict - val = secrets_dict - - for key in secret_path.split("."): - val = ( - val.get(key, {}) if isinstance(val, dict) else getattr(val, key, {}) - ) - if val and val != {}: - value = str(val) - source = "secrets" - except Exception as e: - logging.debug(f"Could not retrieve secret '{secret_path}': {e}") - - # If secrets not used, fallback to env if source != "secrets" and env_key: env_val = os.getenv(env_key) - if env_val: - value = env_val - source = "env" + + if env_val is not None: + env_val = env_val.strip().strip('"').strip("'") + + if env_val: + value = env_val + source = "env" logging.info( f"Loaded config for '{env_key or secret_path}' from [{source}]", @@ -57,6 +36,7 @@ def safe_get(secret_path: str, env_key: str = "", default: str = "") -> str: ) return value + MONGODB_URI = safe_get("mongodb.MONGODB_URI", "MONGODB_URI") DATABASE_NAME = safe_get("mongodb.DATABASE_NAME", "DATABASE_NAME") diff --git a/src/utils/faq.py b/src/utils/faq.py deleted file mode 100644 index 07f8fc0..0000000 --- a/src/utils/faq.py +++ /dev/null @@ -1,27 +0,0 @@ -from pathlib import Path -import streamlit as st -from bs4 import BeautifulSoup - - -def faq_page(): - # Load CSS - st.title(":blue[❓FAQs]") - css = Path(r"templates/faq.css").read_text() - st.markdown(f"", unsafe_allow_html=True) - - # Load full HTML - html = Path(r"templates/faq.html").read_text() - - # Parse and split sections using BeautifulSoup - soup = BeautifulSoup(html, "html.parser") - general_faq = str(soup.find(id="general-faq")) - technical_faq = str(soup.find(id="technical-faq")) - - # Create Streamlit tabs - tab1, tab2 = st.tabs(["General", "Technical"]) - - with tab1: - st.markdown(general_faq, unsafe_allow_html=True) - - with tab2: - st.markdown(technical_faq, unsafe_allow_html=True) diff --git a/templates/faq.html b/templates/faq.html index aff30fd..db4656e 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -11,7 +11,7 @@

    Frequently Asked Questions

    What are the main packages and libraries?
      -
    • we are using streamlit for front end and Fast API for backend.
    • +
    • we are using html for front end and Fast API for backend.
    • we also have versioning system, if you change version in `pyproject.toml`, it will automatically reflected in api
    • using `Box` for centralized messaged which later can be changed using i18n support.
    • @@ -20,7 +20,7 @@

      Frequently Asked Questions

      What are method to run? -

      run `poetry run sample dev` for streamlit UI.

      +

      run `poetry run sample dev` for html UI.

      run `poetry run sample api` and /version` is one endpoint.

      run `poetry run lint` to lint the code.

      From 034b9ea5bace72f9d98a5619514cc87c1e44e394 Mon Sep 17 00:00:00 2001 From: "Poornachandra.A.N" Date: Thu, 15 Jan 2026 21:23:33 +0530 Subject: [PATCH 08/17] chore: update documentation and clean up code structure --- CHANGELOG.md | 2 +- README.md | 9 ++++----- poetry.lock | 16 +++++++++++++++- pyproject.toml | 5 +++-- src/utils/clean.py | 11 +++-------- src/utils/constants.py | 37 ++++++++++++------------------------- 6 files changed, 38 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db3decf..761578e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,4 +5,4 @@ All notable changes to this repository will be documented in this file. ## [1.0.0] - Initial release. -- Include boilerplate with streamlit and fast api +- Include boilerplate without streamlit and fast api diff --git a/README.md b/README.md index af8c9d7..3cb7c6a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Fabric Generator and Search Utility +# Sample BoilerPlare -A Streamlit template for Recursive Zero repository +A Sample template for Recursive Zero repository ## Installation Guide @@ -8,7 +8,6 @@ A Streamlit template for Recursive Zero repository - Python β‰₯ 3.11 - Poetry β‰₯ 2.2.1 -- Streamlit β‰₯ 1.49.1 ## Getting Started @@ -50,7 +49,7 @@ poetry install ## How to Run -## Run Streamlit App +## Run Sample App ```bash poetry run sample dev @@ -119,7 +118,7 @@ pip install sample ## CLI Shortcuts -`sample dev` β†’ Launch Streamlit UI +`sample dev` β†’ Launch UI `sample api` β†’ Launch FastAPI diff --git a/poetry.lock b/poetry.lock index d8e82bc..70128dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -675,6 +675,20 @@ files = [ {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, ] +[[package]] +name = "dotenv" +version = "0.9.9" +description = "Deprecated package" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9"}, +] + +[package.dependencies] +python-dotenv = "*" + [[package]] name = "exceptiongroup" version = "1.3.1" @@ -3120,4 +3134,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "a41f7de47bcddbb0ed7a559241446d68956eb926c495c712f28aecfaea005326" +content-hash = "a5efffd2438fc0aaa834d0a4bb862efb60fd32f767f89dd589e7840ea675f73f" diff --git a/pyproject.toml b/pyproject.toml index 0cc0fe0..4bee94e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ dependencies = [ "uvicorn (>=0.40.0,<0.41.0)", "pymongo (>=4.15.5,<5.0.0)", "python-dotenv (>=1.2.1,<2.0.0)", + "dotenv (>=0.9.9,<0.10.0)", ] @@ -50,8 +51,8 @@ vulture = "^2.3" [tool.flake8] max_line_length = 190 -[tool.poetry.requires-plugins] -poetry-plugin-export = "^1.9" +#[tool.poetry.requires-plugins] +#poetry-plugin-export = "^1.9" [tool.poetry-auto-export] output = "requirements.txt" diff --git a/src/utils/clean.py b/src/utils/clean.py index 18bac97..089b8a0 100644 --- a/src/utils/clean.py +++ b/src/utils/clean.py @@ -17,19 +17,13 @@ def clean(): _remove_artifacts() print("Done ✨") - def reset(): print("Cleaning build artifacts...") _remove_artifacts() - if "VIRTUAL_ENV" in os.environ: - print("You are inside a Poetry env. Cannot delete active env.") - print("Run this instead:") - print(" deactivate && poetry run reset") - return - print("Removing virtualenv...") - subprocess.run(["poetry", "env", "remove", "--all"], check=False) + print("Removing current project virtualenv...") + subprocess.run(["poetry", "env", "remove", "python"], check=True) print("Reinstalling dependencies...") subprocess.run(["poetry", "install"], check=True) @@ -37,6 +31,7 @@ def reset(): print("Environment fully reset ✨") + def main(): clean() diff --git a/src/utils/constants.py b/src/utils/constants.py index 3206de5..39ce36d 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -1,44 +1,31 @@ -import logging import os from pathlib import Path - +import logging from dotenv import load_dotenv +load_dotenv() + + APP_TITLE = ":blue[Greeting Feature]" DEFAULT_GREETING = "Hello" FAQ_TITLE = "FAQs" PORT = 8000 # --- Asset paths --- -PROJECT_ROOT = Path(__file__).parent.parent.resolve() +PROJECT_ROOT = Path(__file__).parent.parent ASSETS_DIR = PROJECT_ROOT / "assets" / "images" COMPANY_LOGO = ASSETS_DIR / "logo.png" -load_dotenv(Path(__file__).resolve().parents[2] / ".env") +def safe_get(env_key: str) -> str: + value = os.getenv(env_key) + if not value: + raise RuntimeError(f"Missing required environment variable: {env_key}") -def safe_get(secret_path: str, env_key: str = "", default: str = "") -> str: - value = default - source = "default" - - if source != "secrets" and env_key: - env_val = os.getenv(env_key) - - if env_val is not None: - env_val = env_val.strip().strip('"').strip("'") - - if env_val: - value = env_val - source = "env" - - logging.info( - f"Loaded config for '{env_key or secret_path}' from [{source}]", - extra={"color": "yellow"}, - ) + logging.info(f"Loaded config '{env_key}' from [env]") return value - -MONGODB_URI = safe_get("mongodb.MONGODB_URI", "MONGODB_URI") -DATABASE_NAME = safe_get("mongodb.DATABASE_NAME", "DATABASE_NAME") +MONGODB_URI = safe_get("MONGODB_URI") +DATABASE_NAME = safe_get("DATABASE_NAME") print("MongoDB URI:", MONGODB_URI) print("Database Name:", DATABASE_NAME) From 0f00496c5e6c8081dceeb83c8c2a5e05350f1585 Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Fri, 16 Jan 2026 21:12:27 +0530 Subject: [PATCH 09/17] add cli commands --- pyproject.toml | 2 -- src/sample/cli.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4bee94e..68248b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,8 +34,6 @@ packages = [ [project.scripts] sample = "sample.cli:cli" lint = "utils.lint:main" -clean = "utils.clean:clean" -reset = "utils.clean:reset" [tool.poetry.group.dev.dependencies] diff --git a/src/sample/cli.py b/src/sample/cli.py index 93d1a1f..cf34e99 100644 --- a/src/sample/cli.py +++ b/src/sample/cli.py @@ -1,4 +1,5 @@ import click + from . import __version__ @@ -26,3 +27,19 @@ def api(): from api.fast_api import start start() + + +@cli.command() +def clean(): + """Run the Sample Streamlit app.""" + from utils.clean import main + + main() + + +@cli.command() +def reset(): + """Run the Sample Streamlit app.""" + from utils.clean import reset + + reset() From 92d52a243605d0dd7c87e1dc77d9bbd1a9caa24c Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Fri, 16 Jan 2026 22:25:16 +0530 Subject: [PATCH 10/17] [RZP-260003]: update readme and prefix to endpoint --- README.md | 2 +- src/api/fast_api.py | 18 ++- src/utils/clean.py | 4 +- src/utils/constants.py | 6 +- templates/index.html | 73 ++++++++-- templates/style.css | 316 ++++++++++++++++++++++++++++++++++------- 6 files changed, 351 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 3cb7c6a..246810d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Sample BoilerPlare +# Sample BoilerPlate A Sample template for Recursive Zero repository diff --git a/src/api/fast_api.py b/src/api/fast_api.py index 0d56f34..8960650 100644 --- a/src/api/fast_api.py +++ b/src/api/fast_api.py @@ -1,10 +1,11 @@ -from fastapi import FastAPI, HTTPException, Request +from fastapi import APIRouter, FastAPI, HTTPException, Request from fastapi.responses import HTMLResponse from pydantic import BaseModel -from . import __version__ -from utils.constants import DEFAULT_GREETING +from utils.constants import DEFAULT_GREETING, GREET_PREFIX from utils.helper import normalize_name +from . import __version__ + app = FastAPI( title="sample API", description="API endpoints for Sample with rate limiting", @@ -20,6 +21,12 @@ ) +greet_router = APIRouter( + prefix=GREET_PREFIX, + tags=["Greeting"], +) + + class GreetRequest(BaseModel): name: str @@ -80,7 +87,7 @@ def health_check(): return {"status": "ok"} -@app.post("/greet", response_model=GreetResponse) +@greet_router.post("/greet", response_model=GreetResponse) def greet_user(payload: GreetRequest): clean_name = normalize_name(payload.name) @@ -90,6 +97,9 @@ def greet_user(payload: GreetRequest): return {"message": f"{DEFAULT_GREETING}, {clean_name} πŸ‘‹"} +app.include_router(greet_router) + + def start(): import uvicorn diff --git a/src/utils/clean.py b/src/utils/clean.py index 089b8a0..238a093 100644 --- a/src/utils/clean.py +++ b/src/utils/clean.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from pathlib import Path @@ -17,11 +16,11 @@ def clean(): _remove_artifacts() print("Done ✨") + def reset(): print("Cleaning build artifacts...") _remove_artifacts() - print("Removing current project virtualenv...") subprocess.run(["poetry", "env", "remove", "python"], check=True) @@ -31,7 +30,6 @@ def reset(): print("Environment fully reset ✨") - def main(): clean() diff --git a/src/utils/constants.py b/src/utils/constants.py index 39ce36d..891f010 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -1,6 +1,7 @@ +import logging import os from pathlib import Path -import logging + from dotenv import load_dotenv load_dotenv() @@ -10,11 +11,13 @@ DEFAULT_GREETING = "Hello" FAQ_TITLE = "FAQs" PORT = 8000 +GREET_PREFIX = "/api/v1" # --- Asset paths --- PROJECT_ROOT = Path(__file__).parent.parent ASSETS_DIR = PROJECT_ROOT / "assets" / "images" COMPANY_LOGO = ASSETS_DIR / "logo.png" + def safe_get(env_key: str) -> str: value = os.getenv(env_key) @@ -24,6 +27,7 @@ def safe_get(env_key: str) -> str: logging.info(f"Loaded config '{env_key}' from [env]") return value + MONGODB_URI = safe_get("MONGODB_URI") DATABASE_NAME = safe_get("DATABASE_NAME") diff --git a/templates/index.html b/templates/index.html index 50c25e6..c72fa7e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3,23 +3,76 @@ - Greeting Page + + Sample Boilerplate - Recursive Zero +
      +
      +
      +

      Sample Boilerplate

      +

      A sample template for Recursive Zero repository

      +
      -
      - -

      Welcome

      -
      +
      +
      +

      πŸš€ How to Run

      +
        +
      1. Open this file directly in your browser.
      2. +
      3. No server, no build, no dependencies required.
      4. +
      +
      -

      This is a plain HTML greeting page.

      +
      +

      πŸ“‹ Prerequisites

      +
        +
      • Python β‰₯ 3.11
      • +
      • Poetry β‰₯ 2.2.1
      • +
      +
      +
      - +
      +
      +

      πŸ“¦ Installation

      +
      pip install poetry>=2.2.1
      +poetry install
      +
      +
      +

      ▢️ Run Sample App

      +
      poetry run sample dev
      +
      +
      + +
      +
      +

      🌐 Run FastAPI Server

      +
      poetry run sample api
      +
      + +
      +

      ✨ Linting

      +
      poetry run lint
      +
      +
      +
      +
      +

      ❓ FAQ

      +

      + Common questions, troubleshooting tips, and usage notes are available in the FAQ page. +

      + Open FAQ +
      +
      + + +
      +

      πŸ“„ License: MIT | Built with ❀️ for Recursive Zero

      +
      +
      - \ No newline at end of file + diff --git a/templates/style.css b/templates/style.css index 8f3ccb8..239f991 100644 --- a/templates/style.css +++ b/templates/style.css @@ -1,49 +1,267 @@ -/* Reset basic styling */ -body { - margin: 0; - font-family: Arial, Helvetica, sans-serif; - background-color: #f5f5f5; - color: #333; -} - -/* Header styling */ -header { - display: flex; - align-items: center; - gap: 15px; - padding: 15px 25px; - background-color: #1e1e2f; - color: white; -} - -/* Logo */ -header img { - border-radius: 8px; -} - -/* Heading */ -header h1 { - margin: 0; - font-size: 24px; -} - -/* Paragraph */ -p { - padding: 20px 25px; - font-size: 16px; -} - -/* Navigation */ -nav { - padding: 0 25px 25px; -} - -nav a { - text-decoration: none; - color: #0066cc; - font-weight: bold; -} - -nav a:hover { - text-decoration: underline; -} \ No newline at end of file +* { + margin: 0; + padding: 0; + box-sizing: border-box; + } + + body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: #333; + line-height: 1.6; + min-height: 100vh; + position: relative; + overflow-x: hidden; + } + + /* Animated background particles */ + body::before { + content: ''; + position: fixed; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 50%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%); + animation: float 15s ease-in-out infinite; + z-index: 0; + } + + @keyframes float { + + 0%, + 100% { + transform: translateY(0) scale(1); + } + + 50% { + transform: translateY(-20px) scale(1.05); + } + } + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; + position: relative; + z-index: 1; + } + + header { + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 3rem 2rem; + text-align: center; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + margin-bottom: 3rem; + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + animation: slideDown 0.6s ease-out; + } + + @keyframes slideDown { + from { + opacity: 0; + transform: translateY(-50px); + } + + to { + opacity: 1; + transform: translateY(0); + } + } + + .logo-container { + width: 120px; + height: 120px; + margin: 0 auto 1.5rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-radius: 30px; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4); + animation: pulse 2s ease-in-out infinite; + } + + @keyframes pulse { + + 0%, + 100% { + transform: scale(1); + } + + 50% { + transform: scale(1.05); + } + } + + .logo-container::before { + content: 'πŸš€'; + font-size: 60px; + } + + h1 { + font-size: 3rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 0.5rem; + font-weight: 800; + } + + header p { + color: #666; + font-size: 1.2rem; + font-weight: 300; + } + + .grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-bottom: 2rem; + } + + section { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 2rem; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + transition: transform 0.3s ease, box-shadow 0.3s ease; + animation: fadeInUp 0.6s ease-out backwards; + } + + section:nth-child(1) { + animation-delay: 0.1s; + } + + section:nth-child(2) { + animation-delay: 0.2s; + } + + section:nth-child(3) { + animation-delay: 0.3s; + } + + section:nth-child(4) { + animation-delay: 0.4s; + } + + section:nth-child(5) { + animation-delay: 0.5s; + } + + section:nth-child(6) { + animation-delay: 0.6s; + } + + @keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + + to { + opacity: 1; + transform: translateY(0); + } + } + + section:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); + } + + h2 { + color: #667eea; + font-size: 1.8rem; + margin-bottom: 1rem; + display: flex; + align-items: center; + gap: 0.5rem; + } + + h2::before { + content: 'β–Έ'; + color: #764ba2; + font-weight: bold; + } + + ol, + ul { + margin-left: 1.5rem; + margin-top: 1rem; + } + + li { + margin-bottom: 0.5rem; + color: #555; + } + + pre { + background: #1e1e1e; + border-radius: 10px; + padding: 1.5rem; + overflow-x: auto; + margin-top: 1rem; + box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.3); + } + + code { + color: #9cdcfe; + font-family: 'Courier New', Courier, monospace; + font-size: 0.95rem; + line-height: 1.6; + } + + .command-line { + color: #4ec9b0; + } + + footer { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 2rem; + text-align: center; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + margin-top: 3rem; + animation: fadeInUp 0.6s ease-out 0.7s backwards; + } + + footer p { + color: #666; + font-size: 1rem; + } + + .badge { + display: inline-block; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + padding: 0.3rem 0.8rem; + border-radius: 20px; + font-size: 0.85rem; + font-weight: 600; + margin-right: 0.5rem; + box-shadow: 0 2px 10px rgba(102, 126, 234, 0.4); + } + + @media (max-width: 768px) { + h1 { + font-size: 2rem; + } + + .grid { + grid-template-columns: 1fr; + } + + section { + padding: 1.5rem; + } + } From 5f33c3669f82e66e5ad903d834aafd564f8360c2 Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Fri, 16 Jan 2026 22:33:08 +0530 Subject: [PATCH 11/17] [RZP-260003]: add reset script --- README.md | 20 ++++++++++++++++++++ docs/POETRY_COMMANDS.md | 20 ++++++++++++++++++++ scripts/reset.sh | 13 +++++++++++++ src/sample/cli.py | 16 ---------------- src/utils/clean.py | 38 -------------------------------------- 5 files changed, 53 insertions(+), 54 deletions(-) create mode 100755 scripts/reset.sh delete mode 100644 src/utils/clean.py diff --git a/README.md b/README.md index 246810d..a11f2f9 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,26 @@ poetry env info poetry env remove ``` +## Reset Environment + +Use the reset script to clean artifacts and recreate the project virtual environment: + +```bash +./scripts/reset.sh +``` + +Note: + +On first clone, the script is already executable (permission is tracked in git). + +If you see Permission denied, run once: + +```bash +chmod +x scripts/reset.sh +``` + +This will completely reset the environment. + ## License [MIT](./LICENSE) diff --git a/docs/POETRY_COMMANDS.md b/docs/POETRY_COMMANDS.md index 6b26ff9..46314a3 100644 --- a/docs/POETRY_COMMANDS.md +++ b/docs/POETRY_COMMANDS.md @@ -25,6 +25,26 @@ poetry install Note: run `poetry install` command before running `poetry shell` +## Reset Environment + +Use the reset script to clean artifacts and recreate the project virtual environment: + +```bash +./scripts/reset.sh +``` + +Note: + +On first clone, the script is already executable (permission is tracked in git). + +If you see Permission denied, run once: + +```bash +chmod +x scripts/reset.sh +``` + +This will completely reset the environment. + ## delete virtual environment if it is on custom location 1. To check the custom location run `poetry env info --path` also you can check all config using diff --git a/scripts/reset.sh b/scripts/reset.sh new file mode 100755 index 0000000..c2100f3 --- /dev/null +++ b/scripts/reset.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e + +echo "Cleaning build artifacts..." +rm -rf dist build *.egg-info + +echo "Removing project virtualenv..." +poetry env remove --all || true + +echo "Reinstalling dependencies..." +poetry install + +echo "Environment fully reset ✨" diff --git a/src/sample/cli.py b/src/sample/cli.py index cf34e99..1f5c1d5 100644 --- a/src/sample/cli.py +++ b/src/sample/cli.py @@ -27,19 +27,3 @@ def api(): from api.fast_api import start start() - - -@cli.command() -def clean(): - """Run the Sample Streamlit app.""" - from utils.clean import main - - main() - - -@cli.command() -def reset(): - """Run the Sample Streamlit app.""" - from utils.clean import reset - - reset() diff --git a/src/utils/clean.py b/src/utils/clean.py deleted file mode 100644 index 238a093..0000000 --- a/src/utils/clean.py +++ /dev/null @@ -1,38 +0,0 @@ -import shutil -import subprocess -from pathlib import Path - - -def _remove_artifacts(): - for path in ["dist", "build"]: - shutil.rmtree(path, ignore_errors=True) - - for p in Path(".").glob("*.egg-info"): - shutil.rmtree(p, ignore_errors=True) - - -def clean(): - print("Cleaning build artifacts...") - _remove_artifacts() - print("Done ✨") - - -def reset(): - print("Cleaning build artifacts...") - _remove_artifacts() - - print("Removing current project virtualenv...") - subprocess.run(["poetry", "env", "remove", "python"], check=True) - - print("Reinstalling dependencies...") - subprocess.run(["poetry", "install"], check=True) - - print("Environment fully reset ✨") - - -def main(): - clean() - - -if __name__ == "__main__": - main() From 55cf5455a641d7680749b0ffe2b4cd09b1304bc0 Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Fri, 16 Jan 2026 22:56:55 +0530 Subject: [PATCH 12/17] [RZP-260003]: update endpoints --- src/api/fast_api.py | 31 ++++++++++++++++++++----------- src/utils/constants.py | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/api/fast_api.py b/src/api/fast_api.py index 8960650..815b3a4 100644 --- a/src/api/fast_api.py +++ b/src/api/fast_api.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, FastAPI, HTTPException, Request -from fastapi.responses import HTMLResponse +from fastapi.responses import HTMLResponse, JSONResponse from pydantic import BaseModel -from utils.constants import DEFAULT_GREETING, GREET_PREFIX +from utils.constants import API_PREFIX, DEFAULT_GREETING from utils.helper import normalize_name from . import __version__ @@ -20,10 +20,9 @@ }, ) - -greet_router = APIRouter( - prefix=GREET_PREFIX, - tags=["Greeting"], +api_v1 = APIRouter( + prefix=API_PREFIX, + tags=["V1"], ) @@ -35,12 +34,12 @@ class GreetResponse(BaseModel): message: str -@app.get("/version") +@app.get("/version", tags=["Version"]) def version(): return {"version": app.version} -@app.get("/", response_class=HTMLResponse) +@app.get("/", response_class=HTMLResponse, tags=["Home"]) async def read_root(request: Request): return """ @@ -82,12 +81,22 @@ async def read_root(request: Request): """ -@app.get("/health") +@app.get("/health", tags=["Help"]) def health_check(): return {"status": "ok"} -@greet_router.post("/greet", response_model=GreetResponse) +@api_v1.get("/help", tags=["Help"]) +def get_help(): + return JSONResponse( + status_code=200, + content={ + "message": "Welcome to the Sample BoilerPlate API! Visit /docs for API documentation." + }, + ) + + +@api_v1.post("/greet", response_model=GreetResponse) def greet_user(payload: GreetRequest): clean_name = normalize_name(payload.name) @@ -97,7 +106,7 @@ def greet_user(payload: GreetRequest): return {"message": f"{DEFAULT_GREETING}, {clean_name} πŸ‘‹"} -app.include_router(greet_router) +app.include_router(api_v1) def start(): diff --git a/src/utils/constants.py b/src/utils/constants.py index 891f010..dceeefc 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -11,7 +11,7 @@ DEFAULT_GREETING = "Hello" FAQ_TITLE = "FAQs" PORT = 8000 -GREET_PREFIX = "/api/v1" +API_PREFIX = "/api/v1" # --- Asset paths --- PROJECT_ROOT = Path(__file__).parent.parent ASSETS_DIR = PROJECT_ROOT / "assets" / "images" From 507c77611659a9bb3d7111a6276f4a776ddab6c1 Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Sat, 17 Jan 2026 21:46:02 +0530 Subject: [PATCH 13/17] [RZP-260003]: update ui and clean scripts --- CHANGELOG.md | 7 ++++++- README.md | 2 +- pyproject.toml | 2 +- src/api/fast_api.py | 5 +++-- src/utils/constants.py | 24 ++++++++++++++---------- templates/faq.css | 8 ++++---- templates/index.html | 17 +++++++---------- 7 files changed, 36 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 761578e..3a0b8b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ All notable changes to this repository will be documented in this file. -## [1.0.0] +## [1.0.0] Sat,10 jan 2026 - Initial release. - Include boilerplate without streamlit and fast api + +## [1.1.0] Sat,17 Jan 2026 + +- Updated UI. +- Add clean script. diff --git a/README.md b/README.md index a11f2f9..ca355a3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A Sample template for Recursive Zero repository ## Prerequisites -- Python β‰₯ 3.11 +- Python β‰₯ 3.11FAQ - Poetry β‰₯ 2.2.1 ## Getting Started diff --git a/pyproject.toml b/pyproject.toml index 68248b4..a2f52f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sample" -version = "1.0.0" +version = "1.1.0" description = "A python template for fastapi and mongo projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" diff --git a/src/api/fast_api.py b/src/api/fast_api.py index 815b3a4..0134ae5 100644 --- a/src/api/fast_api.py +++ b/src/api/fast_api.py @@ -1,7 +1,8 @@ from fastapi import APIRouter, FastAPI, HTTPException, Request from fastapi.responses import HTMLResponse, JSONResponse from pydantic import BaseModel -from utils.constants import API_PREFIX, DEFAULT_GREETING + +from utils.constants import API_PREFIX, GREETING from utils.helper import normalize_name from . import __version__ @@ -103,7 +104,7 @@ def greet_user(payload: GreetRequest): if not clean_name: raise HTTPException(status_code=400, detail="Invalid name provided") - return {"message": f"{DEFAULT_GREETING}, {clean_name} πŸ‘‹"} + return {"message": f"{GREETING}, {clean_name} πŸ‘‹"} app.include_router(api_v1) diff --git a/src/utils/constants.py b/src/utils/constants.py index dceeefc..ace9477 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -5,22 +5,24 @@ from dotenv import load_dotenv load_dotenv() +# These should be in environment variables or .env file. +DEFAULT_PORT = 8005 +DEFAULT_API_PREFIX = "/api/v1" +DEFAULT_MONGODB_URI = ( + "mongodb://127.0.0.1:27017/?retryWrites=true&w=majority&appName=Sample" +) +DEFAULT_DATABASE_NAME = "sample_db" +GREETING = "Hello" -APP_TITLE = ":blue[Greeting Feature]" -DEFAULT_GREETING = "Hello" -FAQ_TITLE = "FAQs" -PORT = 8000 -API_PREFIX = "/api/v1" # --- Asset paths --- PROJECT_ROOT = Path(__file__).parent.parent ASSETS_DIR = PROJECT_ROOT / "assets" / "images" COMPANY_LOGO = ASSETS_DIR / "logo.png" -def safe_get(env_key: str) -> str: - value = os.getenv(env_key) - +def safe_get(env_key: str, default) -> str: + value = os.getenv(env_key, default) if not value: raise RuntimeError(f"Missing required environment variable: {env_key}") @@ -28,8 +30,10 @@ def safe_get(env_key: str) -> str: return value -MONGODB_URI = safe_get("MONGODB_URI") -DATABASE_NAME = safe_get("DATABASE_NAME") +MONGODB_URI = safe_get("MONGODB_URI", DEFAULT_MONGODB_URI) +DATABASE_NAME = safe_get("DATABASE_NAME", DEFAULT_DATABASE_NAME) +API_PREFIX = safe_get("API_PREFIX", DEFAULT_API_PREFIX) +PORT = int(safe_get("PORT", DEFAULT_PORT)) print("MongoDB URI:", MONGODB_URI) print("Database Name:", DATABASE_NAME) diff --git a/templates/faq.css b/templates/faq.css index 415e02b..f9f2a6c 100644 --- a/templates/faq.css +++ b/templates/faq.css @@ -4,7 +4,7 @@ --bg: #ffffff; --border: #e1e4e8; --border-hover: #c1c8cd; - --summary-color: #24292e; + --summary-color: #0c5baa; --text-color: #586069; } } @@ -15,13 +15,13 @@ --bg: #2a2a2a; --border: #3a3a3a; --border-hover: #4a4a4a; - --summary-color: #e1e4e8; + --summary-color: #1254ab; --text-color: #764ba2; } } .faq-container { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; max-width: 900px; margin: 20px auto; padding: 20px; @@ -88,4 +88,4 @@ font-size: 0.9375rem; } } -} \ No newline at end of file +} diff --git a/templates/index.html b/templates/index.html index c72fa7e..48a9cb3 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,11 +1,11 @@ - + - - + + Sample Boilerplate - Recursive Zero - + @@ -49,7 +49,7 @@

      ▢️ Run Sample App

      -

      🌐 Run FastAPI Server

      +

      🌐 Run Server

      poetry run sample api
      @@ -60,15 +60,12 @@

      ✨ Linting

      -

      ❓ FAQ

      -

      - Common questions, troubleshooting tips, and usage notes are available in the FAQ page. -

      +

      ❓ FAQs

      +

      Common questions, troubleshooting tips, and usage notes are available in the FAQs page.

      Open FAQ
      -

      πŸ“„ License: MIT | Built with ❀️ for Recursive Zero

      From 2a21b5dc55a1f147d4496f16edd42deedc4c29bc Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Sat, 17 Jan 2026 22:08:06 +0530 Subject: [PATCH 14/17] [RZP-260003]: update version to 1.1.2, add exception handler for 404 errors, and create templates directory --- .gitignore | 2 +- pyproject.toml | 4 +++- src/api/fast_api.py | 21 +++++++++++++++++++++ templates/__init__.py | 0 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 templates/__init__.py diff --git a/.gitignore b/.gitignore index b7faf40..cf997a8 100644 --- a/.gitignore +++ b/.gitignore @@ -137,7 +137,7 @@ celerybeat.pid # Environments .env .envrc -.venv +.venv* env/ venv/ ENV/ diff --git a/pyproject.toml b/pyproject.toml index a2f52f5..8502175 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sample" -version = "1.1.0" +version = "1.1.2" description = "A python template for fastapi and mongo projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" @@ -27,6 +27,8 @@ packages = [ { include = "features", from = "src" }, { include = "utils", from = "src" }, { include = "api", from = "src" }, + { include = "db", from = "src" }, + { include = "templates", from = "." }, { include = "assets/images/logo.png", from = "src" }, ] diff --git a/src/api/fast_api.py b/src/api/fast_api.py index 0134ae5..986c249 100644 --- a/src/api/fast_api.py +++ b/src/api/fast_api.py @@ -1,6 +1,7 @@ from fastapi import APIRouter, FastAPI, HTTPException, Request from fastapi.responses import HTMLResponse, JSONResponse from pydantic import BaseModel +from starlette.exceptions import HTTPException as StarletteHTTPException from utils.constants import API_PREFIX, GREETING from utils.helper import normalize_name @@ -107,6 +108,26 @@ def greet_user(payload: GreetRequest): return {"message": f"{GREETING}, {clean_name} πŸ‘‹"} +@app.exception_handler(StarletteHTTPException) +async def http_exception_handler(request: Request, exc: StarletteHTTPException): + if exc.status_code == 404: + endpoint = request.url.path + + return JSONResponse( + status_code=404, + content={ + "error": f"Endpoint '{endpoint}' does not exist, use /docs to see available endpoints.", + "status": 404, + }, + ) + + # fallback for other HTTP errors + return JSONResponse( + status_code=exc.status_code, + content={"error": exc.detail}, + ) + + app.include_router(api_v1) diff --git a/templates/__init__.py b/templates/__init__.py new file mode 100644 index 0000000..e69de29 From ee596627c0f3f13ed027b2832356b3046b5dfda7 Mon Sep 17 00:00:00 2001 From: Heisenberg208 Date: Sat, 17 Jan 2026 22:11:31 +0530 Subject: [PATCH 15/17] [RZP-260003]: change version --- CHANGELOG.md | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a0b8b7..2d5603b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,3 +11,4 @@ All notable changes to this repository will be documented in this file. - Updated UI. - Add clean script. +- Add exception handling on API. diff --git a/pyproject.toml b/pyproject.toml index 8502175..74be45a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sample" -version = "1.1.2" +version = "1.1.0" description = "A python template for fastapi and mongo projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" From 034a119b13a165bc925c8520325644912419af29 Mon Sep 17 00:00:00 2001 From: recursivezero Date: Sat, 17 Jan 2026 22:37:36 +0530 Subject: [PATCH 16/17] [core]: remove unused docs --- README.md | 6 +- docs/AWS_integration.md | 315 -------------------------------------- docs/CLOUD.md | 102 ------------ docs/USAGE.md | 31 ---- docs/setup-for-windows.md | 2 +- docs/test_api.md | 111 -------------- scripts/trace_entry.py | 8 - 7 files changed, 5 insertions(+), 570 deletions(-) delete mode 100644 docs/AWS_integration.md delete mode 100644 docs/CLOUD.md delete mode 100644 docs/USAGE.md delete mode 100644 docs/test_api.md delete mode 100644 scripts/trace_entry.py diff --git a/README.md b/README.md index ca355a3..b653ca9 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Sample BoilerPlate -A Sample template for Recursive Zero repository +A boilerplate for python project with poetry and fastapi ## Installation Guide ## Prerequisites -- Python β‰₯ 3.11FAQ +- Python β‰₯ 3.11 - Poetry β‰₯ 2.2.1 ## Getting Started @@ -122,6 +122,8 @@ pip install sample `sample api` β†’ Launch FastAPI +`sample --version` -> check current package version + current version will be printed on start of above commands. ## Install GIT hooks diff --git a/docs/AWS_integration.md b/docs/AWS_integration.md deleted file mode 100644 index c0496e7..0000000 --- a/docs/AWS_integration.md +++ /dev/null @@ -1,315 +0,0 @@ -# Amazon S3 Integration Documentation - -## Overview - -This document provides comprehensive information about the integration of Amazon S3 into the application. It covers the purpose of the integration, setup instructions, and usage for various functionalities such as file uploads, downloads, -and image processing workflows. - ---- - -## 1. Introduction - -Amazon Simple Storage Service (S3) is used for scalable, secure, and highly available object storage. In this application, S3 is integrated for: - -- Uploading and storing image files. -- Generating pre-signed URLs for secure file access. -- Organizing images into structured folders. -- Enabling workflows for image processing and database updates. - ---- - -## 2. Prerequisites - -To use the S3 integration, ensure the following: - -### Required Tools and Access - -- **AWS Account**: Ensure you have an active AWS account. -- **IAM User or Role**: Create an IAM user or role with the required permissions for S3. Attach the `AmazonS3FullAccess` policy or a custom policy that grants the necessary access. -- **AWS CLI**:(Optional) - - - Install the AWS Command Line Interface (CLI): - - ```bash - pip install awscli - ``` - - - Configure the CLI with your AWS credentials: - - ```bash - aws configure - ``` - -- **Python Libraries**: - - - Ensure you have the following Python libraries installed: - - ```bash - pip install boto3 python-dotenv opencv-python-headless numpy - ``` - -### S3 Bucket Setup - -1. **Create an S3 Bucket**: - - - Log in to the AWS Management Console. - - Navigate to the **S3** service. - - Click **Create bucket** and provide a unique bucket name. - - Select the desired AWS region. - - Configure bucket options (e.g., versioning, encryption). - -2. **Set Bucket Policies**: - - - Grant access permissions by defining a bucket policy. Example policy: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::970547383153:root" - }, - "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject"], - "Resource": ["arn:aws:s3:::fabric-storage-bucket", "arn:aws:s3:::fabric-storage-bucket/*"] - } - ] -} -``` - -- - -1. **Enable CORS Configuration**: - - - Configure Cross-Origin Resource Sharing (CORS) for the bucket if required. Example: - -```json -[ - { - "AllowedHeaders": ["*"], - "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"], - "AllowedOrigins": ["*"], - "ExposeHeaders": ["ETag"] - } -] -``` - -## πŸ“˜ Creating a Custom IAM User Policy in AWS Console - -This guide walks you through the steps to create a custom IAM policy that grants specific S3 bucket access using the AWS Management Console. - -Grant the IAM user fabric_search_user permissions to interact with a specified Amazon S3 bucket (e.g., list, read, write, and delete objects). - -Prerequisites -You must have sufficient AWS IAM permissions to manage users and policies. - -The S3 bucket name should be known (e.g., fabric-storage-bucket). - -πŸ“ Steps to Attach the IAM Policy - -1. Go to the IAM Console - Open this URL: - - -2. Select Your User - Find and click on the IAM user: - `fabric_search_user` or `custom_user` - -3. Navigate to the β€œPermissions” Tab - In the user details page, click on the Permissions tab. - -4. Start the Add Permissions Workflow - Click the β€œAdd permissions” button. - Then choose: - - - Attach policies directly - -5. Create a New Policy - Click β€œCreate policy” (located at the bottom left of the page). - This will open the policy creation interface. - -6. Switch to the JSON Editor - Click the β€œJSON” tab. - -Replace the default policy with the following: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "AllowFabricBucketAccess", - "Effect": "Allow", - "Action": ["s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject"], - "Resource": ["arn:aws:s3:::fabric-storage-bucket", "arn:aws:s3:::fabric-storage-bucket/*"] - } - ] -} -``` - -πŸ” Important: Replace `fabric-storage-bucket `with your actual S3 bucket name if different. - -1. Name and Create the Policy - Click β€œNext”, then provide a name for your policy. - πŸ“„ Example: FabricS3AccessPolicy - Then click β€œCreate policy” to save it. - -2. Attach the Policy to the User - - - Go back to the IAM user: `fabric_search_user` or `custom_user` - - - Click Add permissions again - - - Choose: Attach existing policies directly - - - Search for the policy you just created (FabricS3AccessPolicy) - - - Check the box next to the policy - - - Click Add permissions - -βœ… Verification -After attaching the policy, verify the user has the correct permissions by: - -Navigating to the user’s Permissions tab - -Confirming that FabricS3AccessPolicy appears in the attached policies list - -1. **Enable Versioning**: - - - Turn on versioning to keep multiple versions of an object in the bucket. - ---- - -## 3. Environment Variables - -The application uses environment variables for secure configuration. Add the following variables to a `.env` or`constants.py` file: - -```env -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_REGION= - -``` - ---- - -## 4. AWS S3 Bucket Structure - -The S3 bucket is structured into the following folders: - -- **search_uploads/**: Stores original uploaded images. -- **generated/**: Stores processed/generated images. -- **single_images/**: Stores single image files uploaded by users. -- **group_images/**: Stores grouped image files for processing. -- **table/fabric_table**: Stores metadata. - -### Example - -```bash -fabric-storage-bucket -β”œβ”€β”€ search_uploads/ -β”œβ”€β”€ generated/ -└── uploaded/single_images/ -β”œβ”€β”€ uploaded/group_images/ -└── table/fabric_table/ - -``` - ---- - -## 5. Key Features - -### 5.1 File Upload to S3 - -Allows uploading files to specific S3 folders. - -- Function: `upload_file_to_s3(file, bucket_name, s3_key)` -- Parameters: - - `file`: File object to be uploaded. - - `bucket_name`: Name of the S3 bucket. - - `s3_key`: Path (key) within the bucket. -- Returns: `True` on success, `False` otherwise. - -### 5.2 Generate Pre-Signed URLs - -Generates secure, temporary URLs for accessing S3 objects. - -- Function: `generate_presigned_url(bucket_name, object_key, expiration=3600)` -- Parameters: - - `bucket_name`: Name of the S3 bucket. - - `object_key`: Path (key) within the bucket. - - `expiration`: Time in seconds before the URL expires (default: 3600). -- Returns: URL string or `None` on failure. - -### 5.3 List Objects in S3 - -Lists objects in specific folders of the S3 bucket. - -- Example folders: `single_images`, `group_images`, `generated`. -- Usage within API endpoints like `/image/list`. - -### 5.4 Process and Store Images - -Processes uploaded images, generates new images, and stores them in the `generated/` folder. - ---- - -## 7. Helper Functions - -### 7.1 Upload to S3 - -```python -def upload_file_to_s3(file, bucket_name, s3_key): - try: - s3_client.upload_fileobj(file, bucket_name, s3_key) - return True - except Exception as e: - logger.error(f"S3 Upload Failed: {e}") - return False -``` - -### 7.2 Generate Pre-Signed URL - -```python -def generate_presigned_url(bucket_name, object_key, expiration=3600): - try: - return s3_client.generate_presigned_url( - "get_object", - Params={"Bucket": bucket_name, "Key": object_key}, - ExpiresIn=expiration, - ) - except Exception as e: - logger.error(f"Pre-Signed URL Generation Failed: {e}") - return None -``` - ---- - -## 8. Error Handling - -- **File Upload Errors**: Returns 500 with descriptive messages. -- **Pre-Signed URL Failures**: Returns 500 if URL generation fails. -- **S3 Object Listing Issues**: Logs the stack trace and returns 500. - -## 10. Best Practices - -- Use IAM roles with least privilege for accessing S3. -- Validate all user inputs. -- Enable S3 versioning for important data. -- Use lifecycle policies to manage storage costs. - ---- - -## 11. Troubleshooting - -### Common Issues - -1. **Access Denied Errors**: - - - Ensure the AWS access key and secret key have proper permissions. - - Check S3 bucket policies. - -2. **File Not Found in S3**: - - Verify the folder structure and `s3_key`. diff --git a/docs/CLOUD.md b/docs/CLOUD.md deleted file mode 100644 index 69334ca..0000000 --- a/docs/CLOUD.md +++ /dev/null @@ -1,102 +0,0 @@ -# Cloud Deployment - -- Install python v 3.12,poetry using pip - -```sh -sudo apt install python3-pip python3-venv -curl -sSL https://install.python-poetry.org | python3.12 - -echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc -# install additional required packages -sudo apt install -y libglib2.0-0 libsm6 libxrender1 libxext6 -sudo apt install -y libgl1 -``` - -config poetry and virtual environment - -```sh -poetry config --global virtualenvs.prefer-active-python true -sudo mkdir -p /opt/venv -sudo chown $USER:$USER /opt/venv -echo 'export POETRY_VIRTUALENVS_PATH=/opt/venv' >> ~/.bashrc -source ~/.bashrc -poetry config virtualenvs.in-project false -poetry config virtualenvs.path /opt/venv -poetry env info - -``` - -- copy sample repo in a folder -- copy `.env` to that folder -- go to folder and install package dependencies - -```sh -poetry lock --no-cache -poetry install --all-extras --with dev -``` - -## run python app standalone ( not recommended ) - -```sh -nohup poetry run sample dev > sample.log 2>&1 & - -# check log - -tail -f sample.log -``` - -here we have to stop and start again manually checking port `lsof -ti:8501 | xargs kill -9` and many other manual work - -so better use system service method as below - -## run app using system service - -- create service file - -### /etc/systemd/system/sample.service - -```sh -[Unit] -Description=Sample App (via Poetry) -After=network.target - -[Service] -User=root -WorkingDirectory=/opt/project/path/sample -Environment="HOME=/root" -Environment="PYTHONUNBUFFERED=1" -Environment="PATH=/root/.local/bin:/usr/local/bin:/usr/bin:/bin" -ExecStart=/root/.local/bin/poetry run sample dev -Restart=always -RestartSec=5 - -# Optional: persistent logs -StandardOutput=append:/var/log/sample.log -StandardError=append:/var/log/sample-error.log - -[Install] -WantedBy=multi-user.target - -``` - -now start the service using - -```sh -sudo systemctl daemon-reload -sudo systemctl restart sample -``` - -to stop/disable - -```sh -sudo systemctl disable sample -# to check status -sudo systemctl status sample -``` - -to check running logs - -```sh - -tail -f /var/log/sample-error.log - -``` diff --git a/docs/USAGE.md b/docs/USAGE.md deleted file mode 100644 index 8052f38..0000000 --- a/docs/USAGE.md +++ /dev/null @@ -1,31 +0,0 @@ -# How to Run - -## Run Sample app - -```bash -poetry run sample dev - -``` - -Access: - -## Run FastAPI Server - -```bash -poetry run sample api -# OR -python src/api/fast_api.py -``` - -Access: - -## 🧹 Linting & Code Quality - -Pre-commit hooks are enabled. If commits fail, run: - -```bash -poetry run black . -poetry run flake8 . -poetry run mypy . -poetry run ruff check . -``` diff --git a/docs/setup-for-windows.md b/docs/setup-for-windows.md index c2a0bfd..cd318d4 100644 --- a/docs/setup-for-windows.md +++ b/docs/setup-for-windows.md @@ -4,7 +4,7 @@ ### Prerequisites -- Python v3.12.7+ +- Python v3.11.7+ - Windows 10/11 1. **Navigate to the project root:** diff --git a/docs/test_api.md b/docs/test_api.md deleted file mode 100644 index 344f8d9..0000000 --- a/docs/test_api.md +++ /dev/null @@ -1,111 +0,0 @@ -# πŸ”ͺ API Manual Test Guide - -This guide contains all `curl` commands to test your FastAPI endpoints locally at `http://127.0.0.1:5000`. - ---- - -## 1. Health Check - -```cmd -curl http://127.0.0.1:5000/health -``` - -### ⏱️ Loop to exceed rate limit (CMD) - -```cmd -for /L %i in (1,1,100) do curl http://127.0.0.1:5000/health -``` - ---- - -## 2. Home Page (HTML) - -```cmd -curl http://127.0.0.1:5000/ -``` - ---- - -## 3. Rate Limit Info - -```cmd -curl http://127.0.0.1:5000/rate-limit-info -``` - ---- - -## 4. Create Table (PUT) - -```cmd -curl -X PUT http://127.0.0.1:5000/api/v1/create/table -``` - ---- - -## 5. Update Table (PUT) - -```cmd -curl -X PUT http://127.0.0.1:5000/api/v1/update/table -``` - ---- - -## 6. Search Endpoint - -### a. Text-Based Search - -```cmd -curl -X POST http://127.0.0.1:5000/api/v1/search -F "search_term=blue pattern" -F "limit=10" --F "page=1" -F "per_page=10" -``` - -### b. Image Search - -```cmd -curl -X POST http://127.0.0.1:5000/api/v1/search -F "file=@path\to\image.jpg" -F "limit=10" --F "page=1" -F "per_page=10" -``` - -> Replace `path\to\image.jpg` with a valid path on your machine. - ---- - -## 7. Analyze Fabric - -```cmd -curl -X POST http://127.0.0.1:5000/api/v1/analyze/fabric -F "file=@path\to\fabric.jpg" -F "analysis_type=short" -``` - ---- - -## 8. Process Fabric Images - -```cmd -curl -X POST http://127.0.0.1:5000/api/v1/process/fabric -F "single_image=@path\to\single.jpg" --F "group_image=@path\to\group.jpg" --F "mode=Fabric Mask (Smooth Blend)" -``` - ---- - -## πŸ” Loop Test for Rate Limiting - -### Text Search Loop (100 Requests) - -```cmd -for /L %i in (1,1,100) do curl -X POST http://127.0.0.1:5000/api/v1/search -F "search_term=test %i" --F "limit=10" -F "page=1" --F "per_page=10" -``` - -> Customize `%i` to test dynamic input. Expect 429 (Too Many Requests) after rate limit is hit. - ---- - -## βœ… Tips - -- Run these commands in **Windows CMD** -- Do **not use `\` for multi-line** in CMD. Combine all options on one line. -- Use `timeout /t 1 >nul` between requests if you want delays. - ---- diff --git a/scripts/trace_entry.py b/scripts/trace_entry.py deleted file mode 100644 index 338263c..0000000 --- a/scripts/trace_entry.py +++ /dev/null @@ -1,8 +0,0 @@ -import sample.__main__ -import inspect - -print("πŸ” main() is from:", inspect.getfile(sample.__main__.main)) -print("πŸ” Source code of main():") -print(inspect.getsource(sample.__main__.main)) - -sample.__main__.main() From d3b0c014967e54441950b4c17b29f260f3369cd9 Mon Sep 17 00:00:00 2001 From: recursivezero Date: Sun, 18 Jan 2026 01:04:02 +0530 Subject: [PATCH 17/17] [core]: mongo is optional and refactor html pages --- CHANGELOG.md | 5 +- {src/assets => assets}/__init__.py | 0 assets/css/404.css | 5 + {templates => assets/css}/faq.css | 7 +- assets/css/style.css | 277 ++++++++++++++++++++++ {src/assets => assets}/images/__init__.py | 0 {src/assets => assets}/images/logo.png | Bin poetry.lock | 15 +- pyproject.toml | 25 +- sample-py.code-workspace | 23 +- src/api/fast_api.py | 7 +- src/db/connection.py | 25 +- src/sample/__main__.py | 74 ++++-- templates/404.html | 9 + templates/base.html | 33 +++ templates/faq.html | 32 ++- templates/index.html | 125 +++++----- templates/share.html | 132 ----------- templates/style.css | 267 --------------------- 19 files changed, 517 insertions(+), 544 deletions(-) rename {src/assets => assets}/__init__.py (100%) create mode 100644 assets/css/404.css rename {templates => assets/css}/faq.css (95%) create mode 100644 assets/css/style.css rename {src/assets => assets}/images/__init__.py (100%) rename {src/assets => assets}/images/logo.png (100%) create mode 100644 templates/404.html create mode 100644 templates/base.html delete mode 100644 templates/share.html delete mode 100644 templates/style.css diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d5603b..7c6bd38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,9 @@ All notable changes to this repository will be documented in this file. - Initial release. - Include boilerplate without streamlit and fast api -## [1.1.0] Sat,17 Jan 2026 +## [1.2.0] Sat,17 Jan 2026 -- Updated UI. +- Updated UI, using common header and footer. - Add clean script. - Add exception handling on API. +- handle 404 on UI diff --git a/src/assets/__init__.py b/assets/__init__.py similarity index 100% rename from src/assets/__init__.py rename to assets/__init__.py diff --git a/assets/css/404.css b/assets/css/404.css new file mode 100644 index 0000000..8208ec5 --- /dev/null +++ b/assets/css/404.css @@ -0,0 +1,5 @@ +.container_404 { + height: fit-content; + display: grid; + place-content: center; +} diff --git a/templates/faq.css b/assets/css/faq.css similarity index 95% rename from templates/faq.css rename to assets/css/faq.css index f9f2a6c..84936a7 100644 --- a/templates/faq.css +++ b/assets/css/faq.css @@ -21,8 +21,7 @@ } .faq-container { - font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - max-width: 900px; + width: 100%; margin: 20px auto; padding: 20px; line-height: 1.6; @@ -59,6 +58,10 @@ box-shadow: 0 6px 12px rgba(215, 81, 202, 0.12); border-color: var(--border-hover); } + + &:open { + border: 2px dashed grey; + } } & p { diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..9053144 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,277 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: #333; + line-height: 1.6; + min-height: 100vh; + position: relative; + overflow-x: hidden; +} + +/* Animated background particles */ +body::before { + content: ""; + position: fixed; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 50%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%); + animation: float 15s ease-in-out infinite; + z-index: 0; +} + +@keyframes float { + 0%, + 100% { + transform: translateY(0) scale(1); + } + + 50% { + transform: translateY(-20px) scale(1.05); + } +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; + position: relative; + z-index: 1; +} + +header { + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 3rem 2rem; + text-align: center; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + margin-bottom: 3rem; + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + animation: slideDown 0.6s ease-out; +} + +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-50px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.logo-container { + width: 120px; + height: 120px; + margin: 0 auto 1.5rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-radius: 30px; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4); + animation: pulse 2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, + 100% { + transform: scale(1); + } + + 50% { + transform: scale(1.05); + } +} + +.logo-container::before { + content: "πŸš€"; + font-size: 60px; +} + +h1 { + font-size: 3rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 0.5rem; + font-weight: 800; +} + +header p { + color: #666; + font-size: 1.2rem; + font-weight: 300; +} + +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-bottom: 2rem; +} + +section { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 2rem; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + transition: + transform 0.3s ease, + box-shadow 0.3s ease; + animation: fadeInUp 0.6s ease-out backwards; +} + +section:nth-child(1) { + animation-delay: 0.1s; +} + +section:nth-child(2) { + animation-delay: 0.2s; +} + +section:nth-child(3) { + animation-delay: 0.3s; +} + +section:nth-child(4) { + animation-delay: 0.4s; +} + +section:nth-child(5) { + animation-delay: 0.5s; +} + +section:nth-child(6) { + animation-delay: 0.6s; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +section:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); +} + +h2 { + color: #667eea; + font-size: 1.8rem; + margin-bottom: 1rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +h2::before { + content: "β–Έ"; + color: #764ba2; + font-weight: bold; +} + +ol, +ul { + margin-left: 1.5rem; + margin-top: 1rem; +} + +li { + margin-bottom: 0.5rem; + color: #555; +} + +pre { + background: #1e1e1e; + border-radius: 10px; + padding: 1.5rem; + overflow-x: auto; + margin-top: 1rem; + box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.3); +} + +code { + color: #b42bb9; + font-style: normal; + font-weight: 800; + line-height: 1.6; +} + +.command-line { + color: #4ec9b0; +} + +footer { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 2rem; + text-align: center; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.5); + margin-top: 3rem; + animation: fadeInUp 0.6s ease-out 0.7s backwards; + position: absolute; + bottom: 2rem; + width: 100%; +} + +footer p { + color: #666; + font-size: 1rem; +} + +.badge { + display: inline-block; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + padding: 0.3rem 0.8rem; + border-radius: 20px; + font-size: 0.85rem; + font-weight: 600; + margin-right: 0.5rem; + box-shadow: 0 2px 10px rgba(102, 126, 234, 0.4); +} + +@media (max-width: 768px) { + h1 { + font-size: 2rem; + } + + .grid { + grid-template-columns: 1fr; + } + + section { + padding: 1.5rem; + } +} + +pre { + margin: 0; + padding: 1.25rem; + word-wrap: normal; + white-space: pre-line; +} diff --git a/src/assets/images/__init__.py b/assets/images/__init__.py similarity index 100% rename from src/assets/images/__init__.py rename to assets/images/__init__.py diff --git a/src/assets/images/logo.png b/assets/images/logo.png similarity index 100% rename from src/assets/images/logo.png rename to assets/images/logo.png diff --git a/poetry.lock b/poetry.lock index 70128dc..1bf16f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -635,9 +635,10 @@ files = [ name = "dnspython" version = "2.8.0" description = "DNS toolkit" -optional = false +optional = true python-versions = ">=3.10" groups = ["main"] +markers = "extra == \"mongo\"" files = [ {file = "dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af"}, {file = "dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f"}, @@ -1012,7 +1013,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["main", "dev"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1283,7 +1284,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["main", "dev"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -2197,9 +2198,10 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pymongo" version = "4.16.0" description = "PyMongo - the Official MongoDB Python driver" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"mongo\"" files = [ {file = "pymongo-4.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ed162b2227f98d5b270ecbe1d53be56c8c81db08a1a8f5f02d89c7bb4d19591d"}, {file = "pymongo-4.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a9390dce61d705a88218f0d7b54d7e1fa1b421da8129fc7c009e029a9a6b81e"}, @@ -3131,7 +3133,10 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] +[extras] +mongo = ["pymongo"] + [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "a5efffd2438fc0aaa834d0a4bb862efb60fd32f767f89dd589e7840ea675f73f" +content-hash = "2d30e1cf477f739c96708c1d316372dd0403102c5065e7eba87263bb01a3ceca" diff --git a/pyproject.toml b/pyproject.toml index 74be45a..ec31dfd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sample" -version = "1.1.0" +version = "1.2.0" description = "A python template for fastapi and mongo projects." authors = [{ name = "sample", email = "recursivezero@outlook.com" }] license = "MIT" @@ -11,15 +11,19 @@ classifiers = [ "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Image Recognition", ] -dependencies = [ - "fastapi (>=0.121.1,<0.122.0)", - "python-box (>=7.3.2,<8.0.0)", - "uvicorn (>=0.40.0,<0.41.0)", - "pymongo (>=4.15.5,<5.0.0)", - "python-dotenv (>=1.2.1,<2.0.0)", - "dotenv (>=0.9.9,<0.10.0)", -] +[tool.poetry.dependencies] +fastapi = ">=0.121.1,<0.122.0" +python-box = ">=7.3.2,<8.0.0" +uvicorn = ">=0.40.0,<0.41.0" +python-dotenv = ">=1.2.1,<2.0.0" +dotenv = ">=0.9.9,<0.10.0" +jinja2 = ">=3.1.0,<4.0.0" +# pymongo is optional +pymongo = { version = ">=4.15.5,<5.0.0", optional = true } + +[tool.poetry.extras] +mongo = ["pymongo"] [tool.poetry] packages = [ @@ -29,9 +33,10 @@ packages = [ { include = "api", from = "src" }, { include = "db", from = "src" }, { include = "templates", from = "." }, - { include = "assets/images/logo.png", from = "src" }, + { include = "assets", from = "." }, ] +exclude = ["src/**/__pycache__", "tests", "docs", "*.log"] [project.scripts] sample = "sample.cli:cli" diff --git a/sample-py.code-workspace b/sample-py.code-workspace index ab37bf3..cefa420 100644 --- a/sample-py.code-workspace +++ b/sample-py.code-workspace @@ -48,12 +48,8 @@ "git.enableSmartCommit": true, "git.autofetch": true, "explorer.excludeGitIgnore": false, - "git.branchPrefix": "feature/TZP-2500", - "git.branchRandomName.enable": true, - "git.branchRandomName.dictionary": [ - "animals", - "numbers" - ], + "git.branchPrefix": "feature/SAM-26000X", + "git.branchRandomName.enable": false, "search.showLineNumbers": true, "workbench.editorAssociations": { "*.log": "default" @@ -117,9 +113,6 @@ }, "peacock.affectSideBarBorder": true, "prettier.quoteProps": "consistent", - "prettier.documentSelectors": [ - "**/*.astro" - ], "git.branchProtection": [ "develop", "main" @@ -150,11 +143,15 @@ ".poetry/**": true, "**/.git": false }, - "mcp": { - "inputs": [], - "servers": {} - }, "gitstash.explorer.display.fileSorting": "tree", "files.insertFinalNewline": true, + "folderStructure.ignorePatterns": [ + "node_modules", + ".*", + "__pycache__" + ], + "html.format.indentInnerHtml": true, + "html.format.indentHandlebars": true, + "editor.formatOnPaste": true } } diff --git a/src/api/fast_api.py b/src/api/fast_api.py index 986c249..cd464d4 100644 --- a/src/api/fast_api.py +++ b/src/api/fast_api.py @@ -2,7 +2,6 @@ from fastapi.responses import HTMLResponse, JSONResponse from pydantic import BaseModel from starlette.exceptions import HTTPException as StarletteHTTPException - from utils.constants import API_PREFIX, GREETING from utils.helper import normalize_name @@ -128,6 +127,12 @@ async def http_exception_handler(request: Request, exc: StarletteHTTPException): ) +# suppress chrome log +@app.get("/.well-known/appspecific/com.chrome.devtools.json") +async def chrome_devtools_probe(): + return JSONResponse({}) + + app.include_router(api_v1) diff --git a/src/db/connection.py b/src/db/connection.py index af9a697..c80a860 100644 --- a/src/db/connection.py +++ b/src/db/connection.py @@ -1,28 +1,37 @@ import io from datetime import datetime -from typing import Optional -from pymongo import MongoClient -from pymongo.database import Database from utils.constants import MONGO_CONFIG -_mongo_client: Optional[MongoClient] = None -_db: Optional[Database] = None +_mongo_client = None +_db = None -def connect_db() -> Database: +def connect_db(): + """ + Connect to MongoDB and return the Database object. + Requires pymongo to be installed via the 'mongo' extra. + """ global _mongo_client, _db if _db is not None: return _db + try: + from pymongo import MongoClient + except ImportError as e: + raise RuntimeError( + "Mongo support not installed. " + "Install with: pip install sample[mongo] or poetry install --extras 'mongo'" + ) from e + try: uri = MONGO_CONFIG["MONGODB_URI"] name = MONGO_CONFIG["DATABASE_NAME"] print("Mongo URI =", repr(uri)) _mongo_client = MongoClient(uri, serverSelectionTimeoutMS=3000) - # This forces an actual connection attempt + # Force an actual connection attempt _mongo_client.admin.command("ping") _db = _mongo_client[name] print("MongoDB connected successfully.") @@ -35,7 +44,7 @@ def connect_db() -> Database: raise RuntimeError(f"MongoDB Connection Error: {e}") -def save_to_mongodb(data: dict, collection): +def save_to_mongodb(data, collection): try: data["created_at"] = datetime.now() result = collection.insert_one(data) diff --git a/src/sample/__main__.py b/src/sample/__main__.py index 54dc458..942bc01 100644 --- a/src/sample/__main__.py +++ b/src/sample/__main__.py @@ -1,40 +1,72 @@ import logging -import os -from http.server import SimpleHTTPRequestHandler +from contextlib import asynccontextmanager from pathlib import Path -from socketserver import TCPServer from db.connection import connect_db +from fastapi import FastAPI, Request +from fastapi.responses import HTMLResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates from utils.constants import PORT from . import __version__ -def main(): +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup logic print("🏷️ Sample version:", __version__) - logging.info("Starting static HTML server...") - db = connect_db() - - # Future app bootstrapping goes here - print(f"Using database: {db.name}") + logging.info("Starting FastAPI server...") + try: + db = connect_db() + print(f"Using database: {db.name}") + except Exception as e: + logging.error(f"⚠️ Database connection failed: {e}") print("App is ready.") - sample_dir = Path(__file__).resolve().parent.parent + yield # <-- control passes to request handling + + # Shutdown logic + logging.info("Shutting down FastAPI server...") + # If you want to close DB connections, do it here + + +# Create FastAPI app with lifespan handler +app = FastAPI(lifespan=lifespan) + +# Mount assets and pages +app.mount("/static", StaticFiles(directory="assets"), name="static") + +# Point Jinja2 to your templates directory +templates = Jinja2Templates( + directory=str(Path(__file__).resolve().parents[2] / "templates") +) + - if "site-packages" in str(sample_dir): - root = sample_dir - logging.info("Running from wheel") - else: - root = sample_dir.parent - logging.info("Running in dev mode") +@app.get("/", response_class=HTMLResponse) +async def index(request: Request): + """Serve the main index.html at root.""" + return templates.TemplateResponse("index.html", {"request": request}) - logging.info(f"Serving from root: {root}") - os.chdir(root) +@app.get("/faq", response_class=HTMLResponse) +async def faq(request: Request): + return templates.TemplateResponse("faq.html", {"request": request}) + + +templates = Jinja2Templates(directory="templates") + + +@app.get("/{full_path:path}", response_class=HTMLResponse) +async def catch_all(request: Request, full_path: str): + return templates.TemplateResponse("404.html", {"request": request}, status_code=404) + + +def main(): + """Entry point for CLI dev command.""" + import uvicorn - with TCPServer(("", PORT), SimpleHTTPRequestHandler) as httpd: - print(f"🌐 Open http://localhost:{PORT}/templates/index.html") - httpd.serve_forever() + uvicorn.run("sample.__main__:app", host="127.0.0.1", port=PORT, reload=True) if __name__ == "__main__": diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 0000000..0e26e95 --- /dev/null +++ b/templates/404.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} {% block title %}404{% endblock %} {% block extra_css %} + +{% endblock %} {% block content %} + +
      +

      404

      +

      Oops! The page you're looking for does not exist.

      +
      +{% endblock %} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..1ad462f --- /dev/null +++ b/templates/base.html @@ -0,0 +1,33 @@ + + + + + + + {% block title %}Sample - Recursive Zero{% endblock %} + + + {% block extra_css %}{% endblock %} + + + + +
      +
      +

      Sample Boilerplate

      +

      A sample template for Recursive Zero repository

      + +
      + +
      {% block content %}{% endblock %}
      + + +
      +

      © 2026 | Built with ❀️ by RecursiveZero

      +
      + + + diff --git a/templates/faq.html b/templates/faq.html index db4656e..4871253 100644 --- a/templates/faq.html +++ b/templates/faq.html @@ -1,33 +1,39 @@ - +{% extends "base.html" %} {% block title %}FAQs{% endblock %} {% block extra_css %} + +{% endblock %} {% block content %} -
      +

      Frequently Asked Questions

      What is sample? -

      This is a sample template with minimal setup of poetry with fast api. go through README and start developing. -

      +

      This is a sample template with minimal setup of poetry with fast api. go through README and start developing.

      What are the main packages and libraries?
        -
      • we are using html for front end and Fast API for backend.
      • -
      • we also have versioning system, if you change version in `pyproject.toml`, it will automatically reflected in - api
      • +
      • we are using vanilla html for front end and Fast API for backend.
      • +
      • + we also have versioning system, if you change version in pyproject.toml, it will automatically + reflected in api +
      • using `Box` for centralized messaged which later can be changed using i18n support.
      What are method to run? -

      run `poetry run sample dev` for html UI.

      -

      run `poetry run sample api` and /version` is one endpoint.

      -

      run `poetry run lint` to lint the code.

      +

      run poetry run sample dev for UI.

      +

      run poetry run sample api and /version is one endpoint.

      +

      run poetry run lint to lint the code.

      How it is different from others? -

      This is a useful to start the development with pre-defined template and best practices and define folder - structure.

      +

      + This is a useful to start the development with pre-defined template and best practices and define folder + structure. +

      -
      + +{% endblock %} diff --git a/templates/index.html b/templates/index.html index 48a9cb3..57a5024 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,75 +1,60 @@ - - - - - - - Sample Boilerplate - Recursive Zero - - - - -
      -
      -
      -

      Sample Boilerplate

      -

      A sample template for Recursive Zero repository

      -
      - -
      -
      -

      πŸš€ How to Run

      -
        -
      1. Open this file directly in your browser.
      2. -
      3. No server, no build, no dependencies required.
      4. -
      -
      - -
      -

      πŸ“‹ Prerequisites

      -
        -
      • Python β‰₯ 3.11
      • -
      • Poetry β‰₯ 2.2.1
      • -
      -
      -
      - -
      -
      -

      πŸ“¦ Installation

      -
      pip install poetry>=2.2.1
      -poetry install
      -
      - -
      -

      ▢️ Run Sample App

      -
      poetry run sample dev
      -
      -
      +{% extends "base.html" %} {% block title %}Home{% endblock %} {% block content %} +
      +
      +
      +

      πŸš€ How to Run

      +
        +
      1. Open this file directly in your browser.
      2. +
      3. No server, no build, no dependencies required.
      4. +
      +
      + +
      +

      πŸ“‹ Prerequisites

      +
        +
      • Python β‰₯ 3.11
      • +
      • Poetry β‰₯ 2.2.1
      • +
      +
      +
      -
      -
      -

      🌐 Run Server

      -
      poetry run sample api
      -
      +
      +
      +

      πŸ“¦ Installation

      +
      +        
      +          pip install poetry>=2.2.1
      +          poetry install
      +        
      +      
      +
      + +
      +

      ▢️ Run Sample App

      +
      +        poetry run sample dev
      +      
      +
      +
      -
      -

      ✨ Linting

      -
      poetry run lint
      -
      -
      -
      -
      -

      ❓ FAQs

      -

      Common questions, troubleshooting tips, and usage notes are available in the FAQs page.

      - Open FAQ -
      -
      +
      +
      +

      🌐 Run Server

      +
      poetry run sample api
      +
      -
      -

      πŸ“„ License: MIT | Built with ❀️ for Recursive Zero

      -
      +
      +

      ✨ Linting

      +
      poetry run lint
      +
      - - +
      +
      +

      ❓FAQs

      +

      Common questions, troubleshooting tips, and usage notes are available in the FAQs page.

      + Open FAQ +
      +
      +
      +{% endblock %} diff --git a/templates/share.html b/templates/share.html deleted file mode 100644 index a6014fc..0000000 --- a/templates/share.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - Sample Lab - AI Fabric Analysis - - - - - - - - - -

      Redirecting to Sample Lab... Click here if not redirected

      - - - \ No newline at end of file diff --git a/templates/style.css b/templates/style.css deleted file mode 100644 index 239f991..0000000 --- a/templates/style.css +++ /dev/null @@ -1,267 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box; - } - - body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: #333; - line-height: 1.6; - min-height: 100vh; - position: relative; - overflow-x: hidden; - } - - /* Animated background particles */ - body::before { - content: ''; - position: fixed; - width: 100%; - height: 100%; - background-image: - radial-gradient(circle at 20% 50%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%); - animation: float 15s ease-in-out infinite; - z-index: 0; - } - - @keyframes float { - - 0%, - 100% { - transform: translateY(0) scale(1); - } - - 50% { - transform: translateY(-20px) scale(1.05); - } - } - - .container { - max-width: 1200px; - margin: 0 auto; - padding: 2rem; - position: relative; - z-index: 1; - } - - header { - background: rgba(255, 255, 255, 0.95); - border-radius: 20px; - padding: 3rem 2rem; - text-align: center; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); - margin-bottom: 3rem; - backdrop-filter: blur(10px); - border: 2px solid rgba(255, 255, 255, 0.5); - animation: slideDown 0.6s ease-out; - } - - @keyframes slideDown { - from { - opacity: 0; - transform: translateY(-50px); - } - - to { - opacity: 1; - transform: translateY(0); - } - } - - .logo-container { - width: 120px; - height: 120px; - margin: 0 auto 1.5rem; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - border-radius: 30px; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4); - animation: pulse 2s ease-in-out infinite; - } - - @keyframes pulse { - - 0%, - 100% { - transform: scale(1); - } - - 50% { - transform: scale(1.05); - } - } - - .logo-container::before { - content: 'πŸš€'; - font-size: 60px; - } - - h1 { - font-size: 3rem; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 0.5rem; - font-weight: 800; - } - - header p { - color: #666; - font-size: 1.2rem; - font-weight: 300; - } - - .grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 2rem; - margin-bottom: 2rem; - } - - section { - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 2rem; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - border: 2px solid rgba(255, 255, 255, 0.5); - transition: transform 0.3s ease, box-shadow 0.3s ease; - animation: fadeInUp 0.6s ease-out backwards; - } - - section:nth-child(1) { - animation-delay: 0.1s; - } - - section:nth-child(2) { - animation-delay: 0.2s; - } - - section:nth-child(3) { - animation-delay: 0.3s; - } - - section:nth-child(4) { - animation-delay: 0.4s; - } - - section:nth-child(5) { - animation-delay: 0.5s; - } - - section:nth-child(6) { - animation-delay: 0.6s; - } - - @keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - - to { - opacity: 1; - transform: translateY(0); - } - } - - section:hover { - transform: translateY(-5px); - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); - } - - h2 { - color: #667eea; - font-size: 1.8rem; - margin-bottom: 1rem; - display: flex; - align-items: center; - gap: 0.5rem; - } - - h2::before { - content: 'β–Έ'; - color: #764ba2; - font-weight: bold; - } - - ol, - ul { - margin-left: 1.5rem; - margin-top: 1rem; - } - - li { - margin-bottom: 0.5rem; - color: #555; - } - - pre { - background: #1e1e1e; - border-radius: 10px; - padding: 1.5rem; - overflow-x: auto; - margin-top: 1rem; - box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.3); - } - - code { - color: #9cdcfe; - font-family: 'Courier New', Courier, monospace; - font-size: 0.95rem; - line-height: 1.6; - } - - .command-line { - color: #4ec9b0; - } - - footer { - background: rgba(255, 255, 255, 0.95); - border-radius: 15px; - padding: 2rem; - text-align: center; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); - backdrop-filter: blur(10px); - border: 2px solid rgba(255, 255, 255, 0.5); - margin-top: 3rem; - animation: fadeInUp 0.6s ease-out 0.7s backwards; - } - - footer p { - color: #666; - font-size: 1rem; - } - - .badge { - display: inline-block; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 0.3rem 0.8rem; - border-radius: 20px; - font-size: 0.85rem; - font-weight: 600; - margin-right: 0.5rem; - box-shadow: 0 2px 10px rgba(102, 126, 234, 0.4); - } - - @media (max-width: 768px) { - h1 { - font-size: 2rem; - } - - .grid { - grid-template-columns: 1fr; - } - - section { - padding: 1.5rem; - } - }