From 1e371613dc180628a51267df94a7ad354febe20f Mon Sep 17 00:00:00 2001 From: Francis Secada Date: Mon, 20 Jan 2025 22:16:04 -0500 Subject: [PATCH] WIP: building frontend; linkng pages to form backends --- .pre-commit-config.yaml | 22 ++++- core_requirements.in | 2 + core_requirements.txt | 18 +++- dev_requirements.in | 2 +- dev_requirements.txt | 14 +-- pyproject.toml | 18 ++-- src/app.py | 13 ++- src/backend/core/core.py | 42 +++++++- src/backend/site/router.py | 6 +- src/backend/utils.py | 26 +++++ .../templates/components/forms/Form.jinja | 28 ++++++ .../templates/components/forms/Search.jinja | 21 ++++ .../templates/components/main/Base.jinja | 11 --- .../templates/components/main/Header.jinja | 1 + .../components/main/Stylesheets.jinja | 20 ++-- .../templates/components/main/base.html | 19 ++++ .../templates/components/main/footer.html | 0 .../templates/components/main/header.html | 7 ++ .../templates/components/main/nav.html | 0 .../components/main/style_sheets.html | 11 +++ .../templates/components/snippets/js.html | 6 ++ src/frontend/templates/home.html | 23 ++++- uv.lock | 98 ++++++++++++++----- 23 files changed, 331 insertions(+), 77 deletions(-) create mode 100644 src/frontend/templates/components/forms/Form.jinja create mode 100644 src/frontend/templates/components/forms/Search.jinja create mode 100644 src/frontend/templates/components/main/base.html create mode 100644 src/frontend/templates/components/main/footer.html create mode 100644 src/frontend/templates/components/main/header.html create mode 100644 src/frontend/templates/components/main/nav.html create mode 100644 src/frontend/templates/components/main/style_sheets.html create mode 100644 src/frontend/templates/components/snippets/js.html diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ba5615b..edb7492 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,15 +2,33 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: + - id: check-added-large-files + args: ['--maxkb=5000'] - id: check-ast + - id: check-builtin-literals + - id: check-byte-order-marker + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs - id: check-json - id: check-merge-conflict + # - id: check-shebang-scripts-are-executable + - id: check-symlinks + - id: check-toml + - id: check-vcs-permalinks + - id: check-xml - id: check-yaml - - id: check-builtin-literals - id: debug-statements + exclude: tests/ - id: destroyed-symlinks + # - id: detect-aws-credentials + - id: detect-private-key - id: end-of-file-fixer - - id: mixed-line-ending + exclude: tests/test_changes/ + files: \.(py|sh|rst|yml|yaml)$ + - id: pretty-format-json + args: [--autofix] + - id: sort-simple-yaml - id: trailing-whitespace - repo: https://github.com/aufdenpunkt/pre-commit-js-beautify rev: 1.13.0 # represents the used version of JS Beautify as well diff --git a/core_requirements.in b/core_requirements.in index 8fc37eb..a2a7df3 100644 --- a/core_requirements.in +++ b/core_requirements.in @@ -17,6 +17,8 @@ jinjax loguru lxml lxml[html_clean] +openai +praw python-dateutil python-decouple python-slugify diff --git a/core_requirements.txt b/core_requirements.txt index ea09d88..3e61d98 100644 --- a/core_requirements.txt +++ b/core_requirements.txt @@ -195,8 +195,10 @@ mistralai==1.3.1 # via pydantic-ai-slim mypy-extensions==1.0.0 # via typing-inspect -openai==1.59.8 - # via pydantic-ai-slim +openai==1.59.9 + # via + # -r core_requirements.in + # pydantic-ai-slim opentelemetry-api==1.29.0 # via # opentelemetry-exporter-otlp-proto-http @@ -254,11 +256,15 @@ packaging==24.2 # via opentelemetry-instrumentation parse==1.20.2 # via httpx-html +praw==7.8.1 + # via -r core_requirements.in +prawcore==2.4.0 + # via praw priority==2.0.0 # via hypercorn prometheus-client==0.21.1 # via flower -prompt-toolkit==3.0.48 +prompt-toolkit==3.0.50 # via click-repl protobuf==5.29.3 # via @@ -334,7 +340,9 @@ redis==5.2.1 requests==2.32.3 # via # opentelemetry-exporter-otlp-proto-http + # prawcore # pydantic-ai-slim + # update-checker rich==13.9.4 # via # logfire @@ -410,6 +418,8 @@ tzdata==2024.2 # celery # kombu # psycopg +update-checker==0.18.0 + # via praw urllib3==1.26.20 # via # pyppeteer @@ -429,6 +439,8 @@ wcwidth==0.2.13 # via prompt-toolkit webencodings==0.5.1 # via html5lib +websocket-client==1.8.0 + # via praw websockets==10.4 # via pyppeteer win32-setctime==1.2.0 diff --git a/dev_requirements.in b/dev_requirements.in index 15e8e1d..e24e016 100644 --- a/dev_requirements.in +++ b/dev_requirements.in @@ -2,7 +2,7 @@ alembic black -fastapi-debug-toolbar +fastapi-debug-toolbar @ git+https://github.com/fsecada01/fastapi-debug-toolbar.git@patch-2 isort jupyterlab jupyterlab-code-formatter diff --git a/dev_requirements.txt b/dev_requirements.txt index 8c774ee..2aee6ff 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1,6 +1,6 @@ # This file was autogenerated by uv via the following command: # uv pip compile --strip-extras dev_requirements.in -o dev_requirements.txt -alembic==1.14.0 +alembic==1.14.1 # via -r dev_requirements.in annotated-types==0.7.0 # via @@ -80,7 +80,7 @@ fastapi==0.115.6 # via # -c core_requirements.txt # fastapi-debug-toolbar -fastapi-debug-toolbar==0.6.3 +fastapi-debug-toolbar @ git+https://github.com/fsecada01/fastapi-debug-toolbar.git@2da9f1e724d1d7ca56990ba7a8e72598fa3e1cf4 # via -r dev_requirements.in fastjsonschema==2.21.1 # via nbformat @@ -104,7 +104,7 @@ httpx==0.28.1 # via # -c core_requirements.txt # jupyterlab -identify==2.6.5 +identify==2.6.6 # via pre-commit idna==3.10 # via @@ -233,13 +233,13 @@ platformdirs==4.3.6 # black # jupyter-core # virtualenv -pre-commit==4.0.1 +pre-commit==4.1.0 # via -r dev_requirements.in prometheus-client==0.21.1 # via # -c core_requirements.txt # jupyter-server -prompt-toolkit==3.0.48 +prompt-toolkit==3.0.50 # via # -c core_requirements.txt # ipython @@ -412,4 +412,6 @@ webencodings==0.5.1 # bleach # tinycss2 websocket-client==1.8.0 - # via jupyter-server + # via + # -c core_requirements.txt + # jupyter-server diff --git a/pyproject.toml b/pyproject.toml index dd09d47..d7f5b75 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ line_length = 80 [tool.uv.sources] sqlmodel-crud-utilities = { git = "https://github.com/fsecada01/SQLModel-CRUD-Utilities", rev = "83e964f6e7b633e339e45ddcaaa49cd8617fa105" } +fastapi-debug-toolbar = { git = "https://github.com/fsecada01/fastapi-debug-toolbar.git", rev = "2da9f1e724d1d7ca56990ba7a8e72598fa3e1cf4" } #multi_line_output = 3 #include_trailing_comma = true #force_grid_wrap = 0 @@ -140,7 +141,7 @@ dependencies = [ "mdurl==0.1.2", "mistralai==1.3.1", "mypy-extensions==1.0.0", - "openai==1.59.8", + "openai==1.59.9", "opentelemetry-api==1.29.0", "opentelemetry-exporter-otlp-proto-common==1.29.0", "opentelemetry-exporter-otlp-proto-http==1.29.0", @@ -156,9 +157,11 @@ dependencies = [ "opentelemetry-util-http==0.50b0", "packaging==24.2", "parse==1.20.2", + "praw==7.8.1", + "prawcore==2.4.0", "priority==2.0.0", "prometheus-client==0.21.1", - "prompt-toolkit==3.0.48", + "prompt-toolkit==3.0.50", "protobuf==5.29.3", "psutil==5.9.8", "psycopg==3.2.4", @@ -201,12 +204,14 @@ dependencies = [ "typing-extensions==4.12.2", "typing-inspect==0.9.0", "tzdata==2024.2", + "update-checker==0.18.0", "urllib3==1.26.20", "uvicorn==0.34.0", "vine==5.1.0", "w3lib==2.2.1", "wcwidth==0.2.13", "webencodings==0.5.1", + "websocket-client==1.8.0", "websockets==10.4", "win32-setctime==1.2.0", "wrapt==1.17.2", @@ -218,7 +223,8 @@ dependencies = [ [dependency-groups] dev = [ - "alembic==1.14.0", + "aiofiles==24.1.0", + "alembic==1.14.1", "annotated-types==0.7.0", "anyio==4.8.0", "argon2-cffi-bindings==21.2.0", @@ -252,7 +258,7 @@ dev = [ "h11==0.14.0", "httpcore==1.0.7", "httpx==0.28.1", - "identify==2.6.5", + "identify==2.6.6", "idna==3.10", "ipykernel==6.29.5", "ipython==8.31.0", @@ -291,9 +297,9 @@ dev = [ "parso==0.8.4", "pathspec==0.12.1", "platformdirs==4.3.6", - "pre-commit==4.0.1", + "pre-commit==4.1.0", "prometheus-client==0.21.1", - "prompt-toolkit==3.0.48", + "prompt-toolkit==3.0.50", "psutil==5.9.8", "pure-eval==0.2.3", "pycparser==2.22", diff --git a/src/app.py b/src/app.py index 7df692e..c5ddd4e 100644 --- a/src/app.py +++ b/src/app.py @@ -61,6 +61,7 @@ async def unicorn_exception_handler(request: Request, exc: UnicornException): :param exc: UnicornException :return: JSONResponse """ + logger.error(f"{request}: {exc.name}") return JSONResponse( status_code=418, content={ @@ -84,19 +85,21 @@ app.add_middleware( https_only=get_val("HTTPS_ONLY", False), ) -app.include_router(user_frontend) - -@app.get("/", response_class=HTMLResponse) +@user_frontend.get("/", response_class=HTMLResponse) async def home_page(request: Request) -> HTMLResponse: """ default homepage for the web application :param request: :return: HTMLResponse """ - return templates.TemplateResponse("home.html", {"request": request}) + return templates.TemplateResponse( + request, "home.html", context={"request": request} + ) +app.include_router(user_frontend) + if app_settings.DEBUG in (True, "True"): from debug_toolbar.middleware import DebugToolbarMiddleware from debug_toolbar.panels.sqlalchemy import SQLAlchemyPanel @@ -114,7 +117,7 @@ if app_settings.DEBUG in (True, "True"): async def add_engines(self, request: Request): """ Adding SQLModel engine to middleware object. - :param request: Request + :param request: Request0 :return: """ self.engines.add(engine.sync_engine) diff --git a/src/backend/core/core.py b/src/backend/core/core.py index ffbdeb6..89063b9 100644 --- a/src/backend/core/core.py +++ b/src/backend/core/core.py @@ -1,11 +1,15 @@ from collections.abc import Callable +from dataclasses import dataclass from typing import Any +import openai +import praw from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from backend.core.consts import AI_MODEL, default_system_prompt from backend.db.base import Base +from backend.logger import logger from backend.utils import get_val @@ -19,13 +23,49 @@ class SwotAnalysis(Base): analysis: str -class SwotAgentDeps(Base): +def get_reddit_client( + user_agent: str, check_for_async: bool = False +) -> praw.Reddit | None: + """ + A function to return a reddit client, provided all env vars are loaded. + + :param user_agent: str + :param check_for_async: bool = False + + :return: praw.Reddit | None + """ + try: + reddit: praw.Reddit = praw.Reddit( + client_id=get_val("REDDIT_CLIENT_ID"), + client_secret=get_val("REDDIT_CLIENT_SECRET"), + user_agent=user_agent, + check_for_async=check_for_async, + ) + except ValueError as e: + reddit = None + logger.info( + f"Reddit client not initialized. Please set the " + f"REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET environment. " + f"Also please note the error: {e} " + ) + + return reddit + + +@dataclass +class SwotAgentDeps: """Agent Dependencies for SWOT Analysis""" request: Any | None = None update_status_func: Callable | None = None tool_history: list[str] | None = None + reddit_client: praw.Reddit | None = get_reddit_client( + user_agent=get_val("REDDIT_USER_AGENT"), check_for_async=False + ) + + client = openai.Client(api_key=get_val("OPENAI_API_KEY")) + swot_agent = Agent( OpenAIModel(model_name=AI_MODEL, api_key=get_val("OPENAI_API_KEY")), diff --git a/src/backend/site/router.py b/src/backend/site/router.py index 53df4e0..393aa91 100644 --- a/src/backend/site/router.py +++ b/src/backend/site/router.py @@ -2,10 +2,10 @@ import asyncio import os from fastapi import APIRouter, Form, Request +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates from jinjax import Catalog, JinjaX from starlette.responses import HTMLResponse -from starlette.staticfiles import StaticFiles -from starlette.templating import Jinja2Templates from backend.logger import logger from backend.settings import app_settings @@ -39,7 +39,7 @@ user_frontend.mount( ) -@user_frontend.post("analyze", response_class=HTMLResponse) +@user_frontend.post("/analyze", response_class=HTMLResponse) async def analyze_url(request: Request, url: str = Form(...)) -> HTMLResponse: """ Analyze a given URL using SWOT analysis agent diff --git a/src/backend/utils.py b/src/backend/utils.py index 0c36e65..b6b863a 100644 --- a/src/backend/utils.py +++ b/src/backend/utils.py @@ -3,6 +3,32 @@ import os from decouple import config +class ContextManager: + """ + Context middleware to inject all variables into the global context + object. This will ensure that the `request` object is available to all + components in JinjaX and removes the need to pass it through explicitly. + """ + + def __init__(self): + self.global_context = {} + + def set_context(self, **kwargs): + """ + Sets the global context for the application via kwargs + + :param kwargs: dict[str, Any] + """ + self.global_context.update(kwargs) + + def get_context(self): + """ + retrieves the global context for the application + :return: dict[str, Any] + """ + return self.global_context + + def get_db_url(env: str = "dev"): """ diff --git a/src/frontend/templates/components/forms/Form.jinja b/src/frontend/templates/components/forms/Form.jinja new file mode 100644 index 0000000..9d212f0 --- /dev/null +++ b/src/frontend/templates/components/forms/Form.jinja @@ -0,0 +1,28 @@ +{# def +form_id: str, +action: str, +target: str, +method: str = 'GET' +#} +
+
+ {{ content }} +
+
+ +
+
+
+
\ No newline at end of file diff --git a/src/frontend/templates/components/forms/Search.jinja b/src/frontend/templates/components/forms/Search.jinja new file mode 100644 index 0000000..3b4a1a8 --- /dev/null +++ b/src/frontend/templates/components/forms/Search.jinja @@ -0,0 +1,21 @@ +{# def + form_id: str, + action: str, + target: str, + method: str = 'GET' +#} +
+
+ + +
+ {{ content }} +
\ No newline at end of file diff --git a/src/frontend/templates/components/main/Base.jinja b/src/frontend/templates/components/main/Base.jinja index 215a446..6b5afc2 100644 --- a/src/frontend/templates/components/main/Base.jinja +++ b/src/frontend/templates/components/main/Base.jinja @@ -3,17 +3,6 @@
- - - - - - - integrity="sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==" - crossorigin="anonymous" - referrerpolicy="no-referrer" -
diff --git a/src/frontend/templates/components/main/Header.jinja b/src/frontend/templates/components/main/Header.jinja index f85680b..1008d40 100644 --- a/src/frontend/templates/components/main/Header.jinja +++ b/src/frontend/templates/components/main/Header.jinja @@ -9,4 +9,5 @@ {{ title }} {{ content }} + {% include 'style_sheets.html' %} \ No newline at end of file diff --git a/src/frontend/templates/components/main/Stylesheets.jinja b/src/frontend/templates/components/main/Stylesheets.jinja index 4d75f33..0449f83 100644 --- a/src/frontend/templates/components/main/Stylesheets.jinja +++ b/src/frontend/templates/components/main/Stylesheets.jinja @@ -1,9 +1,11 @@ - - - - - integrity="sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==" - crossorigin="anonymous" - referrerpolicy="no-referrer" - \ No newline at end of file + + + + \ No newline at end of file diff --git a/src/frontend/templates/components/main/base.html b/src/frontend/templates/components/main/base.html new file mode 100644 index 0000000..2481de2 --- /dev/null +++ b/src/frontend/templates/components/main/base.html @@ -0,0 +1,19 @@ + + + + + {% include "components/main/header.html" %} + {% block css_content %} + {% endblock css_content %} + + + + {% include "components/main/nav.html" %} + {% block content%} + {% endblock %} + {% block js_content %} + {% endblock js_content %} + {% include "components/snippets/js.html" %} + + + \ No newline at end of file diff --git a/src/frontend/templates/components/main/footer.html b/src/frontend/templates/components/main/footer.html new file mode 100644 index 0000000..e69de29 diff --git a/src/frontend/templates/components/main/header.html b/src/frontend/templates/components/main/header.html new file mode 100644 index 0000000..caac118 --- /dev/null +++ b/src/frontend/templates/components/main/header.html @@ -0,0 +1,7 @@ + + +{% block title %}Pygentic AI{% endblock title %} +{% block head_content %} +{% endblock head_content %} +{% include 'components/main/style_sheets.html' %} \ No newline at end of file diff --git a/src/frontend/templates/components/main/nav.html b/src/frontend/templates/components/main/nav.html new file mode 100644 index 0000000..e69de29 diff --git a/src/frontend/templates/components/main/style_sheets.html b/src/frontend/templates/components/main/style_sheets.html new file mode 100644 index 0000000..7185789 --- /dev/null +++ b/src/frontend/templates/components/main/style_sheets.html @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/src/frontend/templates/components/snippets/js.html b/src/frontend/templates/components/snippets/js.html new file mode 100644 index 0000000..bc1fc86 --- /dev/null +++ b/src/frontend/templates/components/snippets/js.html @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/frontend/templates/home.html b/src/frontend/templates/home.html index c362309..c13d93e 100644 --- a/src/frontend/templates/home.html +++ b/src/frontend/templates/home.html @@ -1,3 +1,20 @@ - -

foo bar

- \ No newline at end of file +{% extends "components/main/base.html" %} +{% block content %} +
+
+

SWOT ANALYZER

+

Strengths, Weaknesses, Opportunities and Threats + breakdown, courtesy of Generative AI-driven insights.

+ +

Try it out now!

+
+
+
+

Search Here

+ + +
+{% endblock content %} \ No newline at end of file diff --git a/uv.lock b/uv.lock index d510f54..a7576af 100644 --- a/uv.lock +++ b/uv.lock @@ -87,6 +87,8 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "packaging" }, { name = "parse" }, + { name = "praw" }, + { name = "prawcore" }, { name = "priority" }, { name = "prometheus-client" }, { name = "prompt-toolkit" }, @@ -132,12 +134,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspect" }, { name = "tzdata" }, + { name = "update-checker" }, { name = "urllib3" }, { name = "uvicorn" }, { name = "vine" }, { name = "w3lib" }, { name = "wcwidth" }, { name = "webencodings" }, + { name = "websocket-client" }, { name = "websockets" }, { name = "win32-setctime" }, { name = "wrapt" }, @@ -149,6 +153,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "aiofiles" }, { name = "alembic" }, { name = "annotated-types" }, { name = "anyio" }, @@ -338,7 +343,7 @@ requires-dist = [ { name = "mdurl", specifier = "==0.1.2" }, { name = "mistralai", specifier = "==1.3.1" }, { name = "mypy-extensions", specifier = "==1.0.0" }, - { name = "openai", specifier = "==1.59.8" }, + { name = "openai", specifier = "==1.59.9" }, { name = "opentelemetry-api", specifier = "==1.29.0" }, { name = "opentelemetry-exporter-otlp-proto-common", specifier = "==1.29.0" }, { name = "opentelemetry-exporter-otlp-proto-http", specifier = "==1.29.0" }, @@ -354,9 +359,11 @@ requires-dist = [ { name = "opentelemetry-util-http", specifier = "==0.50b0" }, { name = "packaging", specifier = "==24.2" }, { name = "parse", specifier = "==1.20.2" }, + { name = "praw", specifier = "==7.8.1" }, + { name = "prawcore", specifier = "==2.4.0" }, { name = "priority", specifier = "==2.0.0" }, { name = "prometheus-client", specifier = "==0.21.1" }, - { name = "prompt-toolkit", specifier = "==3.0.48" }, + { name = "prompt-toolkit", specifier = "==3.0.50" }, { name = "protobuf", specifier = "==5.29.3" }, { name = "psutil", specifier = "==5.9.8" }, { name = "psycopg", specifier = "==3.2.4" }, @@ -399,12 +406,14 @@ requires-dist = [ { name = "typing-extensions", specifier = "==4.12.2" }, { name = "typing-inspect", specifier = "==0.9.0" }, { name = "tzdata", specifier = "==2024.2" }, + { name = "update-checker", specifier = "==0.18.0" }, { name = "urllib3", specifier = "==1.26.20" }, { name = "uvicorn", specifier = "==0.34.0" }, { name = "vine", specifier = "==5.1.0" }, { name = "w3lib", specifier = "==2.2.1" }, { name = "wcwidth", specifier = "==0.2.13" }, { name = "webencodings", specifier = "==0.5.1" }, + { name = "websocket-client", specifier = "==1.8.0" }, { name = "websockets", specifier = "==10.4" }, { name = "win32-setctime", specifier = "==1.2.0" }, { name = "wrapt", specifier = "==1.17.2" }, @@ -416,7 +425,8 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "alembic", specifier = "==1.14.0" }, + { name = "aiofiles", specifier = "==24.1.0" }, + { name = "alembic", specifier = "==1.14.1" }, { name = "annotated-types", specifier = "==0.7.0" }, { name = "anyio", specifier = "==4.8.0" }, { name = "argon2-cffi", specifier = "==23.1.0" }, @@ -442,7 +452,7 @@ dev = [ { name = "distlib", specifier = "==0.3.9" }, { name = "executing", specifier = "==2.1.0" }, { name = "fastapi", specifier = "==0.115.6" }, - { name = "fastapi-debug-toolbar", specifier = "==0.6.3" }, + { name = "fastapi-debug-toolbar", git = "https://github.com/fsecada01/fastapi-debug-toolbar.git?rev=2da9f1e724d1d7ca56990ba7a8e72598fa3e1cf4" }, { name = "fastjsonschema", specifier = "==2.21.1" }, { name = "filelock", specifier = "==3.16.1" }, { name = "fqdn", specifier = "==1.5.1" }, @@ -450,7 +460,7 @@ dev = [ { name = "h11", specifier = "==0.14.0" }, { name = "httpcore", specifier = "==1.0.7" }, { name = "httpx", specifier = "==0.28.1" }, - { name = "identify", specifier = "==2.6.5" }, + { name = "identify", specifier = "==2.6.6" }, { name = "idna", specifier = "==3.10" }, { name = "ipykernel", specifier = "==6.29.5" }, { name = "ipython", specifier = "==8.31.0" }, @@ -489,9 +499,9 @@ dev = [ { name = "parso", specifier = "==0.8.4" }, { name = "pathspec", specifier = "==0.12.1" }, { name = "platformdirs", specifier = "==4.3.6" }, - { name = "pre-commit", specifier = "==4.0.1" }, + { name = "pre-commit", specifier = "==4.1.0" }, { name = "prometheus-client", specifier = "==0.21.1" }, - { name = "prompt-toolkit", specifier = "==3.0.48" }, + { name = "prompt-toolkit", specifier = "==3.0.50" }, { name = "psutil", specifier = "==5.9.8" }, { name = "pure-eval", specifier = "==0.2.3" }, { name = "pycparser", specifier = "==2.22" }, @@ -561,16 +571,16 @@ wheels = [ [[package]] name = "alembic" -version = "1.14.0" +version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mako" }, { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/1e/8cb8900ba1b6360431e46fb7a89922916d3a1b017a8908a7c0499cc7e5f6/alembic-1.14.0.tar.gz", hash = "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b", size = 1916172 } +sdist = { url = "https://files.pythonhosted.org/packages/99/09/f844822e4e847a3f0bd41797f93c4674cd4d2462a3f6c459aa528cdf786e/alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213", size = 1918219 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/06/8b505aea3d77021b18dcbd8133aa1418f1a1e37e432a465b14c46b2c0eaa/alembic-1.14.0-py3-none-any.whl", hash = "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25", size = 233482 }, + { url = "https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5", size = 233565 }, ] [[package]] @@ -1100,7 +1110,7 @@ wheels = [ [[package]] name = "fastapi-debug-toolbar" version = "0.6.3" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/fsecada01/fastapi-debug-toolbar.git?rev=2da9f1e724d1d7ca56990ba7a8e72598fa3e1cf4#2da9f1e724d1d7ca56990ba7a8e72598fa3e1cf4" } dependencies = [ { name = "anyio" }, { name = "fastapi" }, @@ -1111,10 +1121,6 @@ dependencies = [ { name = "pyinstrument" }, { name = "sqlparse" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/e6/c228493e929eeb2b9e61806a63e78c3c0bec4e22ddee99f321ffba4fa64a/fastapi_debug_toolbar-0.6.3.tar.gz", hash = "sha256:15ff6828f9432c786af39f23a2d814ef2af516964b5a9a856444de135a78b2af", size = 26929 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/09/b01c8c60d608e93faa257a9a3fc9a9739c70c9ac926edfbbe92baebbf33b/fastapi_debug_toolbar-0.6.3-py3-none-any.whl", hash = "sha256:077b5ffeb10426c49387ef090cf307a316d5c71c69bbffe270d9898d2554429e", size = 42904 }, -] [[package]] name = "fastapi-restful" @@ -1393,11 +1399,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.5" +version = "2.6.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } +sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, + { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, ] [[package]] @@ -2085,7 +2091,7 @@ wheels = [ [[package]] name = "openai" -version = "1.59.8" +version = "1.59.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2097,9 +2103,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/c4/b4482784de63c7158f6c0afcb07fd66450ea6c912d6bddf9d7599f2eda25/openai-1.59.8.tar.gz", hash = "sha256:ac4bda5fa9819fdc6127e8ea8a63501f425c587244bc653c7c11a8ad84f953e1", size = 346775 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/2d/04faa92bac0341649223398503db4415d2f658a757d9d32bb68f3378ddd0/openai-1.59.9.tar.gz", hash = "sha256:ec1a20b0351b4c3e65c6292db71d8233515437c6065efd4fd50edeb55df5f5d2", size = 347134 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/cf/5b235e12ead3cd2098f9792776c966994c1bc558cba5799e12f3045227df/openai-1.59.8-py3-none-any.whl", hash = "sha256:a8b8ee35c4083b88e6da45406d883cf6bd91a98ab7dd79178b8bc24c8bfb09d9", size = 455567 }, + { url = "https://files.pythonhosted.org/packages/07/b4/57f1954a4560092ad8c45f07ad183eab9c8e093e0a1db829f9b506b2d5d1/openai-1.59.9-py3-none-any.whl", hash = "sha256:61a0608a1313c08ddf92fe793b6dbd1630675a1fe3866b2f96447ce30050c448", size = 455527 }, ] [[package]] @@ -2358,9 +2364,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] +[[package]] +name = "praw" +version = "7.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prawcore" }, + { name = "update-checker" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/52/7dd0b3d9ccb78e90236420ef6c51b6d9b2400a7229442f0cfcf2258cce21/praw-7.8.1.tar.gz", hash = "sha256:3c5767909f71e48853eb6335fef7b50a43cbe3da728cdfb16d3be92904b0a4d8", size = 154106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/ca/60ec131c3b43bff58261167045778b2509b83922ce8f935ac89d871bd3ea/praw-7.8.1-py3-none-any.whl", hash = "sha256:15917a81a06e20ff0aaaf1358481f4588449fa2421233040cb25e5c8202a3e2f", size = 189338 }, +] + +[[package]] +name = "prawcore" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/62/d4c99cf472205f1e5da846b058435a6a7c988abf8eb6f7d632a7f32f4a77/prawcore-2.4.0.tar.gz", hash = "sha256:b7b2b5a1d04406e086ab4e79988dc794df16059862f329f4c6a43ed09986c335", size = 15862 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/5c/8af904314e42d5401afcfaff69940dc448e974f80f7aa39b241a4fbf0cf1/prawcore-2.4.0-py3-none-any.whl", hash = "sha256:29af5da58d85704b439ad3c820873ad541f4535e00bb98c66f0fbcc8c603065a", size = 17203 }, +] + [[package]] name = "pre-commit" -version = "4.0.1" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -2369,9 +2401,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, + { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, ] [[package]] @@ -2394,14 +2426,14 @@ wheels = [ [[package]] name = "prompt-toolkit" -version = "3.0.48" +version = "3.0.50" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, + { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, ] [[package]] @@ -3284,6 +3316,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 }, ] +[[package]] +name = "update-checker" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/0b/1bec4a6cc60d33ce93d11a7bcf1aeffc7ad0aa114986073411be31395c6f/update_checker-0.18.0.tar.gz", hash = "sha256:6a2d45bb4ac585884a6b03f9eade9161cedd9e8111545141e9aa9058932acb13", size = 6699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/ba/8dd7fa5f0b1c6a8ac62f8f57f7e794160c1f86f31c6d0fb00f582372a3e4/update_checker-0.18.0-py3-none-any.whl", hash = "sha256:cbba64760a36fe2640d80d85306e8fe82b6816659190993b7bdabadee4d4bbfd", size = 7008 }, +] + [[package]] name = "uri-template" version = "1.3.0"