From 26d8ed7c3abfb141fce68460c3d8674320eb2c0e Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 21 Feb 2024 22:48:10 +0800 Subject: [PATCH 01/93] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=8E=9F?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 - Dockerfile | 18 - LICENSE | 21 - constants.py | 14 - docker-compose.yml | 26 -- event_callbacks.py | 59 --- fetchers/JPEP_FTN_macket.py | 124 ----- fetchers/LP_collections.py | 97 ---- fetchers/_base.py | 82 ---- fetchers/article_FP_rank.py | 97 ---- fetchers/assets_rank.py | 92 ---- fetchers/daily_update_rank.py | 49 -- fetchers/lottery_data.py | 65 --- main.py | 36 -- model.py | 12 - poetry.lock | 827 ---------------------------------- pyproject.toml | 31 -- requirements-dev.txt | 36 -- requirements.txt | 24 - saver.py | 57 --- utils/config.py | 64 --- utils/db.py | 17 - utils/log.py | 10 - utils/message.py | 194 -------- utils/module_finder.py | 24 - utils/retry.py | 26 -- utils/time_helper.py | 29 -- 27 files changed, 2134 deletions(-) delete mode 100644 .gitignore delete mode 100644 Dockerfile delete mode 100644 LICENSE delete mode 100644 constants.py delete mode 100644 docker-compose.yml delete mode 100644 event_callbacks.py delete mode 100644 fetchers/JPEP_FTN_macket.py delete mode 100644 fetchers/LP_collections.py delete mode 100644 fetchers/_base.py delete mode 100644 fetchers/article_FP_rank.py delete mode 100644 fetchers/assets_rank.py delete mode 100644 fetchers/daily_update_rank.py delete mode 100644 fetchers/lottery_data.py delete mode 100644 main.py delete mode 100644 model.py delete mode 100644 poetry.lock delete mode 100644 pyproject.toml delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt delete mode 100644 saver.py delete mode 100644 utils/config.py delete mode 100644 utils/db.py delete mode 100644 utils/log.py delete mode 100644 utils/message.py delete mode 100644 utils/module_finder.py delete mode 100644 utils/retry.py delete mode 100644 utils/time_helper.py diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 67f3973..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -__pycache__/ -.mypy_cache/ -config.yaml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 287ad11..0000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM python:3.10.8-slim - -WORKDIR /app - -ENV TZ Asia/Shanghai - -COPY requirements.txt . - -RUN pip install \ - -r requirements.txt \ - --no-cache-dir \ - --no-compile \ - --disable-pip-version-check \ - --quiet - -COPY . . - -CMD ["python", "main.py"] \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 1ae0323..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 FHU-yezi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/constants.py b/constants.py deleted file mode 100644 index 8c244c2..0000000 --- a/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from enum import IntEnum - - -class FetchStatus(IntEnum): - FAILED = -1 - SUCCESSED = 0 - SKIPPED = 1 - - -class NoticePolicy(IntEnum): - DISABLE = -1 - ALWAYS = 0 - ONLY_FAILED_SKIPPED = 1 - ONLY_FAILED = 2 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index ca370ad..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "3" - -networks: - mongodb: - external: true - -services: - main: - image: jfetcher:2.7.4 - build: . - volumes: - - "./config.yaml:/app/config.yaml:ro" - networks: - - mongodb - environment: - - PYTHONUNBUFFERED=1 - deploy: - resources: - limits: - cpus: "0.30" - memory: 96M - restart_policy: - condition: on-failure - delay: 5s - max_attempts: 3 - stop_grace_period: 1s \ No newline at end of file diff --git a/event_callbacks.py b/event_callbacks.py deleted file mode 100644 index ba06a30..0000000 --- a/event_callbacks.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import Optional - -from apscheduler.events import JobExecutionEvent - -from constants import FetchStatus, NoticePolicy -from model import FetchResult -from utils.log import run_logger -from utils.message import send_task_fail_card, send_task_success_card -from utils.time_helper import human_readable_cost_time - - -def on_executed_event(event: JobExecutionEvent) -> None: - fetch_result: FetchResult = event.retval # type: ignore - - if fetch_result.fetch_status == FetchStatus.SUCCESSED: - on_task_successed(fetch_result) - elif fetch_result.fetch_status == FetchStatus.SKIPPED: - on_task_skipped(fetch_result) - elif fetch_result.fetch_status == FetchStatus.FAILED: - task_name: str = event.job_id - on_task_failed(task_name) - else: - raise ValueError - - -def on_error_event(event: JobExecutionEvent) -> None: - task_name: str = event.job_id - exception: Exception = event.exception # type: ignore - - on_task_failed(task_name, exception) - - -def on_task_successed(fetch_result: FetchResult) -> None: - run_logger.info( - "采集任务运行成功", - task_name=fetch_result.task_name, - data_count=fetch_result.data_count, - cost_time=fetch_result.cost_time, - ) - - if fetch_result.notice_policy == NoticePolicy.ALWAYS: - send_task_success_card( - fetch_result.task_name, - human_readable_cost_time(fetch_result.cost_time), - fetch_result.data_count, - ) - - -def on_task_failed(task_name: str, exception: Optional[Exception] = None) -> None: - run_logger.error("采集任务运行失败", task_name=task_name, exception=exception) - - send_task_fail_card(task_name, repr(exception)) - - -def on_task_skipped(fetch_result: FetchResult) -> None: - run_logger.info( - "采集任务被跳过", - task_name=fetch_result.task_name, - ) diff --git a/fetchers/JPEP_FTN_macket.py b/fetchers/JPEP_FTN_macket.py deleted file mode 100644 index cc6d5d8..0000000 --- a/fetchers/JPEP_FTN_macket.py +++ /dev/null @@ -1,124 +0,0 @@ -from datetime import datetime, timedelta -from typing import Any, Dict, Generator, Literal - -from httpx import post as httpx_post -from sspeedup.time_helper import get_now_without_mileseconds - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.retry import retry_on_network_error - - -class AssetsRankFetcher(Fetcher): - def get_fetch_time(self) -> datetime: - """保证数据获取时间对齐十分钟间隔""" - result = get_now_without_mileseconds() - result = result.replace(second=0) - while result.minute % 10 != 0: - result = result - timedelta(minutes=1) - return result - - def get_FTN_macket_data( # noqa: N802 - self, type_: Literal["buy", "sell"] - ) -> Generator[Dict, None, None]: - page = 1 - while True: - url = "https://20221023.jianshubei.com/api/getList/furnish.bei/" - params: Dict[str, Any] = { - "page": page, - } - - body_json: Dict[str, Any] = { - "filter": [ - {"trade": 1 if type_ == "buy" else 0}, - {"status": 1}, - {"finish": 0}, - ], - "sort": "price,pub_date" if type_ == "buy" else "-price,pub_date", - "bind": [ - { - "member.user": { - "addField": [ - {"username_md5": "username_md5"}, - ], - "filter": [ - {"id": r"{{uid}}"}, - ], - "fields": "id,username", - } - } - ], - "addField": [ - {"transactions_count": "tradeCount"}, - {"traded": "tradeNum"}, - {"remaining": "leftNum"}, - {"tradable": "tradable"}, - ], - } - - response = retry_on_network_error(httpx_post)( - url, params=params, json=body_json - ) - if response.status_code != 200: - raise ValueError() - response_json = response.json() - if response_json["code"] != 200: - raise ValueError() - if not response_json["data"]: - return None - - yield from response_json["data"] - - page += 1 - - def __init__(self) -> None: - self.task_name = "简书积分兑换平台-贝市" - self.fetch_time_cron = "0 0/10 * * * *" - self.collection_name = "JPEP_FTN_macket" - self.bulk_size = 100 - self.notice_policy = NoticePolicy.ONLY_FAILED - - def should_fetch(self, saver: Saver) -> bool: - del saver - return True - - def iter_data(self) -> Generator[Dict, None, None]: - yield from self.get_FTN_macket_data(type_="buy") - yield from self.get_FTN_macket_data(type_="sell") - - def process_data(self, data: Dict) -> Dict: - return { - "fetch_time": self.get_fetch_time(), - "order_id": data["id"], - "trade_type": "buy" if data["trade"] == 1 else "sell", - "publish_time": datetime.fromisoformat(data["pub_date"]), - "is_anonymous": data["anony"] == 1, - "price": data["price"], - "amount": { - "total": data["totalNum"], - "traded": data["traded"], - "remaining": data["remaining"], - "tradable": data["tradable"], - }, - "traded_percentage": round(data["traded"] / data["totalNum"], 2), - "minimum_trade_count": data["minNum"], - "transactions_count": data["transactions_count"], - "user": { - "id": data["member.user"][0]["id"], - "name": data["member.user"][0]["username"], - "name_md5": data["member.user"][0]["username_md5"], - }, - } - - def should_save(self, data: Dict, saver: Saver) -> bool: - del data - del saver - return True - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - del saver - return True diff --git a/fetchers/LP_collections.py b/fetchers/LP_collections.py deleted file mode 100644 index 7f65a75..0000000 --- a/fetchers/LP_collections.py +++ /dev/null @@ -1,97 +0,0 @@ -from typing import Dict, Generator, Set - -from JianshuResearchTools.convert import ( - ArticleSlugToArticleUrl, - UserSlugToUserUrl, -) -from JianshuResearchTools.objects import Collection, set_cache_status -from sspeedup.time_helper import get_today_in_datetime_obj - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.log import run_logger -from utils.retry import retry_on_network_error - -set_cache_status(False) - - -class LPCollectionsFetcher(Fetcher): - def __init__(self) -> None: - self.task_name = "LP 理事会相关专题" - self.fetch_time_cron = "0 0 0 1/1 * *" - self.collection_name = "LP_collections" - self.bulk_size = 60 - self.notice_policy = NoticePolicy.ALWAYS - - self.collections_to_fetch: Set[Collection] = { - Collection.from_url("https://www.jianshu.com/c/f61832508891"), # 理事会点赞汇总 - } - - def should_fetch(self, saver: Saver) -> bool: - del saver - return True - - def _iter_one_collection( - self, collection: Collection - ) -> Generator[Dict, None, None]: - collection.articles_info = retry_on_network_error(collection.articles_info) - - page: int = 1 - total_count: int = 0 - while True: - data_part = collection.articles_info(page=page, count=40) - page += 1 - - if not data_part: - return - for item in data_part: - yield item - total_count += 1 - if total_count == 120: - return - - def iter_data(self) -> Generator[Dict, None, None]: - for collection in self.collections_to_fetch: - # TODO - run_logger.info("开始获取 理事会点赞汇总(https://www.jianshu.com/c/f61832508891)的数据") - for item in self._iter_one_collection(collection): - yield item - - def process_data(self, data: Dict) -> Dict: - return { - "fetch_date": get_today_in_datetime_obj(), - "from_collection": "理事会点赞汇总", - "article": { - "id": data["aid"], - "url": ArticleSlugToArticleUrl(data["aslug"]), - "title": data["title"], - "release_time": data["release_time"], - "views_count": data["views_count"], - "likes_count": data["likes_count"], - "comments_count": data["comments_count"], - "rewards_count": data["rewards_count"], - "total_FP_amount": data["total_fp_amount"], - "is_paid": data["paid"], - "is_commentable": data["commentable"], - "summary": data["summary"], - }, - "author": { - "id": data["user"]["uid"], - "url": UserSlugToUserUrl(data["user"]["uslug"]), - "name": data["user"]["name"], - }, - } - - def should_save(self, data: Dict, saver: Saver) -> bool: - return not saver.is_in_db( - { - "article.id": data["article"]["id"], - }, - ) - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - return saver.is_in_db({"fetch_date": get_today_in_datetime_obj()}) diff --git a/fetchers/_base.py b/fetchers/_base.py deleted file mode 100644 index ce564cf..0000000 --- a/fetchers/_base.py +++ /dev/null @@ -1,82 +0,0 @@ -from abc import ABC, abstractmethod -from time import time -from typing import Dict, Generator - -from sspeedup.time_helper import cron_str_to_kwargs - -from constants import FetchStatus, NoticePolicy -from model import FetchResult -from saver import Saver -from utils.log import run_logger - - -class Fetcher(ABC): - @abstractmethod - def __init__(self) -> None: - self.task_name = "" - self.fetch_time_cron = "" - self.collection_name = "" - self.bulk_size = 0 - self.notice_policy = NoticePolicy.ALWAYS - raise NotImplementedError - - @property - def fetch_time_cron_kwargs(self) -> Dict[str, str]: - return cron_str_to_kwargs(self.fetch_time_cron) - - @abstractmethod - def should_fetch(self, saver: Saver) -> bool: - raise NotImplementedError - - @abstractmethod - def iter_data(self) -> Generator[Dict, None, None]: - raise NotImplementedError - - @abstractmethod - def process_data(self, data: Dict) -> Dict: - raise NotImplementedError - - @abstractmethod - def should_save(self, data: Dict, saver: Saver) -> bool: - raise NotImplementedError - - @abstractmethod - def save_data(self, data: Dict, saver: Saver) -> None: - raise NotImplementedError - - @abstractmethod - def is_success(self, saver: Saver) -> bool: - raise NotImplementedError - - def run(self) -> FetchResult: - start_time = time() - - saver = Saver(self.collection_name, self.bulk_size) - run_logger.debug(f"已为任务 {self.task_name} 创建存储对象") - - if not self.should_fetch(saver): - run_logger.debug(f"已跳过任务 {self.task_name}") - return FetchResult( - task_name=self.task_name, - notice_policy=self.notice_policy, - fetch_status=FetchStatus.SKIPPED, - cost_time=0, - data_count=0, - ) - - for original_data in self.iter_data(): - processed_data: Dict = self.process_data(original_data) - if not self.should_save(processed_data, saver): - continue - self.save_data(processed_data, saver) - saver.final_save() - - return FetchResult( - task_name=self.task_name, - notice_policy=self.notice_policy, - fetch_status=( - FetchStatus.SUCCESSED if self.is_success(saver) else FetchStatus.FAILED - ), - cost_time=round(time() - start_time), - data_count=saver.data_count, - ) diff --git a/fetchers/article_FP_rank.py b/fetchers/article_FP_rank.py deleted file mode 100644 index 1689d33..0000000 --- a/fetchers/article_FP_rank.py +++ /dev/null @@ -1,97 +0,0 @@ -from datetime import timedelta -from typing import Dict, Generator, Optional, Tuple - -from httpx import get as httpx_get -from JianshuResearchTools.convert import ( - ArticleSlugToArticleUrl, - UserSlugToUserUrl, -) -from JianshuResearchTools.rank import GetArticleFPRankData -from sspeedup.time_helper import get_today_in_datetime_obj - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.log import run_logger -from utils.retry import retry_on_network_error - -GetArticleFPRankData = retry_on_network_error(GetArticleFPRankData) - - -class ArticleFPRankFetcher(Fetcher): - def __init__(self) -> None: - self.task_name = "简书文章收益排行榜" - self.fetch_time_cron = "0 0 1 1/1 * *" - self.collection_name = "article_FP_rank" - self.bulk_size = 100 - self.notice_policy = NoticePolicy.ALWAYS - - def get_user_id_url_from_article_slug( - self, article_slug: str - ) -> Tuple[Optional[int], Optional[str]]: - response = retry_on_network_error(httpx_get)( - f"https://www.jianshu.com/asimov/p/{article_slug}" - ) - result = response.json() - - # 如果作者被封无法获取数据,则跳过采集 - if "error" in result: - return (None, None) - - return (result["user"]["id"], UserSlugToUserUrl(result["user"]["slug"])) - - def should_fetch(self, saver: Saver) -> bool: - return not saver.is_in_db( - {"date": get_today_in_datetime_obj() - timedelta(days=1)} - ) - - def iter_data(self) -> Generator[Dict, None, None]: - yield from GetArticleFPRankData("latest") - - def process_data(self, data: Dict) -> Dict: - result = { - "date": get_today_in_datetime_obj() - timedelta(days=1), - "ranking": data["ranking"], - "article": { - "title": None, - "url": None, - }, - "author": { - "id": None, - "url": None, - "name": None, - }, - "reward": { - "to_author": data["fp_to_author"], - "to_voter": data["fp_to_voter"], - "total": data["total_fp"], - }, - } - if not data["aslug"]: # 文章被删除导致相关信息无法访问 - run_logger.warning( - "文章被删除,部分数据无法采集,已自动跳过", - task_name=self.task_name, - ranking=data["ranking"], - ) - return result - - result["article"]["title"] = data["title"] - result["article"]["url"] = ArticleSlugToArticleUrl(data["aslug"]) - result["author"]["name"] = data["author_name"] - - uid, user_url = self.get_user_id_url_from_article_slug(data["aslug"]) - result["author"]["id"] = uid - result["author"]["url"] = user_url - - return result - - def should_save(self, data: Dict, saver: Saver) -> bool: - del data - del saver - return True - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - return saver.is_in_db({"date": get_today_in_datetime_obj() - timedelta(days=1)}) diff --git a/fetchers/assets_rank.py b/fetchers/assets_rank.py deleted file mode 100644 index 73f2cec..0000000 --- a/fetchers/assets_rank.py +++ /dev/null @@ -1,92 +0,0 @@ -from typing import Dict, Generator - -from httpx import RequestError -from JianshuResearchTools.convert import UserSlugToUserUrl -from JianshuResearchTools.exceptions import APIError, ResourceError -from JianshuResearchTools.objects import User -from JianshuResearchTools.rank import GetAssetsRankData -from sspeedup.time_helper import get_today_in_datetime_obj - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.log import run_logger -from utils.retry import retry_on_network_error - -GetAssetsRankData = retry_on_network_error(GetAssetsRankData) - - -class AssetsRankFetcher(Fetcher): - def __init__(self) -> None: - self.task_name = "简书资产排行榜" - self.fetch_time_cron = "0 0 12 1/1 * *" - self.collection_name = "assets_rank" - self.bulk_size = 100 - self.notice_policy = NoticePolicy.ALWAYS - - def should_fetch(self, saver: Saver) -> bool: - return not saver.is_in_db({"date": get_today_in_datetime_obj()}) - - def iter_data(self) -> Generator[Dict, None, None]: - total_count = 1000 - now = 1 - while True: - data_part = GetAssetsRankData(now) - for item in data_part: - yield item - now += 1 - if now > total_count: - return - - def process_data(self, data: Dict) -> Dict: - result = { - "date": get_today_in_datetime_obj(), - "ranking": data["ranking"], - "user": { - "id": None, - "url": None, - "name": None, - }, - "assets": { - "FP": None, - "FTN": None, - "total": data["assets"], - }, - } - if not data["uid"]: # 用户账号状态异常,相关信息无法获取 - run_logger.warning( - "用户账号状态异常,部分数据无法采集,已自动跳过", - task_name=self.task_name, - ranking=data["ranking"], - ) - return result - - result["user"]["id"] = data["uid"] - result["user"]["url"] = UserSlugToUserUrl(data["uslug"]) - result["user"]["name"] = data["name"] - - try: - user = User.from_slug(data["uslug"]) - result["assets"]["FP"] = user.FP_count - result["assets"]["FTN"] = round( - result["assets"]["total"] - result["assets"]["FP"], 3 - ) - except (ResourceError, APIError, RequestError): - run_logger.warning( - "简书贝和总资产信息获取失败,已自动跳过", - task_name=self.task_name, - user_id=data["uid"], - ) - - return result - - def should_save(self, data: Dict, saver: Saver) -> bool: - del data - del saver - return True - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - return saver.is_in_db({"date": get_today_in_datetime_obj()}) diff --git a/fetchers/daily_update_rank.py b/fetchers/daily_update_rank.py deleted file mode 100644 index f80bed7..0000000 --- a/fetchers/daily_update_rank.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Dict, Generator - -from JianshuResearchTools.convert import UserSlugToUserUrl -from JianshuResearchTools.rank import GetDailyArticleRankData -from sspeedup.time_helper import get_today_in_datetime_obj - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.retry import retry_on_network_error - -GetDailyArticleRankData = retry_on_network_error(GetDailyArticleRankData) - - -class DailyUpdateRankFetcher(Fetcher): - def __init__(self) -> None: - self.task_name = "简书日更排行榜" - self.fetch_time_cron = "0 0 12 1/1 * *" - self.collection_name = "daily_update_rank" - self.bulk_size = 100 - self.notice_policy = NoticePolicy.ALWAYS - - def should_fetch(self, saver: Saver) -> bool: - return not saver.is_in_db({"date": get_today_in_datetime_obj()}) - - def iter_data(self) -> Generator[Dict, None, None]: - yield from GetDailyArticleRankData() - - def process_data(self, data: Dict) -> Dict: - return { - "date": get_today_in_datetime_obj(), - "ranking": data["ranking"], - "user": { - "name": data["name"], - "url": UserSlugToUserUrl(data["uslug"]), - }, - "days": data["check_in_count"], - } - - def should_save(self, data: Dict, saver: Saver) -> bool: - del data - del saver - return True - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - return saver.is_in_db({"date": get_today_in_datetime_obj()}) diff --git a/fetchers/lottery_data.py b/fetchers/lottery_data.py deleted file mode 100644 index fde372b..0000000 --- a/fetchers/lottery_data.py +++ /dev/null @@ -1,65 +0,0 @@ -from datetime import datetime, timedelta -from typing import Dict, Generator, List - -from httpx import get as httpx_get -from JianshuResearchTools.convert import UserSlugToUserUrl - -from constants import NoticePolicy -from fetchers._base import Fetcher -from saver import Saver -from utils.retry import retry_on_network_error - - -class LotteryDataFetcher(Fetcher): - def __init__(self) -> None: - self.task_name = "简书大转盘抽奖" - self.fetch_time_cron = "0 0 2,9,14,21 1/1 * *" - self.collection_name = "lottery_data" - self.bulk_size = 100 - self.notice_policy = NoticePolicy.ALWAYS - - def get_lottery_data(self) -> List[Dict]: - url = "https://www.jianshu.com/asimov/ad_rewards/winner_list" - params = { - "count": 500, - } - response = retry_on_network_error(httpx_get)( - url, - params=params, - timeout=20, - ) - - return response.json() - - def should_fetch(self, saver: Saver) -> bool: - return not saver.is_in_db( - { - "time": { - "$gt": datetime.now() - timedelta(hours=3), - }, - }, - ) - - def iter_data(self) -> Generator[Dict, None, None]: - yield from self.get_lottery_data() - - def process_data(self, data: Dict) -> Dict: - return { - "_id": data["id"], - "time": datetime.fromtimestamp(data["created_at"]), - "reward_name": data["name"], - "user": { - "id": data["user"]["id"], - "url": UserSlugToUserUrl(data["user"]["slug"]), - "name": data["user"]["nickname"], - }, - } - - def should_save(self, data: Dict, saver: Saver) -> bool: - return not saver.is_in_db({"_id": data["_id"]}) - - def save_data(self, data: Dict, saver: Saver) -> None: - saver.add_one(data) - - def is_success(self, saver: Saver) -> bool: - return saver.data_count != 0 diff --git a/main.py b/main.py deleted file mode 100644 index 9f7a988..0000000 --- a/main.py +++ /dev/null @@ -1,36 +0,0 @@ -from time import sleep -from typing import List - -from apscheduler.events import EVENT_JOB_ERROR, EVENT_JOB_EXECUTED -from apscheduler.schedulers.background import BackgroundScheduler - -from event_callbacks import on_error_event, on_executed_event -from fetchers._base import Fetcher -from utils.config import config -from utils.log import run_logger -from utils.module_finder import get_all_fetchers - -scheduler = BackgroundScheduler() -scheduler.add_listener(on_executed_event, EVENT_JOB_EXECUTED) -scheduler.add_listener(on_error_event, EVENT_JOB_ERROR) -run_logger.debug("已注册事件回调") - -fetchers: List[Fetcher] = [x() for x in get_all_fetchers(config.fetchers.base_path)] -for fetcher in fetchers: - scheduler.add_job( - fetcher.run, - "cron", - id=fetcher.task_name, - **fetcher.fetch_time_cron_kwargs, - ) -run_logger.info( - "已添加获取任务", - fetchers_name=[fetcher.task_name for fetcher in fetchers], - fetchers_count=len(fetchers), -) - -scheduler.start() -run_logger.info("调度器启动成功") - -while True: - sleep(180) diff --git a/model.py b/model.py deleted file mode 100644 index 25ca3d7..0000000 --- a/model.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass - -from constants import FetchStatus, NoticePolicy - - -@dataclass -class FetchResult: - task_name: str - notice_policy: NoticePolicy - fetch_status: FetchStatus - cost_time: int - data_count: int diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 698157a..0000000 --- a/poetry.lock +++ /dev/null @@ -1,827 +0,0 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "3.6.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] - -[[package]] -name = "apscheduler" -version = "3.10.1" -description = "In-process task scheduler with Cron-like capabilities" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "APScheduler-3.10.1-py3-none-any.whl", hash = "sha256:e813ad5ada7aff36fb08cdda746b520531eaac7757832abc204868ba78e0c8f6"}, - {file = "APScheduler-3.10.1.tar.gz", hash = "sha256:0293937d8f6051a0f493359440c1a1b93e882c57daf0197afeff0e727777b96e"}, -] - -[package.dependencies] -pytz = "*" -setuptools = ">=0.7" -six = ">=1.4.0" -tzlocal = ">=2.0,<3.0.0 || >=4.0.0" - -[package.extras] -doc = ["sphinx", "sphinx-rtd-theme"] -gevent = ["gevent"] -mongodb = ["pymongo (>=3.0)"] -redis = ["redis (>=3.0)"] -rethinkdb = ["rethinkdb (>=2.4.0)"] -sqlalchemy = ["sqlalchemy (>=1.4)"] -testing = ["pytest", "pytest-asyncio", "pytest-cov", "pytest-tornado5"] -tornado = ["tornado (>=4.3)"] -twisted = ["twisted"] -zookeeper = ["kazoo"] - -[[package]] -name = "backports-zoneinfo" -version = "0.2.1" -description = "Backport of the standard library zoneinfo module" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, - {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, -] - -[package.extras] -tzdata = ["tzdata"] - -[[package]] -name = "black" -version = "23.3.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "certifi" -version = "2022.12.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "dnspython" -version = "2.3.0" -description = "DNS toolkit" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, - {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, -] - -[package.extras] -curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<40.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "httpcore" -version = "0.17.0" -description = "A minimal low-level HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.17.0-py3-none-any.whl", hash = "sha256:0fdfea45e94f0c9fd96eab9286077f9ff788dd186635ae61b312693e4d943599"}, - {file = "httpcore-0.17.0.tar.gz", hash = "sha256:cc045a3241afbf60ce056202301b4d8b6af08845e3294055eb26b09913ef903c"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "httpx" -version = "0.24.0" -description = "The next generation HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"}, - {file = "httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"}, -] - -[package.dependencies] -certifi = "*" -h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} -httpcore = ">=0.15.0,<0.18.0" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "jianshuresearchtools" -version = "2.11.0" -description = "科技赋能创作星辰" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "jianshuresearchtools-2.11.0-py3-none-any.whl", hash = "sha256:d0cdb7c05c59b04a53f2e96f3a99acd3c2f17e4749e1077024131fd403fa4058"}, - {file = "jianshuresearchtools-2.11.0.tar.gz", hash = "sha256:85ca89aa872ad4b0048256bc0c4540fff8d6304c0ec8d117460c60c35a7add88"}, -] - -[package.dependencies] -httpx = {version = ">=0.24.0,<0.25.0", extras = ["http2"]} -lxml = ">=4.9.2,<5.0.0" - -[package.extras] -full = ["tomd (>=0.1.3,<0.2.0)", "ujson (>=5.7.0,<6.0.0)"] -high-perf = ["ujson (>=5.7.0,<6.0.0)"] -md-convert = ["tomd (>=0.1.3,<0.2.0)"] - -[[package]] -name = "lxml" -version = "4.9.2" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.7.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - -[[package]] -name = "platformdirs" -version = "3.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pymongo" -version = "4.3.3" -description = "Python driver for MongoDB " -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pymongo-4.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:74731c9e423c93cbe791f60c27030b6af6a948cef67deca079da6cd1bb583a8e"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:66413c50d510e5bcb0afc79880d1693a2185bcea003600ed898ada31338c004e"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9b87b23570565a6ddaa9244d87811c2ee9cffb02a753c8a2da9c077283d85845"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:695939036a320f4329ccf1627edefbbb67cc7892b8222d297b0dd2313742bfee"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:ffcc8394123ea8d43fff8e5d000095fe7741ce3f8988366c5c919c4f5eb179d3"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:943f208840777f34312c103a2d1caab02d780c4e9be26b3714acf6c4715ba7e1"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:01f7cbe88d22440b6594c955e37312d932fd632ffed1a86d0c361503ca82cc9d"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdb87309de97c63cb9a69132e1cb16be470e58cffdfbad68fdd1dc292b22a840"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d86c35d94b5499689354ccbc48438a79f449481ee6300f3e905748edceed78e7"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a966d5304b7d90c45c404914e06bbf02c5bf7e99685c6c12f0047ef2aa837142"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be1d2ce7e269215c3ee9a215e296b7a744aff4f39233486d2c4d77f5f0c561a6"}, - {file = "pymongo-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b6163dac53ef1e5d834297810c178050bd0548a4136cd4e0f56402185916ca"}, - {file = "pymongo-4.3.3-cp310-cp310-win32.whl", hash = "sha256:dc0cff74cd36d7e1edba91baa09622c35a8a57025f2f2b7a41e3f83b1db73186"}, - {file = "pymongo-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:cafa52873ae12baa512a8721afc20de67a36886baae6a5f394ddef0ce9391f91"}, - {file = "pymongo-4.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:599d3f6fbef31933b96e2d906b0f169b3371ff79ea6aaf6ecd76c947a3508a3d"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0640b4e9d008e13956b004d1971a23377b3d45491f87082161c92efb1e6c0d6"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341221e2f2866a5960e6f8610f4cbac0bb13097f3b1a289aa55aba984fc0d969"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7fac06a539daef4fcf5d8288d0d21b412f9b750454cd5a3cf90484665db442a"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a51901066696c4af38c6c63a1f0aeffd5e282367ff475de8c191ec9609b56d"}, - {file = "pymongo-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3055510fdfdb1775bc8baa359783022f70bb553f2d46e153c094dfcb08578ff"}, - {file = "pymongo-4.3.3-cp311-cp311-win32.whl", hash = "sha256:524d78673518dcd352a91541ecd2839c65af92dc883321c2109ef6e5cd22ef23"}, - {file = "pymongo-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b8a03af1ce79b902a43f5f694c4ca8d92c2a4195db0966f08f266549e2fc49bc"}, - {file = "pymongo-4.3.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:39b03045c71f761aee96a12ebfbc2f4be89e724ff6f5e31c2574c1a0e2add8bd"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6fcfbf435eebf8a1765c6d1f46821740ebe9f54f815a05c8fc30d789ef43cb12"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7d43ac9c7eeda5100fb0a7152fab7099c9cf9e5abd3bb36928eb98c7d7a339c6"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3b93043b14ba7eb08c57afca19751658ece1cfa2f0b7b1fb5c7a41452fbb8482"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:c09956606c08c4a7c6178a04ba2dd9388fcc5db32002ade9c9bc865ab156ab6d"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:b0cfe925610f2fd59555bb7fc37bd739e4b197d33f2a8b2fae7b9c0c6640318c"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:4d00b91c77ceb064c9b0459f0d6ea5bfdbc53ea9e17cf75731e151ef25a830c7"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:c6258a3663780ae47ba73d43eb63c79c40ffddfb764e09b56df33be2f9479837"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e758f0e734e1e90357ae01ec9c6daf19ff60a051192fe110d8fb25c62600e"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f3621a46cdc7a9ba8080422262398a91762a581d27e0647746588d3f995c88"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47f7aa217b25833cd6f0e72b0d224be55393c2692b4f5e0561cb3beeb10296e9"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2fdc855149efe7cdcc2a01ca02bfa24761c640203ea94df467f3baf19078be"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5effd87c7d363890259eac16c56a4e8da307286012c076223997f8cc4a8c435b"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dd1cf2995fdbd64fc0802313e8323f5fa18994d51af059b5b8862b73b5e53f0"}, - {file = "pymongo-4.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bb869707d8e30645ed6766e44098600ca6cdf7989c22a3ea2b7966bb1d98d4b2"}, - {file = "pymongo-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:49210feb0be8051a64d71691f0acbfbedc33e149f0a5d6e271fddf6a12493fed"}, - {file = "pymongo-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:54c377893f2cbbffe39abcff5ff2e917b082c364521fa079305f6f064e1a24a9"}, - {file = "pymongo-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c184ec5be465c0319440734491e1aa4709b5f3ba75fdfc9dbbc2ae715a7f6829"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:dca34367a4e77fcab0693e603a959878eaf2351585e7d752cac544bc6b2dee46"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd6a4afb20fb3c26a7bfd4611a0bbb24d93cbd746f5eb881f114b5e38fd55501"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0c466710871d0026c190fc4141e810cf9d9affbf4935e1d273fbdc7d7cda6143"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:d07d06dba5b5f7d80f9cc45501456e440f759fe79f9895922ed486237ac378a8"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:711bc52cb98e7892c03e9b669bebd89c0a890a90dbc6d5bb2c47f30239bac6e9"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:34b040e095e1671df0c095ec0b04fc4ebb19c4c160f87c2b55c079b16b1a6b00"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4ed00f96e147f40b565fe7530d1da0b0f3ab803d5dd5b683834500fa5d195ec4"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef888f48eb9203ee1e04b9fb27429017b290fb916f1e7826c2f7808c88798394"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:316498b642c00401370b2156b5233b256f9b33799e0a8d9d0b8a7da217a20fca"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa7e202feb683dad74f00dea066690448d0cfa310f8a277db06ec8eb466601b5"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52896e22115c97f1c829db32aa2760b0d61839cfe08b168c2b1d82f31dbc5f55"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c051fe37c96b9878f37fa58906cb53ecd13dcb7341d3a85f1e2e2f6b10782d9"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5134d33286c045393c7beb51be29754647cec5ebc051cf82799c5ce9820a2ca2"}, - {file = "pymongo-4.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a9c2885b4a8e6e39db5662d8b02ca6dcec796a45e48c2de12552841f061692ba"}, - {file = "pymongo-4.3.3-cp38-cp38-win32.whl", hash = "sha256:a6cd6f1db75eb07332bd3710f58f5fce4967eadbf751bad653842750a61bda62"}, - {file = "pymongo-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:d5571b6978750601f783cea07fb6b666837010ca57e5cefa389c1d456f6222e2"}, - {file = "pymongo-4.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81d1a7303bd02ca1c5be4aacd4db73593f573ba8e0c543c04c6da6275fd7a47e"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:016c412118e1c23fef3a1eada4f83ae6e8844fd91986b2e066fc1b0013cdd9ae"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8fd6e191b92a10310f5a6cfe10d6f839d79d192fb02480bda325286bd1c7b385"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2961b05f9c04a53da8bfc72f1910b6aec7205fcf3ac9c036d24619979bbee4b"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:b38a96b3eed8edc515b38257f03216f382c4389d022a8834667e2bc63c0c0c31"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:c1a70c51da9fa95bd75c167edb2eb3f3c4d27bc4ddd29e588f21649d014ec0b7"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8a06a0c02f5606330e8f2e2f3b7949877ca7e4024fa2bff5a4506bec66c49ec7"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6c2216d8b6a6d019c6f4b1ad55f890e5e77eb089309ffc05b6911c09349e7474"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eac0a143ef4f28f49670bf89cb15847eb80b375d55eba401ca2f777cd425f338"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08fc250b5552ee97ceeae0f52d8b04f360291285fc7437f13daa516ce38fdbc6"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704d939656e21b073bfcddd7228b29e0e8a93dd27b54240eaafc0b9a631629a6"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074f1a6f23e28b983c96142f2d45be03ec55d93035b471c26889a7ad2365db3"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b16250238de8dafca225647608dddc7bbb5dce3dd53b4d8e63c1cc287394c2f"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7761cacb8745093062695b11574effea69db636c2fd0a9269a1f0183712927b4"}, - {file = "pymongo-4.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7bb378d82b88387dc10227cfd964f6273eb083e05299e9b97cbe075da12d11"}, - {file = "pymongo-4.3.3-cp39-cp39-win32.whl", hash = "sha256:dc24d245026a72d9b4953729d31813edd4bd4e5c13622d96e27c284942d33f24"}, - {file = "pymongo-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:fc28e8d85d392a06434e9a934908d97e2cf453d69488d2bcd0bfb881497fd975"}, - {file = "pymongo-4.3.3.tar.gz", hash = "sha256:34e95ffb0a68bffbc3b437f2d1f25fc916fef3df5cdeed0992da5f42fae9b807"}, -] - -[package.dependencies] -dnspython = ">=1.16.0,<3.0.0" - -[package.extras] -aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["pymongo-auth-aws (<2.0.0)", "pymongocrypt (>=1.3.0,<2.0.0)"] -gssapi = ["pykerberos"] -ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] -snappy = ["python-snappy"] -zstd = ["zstandard"] - -[[package]] -name = "pyright" -version = "1.1.303" -description = "Command line wrapper for pyright" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyright-1.1.303-py3-none-any.whl", hash = "sha256:8fe3d122d7e965e2df2cef64e1ceb98cff8200f458e7892d92a4c21ee85689c7"}, - {file = "pyright-1.1.303.tar.gz", hash = "sha256:7daa516424555681e8974b21a95c108c5def791bf5381522b1410026d4da62c1"}, -] - -[package.dependencies] -nodeenv = ">=1.6.0" - -[package.extras] -all = ["twine (>=3.4.1)"] -dev = ["twine (>=3.4.1)"] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - -[[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, - {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, -] - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} -tzdata = {version = "*", markers = "python_version >= \"3.6\""} - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "ruff" -version = "0.0.262" -description = "An extremely fast Python linter, written in Rust." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.0.262-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:c26c1abd420d041592d05d63aee8c6a18feb24aed4deb6e91129e9f2c7b4914a"}, - {file = "ruff-0.0.262-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b379e9765afa679316e52288a942df085e590862f8945088936a7bce3116d8f3"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7e0ca6821aafbd2b059df3119fcd5881250721ca8e825789fd2c471f7c59be"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cca35e2aeddff72bb4379a1dabc134e0c0d25ebc754a2cb733a1f8d4dbbb5e0"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15bf5533ce169aebbafa00017987f673e879f60a625d932b464b8cdaf32a4fce"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3909e249d984c4517194005a1c30eaa0c3a6d906c789d9fc0c9c7e007fb3e759"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e2813013a19b3e147e840bdb2e42db5825b53b47364e58e7b467c5fa47ffda2"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d25a94996b2037e566c2a801c8b324c0a826194d5d4d90ad7c1ccb8cf06521fa"}, - {file = "ruff-0.0.262-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ca04348372efc59f6ee808d903d35e0d352cf2c78e487757cd48b65104b83e"}, - {file = "ruff-0.0.262-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:24f989363e9bb5d0283490298102a5218682e49ebf300e445d69e24bee03ac83"}, - {file = "ruff-0.0.262-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3c24e678e43ca4b67e29cc9a7a54eea05f31a5898cbf17bfec47b68f08d32a60"}, - {file = "ruff-0.0.262-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0baff3c9a22227358ea109c165efe62dbdd0f2b9fd5256567dda8682b444fe23"}, - {file = "ruff-0.0.262-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:083bac6e238d8b7d5ac3618666ea63b7ac661cf94c5da160070a58e190082831"}, - {file = "ruff-0.0.262-py3-none-win32.whl", hash = "sha256:15bbfa2d15c137717627e0d56b0e535ae297b734551e34e03fcc25d7642cf43a"}, - {file = "ruff-0.0.262-py3-none-win_amd64.whl", hash = "sha256:973ac29193f718349cf5746b7d86dfeaf7d40e9651ed97790a9b9327305888b9"}, - {file = "ruff-0.0.262-py3-none-win_arm64.whl", hash = "sha256:f102904ebe395acd2a181d295b98120acd7a63f732b691672977fc688674f4af"}, - {file = "ruff-0.0.262.tar.gz", hash = "sha256:faea54231c265f5349975ba6f3d855b71881a01f391b2000c47740390c6d5f68"}, -] - -[[package]] -name = "setuptools" -version = "67.6.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "sspeedup" -version = "0.8.0" -description = "开发工具箱" -category = "main" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "sspeedup-0.8.0-py3-none-any.whl", hash = "sha256:0a19f671a9065f7187a1bdea85ca615aedb8bbdb4cac9f930070c76bc3d54018"}, - {file = "sspeedup-0.8.0.tar.gz", hash = "sha256:e48bd487dcfade16cbe25e070a550d3ae533b9cfe51e987f86c88cdd005c456e"}, -] - -[package.dependencies] -pymongo = {version = ">=4.3.3,<5.0.0", optional = true, markers = "extra == \"logging\""} - -[package.extras] -ability-word-split = ["httpx (>=0.24.0,<0.25.0)"] -api-response-sanic = ["sanic (>=23.3.0,<24.0.0)"] -logging = ["pymongo (>=4.3.3,<5.0.0)"] -pywebio = ["pywebio (>=1.7.1,<2.0.0)"] -qrcode = ["qrcode (>=7.4.2,<8.0.0)"] -word-split-jieba = ["jieba (>=0.42.1,<0.43.0)"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -category = "main" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, -] - -[[package]] -name = "tzlocal" -version = "4.3" -description = "tzinfo object for the local timezone" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, - {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, -] - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -pytz-deprecation-shim = "*" -tzdata = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.8" -content-hash = "d0f23477063e143e3bb4cc6c7112cb820ce084ff68f24dd7a138b851beaa77e8" diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 0fca428..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,31 +0,0 @@ -[tool.poetry] -name = "JFetcher" -version = "2.7.5" -description = "简书数据采集工具" -authors = ["FHU-yezi "] -license = "MIT" - -[tool.poetry.dependencies] -python = "^3.8" -APScheduler = "^3.9.1" -PyYAML = "^6.0" -pymongo = "^4.1.1" -JianshuResearchTools = "2.11.0" -sspeedup = { version = "^0.8.0", extras = ["logging"] } - -[tool.poetry.group.dev.dependencies] -black = "^23.1.0" -ruff = "^0.0.262" -pyright = "^1.1.292" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[tool.ruff] - -select = ["A", "ANN", "B", "C", "E", "F", "I", "N", "RET", "S", "SIM", "UP", "W"] - -ignore = ["ANN101", "ANN102", "ANN401", "C901", "E501", "S104"] - -target-version = "py38" \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 6639431..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,36 +0,0 @@ -anyio==3.6.2 ; python_version >= "3.8" and python_version < "4.0" -apscheduler==3.10.1 ; python_version >= "3.8" and python_version < "4.0" -backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -black==23.3.0 ; python_version >= "3.8" and python_version < "4.0" -certifi==2022.12.7 ; python_version >= "3.8" and python_version < "4.0" -click==8.1.3 ; python_version >= "3.8" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" -dnspython==2.3.0 ; python_version >= "3.8" and python_version < "4.0" -h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" -h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" -hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" -httpcore==0.17.0 ; python_version >= "3.8" and python_version < "4.0" -httpx[http2]==0.24.0 ; python_version >= "3.8" and python_version < "4.0" -hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -idna==3.4 ; python_version >= "3.8" and python_version < "4.0" -jianshuresearchtools==2.11.0 ; python_version >= "3.8" and python_version < "4.0" -lxml==4.9.2 ; python_version >= "3.8" and python_version < "4.0" -mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" -nodeenv==1.7.0 ; python_version >= "3.8" and python_version < "4.0" -packaging==23.1 ; python_version >= "3.8" and python_version < "4.0" -pathspec==0.11.1 ; python_version >= "3.8" and python_version < "4.0" -platformdirs==3.2.0 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.3.3 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.303 ; python_version >= "3.8" and python_version < "4.0" -pytz-deprecation-shim==0.1.0.post0 ; python_version >= "3.8" and python_version < "4.0" -pytz==2023.3 ; python_version >= "3.8" and python_version < "4.0" -pyyaml==6.0 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.0.262 ; python_version >= "3.8" and python_version < "4.0" -setuptools==67.6.1 ; python_version >= "3.8" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" -sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" -sspeedup[logging]==0.8.0 ; python_version >= "3.8" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.11" -typing-extensions==4.5.0 ; python_version >= "3.8" and python_version < "3.10" -tzdata==2023.3 ; python_version >= "3.8" and python_version < "4.0" -tzlocal==4.3 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b7a3eb6..0000000 --- a/requirements.txt +++ /dev/null @@ -1,24 +0,0 @@ -anyio==3.6.2 ; python_version >= "3.8" and python_version < "4.0" -apscheduler==3.10.1 ; python_version >= "3.8" and python_version < "4.0" -backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -certifi==2022.12.7 ; python_version >= "3.8" and python_version < "4.0" -dnspython==2.3.0 ; python_version >= "3.8" and python_version < "4.0" -h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" -h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" -hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" -httpcore==0.17.0 ; python_version >= "3.8" and python_version < "4.0" -httpx[http2]==0.24.0 ; python_version >= "3.8" and python_version < "4.0" -hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -idna==3.4 ; python_version >= "3.8" and python_version < "4.0" -jianshuresearchtools==2.11.0 ; python_version >= "3.8" and python_version < "4.0" -lxml==4.9.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.3.3 ; python_version >= "3.8" and python_version < "4.0" -pytz-deprecation-shim==0.1.0.post0 ; python_version >= "3.8" and python_version < "4.0" -pytz==2023.3 ; python_version >= "3.8" and python_version < "4.0" -pyyaml==6.0 ; python_version >= "3.8" and python_version < "4.0" -setuptools==67.6.1 ; python_version >= "3.8" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" -sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" -sspeedup[logging]==0.8.0 ; python_version >= "3.8" and python_version < "4.0" -tzdata==2023.3 ; python_version >= "3.8" and python_version < "4.0" -tzlocal==4.3 ; python_version >= "3.8" and python_version < "4.0" diff --git a/saver.py b/saver.py deleted file mode 100644 index 623baaa..0000000 --- a/saver.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import Any, Dict, List, Sequence - -from utils.db import get_collection - - -class Saver: - def __init__(self, collection_name: str, bulk_size: int) -> None: - if bulk_size <= 0: - raise ValueError - - self._collection = get_collection(collection_name) - self._bulk_size = bulk_size - self._can_add = True - self._data_count = 0 - self._queue: List[Dict] = [] - - @property - def data_count(self) -> int: - return self._data_count - - def _should_save_to_db(self) -> bool: - return len(self._queue) >= self._bulk_size - - def _save_to_db(self) -> None: - # 队列为空时尝试保存数据会报错,此时直接返回 - if not self._queue: - return - - self._collection.insert_many(self._queue) - self._queue.clear() - - def is_in_db(self, query: Dict[str, Any]) -> bool: - return self._collection.count_documents(query) != 0 - - def final_save(self) -> None: - self._save_to_db() - self._can_add = False - - def add_one(self, data: Dict) -> None: - if not self._can_add: - raise ValueError - - self._queue.append(data) - self._data_count += 1 - - if self._should_save_to_db(): - self._save_to_db() - - def add_many(self, data: Sequence[Dict]) -> None: - if not self._can_add: - raise ValueError - - self._queue.extend(data) - self._data_count += len(data) - - if self._should_save_to_db(): - self._save_to_db() diff --git a/utils/config.py b/utils/config.py deleted file mode 100644 index fd0fd9d..0000000 --- a/utils/config.py +++ /dev/null @@ -1,64 +0,0 @@ -from os import path as os_path -from typing import Any, Dict - -from yaml import SafeLoader -from yaml import dump as yaml_dump -from yaml import load as yaml_load - -_DEFAULT_CONFIG = { - "db": { - "host": "localhost", - "port": 27017, - "main_database": "JFetcherData", - }, - "log": { - "minimum_save_level": "DEBUG", - "minimum_print_level": "INFO", - }, - "fetchers": { - "base_path": "./fetchers", - }, - "message_sender": { - "app_id": "", - "app_secret": "", - "email": "", - }, -} - - -class Config: - def __new__(cls) -> "Config": - # 单例模式 - if not hasattr(cls, "_instance"): - cls._instance = object.__new__(cls) - return cls._instance - - def __init__(self) -> None: - if not os_path.exists("config.yaml"): # 没有配置文件 - with open("config.yaml", "w", encoding="utf-8") as f: - yaml_dump(_DEFAULT_CONFIG, f, allow_unicode=True, indent=4) - self._data = _DEFAULT_CONFIG - else: # 有配置文件 - with open("config.yaml", encoding="utf-8") as f: - self._data = yaml_load(f, Loader=SafeLoader) - - def __getattr__(self, name: str) -> Any: - result: Any = self._data[name] - if isinstance(result, dict): - return ConfigNode(result) - - return result - - def refresh(self) -> None: - self.__init__() - - -class ConfigNode: - def __init__(self, data: Dict[str, Any]) -> None: - self._data: Dict[str, Any] = data - - def __getattr__(self, name: str) -> Any: - return self._data[name] - - -config = Config() diff --git a/utils/db.py b/utils/db.py deleted file mode 100644 index 3880367..0000000 --- a/utils/db.py +++ /dev/null @@ -1,17 +0,0 @@ -from pymongo import MongoClient -from pymongo.collection import Collection - -from utils.config import config - - -def init_DB(db_name: str): # noqa - connection: MongoClient = MongoClient(config.db.host, config.db.port) - return connection[db_name] - - -def get_collection(collection_name: str) -> Collection: - return db[collection_name] - - -db = init_DB(config.db.main_database) -run_log_db = db.log diff --git a/utils/log.py b/utils/log.py deleted file mode 100644 index 04d4446..0000000 --- a/utils/log.py +++ /dev/null @@ -1,10 +0,0 @@ -from sspeedup.logging.run_logger import LogLevel, RunLogger - -from utils.config import config -from utils.db import run_log_db - -run_logger = RunLogger( - mongo_collection=run_log_db, - save_level=LogLevel[config.log.minimum_save_level], - print_level=LogLevel[config.log.minimum_print_level], -) diff --git a/utils/message.py b/utils/message.py deleted file mode 100644 index fe4c242..0000000 --- a/utils/message.py +++ /dev/null @@ -1,194 +0,0 @@ -from typing import Dict - -from httpx import post as httpx_post -from sspeedup.cache.timeout import timeout_cache -from sspeedup.time_helper import get_now_without_mileseconds - -from utils.config import config -from utils.log import run_logger - - -@timeout_cache(3600) -def get_feishu_token() -> str: - """获取飞书 Token - - Raises: - ValueError: 获取 Token 失败 - - Returns: - str: 飞书 Token - """ - headers = {"Content-Type": "application/json; charset=utf-8"} - data = { - "app_id": config.message_sender.app_id, - "app_secret": config.message_sender.app_secret, - } - response = httpx_post( - "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", - headers=headers, - json=data, - ) - - if response.json()["code"] != 0: - run_logger.error( - "获取 Token 时发生错误", - error_code=response.json()["code"], - error_message=response.json()["msg"], - ) - raise ValueError( - "获取 Token 时发生错误," - f"错误码:{response.json()['code']}," - f"错误信息:{response.json()['msg']}" - ) - - return "Bearer " + response.json()["tenant_access_token"] - - -def send_feishu_card(card: Dict) -> None: - """发送飞书卡片 - - Args: - card (Dict): 飞书卡片 - - Raises: - ValueError: 发送飞书卡片失败 - """ - headers = { - "Content-Type": "application/json; charset=utf-8", - "Authorization": get_feishu_token(), - } - data = { - "email": config.message_sender.email, - "msg_type": "interactive", - "card": card, - } - response = httpx_post( - "https://open.feishu.cn/open-apis/message/v4/send/", - headers=headers, - json=data, - ) - - if response.json()["code"] != 0: - run_logger.error( - "发送消息卡片时发生错误", - error_code=response.json()["code"], - error_message=response.json()["msg"], - ) - raise ValueError( - "发送消息卡片时发生错误," - f"错误码:{response.json()['code']}," - f"错误信息:{response.json()['msg']}" - ) - - -def send_task_success_card(task_name: str, cost_time: str, data_count: int) -> None: - """发送任务成功卡片 - - Args: - task_name (str): 任务名称 - cost_time (str): 耗时,已处理的字符串 - data_count (int): 采集的数据量 - """ - time_now = get_now_without_mileseconds() - - card = { - "header": { - "title": { - "tag": "plain_text", - "content": "采集任务运行成功", - }, - "template": "green", - }, - "elements": [ - {"tag": "markdown", "content": f"**时间:**{time_now}"}, - { - "tag": "div", - "fields": [ - { - "is_short": True, - "text": { - "tag": "lark_md", - "content": f"**任务名称**\n{task_name}", - }, - }, - { - "is_short": False, - "text": { - "tag": "lark_md", - "content": "", - }, - }, - { - "is_short": True, - "text": { - "tag": "lark_md", - "content": f"**耗时**\n{cost_time}", - }, - }, - { - "is_short": True, - "text": { - "tag": "lark_md", - "content": f"**采集数据量**\n{data_count}", - }, - }, - ], - }, - ], - } - - send_feishu_card(card) - - -def send_task_fail_card(task_name: str, error_message: str) -> None: - """发送任务失败卡片 - - Args: - task_name (str): 任务名称 - error_message (str): 错误信息 - """ - time_now = get_now_without_mileseconds() - - card = { - "header": { - "title": { - "tag": "plain_text", - "content": "采集任务运行失败", - }, - "template": "red", - }, - "elements": [ - { - "tag": "markdown", - "content": f"**时间:**{time_now}", - }, - { - "tag": "div", - "fields": [ - { - "is_short": True, - "text": { - "tag": "lark_md", - "content": f"**任务名称**\n{task_name}", - }, - }, - { - "is_short": False, - "text": { - "tag": "lark_md", - "content": "", - }, - }, - { - "is_short": True, - "text": { - "tag": "lark_md", - "content": f"**错误信息**\n{error_message}", - }, - }, - ], - }, - ], - } - - send_feishu_card(card) diff --git a/utils/module_finder.py b/utils/module_finder.py deleted file mode 100644 index 5f36531..0000000 --- a/utils/module_finder.py +++ /dev/null @@ -1,24 +0,0 @@ -from importlib import import_module -from os import listdir -from typing import List - - -def get_all_modules(base_path: str) -> List[str]: - return [ - x.split(".")[0] - for x in listdir(base_path) - if x.endswith(".py") and not x.startswith("_") - ] - - -def get_all_fetchers(base_path: str) -> List: - modules: List[str] = get_all_modules(base_path) - result: List = [] - for module_name in modules: - module_obj = import_module(f"{base_path.split('/')[1]}.{module_name}") - - for name, obj in module_obj.__dict__.items(): - if name.endswith("Fetcher") and name != "Fetcher": - result.append(obj) - - return result diff --git a/utils/retry.py b/utils/retry.py deleted file mode 100644 index 76f7279..0000000 --- a/utils/retry.py +++ /dev/null @@ -1,26 +0,0 @@ -from functools import wraps -from typing import Any, Callable - -from httpx import RequestError -from sspeedup.retry import exponential_backoff_policy, retry - -from utils.log import run_logger - - -def retry_on_network_error(func: Callable) -> Callable: - @retry( - exponential_backoff_policy(), - RequestError, - max_tries=5, - on_retry=lambda event: run_logger.warning( - "发生超时重试", - func_name=event.func.__name__, - tries=event.tries, - wait_time=event.wait, - ), - ) - @wraps(func) - def inner(*args: Any, **kwargs: Any) -> Any: - return func(*args, **kwargs) - - return inner diff --git a/utils/time_helper.py b/utils/time_helper.py deleted file mode 100644 index 5226f5d..0000000 --- a/utils/time_helper.py +++ /dev/null @@ -1,29 +0,0 @@ -COST_TIME_MAPPING = { - "分": 60, - "秒": 1, -} - - -def human_readable_cost_time(cost_time: int) -> str: - """将耗时转换成人类可读格式 - - Args: - cost_time (int): 耗时,单位为秒 - - Returns: - str: 人类可读格式的耗时字符串 - """ - data = {key: 0 for key in COST_TIME_MAPPING} - - for key, value in COST_TIME_MAPPING.items(): - while value <= cost_time: - data[key] += 1 - cost_time -= value - - if sum(data.values()) == 0: - return "0秒" - - if data["分"] == 0 and data["秒"] != 0: - del data["分"] - - return "".join(f"{value}{key}" for key, value in data.items()) From 61f753fcc698c42abb203aa8dd2e09d66fdb43e1 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 21 Feb 2024 22:55:57 +0800 Subject: [PATCH 02/93] =?UTF-8?q?chore:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + README.md | 1 + main.py | 1 + poetry.lock | 3032 ++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 35 + requirements-dev.txt | 112 ++ requirements.txt | 109 ++ 7 files changed, 3292 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.py create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 requirements-dev.txt create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f97cd98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/__pycache__ +config.yaml \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5cacef3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# JFetcher \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..f301245 --- /dev/null +++ b/main.py @@ -0,0 +1 @@ +print("Hello World!") diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d64505f --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3032 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "aiosqlite" +version = "0.20.0" +description = "asyncio bridge to the standard sqlite3 module" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiosqlite-0.20.0-py3-none-any.whl", hash = "sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6"}, + {file = "aiosqlite-0.20.0.tar.gz", hash = "sha256:6d35c8c256637f4672f843c31021464090805bf925385ac39473fb16eaaca3d7"}, +] + +[package.dependencies] +typing_extensions = ">=4.0" + +[package.extras] +dev = ["attribution (==1.7.0)", "black (==24.2.0)", "coverage[toml] (==7.4.1)", "flake8 (==7.0.0)", "flake8-bugbear (==24.2.6)", "flit (==3.9.0)", "mypy (==1.8.0)", "ufmt (==2.3.0)", "usort (==1.0.8.post1)"] +docs = ["sphinx (==7.2.6)", "sphinx-mdinclude (==0.5.3)"] + +[[package]] +name = "alembic" +version = "1.13.1" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, +] + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "apprise" +version = "1.7.2" +description = "Push Notifications that work with just about every platform!" +optional = false +python-versions = ">=3.6" +files = [ + {file = "apprise-1.7.2-py3-none-any.whl", hash = "sha256:f3192e62924e54334d4ca0c5723d7de9293500e1a0fbf3a890433ea5b6b56df8"}, + {file = "apprise-1.7.2.tar.gz", hash = "sha256:09e159b29008e6c8e93d7ffc3c15d419c0bbae41620405f8f2d3432b72a2e9bf"}, +] + +[package.dependencies] +certifi = "*" +click = ">=5.0" +markdown = "*" +PyYAML = "*" +requests = "*" +requests-oauthlib = "*" + +[[package]] +name = "asgi-lifespan" +version = "2.1.0" +description = "Programmatic startup/shutdown of ASGI apps." +optional = false +python-versions = ">=3.7" +files = [ + {file = "asgi-lifespan-2.1.0.tar.gz", hash = "sha256:5e2effaf0bfe39829cf2d64e7ecc47c7d86d676a6599f7afba378c31f5e3a308"}, + {file = "asgi_lifespan-2.1.0-py3-none-any.whl", hash = "sha256:ed840706680e28428c01e14afb3875d7d76d3206f3d5b2f2294e059b5c23804f"}, +] + +[package.dependencies] +sniffio = "*" + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "asyncpg" +version = "0.29.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "asyncpg-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72fd0ef9f00aeed37179c62282a3d14262dbbafb74ec0ba16e1b1864d8a12169"}, + {file = "asyncpg-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52e8f8f9ff6e21f9b39ca9f8e3e33a5fcdceaf5667a8c5c32bee158e313be385"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e6823a7012be8b68301342ba33b4740e5a166f6bbda0aee32bc01638491a22"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746e80d83ad5d5464cfbf94315eb6744222ab00aa4e522b704322fb182b83610"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff8e8109cd6a46ff852a5e6bab8b0a047d7ea42fcb7ca5ae6eaae97d8eacf397"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97eb024685b1d7e72b1972863de527c11ff87960837919dac6e34754768098eb"}, + {file = "asyncpg-0.29.0-cp310-cp310-win32.whl", hash = "sha256:5bbb7f2cafd8d1fa3e65431833de2642f4b2124be61a449fa064e1a08d27e449"}, + {file = "asyncpg-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:76c3ac6530904838a4b650b2880f8e7af938ee049e769ec2fba7cd66469d7772"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4900ee08e85af01adb207519bb4e14b1cae8fd21e0ccf80fac6aa60b6da37b4"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a65c1dcd820d5aea7c7d82a3fdcb70e096f8f70d1a8bf93eb458e49bfad036ac"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b52e46f165585fd6af4863f268566668407c76b2c72d366bb8b522fa66f1870"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc600ee8ef3dd38b8d67421359779f8ccec30b463e7aec7ed481c8346decf99f"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:039a261af4f38f949095e1e780bae84a25ffe3e370175193174eb08d3cecab23"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6feaf2d8f9138d190e5ec4390c1715c3e87b37715cd69b2c3dfca616134efd2b"}, + {file = "asyncpg-0.29.0-cp311-cp311-win32.whl", hash = "sha256:1e186427c88225ef730555f5fdda6c1812daa884064bfe6bc462fd3a71c4b675"}, + {file = "asyncpg-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfe73ffae35f518cfd6e4e5f5abb2618ceb5ef02a2365ce64f132601000587d3"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d84156d5fb530b06c493f9e7635aa18f518fa1d1395ef240d211cb563c4e2364"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54858bc25b49d1114178d65a88e48ad50cb2b6f3e475caa0f0c092d5f527c106"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bde17a1861cf10d5afce80a36fca736a86769ab3579532c03e45f83ba8a09c59"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:37a2ec1b9ff88d8773d3eb6d3784dc7e3fee7756a5317b67f923172a4748a175"}, + {file = "asyncpg-0.29.0-cp312-cp312-win32.whl", hash = "sha256:bb1292d9fad43112a85e98ecdc2e051602bce97c199920586be83254d9dafc02"}, + {file = "asyncpg-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:2245be8ec5047a605e0b454c894e54bf2ec787ac04b1cb7e0d3c67aa1e32f0fe"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0009a300cae37b8c525e5b449233d59cd9868fd35431abc470a3e364d2b85cb9"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cad1324dbb33f3ca0cd2074d5114354ed3be2b94d48ddfd88af75ebda7c43cc"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012d01df61e009015944ac7543d6ee30c2dc1eb2f6b10b62a3f598beb6531548"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000c996c53c04770798053e1730d34e30cb645ad95a63265aec82da9093d88e7"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0bfe9c4d3429706cf70d3249089de14d6a01192d617e9093a8e941fea8ee775"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:642a36eb41b6313ffa328e8a5c5c2b5bea6ee138546c9c3cf1bffaad8ee36dd9"}, + {file = "asyncpg-0.29.0-cp38-cp38-win32.whl", hash = "sha256:a921372bbd0aa3a5822dd0409da61b4cd50df89ae85150149f8c119f23e8c408"}, + {file = "asyncpg-0.29.0-cp38-cp38-win_amd64.whl", hash = "sha256:103aad2b92d1506700cbf51cd8bb5441e7e72e87a7b3a2ca4e32c840f051a6a3"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5340dd515d7e52f4c11ada32171d87c05570479dc01dc66d03ee3e150fb695da"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e17b52c6cf83e170d3d865571ba574577ab8e533e7361a2b8ce6157d02c665d3"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f100d23f273555f4b19b74a96840aa27b85e99ba4b1f18d4ebff0734e78dc090"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48e7c58b516057126b363cec8ca02b804644fd012ef8e6c7e23386b7d5e6ce83"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9ea3f24eb4c49a615573724d88a48bd1b7821c890c2effe04f05382ed9e8810"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d36c7f14a22ec9e928f15f92a48207546ffe68bc412f3be718eedccdf10dc5c"}, + {file = "asyncpg-0.29.0-cp39-cp39-win32.whl", hash = "sha256:797ab8123ebaed304a1fad4d7576d5376c3a006a4100380fb9d517f0b59c1ab2"}, + {file = "asyncpg-0.29.0-cp39-cp39-win_amd64.whl", hash = "sha256:cce08a178858b426ae1aa8409b5cc171def45d4293626e7aa6510696d46decd8"}, + {file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""} + +[package.extras] +docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +description = "Backport of the standard library zoneinfo module" +optional = false +python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] + +[package.extras] +tzdata = ["tzdata"] + +[[package]] +name = "beanie" +version = "1.25.0" +description = "Asynchronous Python ODM for MongoDB" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "beanie-1.25.0-py3-none-any.whl", hash = "sha256:4436ac740718ccd62b21576778679ac972359fce2938557890c576adbbf5e244"}, + {file = "beanie-1.25.0.tar.gz", hash = "sha256:f153866b9ba015274102e10a397602d088fc039b705bd806cb447c898cd2979b"}, +] + +[package.dependencies] +click = ">=7" +lazy-model = "0.2.0" +motor = ">=2.5.0,<4.0.0" +pydantic = ">=1.10,<3.0" +toml = "*" +typing-extensions = {version = ">=4.7", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Markdown (>=3.3)", "Pygments (>=2.8.0)", "jinja2 (>=3.0.3)", "mkdocs (>=1.4)", "mkdocs-material (>=9.0)", "pydoc-markdown (>=4.8)"] +queue = ["beanie-batteries-queue (>=0.2)"] +test = ["asgi-lifespan (>=1.0.1)", "dnspython (>=2.1.0)", "fastapi (>=0.100)", "flake8 (>=3)", "httpx (>=0.23.0)", "pre-commit (>=2.3.0)", "pydantic-extra-types (>=2)", "pydantic-settings (>=2)", "pydantic[email]", "pyright (>=0)", "pytest (>=6.0.0)", "pytest-asyncio (>=0.21.0)", "pytest-cov (>=2.8.1)"] + +[[package]] +name = "cachetools" +version = "5.3.2" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coolname" +version = "2.2.0" +description = "Random name and slug generator" +optional = false +python-versions = "*" +files = [ + {file = "coolname-2.2.0-py2.py3-none-any.whl", hash = "sha256:4d1563186cfaf71b394d5df4c744f8c41303b6846413645e31d31915cdeb13e8"}, + {file = "coolname-2.2.0.tar.gz", hash = "sha256:6c5d5731759104479e7ca195a9b64f7900ac5bead40183c09323c7d0be9e75c7"}, +] + +[[package]] +name = "croniter" +version = "2.0.1" +description = "croniter provides iteration for datetime object with cron like format" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-2.0.1-py2.py3-none-any.whl", hash = "sha256:4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7"}, + {file = "croniter-2.0.1.tar.gz", hash = "sha256:d199b2ec3ea5e82988d1f72022433c5f9302b3b3ea9e6bfd6a1518f6ea5e700a"}, +] + +[package.dependencies] +python-dateutil = "*" +pytz = ">2021.1" + +[[package]] +name = "cryptography" +version = "42.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449"}, + {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b"}, + {file = "cryptography-42.0.4-cp37-abi3-win32.whl", hash = "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925"}, + {file = "cryptography-42.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923"}, + {file = "cryptography-42.0.4-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0"}, + {file = "cryptography-42.0.4-cp39-abi3-win32.whl", hash = "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129"}, + {file = "cryptography-42.0.4-cp39-abi3-win_amd64.whl", hash = "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660"}, + {file = "cryptography-42.0.4.tar.gz", hash = "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "dateparser" +version = "1.2.0" +description = "Date parsing library designed to parse dates from HTML pages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, + {file = "dateparser-1.2.0.tar.gz", hash = "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"}, +] + +[package.dependencies] +python-dateutil = "*" +pytz = "*" +regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27" +tzlocal = "*" + +[package.extras] +calendars = ["convertdate", "hijri-converter"] +fasttext = ["fasttext"] +langdetect = ["langdetect"] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "docker" +version = "6.1.3" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, + {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, +] + +[package.dependencies] +packaging = ">=14.0" +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" +websocket-client = ">=0.32.0" + +[package.extras] +ssh = ["paramiko (>=2.4.3)"] + +[[package]] +name = "email-validator" +version = "2.1.0.post1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.0.post1-py3-none-any.whl", hash = "sha256:c973053efbeddfef924dc0bd93f6e77a1ea7ee0fce935aea7103c7a3d6d2d637"}, + {file = "email_validator-2.1.0.post1.tar.gz", hash = "sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fsspec" +version = "2024.2.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "google-auth" +version = "2.28.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.28.0.tar.gz", hash = "sha256:3cfc1b6e4e64797584fb53fc9bd0b7afa9b7c0dba2004fa7dcc9349e58cc3195"}, + {file = "google_auth-2.28.0-py2.py3-none-any.whl", hash = "sha256:7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "graphviz" +version = "0.20.1" +description = "Simple Python interface for Graphviz" +optional = false +python-versions = ">=3.7" +files = [ + {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, + {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, +] + +[package.extras] +dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] +docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] + +[[package]] +name = "greenback" +version = "1.2.1" +description = "Reenter an async event loop from synchronous code" +optional = false +python-versions = ">=3.8" +files = [ + {file = "greenback-1.2.1-py3-none-any.whl", hash = "sha256:98768edbbe4340091a9730cf64a683fcbaa3f2cb81e4ac41d7ed28d3b6f74b79"}, + {file = "greenback-1.2.1.tar.gz", hash = "sha256:de3ca656885c03b96dab36079f3de74bb5ba061da9bfe3bb69dccc866ef95ea3"}, +] + +[package.dependencies] +greenlet = "!=0.4.17" +outcome = "*" +sniffio = "*" + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "griffe" +version = "0.40.1" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-0.40.1-py3-none-any.whl", hash = "sha256:5b8c023f366fe273e762131fe4bfd141ea56c09b3cb825aa92d06a82681cfd93"}, + {file = "griffe-0.40.1.tar.gz", hash = "sha256:66c48a62e2ce5784b6940e603300fcfb807b6f099b94e7f753f1841661fd5c7c"}, +] + +[package.dependencies] +colorama = ">=0.4" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "httpcore" +version = "1.0.4" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, + {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.25.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jkit" +version = "3.0.0a9" +description = "简书非官方 SDK - 创造可能性" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "jkit-3.0.0a9-py3-none-any.whl", hash = "sha256:be5b4f4e0126f7c9669f9249d5b3959065a310be65b7b2e9cf722cdd74669e0c"}, + {file = "jkit-3.0.0a9.tar.gz", hash = "sha256:0fe461c5468a8825af6f8e2613091b361cd7c9983627fc106ac31ec3ceca2ac6"}, +] + +[package.dependencies] +httpx = {version = "*", extras = ["http2"]} +lxml = "*" +msgspec = "*" +typing-extensions = "*" + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +jsonschema-specifications = ">=2023.03.6" +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.31.0" + +[[package]] +name = "kubernetes" +version = "29.0.0" +description = "Kubernetes python client" +optional = false +python-versions = ">=3.6" +files = [ + {file = "kubernetes-29.0.0-py2.py3-none-any.whl", hash = "sha256:ab8cb0e0576ccdfb71886366efb102c6a20f268d817be065ce7f9909c631e43e"}, + {file = "kubernetes-29.0.0.tar.gz", hash = "sha256:c4812e227ae74d07d53c88293e564e54b850452715a59a927e7e1bc6b9a60459"}, +] + +[package.dependencies] +certifi = ">=14.05.14" +google-auth = ">=1.0.1" +oauthlib = ">=3.2.2" +python-dateutil = ">=2.5.3" +pyyaml = ">=5.4.1" +requests = "*" +requests-oauthlib = "*" +six = ">=1.9.0" +urllib3 = ">=1.24.2" +websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" + +[package.extras] +adal = ["adal (>=1.0.2)"] + +[[package]] +name = "lazy-model" +version = "0.2.0" +description = "" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "lazy-model-0.2.0.tar.gz", hash = "sha256:57c0e91e171530c4fca7aebc3ac05a163a85cddd941bf7527cc46c0ddafca47c"}, + {file = "lazy_model-0.2.0-py3-none-any.whl", hash = "sha256:5a3241775c253e36d9069d236be8378288a93d4fc53805211fd152e04cc9c342"}, +] + +[package.dependencies] +pydantic = ">=1.9.0" + +[[package]] +name = "lxml" +version = "5.1.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, + {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, + {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, + {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, + {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, + {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, + {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, + {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, + {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, + {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, + {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, + {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, + {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, + {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, + {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, + {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, + {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, + {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, + {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, + {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, + {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, + {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, + {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, + {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, + {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, + {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, + {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, + {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, + {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, + {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, + {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, + {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, + {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, + {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, + {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, + {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, + {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, + {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, + {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, + {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, + {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, + {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, + {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, + {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, + {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, + {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, + {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, + {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, + {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, + {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.7)"] + +[[package]] +name = "mako" +version = "1.3.2" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.2-py3-none-any.whl", hash = "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c"}, + {file = "Mako-1.3.2.tar.gz", hash = "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markdown" +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "motor" +version = "3.3.2" +description = "Non-blocking MongoDB driver for Tornado or asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "motor-3.3.2-py3-none-any.whl", hash = "sha256:6fe7e6f0c4f430b9e030b9d22549b732f7c2226af3ab71ecc309e4a1b7d19953"}, + {file = "motor-3.3.2.tar.gz", hash = "sha256:d2fc38de15f1c8058f389c1a44a4d4105c0405c48c061cd492a654496f7bc26a"}, +] + +[package.dependencies] +pymongo = ">=4.5,<5" + +[package.extras] +aws = ["pymongo[aws] (>=4.5,<5)"] +encryption = ["pymongo[encryption] (>=4.5,<5)"] +gssapi = ["pymongo[gssapi] (>=4.5,<5)"] +ocsp = ["pymongo[ocsp] (>=4.5,<5)"] +snappy = ["pymongo[snappy] (>=4.5,<5)"] +srv = ["pymongo[srv] (>=4.5,<5)"] +test = ["aiohttp (<3.8.6)", "mockupdb", "motor[encryption]", "pytest (>=7)", "tornado (>=5)"] +zstd = ["pymongo[zstd] (>=4.5,<5)"] + +[[package]] +name = "msgspec" +version = "0.18.6" +description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgspec-0.18.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77f30b0234eceeff0f651119b9821ce80949b4d667ad38f3bfed0d0ebf9d6d8f"}, + {file = "msgspec-0.18.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a76b60e501b3932782a9da039bd1cd552b7d8dec54ce38332b87136c64852dd"}, + {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06acbd6edf175bee0e36295d6b0302c6de3aaf61246b46f9549ca0041a9d7177"}, + {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40a4df891676d9c28a67c2cc39947c33de516335680d1316a89e8f7218660410"}, + {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a6896f4cd5b4b7d688018805520769a8446df911eb93b421c6c68155cdf9dd5a"}, + {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ac4dd63fd5309dd42a8c8c36c1563531069152be7819518be0a9d03be9788e4"}, + {file = "msgspec-0.18.6-cp310-cp310-win_amd64.whl", hash = "sha256:fda4c357145cf0b760000c4ad597e19b53adf01382b711f281720a10a0fe72b7"}, + {file = "msgspec-0.18.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e77e56ffe2701e83a96e35770c6adb655ffc074d530018d1b584a8e635b4f36f"}, + {file = "msgspec-0.18.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5351afb216b743df4b6b147691523697ff3a2fc5f3d54f771e91219f5c23aaa"}, + {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3232fabacef86fe8323cecbe99abbc5c02f7698e3f5f2e248e3480b66a3596b"}, + {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b524df6ea9998bbc99ea6ee4d0276a101bcc1aa8d14887bb823914d9f60d07"}, + {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37f67c1d81272131895bb20d388dd8d341390acd0e192a55ab02d4d6468b434c"}, + {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0feb7a03d971c1c0353de1a8fe30bb6579c2dc5ccf29b5f7c7ab01172010492"}, + {file = "msgspec-0.18.6-cp311-cp311-win_amd64.whl", hash = "sha256:41cf758d3f40428c235c0f27bc6f322d43063bc32da7b9643e3f805c21ed57b4"}, + {file = "msgspec-0.18.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d86f5071fe33e19500920333c11e2267a31942d18fed4d9de5bc2fbab267d28c"}, + {file = "msgspec-0.18.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce13981bfa06f5eb126a3a5a38b1976bddb49a36e4f46d8e6edecf33ccf11df1"}, + {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97dec6932ad5e3ee1e3c14718638ba333befc45e0661caa57033cd4cc489466"}, + {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad237100393f637b297926cae1868b0d500f764ccd2f0623a380e2bcfb2809ca"}, + {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db1d8626748fa5d29bbd15da58b2d73af25b10aa98abf85aab8028119188ed57"}, + {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d70cb3d00d9f4de14d0b31d38dfe60c88ae16f3182988246a9861259c6722af6"}, + {file = "msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0"}, + {file = "msgspec-0.18.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7d9faed6dfff654a9ca7d9b0068456517f63dbc3aa704a527f493b9200b210a"}, + {file = "msgspec-0.18.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da21f804c1a1471f26d32b5d9bc0480450ea77fbb8d9db431463ab64aaac2cf"}, + {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46eb2f6b22b0e61c137e65795b97dc515860bf6ec761d8fb65fdb62aa094ba61"}, + {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8355b55c80ac3e04885d72db515817d9fbb0def3bab936bba104e99ad22cf46"}, + {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9080eb12b8f59e177bd1eb5c21e24dd2ba2fa88a1dbc9a98e05ad7779b54c681"}, + {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc001cf39becf8d2dcd3f413a4797c55009b3a3cdbf78a8bf5a7ca8fdb76032c"}, + {file = "msgspec-0.18.6-cp38-cp38-win_amd64.whl", hash = "sha256:fac5834e14ac4da1fca373753e0c4ec9c8069d1fe5f534fa5208453b6065d5be"}, + {file = "msgspec-0.18.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:974d3520fcc6b824a6dedbdf2b411df31a73e6e7414301abac62e6b8d03791b4"}, + {file = "msgspec-0.18.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd62e5818731a66aaa8e9b0a1e5543dc979a46278da01e85c3c9a1a4f047ef7e"}, + {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7481355a1adcf1f08dedd9311193c674ffb8bf7b79314b4314752b89a2cf7f1c"}, + {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aa85198f8f154cf35d6f979998f6dadd3dc46a8a8c714632f53f5d65b315c07"}, + {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e24539b25c85c8f0597274f11061c102ad6b0c56af053373ba4629772b407be"}, + {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c61ee4d3be03ea9cd089f7c8e36158786cd06e51fbb62529276452bbf2d52ece"}, + {file = "msgspec-0.18.6-cp39-cp39-win_amd64.whl", hash = "sha256:b5c390b0b0b7da879520d4ae26044d74aeee5144f83087eb7842ba59c02bc090"}, + {file = "msgspec-0.18.6.tar.gz", hash = "sha256:a59fc3b4fcdb972d09138cb516dbde600c99d07c38fd9372a6ef500d2d031b4e"}, +] + +[package.extras] +dev = ["attrs", "coverage", "furo", "gcovr", "ipython", "msgpack", "mypy", "pre-commit", "pyright", "pytest", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "tomli", "tomli-w"] +doc = ["furo", "ipython", "sphinx", "sphinx-copybutton", "sphinx-design"] +test = ["attrs", "msgpack", "mypy", "pyright", "pytest", "pyyaml", "tomli", "tomli-w"] +toml = ["tomli", "tomli-w"] +yaml = ["pyyaml"] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "orjson" +version = "3.9.14" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:793f6c9448ab6eb7d4974b4dde3f230345c08ca6c7995330fbceeb43a5c8aa5e"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bc7928d161840096adc956703494b5c0193ede887346f028216cac0af87500"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58b36f54da759602d8e2f7dad958752d453dfe2c7122767bc7f765e17dc59959"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abcda41ecdc950399c05eff761c3de91485d9a70d8227cb599ad3a66afe93bcc"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df76ecd17b1b3627bddfd689faaf206380a1a38cc9f6c4075bd884eaedcf46c2"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d450a8e0656efb5d0fcb062157b918ab02dcca73278975b4ee9ea49e2fcf5bd5"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:95c03137b0cf66517c8baa65770507a756d3a89489d8ecf864ea92348e1beabe"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20837e10835c98973673406d6798e10f821e7744520633811a5a3d809762d8cc"}, + {file = "orjson-3.9.14-cp310-none-win32.whl", hash = "sha256:1f7b6f3ef10ae8e3558abb729873d033dbb5843507c66b1c0767e32502ba96bb"}, + {file = "orjson-3.9.14-cp310-none-win_amd64.whl", hash = "sha256:ea890e6dc1711aeec0a33b8520e395c2f3d59ead5b4351a788e06bf95fc7ba81"}, + {file = "orjson-3.9.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c19009ff37f033c70acd04b636380379499dac2cba27ae7dfc24f304deabbc81"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19cdea0664aec0b7f385be84986d4defd3334e9c3c799407686ee1c26f7b8251"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:135d518f73787ce323b1a5e21fb854fe22258d7a8ae562b81a49d6c7f826f2a3"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2cf1d0557c61c75e18cf7d69fb689b77896e95553e212c0cc64cf2087944b84"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7c11667421df2d8b18b021223505dcc3ee51be518d54e4dc49161ac88ac2b87"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eefc41ba42e75ed88bc396d8fe997beb20477f3e7efa000cd7a47eda452fbb2"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:917311d6a64d1c327c0dfda1e41f3966a7fb72b11ca7aa2e7a68fcccc7db35d9"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4dc1c132259b38d12c6587d190cd09cd76e3b5273ce71fe1372437b4cbc65f6f"}, + {file = "orjson-3.9.14-cp311-none-win32.whl", hash = "sha256:6f39a10408478f4c05736a74da63727a1ae0e83e3533d07b19443400fe8591ca"}, + {file = "orjson-3.9.14-cp311-none-win_amd64.whl", hash = "sha256:26280a7fcb62d8257f634c16acebc3bec626454f9ab13558bbf7883b9140760e"}, + {file = "orjson-3.9.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:08e722a8d06b13b67a51f247a24938d1a94b4b3862e40e0eef3b2e98c99cd04c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2591faa0c031cf3f57e5bce1461cfbd6160f3f66b5a72609a130924917cb07d"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2450d87dd7b4f277f4c5598faa8b49a0c197b91186c47a2c0b88e15531e4e3e"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90903d2908158a2c9077a06f11e27545de610af690fb178fd3ba6b32492d4d1c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce6f095eef0026eae76fc212f20f786011ecf482fc7df2f4c272a8ae6dd7b1ef"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:751250a31fef2bac05a2da2449aae7142075ea26139271f169af60456d8ad27a"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a1af21160a38ee8be3f4fcf24ee4b99e6184cadc7f915d599f073f478a94d2c"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:449bf090b2aa4e019371d7511a6ea8a5a248139205c27d1834bb4b1e3c44d936"}, + {file = "orjson-3.9.14-cp312-none-win_amd64.whl", hash = "sha256:a603161318ff699784943e71f53899983b7dee571b4dd07c336437c9c5a272b0"}, + {file = "orjson-3.9.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:814f288c011efdf8f115c5ebcc1ab94b11da64b207722917e0ceb42f52ef30a3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88cafb100af68af3b9b29b5ccd09fdf7a48c63327916c8c923a94c336d38dd3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba3518b999f88882ade6686f1b71e207b52e23546e180499be5bbb63a2f9c6e6"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978f416bbff9da8d2091e3cf011c92da68b13f2c453dcc2e8109099b2a19d234"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75fc593cf836f631153d0e21beaeb8d26e144445c73645889335c2247fcd71a0"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d1528db3c7554f9d6eeb09df23cb80dd5177ec56eeb55cc5318826928de506"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7183cc68ee2113b19b0b8714221e5e3b07b3ba10ca2bb108d78fd49cefaae101"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df3266d54246cb56b8bb17fa908660d2a0f2e3f63fbc32451ffc1b1505051d07"}, + {file = "orjson-3.9.14-cp38-none-win32.whl", hash = "sha256:7913079b029e1b3501854c9a78ad938ed40d61fe09bebab3c93e60ff1301b189"}, + {file = "orjson-3.9.14-cp38-none-win_amd64.whl", hash = "sha256:29512eb925b620e5da2fd7585814485c67cc6ba4fe739a0a700c50467a8a8065"}, + {file = "orjson-3.9.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bf597530544db27a8d76aced49cfc817ee9503e0a4ebf0109cd70331e7bbe0c"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac650d49366fa41fe702e054cb560171a8634e2865537e91f09a8d05ea5b1d37"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:236230433a9a4968ab895140514c308fdf9f607cb8bee178a04372b771123860"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3014ccbda9be0b1b5f8ea895121df7e6524496b3908f4397ff02e923bcd8f6dd"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac0c7eae7ad3a223bde690565442f8a3d620056bd01196f191af8be58a5248e1"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca33fdd0b38839b01912c57546d4f412ba7bfa0faf9bf7453432219aec2df07"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f75823cc1674a840a151e999a7dfa0d86c911150dd6f951d0736ee9d383bf415"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f52ac2eb49e99e7373f62e2a68428c6946cda52ce89aa8fe9f890c7278e2d3a"}, + {file = "orjson-3.9.14-cp39-none-win32.whl", hash = "sha256:0572f174f50b673b7df78680fb52cd0087a8585a6d06d295a5f790568e1064c6"}, + {file = "orjson-3.9.14-cp39-none-win_amd64.whl", hash = "sha256:ab90c02cb264250b8a58cedcc72ed78a4a257d956c8d3c8bebe9751b818dfad8"}, + {file = "orjson-3.9.14.tar.gz", hash = "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79"}, +] + +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "pendulum" +version = "3.0.0" +description = "Python datetimes made easy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, + {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c58227ac260d5b01fc1025176d7b31858c9f62595737f350d22124a9a3ad82d"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60fb6f415fea93a11c52578eaa10594568a6716602be8430b167eb0d730f3332"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b69f6b4dbcb86f2c2fe696ba991e67347bcf87fe601362a1aba6431454b46bde"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:138afa9c373ee450ede206db5a5e9004fd3011b3c6bbe1e57015395cd076a09f"}, + {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:83d9031f39c6da9677164241fd0d37fbfc9dc8ade7043b5d6d62f56e81af8ad2"}, + {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c2308af4033fa534f089595bcd40a95a39988ce4059ccd3dc6acb9ef14ca44a"}, + {file = "pendulum-3.0.0-cp310-none-win_amd64.whl", hash = "sha256:9a59637cdb8462bdf2dbcb9d389518c0263799189d773ad5c11db6b13064fa79"}, + {file = "pendulum-3.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3725245c0352c95d6ca297193192020d1b0c0f83d5ee6bb09964edc2b5a2d508"}, + {file = "pendulum-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c035f03a3e565ed132927e2c1b691de0dbf4eb53b02a5a3c5a97e1a64e17bec"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597e66e63cbd68dd6d58ac46cb7a92363d2088d37ccde2dae4332ef23e95cd00"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99a0f8172e19f3f0c0e4ace0ad1595134d5243cf75985dc2233e8f9e8de263ca"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77d8839e20f54706aed425bec82a83b4aec74db07f26acd039905d1237a5e1d4"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afde30e8146292b059020fbc8b6f8fd4a60ae7c5e6f0afef937bbb24880bdf01"}, + {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:660434a6fcf6303c4efd36713ca9212c753140107ee169a3fc6c49c4711c2a05"}, + {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dee9e5a48c6999dc1106eb7eea3e3a50e98a50651b72c08a87ee2154e544b33e"}, + {file = "pendulum-3.0.0-cp311-none-win_amd64.whl", hash = "sha256:d4cdecde90aec2d67cebe4042fd2a87a4441cc02152ed7ed8fb3ebb110b94ec4"}, + {file = "pendulum-3.0.0-cp311-none-win_arm64.whl", hash = "sha256:773c3bc4ddda2dda9f1b9d51fe06762f9200f3293d75c4660c19b2614b991d83"}, + {file = "pendulum-3.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:409e64e41418c49f973d43a28afe5df1df4f1dd87c41c7c90f1a63f61ae0f1f7"}, + {file = "pendulum-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38ad2121c5ec7c4c190c7334e789c3b4624798859156b138fcc4d92295835dc"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde4d0b2024b9785f66b7f30ed59281bd60d63d9213cda0eb0910ead777f6d37"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2c5675769fb6d4c11238132962939b960fcb365436b6d623c5864287faa319"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af95e03e066826f0f4c65811cbee1b3123d4a45a1c3a2b4fc23c4b0dff893b5"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2165a8f33cb15e06c67070b8afc87a62b85c5a273e3aaa6bc9d15c93a4920d6f"}, + {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ad5e65b874b5e56bd942546ea7ba9dd1d6a25121db1c517700f1c9de91b28518"}, + {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17fe4b2c844bbf5f0ece69cfd959fa02957c61317b2161763950d88fed8e13b9"}, + {file = "pendulum-3.0.0-cp312-none-win_amd64.whl", hash = "sha256:78f8f4e7efe5066aca24a7a57511b9c2119f5c2b5eb81c46ff9222ce11e0a7a5"}, + {file = "pendulum-3.0.0-cp312-none-win_arm64.whl", hash = "sha256:28f49d8d1e32aae9c284a90b6bb3873eee15ec6e1d9042edd611b22a94ac462f"}, + {file = "pendulum-3.0.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d4e2512f4e1a4670284a153b214db9719eb5d14ac55ada5b76cbdb8c5c00399d"}, + {file = "pendulum-3.0.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d897eb50883cc58d9b92f6405245f84b9286cd2de6e8694cb9ea5cb15195a32"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e169cc2ca419517f397811bbe4589cf3cd13fca6dc38bb352ba15ea90739ebb"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17c3084a4524ebefd9255513692f7e7360e23c8853dc6f10c64cc184e1217ab"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:826d6e258052715f64d05ae0fc9040c0151e6a87aae7c109ba9a0ed930ce4000"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2aae97087872ef152a0c40e06100b3665d8cb86b59bc8471ca7c26132fccd0f"}, + {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac65eeec2250d03106b5e81284ad47f0d417ca299a45e89ccc69e36130ca8bc7"}, + {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5346d08f3f4a6e9e672187faa179c7bf9227897081d7121866358af369f44f9"}, + {file = "pendulum-3.0.0-cp37-none-win_amd64.whl", hash = "sha256:235d64e87946d8f95c796af34818c76e0f88c94d624c268693c85b723b698aa9"}, + {file = "pendulum-3.0.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6a881d9c2a7f85bc9adafcfe671df5207f51f5715ae61f5d838b77a1356e8b7b"}, + {file = "pendulum-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7762d2076b9b1cb718a6631ad6c16c23fc3fac76cbb8c454e81e80be98daa34"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e8e36a8130819d97a479a0e7bf379b66b3b1b520e5dc46bd7eb14634338df8c"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dc843253ac373358ffc0711960e2dd5b94ab67530a3e204d85c6e8cb2c5fa10"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a78ad3635d609ceb1e97d6aedef6a6a6f93433ddb2312888e668365908c7120"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a137e9e0d1f751e60e67d11fc67781a572db76b2296f7b4d44554761049d6"}, + {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c95984037987f4a457bb760455d9ca80467be792236b69d0084f228a8ada0162"}, + {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29c6e578fe0f893766c0d286adbf0b3c726a4e2341eba0917ec79c50274ec16"}, + {file = "pendulum-3.0.0-cp38-none-win_amd64.whl", hash = "sha256:deaba8e16dbfcb3d7a6b5fabdd5a38b7c982809567479987b9c89572df62e027"}, + {file = "pendulum-3.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b11aceea5b20b4b5382962b321dbc354af0defe35daa84e9ff3aae3c230df694"}, + {file = "pendulum-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90d4d504e82ad236afac9adca4d6a19e4865f717034fc69bafb112c320dcc8f"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825799c6b66e3734227756fa746cc34b3549c48693325b8b9f823cb7d21b19ac"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad769e98dc07972e24afe0cff8d365cb6f0ebc7e65620aa1976fcfbcadc4c6f3"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6fc26907eb5fb8cc6188cc620bc2075a6c534d981a2f045daa5f79dfe50d512"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c717eab1b6d898c00a3e0fa7781d615b5c5136bbd40abe82be100bb06df7a56"}, + {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3ddd1d66d1a714ce43acfe337190be055cdc221d911fc886d5a3aae28e14b76d"}, + {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:822172853d7a9cf6da95d7b66a16c7160cb99ae6df55d44373888181d7a06edc"}, + {file = "pendulum-3.0.0-cp39-none-win_amd64.whl", hash = "sha256:840de1b49cf1ec54c225a2a6f4f0784d50bd47f68e41dc005b7f67c7d5b5f3ae"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b1f74d1e6ffe5d01d6023870e2ce5c2191486928823196f8575dcc786e107b1"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:729e9f93756a2cdfa77d0fc82068346e9731c7e884097160603872686e570f07"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e586acc0b450cd21cbf0db6bae386237011b75260a3adceddc4be15334689a9a"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22e7944ffc1f0099a79ff468ee9630c73f8c7835cd76fdb57ef7320e6a409df4"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fa30af36bd8e50686846bdace37cf6707bdd044e5cb6e1109acbad3277232e04"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:440215347b11914ae707981b9a57ab9c7b6983ab0babde07063c6ee75c0dc6e7"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:314c4038dc5e6a52991570f50edb2f08c339debdf8cea68ac355b32c4174e820"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5acb1d386337415f74f4d1955c4ce8d0201978c162927d07df8eb0692b2d8533"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a789e12fbdefaffb7b8ac67f9d8f22ba17a3050ceaaa635cd1cc4645773a4b1e"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:860aa9b8a888e5913bd70d819306749e5eb488e6b99cd6c47beb701b22bdecf5"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5ebc65ea033ef0281368217fbf59f5cb05b338ac4dd23d60959c7afcd79a60a0"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9fef18ab0386ef6a9ac7bad7e43ded42c83ff7ad412f950633854f90d59afa8"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c134ba2f0571d0b68b83f6972e2307a55a5a849e7dac8505c715c531d2a8795"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:385680812e7e18af200bb9b4a49777418c32422d05ad5a8eb85144c4a285907b"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eec91cd87c59fb32ec49eb722f375bd58f4be790cae11c1b70fac3ee4f00da0"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4386bffeca23c4b69ad50a36211f75b35a4deb6210bdca112ac3043deb7e494a"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dfbcf1661d7146d7698da4b86e7f04814221081e9fe154183e34f4c5f5fa3bf8"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:04a1094a5aa1daa34a6b57c865b25f691848c61583fb22722a4df5699f6bf74c"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5b0ec85b9045bd49dd3a3493a5e7ddfd31c36a2a60da387c419fa04abcaecb23"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0a15b90129765b705eb2039062a6daf4d22c4e28d1a54fa260892e8c3ae6e157"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:bb8f6d7acd67a67d6fedd361ad2958ff0539445ef51cbe8cd288db4306503cd0"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd69b15374bef7e4b4440612915315cc42e8575fcda2a3d7586a0d88192d0c88"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc00f8110db6898360c53c812872662e077eaf9c75515d53ecc65d886eec209a"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:83a44e8b40655d0ba565a5c3d1365d27e3e6778ae2a05b69124db9e471255c4a"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1a3604e9fbc06b788041b2a8b78f75c243021e0f512447806a6d37ee5214905d"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:92c307ae7accebd06cbae4729f0ba9fa724df5f7d91a0964b1b972a22baa482b"}, + {file = "pendulum-3.0.0.tar.gz", hash = "sha256:5d034998dea404ec31fae27af6b22cff1708f830a1ed7353be4d1019bb9f584e"}, +] + +[package.dependencies] +python-dateutil = ">=2.6" +tzdata = ">=2020.1" + +[package.extras] +test = ["time-machine (>=2.6.0)"] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "prefect" +version = "2.15.0" +description = "Workflow orchestration and management." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prefect-2.15.0-py3-none-any.whl", hash = "sha256:f0c2918b88eeea049bb547a45b247ee3a623ab6a2821cdd25e5edbcb0eb6f91b"}, + {file = "prefect-2.15.0.tar.gz", hash = "sha256:7732ae51005612be8545b1bb6ccbe313c5b1ed451da4b9c623ca7f856a2ca038"}, +] + +[package.dependencies] +aiosqlite = ">=0.17.0" +alembic = ">=1.7.5,<2.0.0" +anyio = ">=3.7.1,<4.0.0" +apprise = ">=1.1.0,<2.0.0" +asgi-lifespan = ">=1.0,<3.0" +asyncpg = ">=0.23" +cachetools = ">=5.3,<6.0" +click = ">=8.0,<8.2" +cloudpickle = ">=2.0,<4.0" +coolname = ">=1.0.4,<3.0.0" +croniter = ">=1.0.12,<3.0.0" +cryptography = ">=36.0.1" +dateparser = ">=1.1.1,<2.0.0" +docker = ">=4.0,<7.0" +fsspec = ">=2022.5.0" +graphviz = ">=0.20.1" +greenback = ">=1.2.0" +griffe = ">=0.20.0" +httpcore = ">=0.15.0,<2.0.0" +httpx = {version = ">=0.23,<0.23.2 || >0.23.2", extras = ["http2"]} +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +itsdangerous = "*" +jinja2 = ">=3.0.0,<4.0.0" +jsonpatch = ">=1.32,<2.0" +jsonschema = ">=3.2.0,<5.0.0" +kubernetes = ">=24.2.0,<30.0.0" +orjson = ">=3.7,<4.0" +packaging = ">=21.3,<24.3" +pathspec = ">=0.8.0" +pendulum = [ + {version = "<3.0", markers = "python_version < \"3.12\""}, + {version = ">=3.0.0,<4", markers = "python_version >= \"3.12\""}, +] +pydantic = {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0", extras = ["email"]} +python-dateutil = ">=2.8.2,<3.0.0" +python-multipart = ">=0.0.7" +python-slugify = ">=5.0,<9.0" +pytz = ">=2021.1,<2025" +pyyaml = ">=5.4.1,<7.0.0" +readchar = ">=4.0.0,<5.0.0" +rich = ">=11.0,<14.0" +"ruamel.yaml" = ">=0.17.0" +sniffio = ">=1.3.0,<2.0.0" +sqlalchemy = {version = ">=1.4.22,<1.4.33 || >1.4.33,<3.0.0", extras = ["asyncio"]} +toml = ">=0.10.0" +typer = ">=0.4.2" +typing-extensions = ">=4.5.0,<5.0.0" +ujson = ">=5.8.0,<6.0.0" +uvicorn = ">=0.14.0" +websockets = ">=10.4,<13.0" + +[package.extras] +dev = ["cairosvg", "codespell", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "virtualenv", "watchfiles"] + +[[package]] +name = "pyasn1" +version = "0.5.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydantic" +version = "2.6.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, + {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} +pydantic-core = "2.16.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.16.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, + {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, + {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, + {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, + {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, + {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, + {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, + {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, + {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, + {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, + {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, + {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, + {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, + {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pymongo" +version = "4.6.1" +description = "Python driver for MongoDB " +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymongo-4.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4344c30025210b9fa80ec257b0e0aab5aa1d5cca91daa70d82ab97b482cc038e"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:1c5654bb8bb2bdb10e7a0bc3c193dd8b49a960b9eebc4381ff5a2043f4c3c441"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:eaf2f65190c506def2581219572b9c70b8250615dc918b3b7c218361a51ec42e"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:262356ea5fcb13d35fb2ab6009d3927bafb9504ef02339338634fffd8a9f1ae4"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:2dd2f6960ee3c9360bed7fb3c678be0ca2d00f877068556785ec2eb6b73d2414"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:ff925f1cca42e933376d09ddc254598f8c5fcd36efc5cac0118bb36c36217c41"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:3cadf7f4c8e94d8a77874b54a63c80af01f4d48c4b669c8b6867f86a07ba994f"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55dac73316e7e8c2616ba2e6f62b750918e9e0ae0b2053699d66ca27a7790105"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:154b361dcb358ad377d5d40df41ee35f1cc14c8691b50511547c12404f89b5cb"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2940aa20e9cc328e8ddeacea8b9a6f5ddafe0b087fedad928912e787c65b4909"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:010bc9aa90fd06e5cc52c8fac2c2fd4ef1b5f990d9638548dde178005770a5e8"}, + {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e470fa4bace5f50076c32f4b3cc182b31303b4fefb9b87f990144515d572820b"}, + {file = "pymongo-4.6.1-cp310-cp310-win32.whl", hash = "sha256:da08ea09eefa6b960c2dd9a68ec47949235485c623621eb1d6c02b46765322ac"}, + {file = "pymongo-4.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:13d613c866f9f07d51180f9a7da54ef491d130f169e999c27e7633abe8619ec9"}, + {file = "pymongo-4.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6a0ae7a48a6ef82ceb98a366948874834b86c84e288dbd55600c1abfc3ac1d88"}, + {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bd94c503271e79917b27c6e77f7c5474da6930b3fb9e70a12e68c2dff386b9a"}, + {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d4ccac3053b84a09251da8f5350bb684cbbf8c8c01eda6b5418417d0a8ab198"}, + {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:349093675a2d3759e4fb42b596afffa2b2518c890492563d7905fac503b20daa"}, + {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88beb444fb438385e53dc9110852910ec2a22f0eab7dd489e827038fdc19ed8d"}, + {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8e62d06e90f60ea2a3d463ae51401475568b995bafaffd81767d208d84d7bb1"}, + {file = "pymongo-4.6.1-cp311-cp311-win32.whl", hash = "sha256:5556e306713e2522e460287615d26c0af0fe5ed9d4f431dad35c6624c5d277e9"}, + {file = "pymongo-4.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:b10d8cda9fc2fcdcfa4a000aa10413a2bf8b575852cd07cb8a595ed09689ca98"}, + {file = "pymongo-4.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b435b13bb8e36be11b75f7384a34eefe487fe87a6267172964628e2b14ecf0a7"}, + {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e438417ce1dc5b758742e12661d800482200b042d03512a8f31f6aaa9137ad40"}, + {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b47ebd89e69fbf33d1c2df79759d7162fc80c7652dacfec136dae1c9b3afac7"}, + {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbed8cccebe1169d45cedf00461b2842652d476d2897fd1c42cf41b635d88746"}, + {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30a9e06041fbd7a7590693ec5e407aa8737ad91912a1e70176aff92e5c99d20"}, + {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, + {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, + {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, + {file = "pymongo-4.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dcc95f4bb9ed793714b43f4f23a7b0c57e4ef47414162297d6f650213512c19"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:026a24a36394dc8930cbcb1d19d5eb35205ef3c838a7e619e04bd170713972e7"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:3b287e814a01deddb59b88549c1e0c87cefacd798d4afc0c8bd6042d1c3d48aa"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9a710c184ba845afb05a6f876edac8f27783ba70e52d5eaf939f121fc13b2f59"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:30b2c9caf3e55c2e323565d1f3b7e7881ab87db16997dc0cbca7c52885ed2347"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff62ba8ff70f01ab4fe0ae36b2cb0b5d1f42e73dfc81ddf0758cd9f77331ad25"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:547dc5d7f834b1deefda51aedb11a7af9c51c45e689e44e14aa85d44147c7657"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1de3c6faf948f3edd4e738abdb4b76572b4f4fdfc1fed4dad02427e70c5a6219"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2831e05ce0a4df10c4ac5399ef50b9a621f90894c2a4d2945dc5658765514ed"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:144a31391a39a390efce0c5ebcaf4bf112114af4384c90163f402cec5ede476b"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33bb16a07d3cc4e0aea37b242097cd5f7a156312012455c2fa8ca396953b11c4"}, + {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b7b1a83ce514700276a46af3d9e481ec381f05b64939effc9065afe18456a6b9"}, + {file = "pymongo-4.6.1-cp37-cp37m-win32.whl", hash = "sha256:3071ec998cc3d7b4944377e5f1217c2c44b811fae16f9a495c7a1ce9b42fb038"}, + {file = "pymongo-4.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2346450a075625c4d6166b40a013b605a38b6b6168ce2232b192a37fb200d588"}, + {file = "pymongo-4.6.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:061598cbc6abe2f382ab64c9caa83faa2f4c51256f732cdd890bcc6e63bfb67e"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d483793a384c550c2d12cb794ede294d303b42beff75f3b3081f57196660edaf"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f9756f1d25454ba6a3c2f1ef8b7ddec23e5cdeae3dc3c3377243ae37a383db00"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:1ed23b0e2dac6f84f44c8494fbceefe6eb5c35db5c1099f56ab78fc0d94ab3af"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:3d18a9b9b858ee140c15c5bfcb3e66e47e2a70a03272c2e72adda2482f76a6ad"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:c258dbacfff1224f13576147df16ce3c02024a0d792fd0323ac01bed5d3c545d"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:f7acc03a4f1154ba2643edeb13658d08598fe6e490c3dd96a241b94f09801626"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:76013fef1c9cd1cd00d55efde516c154aa169f2bf059b197c263a255ba8a9ddf"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0e6a6c807fa887a0c51cc24fe7ea51bb9e496fe88f00d7930063372c3664c3"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd1fa413f8b9ba30140de198e4f408ffbba6396864c7554e0867aa7363eb58b2"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d219b4508f71d762368caec1fc180960569766049bbc4d38174f05e8ef2fe5b"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b81ecf18031998ad7db53b960d1347f8f29e8b7cb5ea7b4394726468e4295e"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56816e43c92c2fa8c11dc2a686f0ca248bea7902f4a067fa6cbc77853b0f041e"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef801027629c5b511cf2ba13b9be29bfee36ae834b2d95d9877818479cdc99ea"}, + {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d4c2be9760b112b1caf649b4977b81b69893d75aa86caf4f0f398447be871f3c"}, + {file = "pymongo-4.6.1-cp38-cp38-win32.whl", hash = "sha256:39d77d8bbb392fa443831e6d4ae534237b1f4eee6aa186f0cdb4e334ba89536e"}, + {file = "pymongo-4.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:4497d49d785482cc1a44a0ddf8830b036a468c088e72a05217f5b60a9e025012"}, + {file = "pymongo-4.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:69247f7a2835fc0984bbf0892e6022e9a36aec70e187fcfe6cae6a373eb8c4de"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7bb0e9049e81def6829d09558ad12d16d0454c26cabe6efc3658e544460688d9"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6a1810c2cbde714decf40f811d1edc0dae45506eb37298fd9d4247b8801509fe"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2aced6fb2f5261b47d267cb40060b73b6527e64afe54f6497844c9affed5fd0"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d0355cff58a4ed6d5e5f6b9c3693f52de0784aa0c17119394e2a8e376ce489d4"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:3c74f4725485f0a7a3862cfd374cc1b740cebe4c133e0c1425984bcdcce0f4bb"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:9c79d597fb3a7c93d7c26924db7497eba06d58f88f58e586aa69b2ad89fee0f8"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8ec75f35f62571a43e31e7bd11749d974c1b5cd5ea4a8388725d579263c0fdf6"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e641f931c5cd95b376fd3c59db52770e17bec2bf86ef16cc83b3906c054845"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aafd036f6f2e5ad109aec92f8dbfcbe76cff16bad683eb6dd18013739c0b3ae"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f2b856518bfcfa316c8dae3d7b412aecacf2e8ba30b149f5eb3b63128d703b9"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec31adc2e988fd7db3ab509954791bbc5a452a03c85e45b804b4bfc31fa221d"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9167e735379ec43d8eafa3fd675bfbb12e2c0464f98960586e9447d2cf2c7a83"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1461199b07903fc1424709efafe379205bf5f738144b1a50a08b0396357b5abf"}, + {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3094c7d2f820eecabadae76bfec02669567bbdd1730eabce10a5764778564f7b"}, + {file = "pymongo-4.6.1-cp39-cp39-win32.whl", hash = "sha256:c91ea3915425bd4111cb1b74511cdc56d1d16a683a48bf2a5a96b6a6c0f297f7"}, + {file = "pymongo-4.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef102a67ede70e1721fe27f75073b5314911dbb9bc27cde0a1c402a11531e7bd"}, + {file = "pymongo-4.6.1.tar.gz", hash = "sha256:31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712"}, +] + +[package.dependencies] +dnspython = ">=1.16.0,<3.0.0" + +[package.extras] +aws = ["pymongo-auth-aws (<2.0.0)"] +encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] +ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +snappy = ["python-snappy"] +test = ["pytest (>=7)"] +zstd = ["zstandard"] + +[[package]] +name = "pyright" +version = "1.1.351" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.351-py3-none-any.whl", hash = "sha256:83b44b25396ae20661fc5f133c3fce30928ff1296d4f2e5ff0bca5fcf03eb89d"}, + {file = "pyright-1.1.351.tar.gz", hash = "sha256:01124099714eebd7f6525d8cbfa350626b56dfaf771cfcd55c03e69f0f1efbbd"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-multipart" +version = "0.0.9" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + +[package.extras] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "readchar" +version = "4.0.5" +description = "Library to easily read single chars and key strokes" +optional = false +python-versions = ">=3.7" +files = [ + {file = "readchar-4.0.5-py3-none-any.whl", hash = "sha256:76ec784a5dd2afac3b7da8003329834cdd9824294c260027f8c8d2e4d0a78f43"}, + {file = "readchar-4.0.5.tar.gz", hash = "sha256:08a456c2d7c1888cde3f4688b542621b676eb38cd6cfed7eb6cb2e2905ddc826"}, +] + +[package.dependencies] +setuptools = ">=41.0" + +[[package]] +name = "referencing" +version = "0.33.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, + {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rich" +version = "13.7.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.18.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruamel-yaml" +version = "0.18.6" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, + {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + +[[package]] +name = "ruff" +version = "0.2.2" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, + {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, + {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, + {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, + {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, +] + +[[package]] +name = "setuptools" +version = "69.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, + {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.27" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win32.whl", hash = "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win32.whl", hash = "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win32.whl", hash = "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-win32.whl", hash = "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-win_amd64.whl", hash = "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-win32.whl", hash = "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-win_amd64.whl", hash = "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win32.whl", hash = "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620"}, + {file = "SQLAlchemy-2.0.27-py3-none-any.whl", hash = "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac"}, + {file = "SQLAlchemy-2.0.27.tar.gz", hash = "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"asyncio\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + +[[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.*" +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 = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "ujson" +version = "5.9.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, + {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, + {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, + {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, + {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, + {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, + {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, + {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, + {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, + {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, + {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, + {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, + {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.27.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"}, + {file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "websocket-client" +version = "1.7.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "f839bee0ae452d951a1394c351c328ba9d14315599b5ba01d844a0db1ac3eb17" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..89b8726 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,35 @@ +[tool.poetry] +name = "jfetcher" +version = "3.0.0" +description = "简书数据采集服务" +authors = ["yezi "] +license = "MIT" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.8" +prefect = "^2.15.0" +jkit = "^3.0.0a9" +beanie = "^1.25.0" + +[tool.poetry.group.dev.dependencies] +ruff = "^0.2.0" +pyright = "^1.1.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.ruff] + +target-version = "py38" + +lint.select = [ + "A", "ANN", "ARG", "ASYNC", "B", + "BLE", "C4", "E", "F", "I", + "ICN", "ISC", "N", "PERF", "PIE", + "PT", "Q", "RET", "RSE", "RUF", + "S", "SIM", "SLOT", "TCH", "UP", + "W" +] +lint.ignore = ["ANN101", "ANN102", "ISC001", "RUF001", "RUF002", "RUF003"] \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..3712ec3 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,112 @@ +aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" +alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" +annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" +asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" +async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" +asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" +attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" +backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" +beanie==1.25.0 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" +certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" +cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" +cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" +coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.1 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.4 ; python_version >= "3.8" and python_version < "4.0" +dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" +dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" +fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.0 ; python_version >= "3.8" and python_version < "4.0" +graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" +greenback==1.2.1 ; python_version >= "3.8" and python_version < "4.0" +greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" +h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" +h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" +hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" +httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" +hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +idna==3.6 ; python_version >= "3.8" and python_version < "4.0" +importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" +itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a9 ; python_version >= "3.8" and python_version < "4.0" +jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" +jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" +jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" +kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" +lazy-model==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +markdown==3.5.2 ; python_version >= "3.8" and python_version < "4.0" +markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" +nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" +outcome==1.3.0.post0 ; python_version >= "3.8" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" +pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" +pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" +pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" +prefect==2.15.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.1 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.351 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" +python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" +pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" +pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" +pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" +regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.7.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" +rsa==4.9 ; python_version >= "3.8" and python_version < "4" +ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" +ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.2.2 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.1.0 ; python_version >= "3.8" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" +toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" +typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0" +tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" +tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" +ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" +urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" +websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8a3f244 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,109 @@ +aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" +alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" +annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" +asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" +async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" +asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" +attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" +backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" +beanie==1.25.0 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" +certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" +cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" +cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" +coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.1 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.4 ; python_version >= "3.8" and python_version < "4.0" +dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" +dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" +fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.0 ; python_version >= "3.8" and python_version < "4.0" +graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" +greenback==1.2.1 ; python_version >= "3.8" and python_version < "4.0" +greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" +h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" +h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" +hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" +httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" +hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +idna==3.6 ; python_version >= "3.8" and python_version < "4.0" +importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" +itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a9 ; python_version >= "3.8" and python_version < "4.0" +jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" +jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" +jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" +kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" +lazy-model==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +markdown==3.5.2 ; python_version >= "3.8" and python_version < "4.0" +markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" +outcome==1.3.0.post0 ; python_version >= "3.8" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" +pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" +pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" +pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" +prefect==2.15.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.1 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" +python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" +pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" +pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" +pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" +regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.7.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" +rsa==4.9 ; python_version >= "3.8" and python_version < "4" +ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" +ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.1.0 ; python_version >= "3.8" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" +toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" +typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0" +tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" +tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" +ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" +urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" +websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" From 6282415a3858cc39029dbc70dfb68c582045e782 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 22 Feb 2024 18:07:46 +0800 Subject: [PATCH 03/93] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.example.yaml | 8 ++ jobs/__init__.py | 39 ++++++++++ jobs/fetch_article_earning_rank_records.py | 88 ++++++++++++++++++++++ main.py | 20 ++++- models/__init__.py | 7 ++ models/article_earning_rank_record.py | 32 ++++++++ poetry.lock | 28 ++++++- pyproject.toml | 1 + requirements-dev.txt | 1 + requirements.txt | 1 + utils/config.py | 16 ++++ utils/db.py | 14 ++++ utils/job_model.py | 24 ++++++ utils/log.py | 10 +++ 14 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 config.example.yaml create mode 100644 jobs/__init__.py create mode 100644 jobs/fetch_article_earning_rank_records.py create mode 100644 models/__init__.py create mode 100644 models/article_earning_rank_record.py create mode 100644 utils/config.py create mode 100644 utils/db.py create mode 100644 utils/job_model.py create mode 100644 utils/log.py diff --git a/config.example.yaml b/config.example.yaml new file mode 100644 index 0000000..a2a47be --- /dev/null +++ b/config.example.yaml @@ -0,0 +1,8 @@ +version: v3.0.0 +mongodb: + host: localhost + port: 27017 + database: jfetcher +log: + save_level: DEBUG + print_level: DEBUG \ No newline at end of file diff --git a/jobs/__init__.py b/jobs/__init__.py new file mode 100644 index 0000000..6149a04 --- /dev/null +++ b/jobs/__init__.py @@ -0,0 +1,39 @@ +from typing import Any, Coroutine, Tuple + +from prefect import Flow +from prefect.deployments.runner import RunnerDeployment + +from jobs.fetch_article_earning_rank_records import ( + fetch_article_earning_rank_records_job, +) +from utils.job_model import Job + +FlowType = Flow[[], Coroutine[Any, Any, None]] +DeploymentType = Coroutine[Any, Any, RunnerDeployment] + + +def create_flow(job: Job) -> FlowType: + job.func.name = job.name + job.func.version = job.version + + job.func.retries = job.retries + job.func.retry_delay_seconds = job.retry_delay + job.func.timeout_seconds = job.timeout + + return job.func + + +def create_deployment(job: Job, flow: FlowType) -> DeploymentType: + return flow.to_deployment( + name=f"JFetcher - {flow.name}", + cron=job.cron, + version=job.version, + ) + + +JOBS: Tuple[Job, ...] = (fetch_article_earning_rank_records_job,) + +FLOWS: Tuple[FlowType, ...] = tuple(map(create_flow, JOBS)) +DEPLOYMENTS: Tuple[DeploymentType, ...] = tuple( + (create_deployment(job, flow) for job, flow in zip(JOBS, FLOWS)) +) diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_rank_records.py new file mode 100644 index 0000000..f85ba83 --- /dev/null +++ b/jobs/fetch_article_earning_rank_records.py @@ -0,0 +1,88 @@ +from datetime import date, datetime, timedelta +from typing import AsyncGenerator, List + +from jkit.article import Article +from jkit.ranking.article_earning import ArticleEarningRank, ArticleEarningRankRecord +from jkit.user import User +from prefect import flow, task + +from models.article_earning_rank_record import ( + ArticleEarningRankRecordModel, + ArticleField, + AuthorField, + EarningField, +) +from utils.db import init_db +from utils.job_model import Job +from utils.log import logger + + +async def get_user_from_article_slug(article_slug: str) -> User: + article = Article.from_slug(article_slug)._as_checked() + article_info = await article.info + return article_info.author_info.to_user_obj() + + +@task +async def fetch_data( + *, target_date: date +) -> AsyncGenerator[ArticleEarningRankRecord, None]: + rank_obj = ArticleEarningRank(target_date) + logger.debug(f"已创建 {target_date} 的文章收益排行榜对象") + + for item in (await rank_obj.get_data()).records: + yield item + + +async def process_data( + item: ArticleEarningRankRecord, /, *, target_date: date +) -> ArticleEarningRankRecordModel: + if item.slug: + author = await get_user_from_article_slug(item.slug) + else: + logger.warning("文章走丢了,跳过采集文章与作者信息", ranking=item.ranking) + author = None + + return ArticleEarningRankRecordModel( + date=target_date, + ranking=item.ranking, + article=ArticleField( + title=item.title, + slug=item.slug, + ), + author=AuthorField( + id=(await author.id) if author else None, + slug=author.slug if author else None, + name=item.author_info.name, + ), + earning=EarningField( + to_author=item.fp_to_author_anount, + to_voter=item.fp_to_voter_amount, + ), + ) + + +@task +async def save_data(data: List[ArticleEarningRankRecordModel]) -> None: + await ArticleEarningRankRecordModel.insert_many(data) + + +@flow +async def fetch_article_earning_rank_records() -> None: + await init_db() + + target_date = datetime.now().date() - timedelta(days=1) + + data: List[ArticleEarningRankRecordModel] = [] + async for item in fetch_data(target_date=target_date): + processed_item = await process_data(item, target_date=target_date) + data.append(processed_item) + + await save_data(data) + + +fetch_article_earning_rank_records_job = Job( + func=fetch_article_earning_rank_records, + name="采集文章收益排行榜记录", + cron="0 0 1 1/1 * *", +) diff --git a/main.py b/main.py index f301245..8a3ff19 100644 --- a/main.py +++ b/main.py @@ -1 +1,19 @@ -print("Hello World!") +from asyncio import run as asyncio_run + +from prefect import serve + +from jobs import DEPLOYMENTS +from utils.db import init_db +from utils.log import logger + + +async def main() -> None: + await init_db() + logger.info("初始化数据库成功") + + logger.info("启动工作流") + await serve(*DEPLOYMENTS, print_starting_message=False) # type: ignore + + +if __name__ == "__main__": + asyncio_run(main()) diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..86e9545 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,7 @@ +from typing import List, Type, Union + +from beanie import Document, View + +from models.article_earning_rank_record import ArticleEarningRankRecordModel + +MODELS: List[Union[Type[Document], Type[View], str]] = [ArticleEarningRankRecordModel] diff --git a/models/article_earning_rank_record.py b/models/article_earning_rank_record.py new file mode 100644 index 0000000..aaff4b9 --- /dev/null +++ b/models/article_earning_rank_record.py @@ -0,0 +1,32 @@ +from typing import Optional + +from beanie import Document +from pydantic import BaseModel, Field, PastDate, PositiveFloat, PositiveInt + + +class ArticleField(BaseModel): + title: Optional[str] + slug: Optional[str] + + +class AuthorField(BaseModel): + id: Optional[PositiveInt] + slug: Optional[str] + name: Optional[str] + + +class EarningField(BaseModel): + to_author: PositiveFloat = Field(serialization_alias="toAuthor") + to_voter: PositiveFloat = Field(serialization_alias="toVoter") + + +class ArticleEarningRankRecordModel(Document): + date: PastDate + ranking: PositiveInt + article: ArticleField + author: AuthorField + earning: EarningField + + class Settings: + name = "article_earning_rank_record" + indexes = ("date", "ranking") diff --git a/poetry.lock b/poetry.lock index d64505f..24d6ebc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2721,6 +2721,32 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "sspeedup" +version = "0.25.1" +description = "开发工具箱" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "sspeedup-0.25.1-py3-none-any.whl", hash = "sha256:be94775b8c33518954ce334841c41dadbe48d822c0b06448c95d4cc4e8be8073"}, + {file = "sspeedup-0.25.1.tar.gz", hash = "sha256:179bde7edf899205077dbf00929265df6acfb0362754d8bbfb66f5f5a6f6b1e8"}, +] + +[package.dependencies] +motor = ">=3.3.0,<4.0.0" +pymongo = ">=4.3.0,<5.0.0" + +[package.extras] +ability-word-split = ["httpx (==0.*)"] +api-litestar = ["litestar (>=2.3.0,<3.0.0)", "msgspec (==0.*)"] +api-sanic = ["pydantic (>=2.0.0,<3.0.0)", "sanic (>=23.3.0,<24.0.0)", "ujson (>=5.8.0,<6.0.0)"] +config = ["msgspec (==0.*)"] +feishu-auth = ["httpx (==0.*)"] +feishu-bitable = ["httpx (==0.*)", "msgspec (==0.*)"] +pywebio = ["pywebio (>=1.8.0,<2.0.0)"] +qrcode = ["qrcode (>=7.4.0,<8.0.0)"] +word-split-jieba = ["jieba (>=0.42.0,<0.43.0)"] + [[package]] name = "text-unidecode" version = "1.3" @@ -3029,4 +3055,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f839bee0ae452d951a1394c351c328ba9d14315599b5ba01d844a0db1ac3eb17" +content-hash = "111b391843d856da523b6a5b168f641fc25d141a21e8128fda5bdb8185795032" diff --git a/pyproject.toml b/pyproject.toml index 89b8726..f13f774 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ python = "^3.8" prefect = "^2.15.0" jkit = "^3.0.0a9" beanie = "^1.25.0" +sspeedup = "^0.25.1" [tool.poetry.group.dev.dependencies] ruff = "^0.2.0" diff --git a/requirements-dev.txt b/requirements-dev.txt index 3712ec3..bd02701 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -98,6 +98,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 8a3f244..9ac59aa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -95,6 +95,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" diff --git a/utils/config.py b/utils/config.py new file mode 100644 index 0000000..57d5fde --- /dev/null +++ b/utils/config.py @@ -0,0 +1,16 @@ +from msgspec import Struct +from sspeedup.config import load_or_save_default_config +from sspeedup.config.blocks import ( + CONFIG_STRUCT_CONFIG, + LoggingConfig, + MongoDBConfig, +) + + +class _Config(Struct, **CONFIG_STRUCT_CONFIG): + version: str = "v3.0.0" + mongodb: MongoDBConfig = MongoDBConfig() + log: LoggingConfig = LoggingConfig() + + +CONFIG = load_or_save_default_config(_Config) diff --git a/utils/db.py b/utils/db.py new file mode 100644 index 0000000..8958eb5 --- /dev/null +++ b/utils/db.py @@ -0,0 +1,14 @@ +from beanie import init_beanie +from motor.motor_asyncio import AsyncIOMotorClient + +from models import MODELS +from utils.config import CONFIG + +_CLIENT = AsyncIOMotorClient(CONFIG.mongodb.host, CONFIG.mongodb.port) +_DB = _CLIENT[CONFIG.mongodb.database] + +RUN_LOG_COLLECTION = _DB.run_log + + +async def init_db() -> None: + await init_beanie(database=_DB, document_models=MODELS) diff --git a/utils/job_model.py b/utils/job_model.py new file mode 100644 index 0000000..75c2017 --- /dev/null +++ b/utils/job_model.py @@ -0,0 +1,24 @@ +from typing import Any, Callable, Coroutine, List, Optional, Union + +from msgspec import Struct +from prefect import Flow +from prefect.tasks import exponential_backoff + +from utils.config import CONFIG + + +class Job(Struct): + func: Flow[[], Coroutine[Any, Any, None]] + + name: str + version: str = CONFIG.version + cron: Optional[str] = None + + retries: int = 3 + retry_delay: Union[ + int, + float, + List[Union[int, float]], + Callable[[int], List[Union[int, float]]], + ] = exponential_backoff(10) + timeout: int = 3600 diff --git a/utils/log.py b/utils/log.py new file mode 100644 index 0000000..275a65b --- /dev/null +++ b/utils/log.py @@ -0,0 +1,10 @@ +from sspeedup.logging.run_logger import RunLogger + +from utils.config import CONFIG +from utils.db import RUN_LOG_COLLECTION + +logger = RunLogger( + save_level=CONFIG.log.save_level, + print_level=CONFIG.log.print_level, + mongo_collection=RUN_LOG_COLLECTION, +) From 5fd9ec4134289f6e967418251ee1d35a7d60d3a5 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 22 Feb 2024 23:28:25 +0800 Subject: [PATCH 04/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=97=B6=E5=8C=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jobs/__init__.py b/jobs/__init__.py index 6149a04..7de833b 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -1,6 +1,7 @@ from typing import Any, Coroutine, Tuple from prefect import Flow +from prefect.client.schemas.schedules import CronSchedule from prefect.deployments.runner import RunnerDeployment from jobs.fetch_article_earning_rank_records import ( @@ -26,8 +27,11 @@ def create_flow(job: Job) -> FlowType: def create_deployment(job: Job, flow: FlowType) -> DeploymentType: return flow.to_deployment( name=f"JFetcher - {flow.name}", - cron=job.cron, version=job.version, + schedule=CronSchedule( + cron=job.cron, + timezone="Asia/Shanghai", + ), ) From 0069dae96b25bcf8e343a15c3692c58b52d2cfee Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 11:04:16 +0800 Subject: [PATCH 05/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=20cron=20?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_rank_records.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_rank_records.py index f85ba83..0811efc 100644 --- a/jobs/fetch_article_earning_rank_records.py +++ b/jobs/fetch_article_earning_rank_records.py @@ -68,7 +68,7 @@ async def save_data(data: List[ArticleEarningRankRecordModel]) -> None: @flow -async def fetch_article_earning_rank_records() -> None: +async def main() -> None: await init_db() target_date = datetime.now().date() - timedelta(days=1) @@ -82,7 +82,7 @@ async def fetch_article_earning_rank_records() -> None: fetch_article_earning_rank_records_job = Job( - func=fetch_article_earning_rank_records, + func=main, name="采集文章收益排行榜记录", - cron="0 0 1 1/1 * *", + cron="0 1 * * *", ) From 8758a53470d3ef2ec59c69a21fe72ebdf8fcf9a9 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 13:59:43 +0800 Subject: [PATCH 06/93] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=20JKit=20v3.0.?= =?UTF-8?q?0a10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_rank_records.py | 12 +- poetry.lock | 219 +++++++++------------ pyproject.toml | 2 +- requirements-dev.txt | 10 +- requirements.txt | 10 +- 5 files changed, 108 insertions(+), 145 deletions(-) diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_rank_records.py index 0811efc..f2404da 100644 --- a/jobs/fetch_article_earning_rank_records.py +++ b/jobs/fetch_article_earning_rank_records.py @@ -2,7 +2,7 @@ from typing import AsyncGenerator, List from jkit.article import Article -from jkit.ranking.article_earning import ArticleEarningRank, ArticleEarningRankRecord +from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User from prefect import flow, task @@ -24,18 +24,16 @@ async def get_user_from_article_slug(article_slug: str) -> User: @task -async def fetch_data( - *, target_date: date -) -> AsyncGenerator[ArticleEarningRankRecord, None]: - rank_obj = ArticleEarningRank(target_date) +async def fetch_data(*, target_date: date) -> AsyncGenerator[RecordField, None]: + ranking_obj = ArticleEarningRanking(target_date) logger.debug(f"已创建 {target_date} 的文章收益排行榜对象") - for item in (await rank_obj.get_data()).records: + async for item in ranking_obj: yield item async def process_data( - item: ArticleEarningRankRecord, /, *, target_date: date + item: RecordField, /, *, target_date: date ) -> ArticleEarningRankRecordModel: if item.slug: author = await get_user_from_article_slug(item.slug) diff --git a/poetry.lock b/poetry.lock index 24d6ebc..6adcd64 100644 --- a/poetry.lock +++ b/poetry.lock @@ -676,13 +676,13 @@ tqdm = ["tqdm"] [[package]] name = "google-auth" -version = "2.28.0" +version = "2.28.1" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.28.0.tar.gz", hash = "sha256:3cfc1b6e4e64797584fb53fc9bd0b7afa9b7c0dba2004fa7dcc9349e58cc3195"}, - {file = "google_auth-2.28.0-py2.py3-none-any.whl", hash = "sha256:7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53"}, + {file = "google-auth-2.28.1.tar.gz", hash = "sha256:34fc3046c257cedcf1622fc4b31fc2be7923d9b4d44973d481125ecc50d83885"}, + {file = "google_auth-2.28.1-py2.py3-none-any.whl", hash = "sha256:25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72"}, ] [package.dependencies] @@ -713,22 +713,6 @@ dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] -[[package]] -name = "greenback" -version = "1.2.1" -description = "Reenter an async event loop from synchronous code" -optional = false -python-versions = ">=3.8" -files = [ - {file = "greenback-1.2.1-py3-none-any.whl", hash = "sha256:98768edbbe4340091a9730cf64a683fcbaa3f2cb81e4ac41d7ed28d3b6f74b79"}, - {file = "greenback-1.2.1.tar.gz", hash = "sha256:de3ca656885c03b96dab36079f3de74bb5ba061da9bfe3bb69dccc866ef95ea3"}, -] - -[package.dependencies] -greenlet = "!=0.4.17" -outcome = "*" -sniffio = "*" - [[package]] name = "greenlet" version = "3.0.3" @@ -986,13 +970,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a9" +version = "3.0.0a10" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a9-py3-none-any.whl", hash = "sha256:be5b4f4e0126f7c9669f9249d5b3959065a310be65b7b2e9cf722cdd74669e0c"}, - {file = "jkit-3.0.0a9.tar.gz", hash = "sha256:0fe461c5468a8825af6f8e2613091b361cd7c9983627fc106ac31ec3ceca2ac6"}, + {file = "jkit-3.0.0a10-py3-none-any.whl", hash = "sha256:9119a9f0e6d98429918da99bfb8a8129450fe8014d6c144398d561eb6acbc3d4"}, + {file = "jkit-3.0.0a10.tar.gz", hash = "sha256:93a048376403c4a140bae8a32408d3c2d958b6c0b3a7a2b25ab32811b7a2ee40"}, ] [package.dependencies] @@ -1503,20 +1487,6 @@ files = [ {file = "orjson-3.9.14.tar.gz", hash = "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79"}, ] -[[package]] -name = "outcome" -version = "1.3.0.post0" -description = "Capture the outcome of Python function calls." -optional = false -python-versions = ">=3.7" -files = [ - {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, - {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, -] - -[package.dependencies] -attrs = ">=19.2.0" - [[package]] name = "packaging" version = "23.2" @@ -1685,13 +1655,13 @@ files = [ [[package]] name = "prefect" -version = "2.15.0" +version = "2.16.0" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.15.0-py3-none-any.whl", hash = "sha256:f0c2918b88eeea049bb547a45b247ee3a623ab6a2821cdd25e5edbcb0eb6f91b"}, - {file = "prefect-2.15.0.tar.gz", hash = "sha256:7732ae51005612be8545b1bb6ccbe313c5b1ed451da4b9c623ca7f856a2ca038"}, + {file = "prefect-2.16.0-py3-none-any.whl", hash = "sha256:19f431962bc51df3d46cd22f206c20b22ae224c9ee46e04ed3d37ea03f92ba65"}, + {file = "prefect-2.16.0.tar.gz", hash = "sha256:5143adb2da972a2fadc6d1de959adb82a8498d347fc3896d839ae4cda7642a8f"}, ] [package.dependencies] @@ -1711,7 +1681,6 @@ dateparser = ">=1.1.1,<2.0.0" docker = ">=4.0,<7.0" fsspec = ">=2022.5.0" graphviz = ">=0.20.1" -greenback = ">=1.2.0" griffe = ">=0.20.0" httpcore = ">=0.15.0,<2.0.0" httpx = {version = ">=0.23,<0.23.2 || >0.23.2", extras = ["http2"]} @@ -1747,7 +1716,7 @@ uvicorn = ">=0.14.0" websockets = ">=10.4,<13.0" [package.extras] -dev = ["cairosvg", "codespell", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "virtualenv", "watchfiles"] +dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "virtualenv", "watchfiles"] [[package]] name = "pyasn1" @@ -1913,93 +1882,93 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.6.1" +version = "4.6.2" description = "Python driver for MongoDB " optional = false python-versions = ">=3.7" files = [ - {file = "pymongo-4.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4344c30025210b9fa80ec257b0e0aab5aa1d5cca91daa70d82ab97b482cc038e"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:1c5654bb8bb2bdb10e7a0bc3c193dd8b49a960b9eebc4381ff5a2043f4c3c441"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:eaf2f65190c506def2581219572b9c70b8250615dc918b3b7c218361a51ec42e"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:262356ea5fcb13d35fb2ab6009d3927bafb9504ef02339338634fffd8a9f1ae4"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:2dd2f6960ee3c9360bed7fb3c678be0ca2d00f877068556785ec2eb6b73d2414"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:ff925f1cca42e933376d09ddc254598f8c5fcd36efc5cac0118bb36c36217c41"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:3cadf7f4c8e94d8a77874b54a63c80af01f4d48c4b669c8b6867f86a07ba994f"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55dac73316e7e8c2616ba2e6f62b750918e9e0ae0b2053699d66ca27a7790105"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:154b361dcb358ad377d5d40df41ee35f1cc14c8691b50511547c12404f89b5cb"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2940aa20e9cc328e8ddeacea8b9a6f5ddafe0b087fedad928912e787c65b4909"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:010bc9aa90fd06e5cc52c8fac2c2fd4ef1b5f990d9638548dde178005770a5e8"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e470fa4bace5f50076c32f4b3cc182b31303b4fefb9b87f990144515d572820b"}, - {file = "pymongo-4.6.1-cp310-cp310-win32.whl", hash = "sha256:da08ea09eefa6b960c2dd9a68ec47949235485c623621eb1d6c02b46765322ac"}, - {file = "pymongo-4.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:13d613c866f9f07d51180f9a7da54ef491d130f169e999c27e7633abe8619ec9"}, - {file = "pymongo-4.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6a0ae7a48a6ef82ceb98a366948874834b86c84e288dbd55600c1abfc3ac1d88"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bd94c503271e79917b27c6e77f7c5474da6930b3fb9e70a12e68c2dff386b9a"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d4ccac3053b84a09251da8f5350bb684cbbf8c8c01eda6b5418417d0a8ab198"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:349093675a2d3759e4fb42b596afffa2b2518c890492563d7905fac503b20daa"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88beb444fb438385e53dc9110852910ec2a22f0eab7dd489e827038fdc19ed8d"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8e62d06e90f60ea2a3d463ae51401475568b995bafaffd81767d208d84d7bb1"}, - {file = "pymongo-4.6.1-cp311-cp311-win32.whl", hash = "sha256:5556e306713e2522e460287615d26c0af0fe5ed9d4f431dad35c6624c5d277e9"}, - {file = "pymongo-4.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:b10d8cda9fc2fcdcfa4a000aa10413a2bf8b575852cd07cb8a595ed09689ca98"}, - {file = "pymongo-4.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b435b13bb8e36be11b75f7384a34eefe487fe87a6267172964628e2b14ecf0a7"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e438417ce1dc5b758742e12661d800482200b042d03512a8f31f6aaa9137ad40"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b47ebd89e69fbf33d1c2df79759d7162fc80c7652dacfec136dae1c9b3afac7"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbed8cccebe1169d45cedf00461b2842652d476d2897fd1c42cf41b635d88746"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30a9e06041fbd7a7590693ec5e407aa8737ad91912a1e70176aff92e5c99d20"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, - {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, - {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, - {file = "pymongo-4.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dcc95f4bb9ed793714b43f4f23a7b0c57e4ef47414162297d6f650213512c19"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:026a24a36394dc8930cbcb1d19d5eb35205ef3c838a7e619e04bd170713972e7"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:3b287e814a01deddb59b88549c1e0c87cefacd798d4afc0c8bd6042d1c3d48aa"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9a710c184ba845afb05a6f876edac8f27783ba70e52d5eaf939f121fc13b2f59"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:30b2c9caf3e55c2e323565d1f3b7e7881ab87db16997dc0cbca7c52885ed2347"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff62ba8ff70f01ab4fe0ae36b2cb0b5d1f42e73dfc81ddf0758cd9f77331ad25"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:547dc5d7f834b1deefda51aedb11a7af9c51c45e689e44e14aa85d44147c7657"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1de3c6faf948f3edd4e738abdb4b76572b4f4fdfc1fed4dad02427e70c5a6219"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2831e05ce0a4df10c4ac5399ef50b9a621f90894c2a4d2945dc5658765514ed"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:144a31391a39a390efce0c5ebcaf4bf112114af4384c90163f402cec5ede476b"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33bb16a07d3cc4e0aea37b242097cd5f7a156312012455c2fa8ca396953b11c4"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b7b1a83ce514700276a46af3d9e481ec381f05b64939effc9065afe18456a6b9"}, - {file = "pymongo-4.6.1-cp37-cp37m-win32.whl", hash = "sha256:3071ec998cc3d7b4944377e5f1217c2c44b811fae16f9a495c7a1ce9b42fb038"}, - {file = "pymongo-4.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2346450a075625c4d6166b40a013b605a38b6b6168ce2232b192a37fb200d588"}, - {file = "pymongo-4.6.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:061598cbc6abe2f382ab64c9caa83faa2f4c51256f732cdd890bcc6e63bfb67e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d483793a384c550c2d12cb794ede294d303b42beff75f3b3081f57196660edaf"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f9756f1d25454ba6a3c2f1ef8b7ddec23e5cdeae3dc3c3377243ae37a383db00"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:1ed23b0e2dac6f84f44c8494fbceefe6eb5c35db5c1099f56ab78fc0d94ab3af"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:3d18a9b9b858ee140c15c5bfcb3e66e47e2a70a03272c2e72adda2482f76a6ad"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:c258dbacfff1224f13576147df16ce3c02024a0d792fd0323ac01bed5d3c545d"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:f7acc03a4f1154ba2643edeb13658d08598fe6e490c3dd96a241b94f09801626"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:76013fef1c9cd1cd00d55efde516c154aa169f2bf059b197c263a255ba8a9ddf"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0e6a6c807fa887a0c51cc24fe7ea51bb9e496fe88f00d7930063372c3664c3"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd1fa413f8b9ba30140de198e4f408ffbba6396864c7554e0867aa7363eb58b2"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d219b4508f71d762368caec1fc180960569766049bbc4d38174f05e8ef2fe5b"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b81ecf18031998ad7db53b960d1347f8f29e8b7cb5ea7b4394726468e4295e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56816e43c92c2fa8c11dc2a686f0ca248bea7902f4a067fa6cbc77853b0f041e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef801027629c5b511cf2ba13b9be29bfee36ae834b2d95d9877818479cdc99ea"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d4c2be9760b112b1caf649b4977b81b69893d75aa86caf4f0f398447be871f3c"}, - {file = "pymongo-4.6.1-cp38-cp38-win32.whl", hash = "sha256:39d77d8bbb392fa443831e6d4ae534237b1f4eee6aa186f0cdb4e334ba89536e"}, - {file = "pymongo-4.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:4497d49d785482cc1a44a0ddf8830b036a468c088e72a05217f5b60a9e025012"}, - {file = "pymongo-4.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:69247f7a2835fc0984bbf0892e6022e9a36aec70e187fcfe6cae6a373eb8c4de"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7bb0e9049e81def6829d09558ad12d16d0454c26cabe6efc3658e544460688d9"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6a1810c2cbde714decf40f811d1edc0dae45506eb37298fd9d4247b8801509fe"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2aced6fb2f5261b47d267cb40060b73b6527e64afe54f6497844c9affed5fd0"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d0355cff58a4ed6d5e5f6b9c3693f52de0784aa0c17119394e2a8e376ce489d4"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:3c74f4725485f0a7a3862cfd374cc1b740cebe4c133e0c1425984bcdcce0f4bb"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:9c79d597fb3a7c93d7c26924db7497eba06d58f88f58e586aa69b2ad89fee0f8"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8ec75f35f62571a43e31e7bd11749d974c1b5cd5ea4a8388725d579263c0fdf6"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e641f931c5cd95b376fd3c59db52770e17bec2bf86ef16cc83b3906c054845"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aafd036f6f2e5ad109aec92f8dbfcbe76cff16bad683eb6dd18013739c0b3ae"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f2b856518bfcfa316c8dae3d7b412aecacf2e8ba30b149f5eb3b63128d703b9"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec31adc2e988fd7db3ab509954791bbc5a452a03c85e45b804b4bfc31fa221d"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9167e735379ec43d8eafa3fd675bfbb12e2c0464f98960586e9447d2cf2c7a83"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1461199b07903fc1424709efafe379205bf5f738144b1a50a08b0396357b5abf"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3094c7d2f820eecabadae76bfec02669567bbdd1730eabce10a5764778564f7b"}, - {file = "pymongo-4.6.1-cp39-cp39-win32.whl", hash = "sha256:c91ea3915425bd4111cb1b74511cdc56d1d16a683a48bf2a5a96b6a6c0f297f7"}, - {file = "pymongo-4.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef102a67ede70e1721fe27f75073b5314911dbb9bc27cde0a1c402a11531e7bd"}, - {file = "pymongo-4.6.1.tar.gz", hash = "sha256:31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712"}, + {file = "pymongo-4.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7640d176ee5b0afec76a1bda3684995cb731b2af7fcfd7c7ef8dc271c5d689af"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux1_i686.whl", hash = "sha256:4e2129ec8f72806751b621470ac5d26aaa18fae4194796621508fa0e6068278a"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c43205e85cbcbdf03cff62ad8f50426dd9d20134a915cfb626d805bab89a1844"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:91ddf95cedca12f115fbc5f442b841e81197d85aa3cc30b82aee3635a5208af2"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:0fbdbf2fba1b4f5f1522e9f11e21c306e095b59a83340a69e908f8ed9b450070"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:097791d5a8d44e2444e0c8c4d6e14570ac11e22bcb833808885a5db081c3dc2a"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:e0b208ebec3b47ee78a5c836e2e885e8c1e10f8ffd101aaec3d63997a4bdcd04"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1849fd6f1917b4dc5dbf744b2f18e41e0538d08dd8e9ba9efa811c5149d665a3"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa0bbbfbd1f8ebbd5facaa10f9f333b20027b240af012748555148943616fdf3"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4522ad69a4ab0e1b46a8367d62ad3865b8cd54cf77518c157631dac1fdc97584"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397949a9cc85e4a1452f80b7f7f2175d557237177120954eff00bf79553e89d3"}, + {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d511db310f43222bc58d811037b176b4b88dc2b4617478c5ef01fea404f8601"}, + {file = "pymongo-4.6.2-cp310-cp310-win32.whl", hash = "sha256:991e406db5da4d89fb220a94d8caaf974ffe14ce6b095957bae9273c609784a0"}, + {file = "pymongo-4.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:94637941fe343000f728e28d3fe04f1f52aec6376b67b85583026ff8dab2a0e0"}, + {file = "pymongo-4.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84593447a5c5fe7a59ba86b72c2c89d813fbac71c07757acdf162fbfd5d005b9"}, + {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aebddb2ec2128d5fc2fe3aee6319afef8697e0374f8a1fcca3449d6f625e7b4"}, + {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f706c1a644ed33eaea91df0a8fb687ce572b53eeb4ff9b89270cb0247e5d0e1"}, + {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c422e6b08fa370ed9d8670c67e78d01f50d6517cec4522aa8627014dfa38b6"}, + {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d002ae456a15b1d790a78bb84f87af21af1cb716a63efb2c446ab6bcbbc48ca"}, + {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f86ba0c781b497a3c9c886765d7b6402a0e3ae079dd517365044c89cd7abb06"}, + {file = "pymongo-4.6.2-cp311-cp311-win32.whl", hash = "sha256:ac20dd0c7b42555837c86f5ea46505f35af20a08b9cf5770cd1834288d8bd1b4"}, + {file = "pymongo-4.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:e78af59fd0eb262c2a5f7c7d7e3b95e8596a75480d31087ca5f02f2d4c6acd19"}, + {file = "pymongo-4.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6125f73503407792c8b3f80165f8ab88a4e448d7d9234c762681a4d0b446fcb4"}, + {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba052446a14bd714ec83ca4e77d0d97904f33cd046d7bb60712a6be25eb31dbb"}, + {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b65433c90e07dc252b4a55dfd885ca0df94b1cf77c5b8709953ec1983aadc03"}, + {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2160d9c8cd20ce1f76a893f0daf7c0d38af093f36f1b5c9f3dcf3e08f7142814"}, + {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f251f287e6d42daa3654b686ce1fcb6d74bf13b3907c3ae25954978c70f2cd4"}, + {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d227a60b00925dd3aeae4675575af89c661a8e89a1f7d1677e57eba4a3693c"}, + {file = "pymongo-4.6.2-cp312-cp312-win32.whl", hash = "sha256:311794ef3ccae374aaef95792c36b0e5c06e8d5cf04a1bdb1b2bf14619ac881f"}, + {file = "pymongo-4.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:f673b64a0884edcc56073bda0b363428dc1bf4eb1b5e7d0b689f7ec6173edad6"}, + {file = "pymongo-4.6.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:fe010154dfa9e428bd2fb3e9325eff2216ab20a69ccbd6b5cac6785ca2989161"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1f5f4cd2969197e25b67e24d5b8aa2452d381861d2791d06c493eaa0b9c9fcfe"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c9519c9d341983f3a1bd19628fecb1d72a48d8666cf344549879f2e63f54463b"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c68bf4a399e37798f1b5aa4f6c02886188ef465f4ac0b305a607b7579413e366"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a509db602462eb736666989739215b4b7d8f4bb8ac31d0bffd4be9eae96c63ef"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:362a5adf6f3f938a8ff220a4c4aaa93e84ef932a409abecd837c617d17a5990f"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:ee30a9d4c27a88042d0636aca0275788af09cc237ae365cd6ebb34524bddb9cc"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:477914e13501bb1d4608339ee5bb618be056d2d0e7267727623516cfa902e652"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd343ca44982d480f1e39372c48e8e263fc6f32e9af2be456298f146a3db715"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3797e0a628534e07a36544d2bfa69e251a578c6d013e975e9e3ed2ac41f2d95"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97d81d357e1a2a248b3494d52ebc8bf15d223ee89d59ee63becc434e07438a24"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed694c0d1977cb54281cb808bc2b247c17fb64b678a6352d3b77eb678ebe1bd9"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ceaaff4b812ae368cf9774989dea81b9bbb71e5bed666feca6a9f3087c03e49"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7dd63f7c2b3727541f7f37d0fb78d9942eb12a866180fbeb898714420aad74e2"}, + {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e571434633f99a81e081738721bb38e697345281ed2f79c2f290f809ba3fbb2f"}, + {file = "pymongo-4.6.2-cp37-cp37m-win32.whl", hash = "sha256:3e9f6e2f3da0a6af854a3e959a6962b5f8b43bbb8113cd0bff0421c5059b3106"}, + {file = "pymongo-4.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3a5280f496297537301e78bde250c96fadf4945e7b2c397d8bb8921861dd236d"}, + {file = "pymongo-4.6.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:5f6bcd2d012d82d25191a911a239fd05a8a72e8c5a7d81d056c0f3520cad14d1"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4fa30494601a6271a8b416554bd7cde7b2a848230f0ec03e3f08d84565b4bf8c"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bea62f03a50f363265a7a651b4e2a4429b4f138c1864b2d83d4bf6f9851994be"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b2d445f1cf147331947cc35ec10342f898329f29dd1947a3f8aeaf7e0e6878d1"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:5db133d6ec7a4f7fc7e2bd098e4df23d7ad949f7be47b27b515c9fb9301c61e4"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:9eec7140cf7513aa770ea51505d312000c7416626a828de24318fdcc9ac3214c"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:5379ca6fd325387a34cda440aec2bd031b5ef0b0aa2e23b4981945cff1dab84c"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:579508536113dbd4c56e4738955a18847e8a6c41bf3c0b4ab18b51d81a6b7be8"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bae553ca39ed52db099d76acd5e8566096064dc7614c34c9359bb239ec4081"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0257e0eebb50f242ca28a92ef195889a6ad03dcdde5bf1c7ab9f38b7e810801"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbafe3a1df21eeadb003c38fc02c1abf567648b6477ec50c4a3c042dca205371"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaecfafb407feb6f562c7f2f5b91f22bfacba6dd739116b1912788cff7124c4a"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e942945e9112075a84d2e2d6e0d0c98833cdcdfe48eb8952b917f996025c7ffa"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f7b98f8d2cf3eeebde738d080ae9b4276d7250912d9751046a9ac1efc9b1ce2"}, + {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8110b78fc4b37dced85081d56795ecbee6a7937966e918e05e33a3900e8ea07d"}, + {file = "pymongo-4.6.2-cp38-cp38-win32.whl", hash = "sha256:df813f0c2c02281720ccce225edf39dc37855bf72cdfde6f789a1d1cf32ffb4b"}, + {file = "pymongo-4.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:64ec3e2dcab9af61bdbfcb1dd863c70d1b0c220b8e8ac11df8b57f80ee0402b3"}, + {file = "pymongo-4.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bff601fbfcecd2166d9a2b70777c2985cb9689e2befb3278d91f7f93a0456cae"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f1febca6f79e91feafc572906871805bd9c271b6a2d98a8bb5499b6ace0befed"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d788cb5cc947d78934be26eef1623c78cec3729dc93a30c23f049b361aa6d835"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c2f258489de12a65b81e1b803a531ee8cf633fa416ae84de65cd5f82d2ceb37"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:fb24abcd50501b25d33a074c1790a1389b6460d2509e4b240d03fd2e5c79f463"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:4d982c6db1da7cf3018183891883660ad085de97f21490d314385373f775915b"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:b2dd8c874927a27995f64a3b44c890e8a944c98dec1ba79eab50e07f1e3f801b"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:4993593de44c741d1e9f230f221fe623179f500765f9855936e4ff6f33571bad"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:658f6c028edaeb02761ebcaca8d44d519c22594b2a51dcbc9bd2432aa93319e3"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68109c13176749fbbbbbdb94dd4a58dcc604db6ea43ee300b2602154aebdd55f"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:707d28a822b918acf941cff590affaddb42a5d640614d71367c8956623a80cbc"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f251db26c239aec2a4d57fbe869e0a27b7f6b5384ec6bf54aeb4a6a5e7408234"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57c05f2e310701fc17ae358caafd99b1830014e316f0242d13ab6c01db0ab1c2"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b575fbe6396bbf21e4d0e5fd2e3cdb656dc90c930b6c5532192e9a89814f72d"}, + {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ca5877754f3fa6e4fe5aacf5c404575f04c2d9efc8d22ed39576ed9098d555c8"}, + {file = "pymongo-4.6.2-cp39-cp39-win32.whl", hash = "sha256:8caa73fb19070008e851a589b744aaa38edd1366e2487284c61158c77fdf72af"}, + {file = "pymongo-4.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:3e03c732cb64b96849310e1d8688fb70d75e2571385485bf2f1e7ad1d309fa53"}, + {file = "pymongo-4.6.2.tar.gz", hash = "sha256:ab7d01ac832a1663dad592ccbd92bb0f0775bc8f98a1923c5e1a7d7fead495af"}, ] [package.dependencies] @@ -3055,4 +3024,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "111b391843d856da523b6a5b168f641fc25d141a21e8128fda5bdb8185795032" +content-hash = "5921e62d33056fe244b3d535bdc071cc3356da450c80647c2b37b86c54b58936" diff --git a/pyproject.toml b/pyproject.toml index f13f774..dfa2ce5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.15.0" -jkit = "^3.0.0a9" +jkit = "^3.0.0a10" beanie = "^1.25.0" sspeedup = "^0.25.1" diff --git a/requirements-dev.txt b/requirements-dev.txt index bd02701..6ca504f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -25,9 +25,8 @@ docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" -greenback==1.2.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" @@ -41,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a9 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a10 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -59,13 +58,12 @@ msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" -outcome==1.3.0.post0 ; python_version >= "3.8" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.15.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" @@ -73,7 +71,7 @@ pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.1 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" pyright==1.1.351 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 9ac59aa..38abaa9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,9 +25,8 @@ docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" -greenback==1.2.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" @@ -41,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a9 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a10 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -58,13 +57,12 @@ motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" -outcome==1.3.0.post0 ; python_version >= "3.8" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.15.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" @@ -72,7 +70,7 @@ pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.1 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" From ba8a4660482f47a92e0e89bcde9459f44ac1b4b0 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 14:57:32 +0800 Subject: [PATCH 07/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=AE=9E=E7=8E=B0=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_rank_records.py | 15 ++++++++------- models/__init__.py | 6 +++--- poetry.lock | 2 +- pyproject.toml | 2 +- utils/db.py | 15 +++++++++++---- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_rank_records.py index f2404da..d8466b9 100644 --- a/jobs/fetch_article_earning_rank_records.py +++ b/jobs/fetch_article_earning_rank_records.py @@ -4,7 +4,7 @@ from jkit.article import Article from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User -from prefect import flow, task +from prefect import flow, get_run_logger from models.article_earning_rank_record import ( ArticleEarningRankRecordModel, @@ -14,7 +14,6 @@ ) from utils.db import init_db from utils.job_model import Job -from utils.log import logger async def get_user_from_article_slug(article_slug: str) -> User: @@ -23,10 +22,11 @@ async def get_user_from_article_slug(article_slug: str) -> User: return article_info.author_info.to_user_obj() -@task async def fetch_data(*, target_date: date) -> AsyncGenerator[RecordField, None]: + logger = get_run_logger() + ranking_obj = ArticleEarningRanking(target_date) - logger.debug(f"已创建 {target_date} 的文章收益排行榜对象") + logger.debug(f"已创建文章收益排行榜对象 target_date={ranking_obj._target_date}") async for item in ranking_obj: yield item @@ -35,10 +35,12 @@ async def fetch_data(*, target_date: date) -> AsyncGenerator[RecordField, None]: async def process_data( item: RecordField, /, *, target_date: date ) -> ArticleEarningRankRecordModel: + logger = get_run_logger() + if item.slug: author = await get_user_from_article_slug(item.slug) else: - logger.warning("文章走丢了,跳过采集文章与作者信息", ranking=item.ranking) + logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") author = None return ArticleEarningRankRecordModel( @@ -60,14 +62,13 @@ async def process_data( ) -@task async def save_data(data: List[ArticleEarningRankRecordModel]) -> None: await ArticleEarningRankRecordModel.insert_many(data) @flow async def main() -> None: - await init_db() + await init_db([ArticleEarningRankRecordModel]) target_date = datetime.now().date() - timedelta(days=1) diff --git a/models/__init__.py b/models/__init__.py index 86e9545..a064939 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,7 +1,7 @@ -from typing import List, Type, Union +from typing import List, Type -from beanie import Document, View +from beanie import Document from models.article_earning_rank_record import ArticleEarningRankRecordModel -MODELS: List[Union[Type[Document], Type[View], str]] = [ArticleEarningRankRecordModel] +MODELS: List[Type[Document]] = [ArticleEarningRankRecordModel] diff --git a/poetry.lock b/poetry.lock index 6adcd64..5cae74a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3024,4 +3024,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5921e62d33056fe244b3d535bdc071cc3356da450c80647c2b37b86c54b58936" +content-hash = "f5eadd38fde522e11b7e2aa5e1c21060ec46bf940c0ab69e1d90be0079ac1854" diff --git a/pyproject.toml b/pyproject.toml index dfa2ce5..351b317 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" -prefect = "^2.15.0" +prefect = "^2.16.0" jkit = "^3.0.0a10" beanie = "^1.25.0" sspeedup = "^0.25.1" diff --git a/utils/db.py b/utils/db.py index 8958eb5..efc45d8 100644 --- a/utils/db.py +++ b/utils/db.py @@ -1,7 +1,9 @@ -from beanie import init_beanie +from typing import List, Optional, Type + +from beanie import Document, init_beanie from motor.motor_asyncio import AsyncIOMotorClient -from models import MODELS +from models import MODELS as ALL_MODELS from utils.config import CONFIG _CLIENT = AsyncIOMotorClient(CONFIG.mongodb.host, CONFIG.mongodb.port) @@ -10,5 +12,10 @@ RUN_LOG_COLLECTION = _DB.run_log -async def init_db() -> None: - await init_beanie(database=_DB, document_models=MODELS) +async def init_db( + models: Optional[List[Type[Document]]] = None, +) -> None: + await init_beanie( + database=_DB, + document_models=models if models else ALL_MODELS, # type: ignore + ) From ad50b6c963864556711af824d4dd8e99c7033f1e Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 15:39:50 +0800 Subject: [PATCH 08/93] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=20ODM=20?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=AE=9A=E4=B9=89=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_rank_records.py | 62 +++++++++++++--------- main.py | 7 +-- models/__init__.py | 7 --- models/article_earning_rank_record.py | 32 ----------- utils/db.py | 12 +---- utils/log.py | 10 ---- 6 files changed, 41 insertions(+), 89 deletions(-) delete mode 100644 models/__init__.py delete mode 100644 models/article_earning_rank_record.py delete mode 100644 utils/log.py diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_rank_records.py index d8466b9..d578a48 100644 --- a/jobs/fetch_article_earning_rank_records.py +++ b/jobs/fetch_article_earning_rank_records.py @@ -1,35 +1,49 @@ from datetime import date, datetime, timedelta -from typing import AsyncGenerator, List +from typing import List, Optional +from beanie import Document from jkit.article import Article from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User from prefect import flow, get_run_logger +from pydantic import BaseModel, Field, PastDate, PositiveFloat, PositiveInt -from models.article_earning_rank_record import ( - ArticleEarningRankRecordModel, - ArticleField, - AuthorField, - EarningField, -) from utils.db import init_db from utils.job_model import Job -async def get_user_from_article_slug(article_slug: str) -> User: - article = Article.from_slug(article_slug)._as_checked() - article_info = await article.info - return article_info.author_info.to_user_obj() +class ArticleField(BaseModel): + title: Optional[str] + slug: Optional[str] -async def fetch_data(*, target_date: date) -> AsyncGenerator[RecordField, None]: - logger = get_run_logger() +class AuthorField(BaseModel): + id: Optional[PositiveInt] + slug: Optional[str] + name: Optional[str] - ranking_obj = ArticleEarningRanking(target_date) - logger.debug(f"已创建文章收益排行榜对象 target_date={ranking_obj._target_date}") - async for item in ranking_obj: - yield item +class EarningField(BaseModel): + to_author: PositiveFloat = Field(serialization_alias="toAuthor") + to_voter: PositiveFloat = Field(serialization_alias="toVoter") + + +class ArticleEarningRankRecordModel(Document): + date: PastDate + ranking: PositiveInt + article: ArticleField + author: AuthorField + earning: EarningField + + class Settings: + name = "article_earning_rank_record" + indexes = ("date", "ranking") + + +async def get_article_author(article_slug: str, /) -> User: + article = Article.from_slug(article_slug)._as_checked() + article_info = await article.info + return article_info.author_info.to_user_obj() async def process_data( @@ -38,7 +52,7 @@ async def process_data( logger = get_run_logger() if item.slug: - author = await get_user_from_article_slug(item.slug) + author = await get_article_author(item.slug) else: logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") author = None @@ -62,22 +76,22 @@ async def process_data( ) -async def save_data(data: List[ArticleEarningRankRecordModel]) -> None: - await ArticleEarningRankRecordModel.insert_many(data) - - @flow async def main() -> None: + logger = get_run_logger() + await init_db([ArticleEarningRankRecordModel]) + logger.info("初始化 ODM 模型成功") target_date = datetime.now().date() - timedelta(days=1) + logger.info(f"target_date={target_date}") data: List[ArticleEarningRankRecordModel] = [] - async for item in fetch_data(target_date=target_date): + async for item in ArticleEarningRanking(target_date): processed_item = await process_data(item, target_date=target_date) data.append(processed_item) - await save_data(data) + await ArticleEarningRankRecordModel.insert_many(data) fetch_article_earning_rank_records_job = Job( diff --git a/main.py b/main.py index 8a3ff19..96c078b 100644 --- a/main.py +++ b/main.py @@ -3,15 +3,10 @@ from prefect import serve from jobs import DEPLOYMENTS -from utils.db import init_db -from utils.log import logger async def main() -> None: - await init_db() - logger.info("初始化数据库成功") - - logger.info("启动工作流") + print("启动工作流...") await serve(*DEPLOYMENTS, print_starting_message=False) # type: ignore diff --git a/models/__init__.py b/models/__init__.py deleted file mode 100644 index a064939..0000000 --- a/models/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from typing import List, Type - -from beanie import Document - -from models.article_earning_rank_record import ArticleEarningRankRecordModel - -MODELS: List[Type[Document]] = [ArticleEarningRankRecordModel] diff --git a/models/article_earning_rank_record.py b/models/article_earning_rank_record.py deleted file mode 100644 index aaff4b9..0000000 --- a/models/article_earning_rank_record.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Optional - -from beanie import Document -from pydantic import BaseModel, Field, PastDate, PositiveFloat, PositiveInt - - -class ArticleField(BaseModel): - title: Optional[str] - slug: Optional[str] - - -class AuthorField(BaseModel): - id: Optional[PositiveInt] - slug: Optional[str] - name: Optional[str] - - -class EarningField(BaseModel): - to_author: PositiveFloat = Field(serialization_alias="toAuthor") - to_voter: PositiveFloat = Field(serialization_alias="toVoter") - - -class ArticleEarningRankRecordModel(Document): - date: PastDate - ranking: PositiveInt - article: ArticleField - author: AuthorField - earning: EarningField - - class Settings: - name = "article_earning_rank_record" - indexes = ("date", "ranking") diff --git a/utils/db.py b/utils/db.py index efc45d8..2d85c23 100644 --- a/utils/db.py +++ b/utils/db.py @@ -3,19 +3,11 @@ from beanie import Document, init_beanie from motor.motor_asyncio import AsyncIOMotorClient -from models import MODELS as ALL_MODELS from utils.config import CONFIG _CLIENT = AsyncIOMotorClient(CONFIG.mongodb.host, CONFIG.mongodb.port) _DB = _CLIENT[CONFIG.mongodb.database] -RUN_LOG_COLLECTION = _DB.run_log - -async def init_db( - models: Optional[List[Type[Document]]] = None, -) -> None: - await init_beanie( - database=_DB, - document_models=models if models else ALL_MODELS, # type: ignore - ) +async def init_db(models: Optional[List[Type[Document]]]) -> None: + await init_beanie(database=_DB, document_models=models) # type: ignore diff --git a/utils/log.py b/utils/log.py deleted file mode 100644 index 275a65b..0000000 --- a/utils/log.py +++ /dev/null @@ -1,10 +0,0 @@ -from sspeedup.logging.run_logger import RunLogger - -from utils.config import CONFIG -from utils.db import RUN_LOG_COLLECTION - -logger = RunLogger( - save_level=CONFIG.log.save_level, - print_level=CONFIG.log.print_level, - mongo_collection=RUN_LOG_COLLECTION, -) From d75ca3a38fabdd99a421f6bd909bced43c1e1d80 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 15:41:18 +0800 Subject: [PATCH 09/93] =?UTF-8?q?ci:=20=E5=88=9D=E5=A7=8B=E5=8C=96=20CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/static-check.yaml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/static-check.yaml diff --git a/.github/workflows/static-check.yaml b/.github/workflows/static-check.yaml new file mode 100644 index 0000000..6213fa7 --- /dev/null +++ b/.github/workflows/static-check.yaml @@ -0,0 +1,22 @@ +name: Static Check + +on: + push: + +jobs: + static-check-backend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Poetry + run: pipx install poetry + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + cache: "poetry" + - name: Install Dependencies + run: poetry install --all-extras --no-root + - name: Lint With Ruff + run: poetry run ruff check --output-format=github . + - name: Type checking with Pyright + run: poetry run pyright --warnings . \ No newline at end of file From 35e6c86c732e5b3d95fb576655bb9ff5bb695bc4 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 15:50:22 +0800 Subject: [PATCH 10/93] =?UTF-8?q?feat:=20=E9=87=87=E9=9B=86=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E6=94=B6=E7=9B=8A=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... fetch_article_earning_ranking_records.py} | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) rename jobs/{fetch_article_earning_rank_records.py => fetch_article_earning_ranking_records.py} (82%) diff --git a/jobs/fetch_article_earning_rank_records.py b/jobs/fetch_article_earning_ranking_records.py similarity index 82% rename from jobs/fetch_article_earning_rank_records.py rename to jobs/fetch_article_earning_ranking_records.py index d578a48..55cb823 100644 --- a/jobs/fetch_article_earning_rank_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -28,7 +28,7 @@ class EarningField(BaseModel): to_voter: PositiveFloat = Field(serialization_alias="toVoter") -class ArticleEarningRankRecordModel(Document): +class ArticleEarningRankingRecordModel(Document): date: PastDate ranking: PositiveInt article: ArticleField @@ -36,7 +36,7 @@ class ArticleEarningRankRecordModel(Document): earning: EarningField class Settings: - name = "article_earning_rank_record" + name = "article_earning_ranking_record" indexes = ("date", "ranking") @@ -46,9 +46,9 @@ async def get_article_author(article_slug: str, /) -> User: return article_info.author_info.to_user_obj() -async def process_data( +async def process_item( item: RecordField, /, *, target_date: date -) -> ArticleEarningRankRecordModel: +) -> ArticleEarningRankingRecordModel: logger = get_run_logger() if item.slug: @@ -57,7 +57,7 @@ async def process_data( logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") author = None - return ArticleEarningRankRecordModel( + return ArticleEarningRankingRecordModel( date=target_date, ranking=item.ranking, article=ArticleField( @@ -80,21 +80,21 @@ async def process_data( async def main() -> None: logger = get_run_logger() - await init_db([ArticleEarningRankRecordModel]) + await init_db([ArticleEarningRankingRecordModel]) logger.info("初始化 ODM 模型成功") target_date = datetime.now().date() - timedelta(days=1) logger.info(f"target_date={target_date}") - data: List[ArticleEarningRankRecordModel] = [] + data: List[ArticleEarningRankingRecordModel] = [] async for item in ArticleEarningRanking(target_date): - processed_item = await process_data(item, target_date=target_date) + processed_item = await process_item(item, target_date=target_date) data.append(processed_item) - await ArticleEarningRankRecordModel.insert_many(data) + await ArticleEarningRankingRecordModel.insert_many(data) -fetch_article_earning_rank_records_job = Job( +fetch_article_earning_ranking_records_job = Job( func=main, name="采集文章收益排行榜记录", cron="0 1 * * *", From 784eb01547c5aff337e54737a15d6a24270b7fbc Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 16:05:52 +0800 Subject: [PATCH 11/93] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=97=A5=E6=9B=B4=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 12 +++- jobs/fetch_article_earning_ranking_records.py | 2 +- jobs/fetch_daily_update_ranking_records.py | 61 +++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 jobs/fetch_daily_update_ranking_records.py diff --git a/jobs/__init__.py b/jobs/__init__.py index 7de833b..629d6c4 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -4,8 +4,11 @@ from prefect.client.schemas.schedules import CronSchedule from prefect.deployments.runner import RunnerDeployment -from jobs.fetch_article_earning_rank_records import ( - fetch_article_earning_rank_records_job, +from jobs.fetch_article_earning_ranking_records import ( + fetch_article_earning_ranking_records_job, +) +from jobs.fetch_daily_update_ranking_records import ( + fetch_daily_update_ranking_records_job, ) from utils.job_model import Job @@ -35,7 +38,10 @@ def create_deployment(job: Job, flow: FlowType) -> DeploymentType: ) -JOBS: Tuple[Job, ...] = (fetch_article_earning_rank_records_job,) +JOBS: Tuple[Job, ...] = ( + fetch_article_earning_ranking_records_job, + fetch_daily_update_ranking_records_job, +) FLOWS: Tuple[FlowType, ...] = tuple(map(create_flow, JOBS)) DEPLOYMENTS: Tuple[DeploymentType, ...] = tuple( diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 55cb823..2713434 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -36,7 +36,7 @@ class ArticleEarningRankingRecordModel(Document): earning: EarningField class Settings: - name = "article_earning_ranking_record" + name = "article_earning_ranking_records" indexes = ("date", "ranking") diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py new file mode 100644 index 0000000..700472e --- /dev/null +++ b/jobs/fetch_daily_update_ranking_records.py @@ -0,0 +1,61 @@ +from datetime import date, datetime +from typing import List + +from beanie import Document +from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord +from prefect import flow, get_run_logger +from pydantic import BaseModel, PositiveInt + +from utils.db import init_db +from utils.job_model import Job + + +class UserInfoField(BaseModel): + slug: str + name: str + + +class DailyUpdateRankingRecordModel(Document): + date: date + ranking: PositiveInt + days: PositiveInt + user_info: UserInfoField + + class Settings: + name = "daily_update_ranking_records" + indexes = ("date", "ranking", "days") + + +def process_item( + item: DailyUpdateRankingRecord, /, *, current_date: date +) -> DailyUpdateRankingRecordModel: + return DailyUpdateRankingRecordModel( + date=current_date, + ranking=item.ranking, + days=item.days, + user_info=UserInfoField(slug=item.user_info.slug, name=item.user_info.name), + ) + + +@flow +async def main() -> None: + logger = get_run_logger() + + current_date = datetime.now().date() + + await init_db([DailyUpdateRankingRecordModel]) + logger.info("初始化 ODM 模型成功") + + data: List[DailyUpdateRankingRecordModel] = [] + async for item in DailyUpdateRanking(): + processed_item = process_item(item, current_date=current_date) + data.append(processed_item) + + await DailyUpdateRankingRecordModel.insert_many(data) + + +fetch_daily_update_ranking_records_job = Job( + func=main, + name="采集日更排行榜记录", + cron="0 1 * * *", +) From 08285a31455525d2f1c157f905d6d4d17a5dd818 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 16:45:27 +0800 Subject: [PATCH 12/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=87=87?= =?UTF-8?q?=E9=9B=86=E7=AE=80=E4=B9=A6=E5=A4=A7=E8=BD=AC=E7=9B=98=E6=8A=BD?= =?UTF-8?q?=E5=A5=96=E4=B8=AD=E5=A5=96=E8=AE=B0=E5=BD=95=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 2 + jobs/fetch_daily_update_ranking_records.py | 5 +- jobs/fetch_jianshu_lottery_win_records.py | 86 ++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 jobs/fetch_jianshu_lottery_win_records.py diff --git a/jobs/__init__.py b/jobs/__init__.py index 629d6c4..5bedd1a 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -10,6 +10,7 @@ from jobs.fetch_daily_update_ranking_records import ( fetch_daily_update_ranking_records_job, ) +from jobs.fetch_jianshu_lottery_win_records import fetch_jianshu_lottery_win_records_job from utils.job_model import Job FlowType = Flow[[], Coroutine[Any, Any, None]] @@ -41,6 +42,7 @@ def create_deployment(job: Job, flow: FlowType) -> DeploymentType: JOBS: Tuple[Job, ...] = ( fetch_article_earning_ranking_records_job, fetch_daily_update_ranking_records_job, + fetch_jianshu_lottery_win_records_job, ) FLOWS: Tuple[FlowType, ...] = tuple(map(create_flow, JOBS)) diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index 700472e..2e9b065 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -33,7 +33,10 @@ def process_item( date=current_date, ranking=item.ranking, days=item.days, - user_info=UserInfoField(slug=item.user_info.slug, name=item.user_info.name), + user_info=UserInfoField( + slug=item.user_info.slug, + name=item.user_info.name, + ), ) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py new file mode 100644 index 0000000..e1ba174 --- /dev/null +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -0,0 +1,86 @@ +from typing import List + +from beanie import Document +from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord +from prefect import flow, get_run_logger +from pydantic import BaseModel, PastDatetime, PositiveInt + +from utils.db import init_db +from utils.job_model import Job + + +class UserInfoField(BaseModel): + id: PositiveInt + slug: str + name: str + + +class JianshuLotteryWinRecordModel(Document): + record_id: PositiveInt + time: PastDatetime + award_name: str + user_info: UserInfoField + + class Settings: + name = "jianshu_lottery_win_records" + indexes = ("record_id", "time", "award_name", "user.slug", "user.name") + + +async def get_latest_stored_record_id() -> int: + latest_data = ( + await JianshuLotteryWinRecordModel.find().sort("-record_id").first_or_none() + ) + if not latest_data: + return 0 + + return latest_data.record_id + + +def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordModel: + return JianshuLotteryWinRecordModel( + record_id=item.id, + time=item.time, + award_name=item.award_name, + user_info=UserInfoField( + id=item.user_info.id, + slug=item.user_info.slug, + name=item.user_info.name, + ), + ) + + +@flow +async def main() -> None: + logger = get_run_logger() + + await init_db([JianshuLotteryWinRecordModel]) + logger.info("初始化 ODM 模型成功") + + stop_id = await get_latest_stored_record_id() + logger.info(f"获取到最新的已存储 ID:{stop_id}") + if stop_id == 0: + logger.warning("数据库中没有记录") + + data: List[JianshuLotteryWinRecordModel] = [] + async for item in JianshuLottery().iter_win_records(): + if item.id == stop_id: + break + + processed_item = process_item(item) + data.append(processed_item) + else: + logger.warning("采集数据量达到上限") + + logger.info(f"采集数据量:{len(data)}") + + if data: + await JianshuLotteryWinRecordModel.insert_many(data) + else: + logger.info("无数据,不执行保存操作") + + +fetch_jianshu_lottery_win_records_job = Job( + func=main, + name="采集简书大转盘抽奖中奖记录", + cron="*/10 * * * *", +) From 86f71c2af74cc7429a662109576da57dd608333f Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 17:47:05 +0800 Subject: [PATCH 13/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=87=87?= =?UTF-8?q?=E9=9B=86=E7=AE=80=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=AE=80=E4=B9=A6=E8=B4=9D=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E6=8C=82=E5=8D=95=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 2 + jobs/fetch_jpep_ftn_trade_orders.py | 107 ++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 jobs/fetch_jpep_ftn_trade_orders.py diff --git a/jobs/__init__.py b/jobs/__init__.py index 5bedd1a..46afead 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -11,6 +11,7 @@ fetch_daily_update_ranking_records_job, ) from jobs.fetch_jianshu_lottery_win_records import fetch_jianshu_lottery_win_records_job +from jobs.fetch_jpep_ftn_trade_orders import fetch_jpep_ftn_trade_orders_job from utils.job_model import Job FlowType = Flow[[], Coroutine[Any, Any, None]] @@ -43,6 +44,7 @@ def create_deployment(job: Job, flow: FlowType) -> DeploymentType: fetch_article_earning_ranking_records_job, fetch_daily_update_ranking_records_job, fetch_jianshu_lottery_win_records_job, + fetch_jpep_ftn_trade_orders_job, ) FLOWS: Tuple[FlowType, ...] = tuple(map(create_flow, JOBS)) diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py new file mode 100644 index 0000000..855c240 --- /dev/null +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -0,0 +1,107 @@ +from datetime import datetime +from typing import List, Optional + +from beanie import Document +from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord +from prefect import flow, get_run_logger +from pydantic import ( + BaseModel, + NonNegativeInt, + PastDatetime, + PositiveFloat, + PositiveInt, +) + +from utils.db import init_db +from utils.job_model import Job + + +class PublisherInfoField(BaseModel): + is_anonymous: bool + id: Optional[PositiveInt] + name: Optional[str] + hashed_name: Optional[str] + credit: Optional[NonNegativeInt] + + +class JPEPFTNTradeOrder(Document): + fetch_time: datetime + order_id: PositiveInt + price: PositiveFloat + + total_amount: PositiveInt + traded_amount: NonNegativeInt + tradable_amount: NonNegativeInt + minimum_trade_amount: PositiveInt + + traded_count: NonNegativeInt + publish_time: PastDatetime + + publisher_info: PublisherInfoField + + class Settings: + name = "jpep_ftn_trade_orders" + indexes = ("fetch_time", "order_id") + + +def get_fetch_time() -> datetime: + current_dt = datetime.now() + + # 保证采集时间对齐 10 分钟间隔 + return current_dt.replace(minute=current_dt.minute // 10, second=0, microsecond=0) + + +def process_item( + item: FTNMacketOrderRecord, /, *, fetch_time: datetime +) -> JPEPFTNTradeOrder: + return JPEPFTNTradeOrder( + fetch_time=fetch_time, + order_id=item.id, + price=item.price, + total_amount=item.total_amount, + traded_amount=item.traded_amount, + tradable_amount=item.tradable_amount, + minimum_trade_amount=item.minimum_trade_amount, + traded_count=item.traded_count, + publish_time=item.publish_time, + publisher_info=PublisherInfoField( + is_anonymous=item.publisher_info.is_anonymous, + id=item.publisher_info.id, + name=item.publisher_info.name, + hashed_name=item.publisher_info.hashed_name, + credit=item.publisher_info.credit, + ), + ) + + +@flow +async def main() -> None: + logger = get_run_logger() + + fetch_time = get_fetch_time() + + await init_db([JPEPFTNTradeOrder]) + logger.info("初始化 ODM 模型成功") + + buy_data: List[JPEPFTNTradeOrder] = [] + async for item in FTNMacket().iter_orders(type="buy"): + processed_item = process_item(item, fetch_time=fetch_time) + buy_data.append(processed_item) + + await JPEPFTNTradeOrder.insert_many(buy_data) + logger.info(f"采集买单数据成功({len(buy_data)} 条)") + + sell_data: List[JPEPFTNTradeOrder] = [] + async for item in FTNMacket().iter_orders(type="sell"): + processed_item = process_item(item, fetch_time=fetch_time) + sell_data.append(processed_item) + + await JPEPFTNTradeOrder.insert_many(sell_data) + logger.info(f"采集卖单数据成功({len(sell_data)} 条)") + + +fetch_jpep_ftn_trade_orders_job = Job( + func=main, + name="采集简书积分兑换平台简书贝交易挂单", + cron="*/10 * * * *", +) From bdda0bbd1156c58213439f5c49b53b6ad8666da4 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 17:59:43 +0800 Subject: [PATCH 14/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 3 +++ Dockerfile | 17 +++++++++++++++++ docker-compose.yml | 29 +++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df09dd7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +**/__pycache__ +poetry.lock +config.yaml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ab26482 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.10.8-slim + +ENV TZ Asia/Shanghai + +WORKDIR /app + +COPY requirements.txt . + +RUN pip install \ + -r requirements.txt \ + --no-cache-dir \ + --no-compile \ + --disable-pip-version-check + +COPY . . + +CMD ["python", "main.py"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b1c1d82 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +version: "3" + +networks: + mongodb: + external: true + prefect: + external: true + +services: + main: + image: jfetcher:3.0.0 + build: . + volumes: + - ./config.yaml:/app/config.yaml:ro + networks: + - mongodb + - prefect + environment: + - PYTHONUNBUFFERED=1 + deploy: + resources: + limits: + cpus: "0.50" + memory: 128M + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 3 + stop_grace_period: 5s From 94ef098713f7e6d975157761916c3674f169368e Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 18:11:18 +0800 Subject: [PATCH 15/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b1c1d82..d4dc43e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,11 +17,12 @@ services: - prefect environment: - PYTHONUNBUFFERED=1 + - PREFECT_API_URL=http://prefect:4200/api deploy: resources: limits: - cpus: "0.50" - memory: 128M + cpus: "1.00" + memory: 512M restart_policy: condition: on-failure delay: 5s From 08b21ecda63bacda29527b259a0026b43f283f4c Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 18:25:16 +0800 Subject: [PATCH 16/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=20Dockerfile?= =?UTF-8?q?=20=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d4dc43e..b6d0cb5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,8 @@ services: - mongodb - prefect environment: - - PYTHONUNBUFFERED=1 - - PREFECT_API_URL=http://prefect:4200/api + - PYTHONUNBUFFERED: 1 + - PREFECT_API_URL: http://prefect:4200/api deploy: resources: limits: From 0816065f14884577baee5befe9f2a872cffaf842 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 22:58:05 +0800 Subject: [PATCH 17/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=87=87?= =?UTF-8?q?=E9=9B=86=E7=AE=80=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=AE=80=E4=B9=A6=E8=B4=9D=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E6=8C=82=E5=8D=95=E5=B7=A5=E4=BD=9C=E6=B5=81=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 18 +++++++++--------- pyproject.toml | 2 +- requirements-dev.txt | 4 ++-- requirements.txt | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5cae74a..69bf8a0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -970,13 +970,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a10" +version = "3.0.0a11" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a10-py3-none-any.whl", hash = "sha256:9119a9f0e6d98429918da99bfb8a8129450fe8014d6c144398d561eb6acbc3d4"}, - {file = "jkit-3.0.0a10.tar.gz", hash = "sha256:93a048376403c4a140bae8a32408d3c2d958b6c0b3a7a2b25ab32811b7a2ee40"}, + {file = "jkit-3.0.0a11-py3-none-any.whl", hash = "sha256:391e2578449a2045d5d111cc6a97620b5b71f80ee7722fdb6d7d5d4fc987479c"}, + {file = "jkit-3.0.0a11.tar.gz", hash = "sha256:daf11b2f51570bec1872d5b199a0c9e20017b339c145a86263d070d78e75ddd6"}, ] [package.dependencies] @@ -2567,19 +2567,19 @@ files = [ [[package]] name = "setuptools" -version = "69.1.0" +version = "69.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -3024,4 +3024,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f5eadd38fde522e11b7e2aa5e1c21060ec46bf940c0ab69e1d90be0079ac1854" +content-hash = "7277de1dcd2bbe957a3033ecba551c85a0ac4070939847fd5567ac7cb36c5d95" diff --git a/pyproject.toml b/pyproject.toml index 351b317..3c7a2f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a10" +jkit = "^3.0.0a11" beanie = "^1.25.0" sspeedup = "^0.25.1" diff --git a/requirements-dev.txt b/requirements-dev.txt index 6ca504f..63e446e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a10 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a11 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -91,7 +91,7 @@ rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" ruff==0.2.2 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.1.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 38abaa9..dcd343b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a10 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a11 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -88,7 +88,7 @@ rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.1.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" From 5ead19d442457f34e907dba19e0650cdddd0c49a Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 23:31:35 +0800 Subject: [PATCH 18/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=87=87?= =?UTF-8?q?=E9=9B=86=E8=B5=84=E4=BA=A7=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 2 + jobs/fetch_assets_ranking_records.py | 87 ++++++++++++++++++++++++++++ poetry.lock | 8 +-- pyproject.toml | 2 +- requirements-dev.txt | 2 +- requirements.txt | 2 +- 6 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 jobs/fetch_assets_ranking_records.py diff --git a/jobs/__init__.py b/jobs/__init__.py index 46afead..9f8ee0e 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -7,6 +7,7 @@ from jobs.fetch_article_earning_ranking_records import ( fetch_article_earning_ranking_records_job, ) +from jobs.fetch_assets_ranking_records import fetch_assets_ranking_records_job from jobs.fetch_daily_update_ranking_records import ( fetch_daily_update_ranking_records_job, ) @@ -42,6 +43,7 @@ def create_deployment(job: Job, flow: FlowType) -> DeploymentType: JOBS: Tuple[Job, ...] = ( fetch_article_earning_ranking_records_job, + fetch_assets_ranking_records_job, fetch_daily_update_ranking_records_job, fetch_jianshu_lottery_win_records_job, fetch_jpep_ftn_trade_orders_job, diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py new file mode 100644 index 0000000..3a38b71 --- /dev/null +++ b/jobs/fetch_assets_ranking_records.py @@ -0,0 +1,87 @@ +from datetime import date, datetime +from typing import List, Optional + +from beanie import Document +from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord +from prefect import flow, get_run_logger +from pydantic import BaseModel, NonNegativeFloat, PositiveFloat, PositiveInt + +from utils.db import init_db +from utils.job_model import Job + + +class UserInfoField(BaseModel): + id: Optional[PositiveInt] + slug: Optional[str] + name: Optional[str] + + +class AssetsRankingRecordModel(Document): + date: date + ranking: PositiveInt + + fp_amount: Optional[NonNegativeFloat] + ftn_amount: Optional[NonNegativeFloat] + assets_amount: PositiveFloat + + user_info: UserInfoField + + class Settings: + name = "assets_ranking_records" + indexes = ("date", "ranking", "user_info.slug") + + +async def process_item( + item: AssetsRankingRecord, /, *, target_date: date +) -> AssetsRankingRecordModel: + logger = get_run_logger() + + if item.user_info.slug: + user_obj = item.user_info.to_user_obj() + fp_amount = await user_obj.fp_amount + ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) + else: + logger.warning(f"用户不存在,跳过采集简书钻与简书贝信息 ranking={item.ranking}") + fp_amount = None + ftn_amount = None + + return AssetsRankingRecordModel( + date=target_date, + ranking=item.ranking, + fp_amount=fp_amount, + ftn_amount=ftn_amount, + assets_amount=item.assets_amount, + user_info=UserInfoField( + id=item.user_info.id, + slug=item.user_info.slug, + name=item.user_info.name, + ), + ) + + +@flow +async def main() -> None: + logger = get_run_logger() + + await init_db([AssetsRankingRecordModel]) + logger.info("初始化 ODM 模型成功") + + target_date = datetime.now().date() + logger.info(f"target_date={target_date}") + + data: List[AssetsRankingRecordModel] = [] + async for item in AssetsRanking(): + processed_item = await process_item(item, target_date=target_date) + data.append(processed_item) + + if len(data) == 1000: + break + + await AssetsRankingRecordModel.insert_many(data) + + +fetch_assets_ranking_records_job = Job( + func=main, + name="采集资产排行榜记录", + cron="0 1 * * *", +) diff --git a/poetry.lock b/poetry.lock index 69bf8a0..343a4bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -970,13 +970,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a11" +version = "3.0.0a12" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a11-py3-none-any.whl", hash = "sha256:391e2578449a2045d5d111cc6a97620b5b71f80ee7722fdb6d7d5d4fc987479c"}, - {file = "jkit-3.0.0a11.tar.gz", hash = "sha256:daf11b2f51570bec1872d5b199a0c9e20017b339c145a86263d070d78e75ddd6"}, + {file = "jkit-3.0.0a12-py3-none-any.whl", hash = "sha256:f2006220a05d56457f2d2e9ded00a515522f543aef3930f3e732bde3b9678e06"}, + {file = "jkit-3.0.0a12.tar.gz", hash = "sha256:cf9580ed9b82da0d177ba798c730def1c1bd369da28497c5f9346eb15acfdded"}, ] [package.dependencies] @@ -3024,4 +3024,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "7277de1dcd2bbe957a3033ecba551c85a0ac4070939847fd5567ac7cb36c5d95" +content-hash = "6a0b2b076b3010227250036671f7f37ecc1f32e4469af9cf89623d674430b876" diff --git a/pyproject.toml b/pyproject.toml index 3c7a2f9..14a3ea0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a11" +jkit = "^3.0.0a12" beanie = "^1.25.0" sspeedup = "^0.25.1" diff --git a/requirements-dev.txt b/requirements-dev.txt index 63e446e..e3a9ce3 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a11 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a12 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index dcd343b..ab5ad17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a11 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a12 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" From f14ab4606a5517045dd3c16b3c2f56d8b8b7f9ac Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 23:33:24 +0800 Subject: [PATCH 19/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=87=87?= =?UTF-8?q?=E9=9B=86=E8=B5=84=E4=BA=A7=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=9C=A8=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=BC=82=E5=B8=B8=E6=97=B6=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_assets_ranking_records.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 3a38b71..3c96b67 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -2,6 +2,7 @@ from typing import List, Optional from beanie import Document +from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord from prefect import flow, get_run_logger from pydantic import BaseModel, NonNegativeFloat, PositiveFloat, PositiveInt @@ -38,6 +39,15 @@ async def process_item( if item.user_info.slug: user_obj = item.user_info.to_user_obj() + try: + await user_obj.check() + except ResourceUnavailableError: + logger.warning( + f"用户已注销或被封禁,跳过采集简书钻与简书贝信息 ranking={item.ranking}" + ) + fp_amount = None + ftn_amount = None + fp_amount = await user_obj.fp_amount ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) else: From a87e3f7bd676b6742d71cc3dee4a36bc695701a8 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 23:35:39 +0800 Subject: [PATCH 20/93] =?UTF-8?q?feat:=20=E4=BB=85=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E7=9A=84=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 1 - jobs/fetch_assets_ranking_records.py | 4 +++- jobs/fetch_daily_update_ranking_records.py | 1 - jobs/fetch_jianshu_lottery_win_records.py | 2 +- jobs/fetch_jpep_ftn_trade_orders.py | 1 - 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 2713434..09a8232 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -37,7 +37,6 @@ class ArticleEarningRankingRecordModel(Document): class Settings: name = "article_earning_ranking_records" - indexes = ("date", "ranking") async def get_article_author(article_slug: str, /) -> User: diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 3c96b67..dd3d5f4 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -29,7 +29,6 @@ class AssetsRankingRecordModel(Document): class Settings: name = "assets_ranking_records" - indexes = ("date", "ranking", "user_info.slug") async def process_item( @@ -40,6 +39,9 @@ async def process_item( if item.user_info.slug: user_obj = item.user_info.to_user_obj() try: + # TODO + # 强制重新检查 + user_obj._checked = False await user_obj.check() except ResourceUnavailableError: logger.warning( diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index 2e9b065..f14a33e 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -23,7 +23,6 @@ class DailyUpdateRankingRecordModel(Document): class Settings: name = "daily_update_ranking_records" - indexes = ("date", "ranking", "days") def process_item( diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index e1ba174..c3992c5 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -23,7 +23,7 @@ class JianshuLotteryWinRecordModel(Document): class Settings: name = "jianshu_lottery_win_records" - indexes = ("record_id", "time", "award_name", "user.slug", "user.name") + indexes = ("record_id") async def get_latest_stored_record_id() -> int: diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 855c240..879c06e 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -41,7 +41,6 @@ class JPEPFTNTradeOrder(Document): class Settings: name = "jpep_ftn_trade_orders" - indexes = ("fetch_time", "order_id") def get_fetch_time() -> datetime: From 34178f394fa7e0f7f24363b0d93fe30b8be2b3c5 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 23 Feb 2024 23:41:52 +0800 Subject: [PATCH 21/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b6d0cb5..d4dc43e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,8 @@ services: - mongodb - prefect environment: - - PYTHONUNBUFFERED: 1 - - PREFECT_API_URL: http://prefect:4200/api + - PYTHONUNBUFFERED=1 + - PREFECT_API_URL=http://prefect:4200/api deploy: resources: limits: From 9a0a8dd44b0501baa8ae60d5c41886a1be71fb55 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 24 Feb 2024 08:25:36 +0800 Subject: [PATCH 22/93] =?UTF-8?q?feat:=20=E5=9C=A8=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E4=B8=AD=E5=8A=A0=E5=85=A5=E5=AF=B9=20JKit=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9A=84=E4=B8=B4=E6=97=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E9=81=BF=E5=85=8D=E7=AE=80=E4=B9=A6=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=A0=A1=E9=AA=8C=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 4 ++++ jobs/fetch_assets_ranking_records.py | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 09a8232..4d2d492 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -3,6 +3,7 @@ from beanie import Document from jkit.article import Article +from jkit.config import CONFIG from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User from prefect import flow, get_run_logger @@ -51,7 +52,10 @@ async def process_item( logger = get_run_logger() if item.slug: + # TODO: 临时解决简书系统问题数据负数导致的报错 + CONFIG.data_validation.enabled = False author = await get_article_author(item.slug) + CONFIG.data_validation.enabled = True else: logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") author = None diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index dd3d5f4..f2b1ea5 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -2,6 +2,7 @@ from typing import List, Optional from beanie import Document +from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord from prefect import flow, get_run_logger @@ -39,10 +40,10 @@ async def process_item( if item.user_info.slug: user_obj = item.user_info.to_user_obj() try: - # TODO - # 强制重新检查 - user_obj._checked = False + # TODO: 强制重新检查 + CONFIG.resource_check.force_check_safe_data = True await user_obj.check() + CONFIG.resource_check.force_check_safe_data = False except ResourceUnavailableError: logger.warning( f"用户已注销或被封禁,跳过采集简书钻与简书贝信息 ranking={item.ranking}" @@ -50,8 +51,11 @@ async def process_item( fp_amount = None ftn_amount = None + # TODO: 临时解决简书系统问题数据负数导致的报错 + CONFIG.data_validation.enabled = False fp_amount = await user_obj.fp_amount ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) + CONFIG.data_validation.enabled = True else: logger.warning(f"用户不存在,跳过采集简书钻与简书贝信息 ranking={item.ranking}") fp_amount = None From 6a7eb4ec228bf35b93772a9fb360c500713a335d Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 24 Feb 2024 08:28:56 +0800 Subject: [PATCH 23/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E6=95=B0=E6=8D=AE=E5=BC=82=E5=B8=B8=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_jianshu_lottery_win_records.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index c3992c5..daf22fe 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -23,7 +23,7 @@ class JianshuLotteryWinRecordModel(Document): class Settings: name = "jianshu_lottery_win_records" - indexes = ("record_id") + indexes = ("record_id", ) async def get_latest_stored_record_id() -> int: From f89258aac0d84e9bd0cbdc92ff2f989e196e6e7e Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 24 Feb 2024 09:30:14 +0800 Subject: [PATCH 24/93] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=BB=93=E6=9E=9C=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 3 +- jobs/fetch_article_earning_ranking_records.py | 15 +- jobs/fetch_assets_ranking_records.py | 17 +- jobs/fetch_daily_update_ranking_records.py | 5 +- jobs/fetch_jianshu_lottery_win_records.py | 9 +- jobs/fetch_jpep_ftn_trade_orders.py | 10 +- poetry.lock | 278 +++++++++--------- pyproject.toml | 2 +- requirements-dev.txt | 10 +- requirements.txt | 10 +- utils/job_model.py | 4 +- 11 files changed, 189 insertions(+), 174 deletions(-) diff --git a/jobs/__init__.py b/jobs/__init__.py index 9f8ee0e..64603ac 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -3,6 +3,7 @@ from prefect import Flow from prefect.client.schemas.schedules import CronSchedule from prefect.deployments.runner import RunnerDeployment +from prefect.states import State from jobs.fetch_article_earning_ranking_records import ( fetch_article_earning_ranking_records_job, @@ -15,7 +16,7 @@ from jobs.fetch_jpep_ftn_trade_orders import fetch_jpep_ftn_trade_orders_job from utils.job_model import Job -FlowType = Flow[[], Coroutine[Any, Any, None]] +FlowType = Flow[[], Coroutine[Any, Any, State]] DeploymentType = Coroutine[Any, Any, RunnerDeployment] diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 4d2d492..a044be8 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -7,6 +7,7 @@ from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User from prefect import flow, get_run_logger +from prefect.states import Completed, State from pydantic import BaseModel, Field, PastDate, PositiveFloat, PositiveInt from utils.db import init_db @@ -55,10 +56,13 @@ async def process_item( # TODO: 临时解决简书系统问题数据负数导致的报错 CONFIG.data_validation.enabled = False author = await get_article_author(item.slug) + author_id = await author.id + author_slug = author.slug CONFIG.data_validation.enabled = True else: logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") - author = None + author_id = None + author_slug = None return ArticleEarningRankingRecordModel( date=target_date, @@ -68,8 +72,8 @@ async def process_item( slug=item.slug, ), author=AuthorField( - id=(await author.id) if author else None, - slug=author.slug if author else None, + id=author_id, + slug=author_slug, name=item.author_info.name, ), earning=EarningField( @@ -80,14 +84,13 @@ async def process_item( @flow -async def main() -> None: +async def main() -> State: logger = get_run_logger() await init_db([ArticleEarningRankingRecordModel]) logger.info("初始化 ODM 模型成功") target_date = datetime.now().date() - timedelta(days=1) - logger.info(f"target_date={target_date}") data: List[ArticleEarningRankingRecordModel] = [] async for item in ArticleEarningRanking(target_date): @@ -96,6 +99,8 @@ async def main() -> None: await ArticleEarningRankingRecordModel.insert_many(data) + return Completed(message=f"target_date={target_date}, data_count={len(data)}") + fetch_article_earning_ranking_records_job = Job( func=main, diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index f2b1ea5..76161ff 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -6,6 +6,7 @@ from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord from prefect import flow, get_run_logger +from prefect.states import Completed, State from pydantic import BaseModel, NonNegativeFloat, PositiveFloat, PositiveInt from utils.db import init_db @@ -41,8 +42,12 @@ async def process_item( user_obj = item.user_info.to_user_obj() try: # TODO: 强制重新检查 + # TODO: 临时解决简书系统问题数据负数导致的报错 CONFIG.resource_check.force_check_safe_data = True - await user_obj.check() + CONFIG.data_validation.enabled = False + fp_amount = await user_obj.fp_amount + ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) + CONFIG.data_validation.enabled = True CONFIG.resource_check.force_check_safe_data = False except ResourceUnavailableError: logger.warning( @@ -51,11 +56,6 @@ async def process_item( fp_amount = None ftn_amount = None - # TODO: 临时解决简书系统问题数据负数导致的报错 - CONFIG.data_validation.enabled = False - fp_amount = await user_obj.fp_amount - ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) - CONFIG.data_validation.enabled = True else: logger.warning(f"用户不存在,跳过采集简书钻与简书贝信息 ranking={item.ranking}") fp_amount = None @@ -76,14 +76,13 @@ async def process_item( @flow -async def main() -> None: +async def main() -> State: logger = get_run_logger() await init_db([AssetsRankingRecordModel]) logger.info("初始化 ODM 模型成功") target_date = datetime.now().date() - logger.info(f"target_date={target_date}") data: List[AssetsRankingRecordModel] = [] async for item in AssetsRanking(): @@ -95,6 +94,8 @@ async def main() -> None: await AssetsRankingRecordModel.insert_many(data) + return Completed(message=f"target_date={target_date}, data_count={len(data)}") + fetch_assets_ranking_records_job = Job( func=main, diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index f14a33e..895ec6a 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -4,6 +4,7 @@ from beanie import Document from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord from prefect import flow, get_run_logger +from prefect.states import Completed, State from pydantic import BaseModel, PositiveInt from utils.db import init_db @@ -40,7 +41,7 @@ def process_item( @flow -async def main() -> None: +async def main() -> State: logger = get_run_logger() current_date = datetime.now().date() @@ -55,6 +56,8 @@ async def main() -> None: await DailyUpdateRankingRecordModel.insert_many(data) + return Completed(message=f"data_count={len(data)}") + fetch_daily_update_ranking_records_job = Job( func=main, diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index daf22fe..86d9578 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -3,6 +3,7 @@ from beanie import Document from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord from prefect import flow, get_run_logger +from prefect.states import Completed, State from pydantic import BaseModel, PastDatetime, PositiveInt from utils.db import init_db @@ -23,7 +24,7 @@ class JianshuLotteryWinRecordModel(Document): class Settings: name = "jianshu_lottery_win_records" - indexes = ("record_id", ) + indexes = ("record_id",) async def get_latest_stored_record_id() -> int: @@ -50,7 +51,7 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordMod @flow -async def main() -> None: +async def main() -> State: logger = get_run_logger() await init_db([JianshuLotteryWinRecordModel]) @@ -71,13 +72,13 @@ async def main() -> None: else: logger.warning("采集数据量达到上限") - logger.info(f"采集数据量:{len(data)}") - if data: await JianshuLotteryWinRecordModel.insert_many(data) else: logger.info("无数据,不执行保存操作") + return Completed(message=f"data_count={len(data)}") + fetch_jianshu_lottery_win_records_job = Job( func=main, diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 879c06e..e8fd7e2 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -4,6 +4,7 @@ from beanie import Document from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord from prefect import flow, get_run_logger +from prefect.states import Completed, State from pydantic import ( BaseModel, NonNegativeInt, @@ -74,7 +75,7 @@ def process_item( @flow -async def main() -> None: +async def main() -> State: logger = get_run_logger() fetch_time = get_fetch_time() @@ -88,7 +89,6 @@ async def main() -> None: buy_data.append(processed_item) await JPEPFTNTradeOrder.insert_many(buy_data) - logger.info(f"采集买单数据成功({len(buy_data)} 条)") sell_data: List[JPEPFTNTradeOrder] = [] async for item in FTNMacket().iter_orders(type="sell"): @@ -96,7 +96,11 @@ async def main() -> None: sell_data.append(processed_item) await JPEPFTNTradeOrder.insert_many(sell_data) - logger.info(f"采集卖单数据成功({len(sell_data)} 条)") + + return Completed( + message=f"fetch_time={fetch_time}, buy_data_count={len(buy_data)}, " + f"sell_data_count={len(sell_data)}" + ) fetch_jpep_ftn_trade_orders_job = Job( diff --git a/poetry.lock b/poetry.lock index 343a4bc..f2d26fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -970,13 +970,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a12" +version = "3.0.0a13" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a12-py3-none-any.whl", hash = "sha256:f2006220a05d56457f2d2e9ded00a515522f543aef3930f3e732bde3b9678e06"}, - {file = "jkit-3.0.0a12.tar.gz", hash = "sha256:cf9580ed9b82da0d177ba798c730def1c1bd369da28497c5f9346eb15acfdded"}, + {file = "jkit-3.0.0a13-py3-none-any.whl", hash = "sha256:cdaf86ceda1e65139c750c98cd0d5cc91f36d05804664cceccfe580395560216"}, + {file = "jkit-3.0.0a13.tar.gz", hash = "sha256:2cc74a013a0af8bfd9daa939362ac600f0e38723dbcd6ab023a54aea2b362e7c"}, ] [package.dependencies] @@ -1430,61 +1430,61 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "orjson" -version = "3.9.14" +version = "3.9.15" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.9.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:793f6c9448ab6eb7d4974b4dde3f230345c08ca6c7995330fbceeb43a5c8aa5e"}, - {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bc7928d161840096adc956703494b5c0193ede887346f028216cac0af87500"}, - {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58b36f54da759602d8e2f7dad958752d453dfe2c7122767bc7f765e17dc59959"}, - {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abcda41ecdc950399c05eff761c3de91485d9a70d8227cb599ad3a66afe93bcc"}, - {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df76ecd17b1b3627bddfd689faaf206380a1a38cc9f6c4075bd884eaedcf46c2"}, - {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d450a8e0656efb5d0fcb062157b918ab02dcca73278975b4ee9ea49e2fcf5bd5"}, - {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:95c03137b0cf66517c8baa65770507a756d3a89489d8ecf864ea92348e1beabe"}, - {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20837e10835c98973673406d6798e10f821e7744520633811a5a3d809762d8cc"}, - {file = "orjson-3.9.14-cp310-none-win32.whl", hash = "sha256:1f7b6f3ef10ae8e3558abb729873d033dbb5843507c66b1c0767e32502ba96bb"}, - {file = "orjson-3.9.14-cp310-none-win_amd64.whl", hash = "sha256:ea890e6dc1711aeec0a33b8520e395c2f3d59ead5b4351a788e06bf95fc7ba81"}, - {file = "orjson-3.9.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c19009ff37f033c70acd04b636380379499dac2cba27ae7dfc24f304deabbc81"}, - {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19cdea0664aec0b7f385be84986d4defd3334e9c3c799407686ee1c26f7b8251"}, - {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:135d518f73787ce323b1a5e21fb854fe22258d7a8ae562b81a49d6c7f826f2a3"}, - {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2cf1d0557c61c75e18cf7d69fb689b77896e95553e212c0cc64cf2087944b84"}, - {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7c11667421df2d8b18b021223505dcc3ee51be518d54e4dc49161ac88ac2b87"}, - {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eefc41ba42e75ed88bc396d8fe997beb20477f3e7efa000cd7a47eda452fbb2"}, - {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:917311d6a64d1c327c0dfda1e41f3966a7fb72b11ca7aa2e7a68fcccc7db35d9"}, - {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4dc1c132259b38d12c6587d190cd09cd76e3b5273ce71fe1372437b4cbc65f6f"}, - {file = "orjson-3.9.14-cp311-none-win32.whl", hash = "sha256:6f39a10408478f4c05736a74da63727a1ae0e83e3533d07b19443400fe8591ca"}, - {file = "orjson-3.9.14-cp311-none-win_amd64.whl", hash = "sha256:26280a7fcb62d8257f634c16acebc3bec626454f9ab13558bbf7883b9140760e"}, - {file = "orjson-3.9.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:08e722a8d06b13b67a51f247a24938d1a94b4b3862e40e0eef3b2e98c99cd04c"}, - {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2591faa0c031cf3f57e5bce1461cfbd6160f3f66b5a72609a130924917cb07d"}, - {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2450d87dd7b4f277f4c5598faa8b49a0c197b91186c47a2c0b88e15531e4e3e"}, - {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90903d2908158a2c9077a06f11e27545de610af690fb178fd3ba6b32492d4d1c"}, - {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce6f095eef0026eae76fc212f20f786011ecf482fc7df2f4c272a8ae6dd7b1ef"}, - {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:751250a31fef2bac05a2da2449aae7142075ea26139271f169af60456d8ad27a"}, - {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a1af21160a38ee8be3f4fcf24ee4b99e6184cadc7f915d599f073f478a94d2c"}, - {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:449bf090b2aa4e019371d7511a6ea8a5a248139205c27d1834bb4b1e3c44d936"}, - {file = "orjson-3.9.14-cp312-none-win_amd64.whl", hash = "sha256:a603161318ff699784943e71f53899983b7dee571b4dd07c336437c9c5a272b0"}, - {file = "orjson-3.9.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:814f288c011efdf8f115c5ebcc1ab94b11da64b207722917e0ceb42f52ef30a3"}, - {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88cafb100af68af3b9b29b5ccd09fdf7a48c63327916c8c923a94c336d38dd3"}, - {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba3518b999f88882ade6686f1b71e207b52e23546e180499be5bbb63a2f9c6e6"}, - {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978f416bbff9da8d2091e3cf011c92da68b13f2c453dcc2e8109099b2a19d234"}, - {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75fc593cf836f631153d0e21beaeb8d26e144445c73645889335c2247fcd71a0"}, - {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d1528db3c7554f9d6eeb09df23cb80dd5177ec56eeb55cc5318826928de506"}, - {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7183cc68ee2113b19b0b8714221e5e3b07b3ba10ca2bb108d78fd49cefaae101"}, - {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df3266d54246cb56b8bb17fa908660d2a0f2e3f63fbc32451ffc1b1505051d07"}, - {file = "orjson-3.9.14-cp38-none-win32.whl", hash = "sha256:7913079b029e1b3501854c9a78ad938ed40d61fe09bebab3c93e60ff1301b189"}, - {file = "orjson-3.9.14-cp38-none-win_amd64.whl", hash = "sha256:29512eb925b620e5da2fd7585814485c67cc6ba4fe739a0a700c50467a8a8065"}, - {file = "orjson-3.9.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bf597530544db27a8d76aced49cfc817ee9503e0a4ebf0109cd70331e7bbe0c"}, - {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac650d49366fa41fe702e054cb560171a8634e2865537e91f09a8d05ea5b1d37"}, - {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:236230433a9a4968ab895140514c308fdf9f607cb8bee178a04372b771123860"}, - {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3014ccbda9be0b1b5f8ea895121df7e6524496b3908f4397ff02e923bcd8f6dd"}, - {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac0c7eae7ad3a223bde690565442f8a3d620056bd01196f191af8be58a5248e1"}, - {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca33fdd0b38839b01912c57546d4f412ba7bfa0faf9bf7453432219aec2df07"}, - {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f75823cc1674a840a151e999a7dfa0d86c911150dd6f951d0736ee9d383bf415"}, - {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f52ac2eb49e99e7373f62e2a68428c6946cda52ce89aa8fe9f890c7278e2d3a"}, - {file = "orjson-3.9.14-cp39-none-win32.whl", hash = "sha256:0572f174f50b673b7df78680fb52cd0087a8585a6d06d295a5f790568e1064c6"}, - {file = "orjson-3.9.14-cp39-none-win_amd64.whl", hash = "sha256:ab90c02cb264250b8a58cedcc72ed78a4a257d956c8d3c8bebe9751b818dfad8"}, - {file = "orjson-3.9.14.tar.gz", hash = "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79"}, + {file = "orjson-3.9.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe"}, + {file = "orjson-3.9.15-cp310-none-win32.whl", hash = "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7"}, + {file = "orjson-3.9.15-cp310-none-win_amd64.whl", hash = "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb"}, + {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, + {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, + {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, + {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, + {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, + {file = "orjson-3.9.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1"}, + {file = "orjson-3.9.15-cp38-none-win32.whl", hash = "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5"}, + {file = "orjson-3.9.15-cp38-none-win_amd64.whl", hash = "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b"}, + {file = "orjson-3.9.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10"}, + {file = "orjson-3.9.15-cp39-none-win32.whl", hash = "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a"}, + {file = "orjson-3.9.15-cp39-none-win_amd64.whl", hash = "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7"}, + {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, ] [[package]] @@ -1756,19 +1756,19 @@ files = [ [[package]] name = "pydantic" -version = "2.6.1" +version = "2.6.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, - {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, + {file = "pydantic-2.6.2-py3-none-any.whl", hash = "sha256:37a5432e54b12fecaa1049c5195f3d860a10e01bdfd24f1840ef14bd0d3aeab3"}, + {file = "pydantic-2.6.2.tar.gz", hash = "sha256:a09be1c3d28f3abe37f8a78af58284b236a92ce520105ddc91a6d29ea1176ba7"}, ] [package.dependencies] annotated-types = ">=0.4.0" email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} -pydantic-core = "2.16.2" +pydantic-core = "2.16.3" typing-extensions = ">=4.6.1" [package.extras] @@ -1776,90 +1776,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.2" +version = "2.16.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, - {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, - {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, - {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, - {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, - {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, - {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, - {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, - {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, - {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, - {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, - {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, - {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, - {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, - {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, - {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, - {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, - {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, - {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, - {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, - {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, - {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, - {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, - {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, - {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, - {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, - {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, - {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, - {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, - {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, - {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, - {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, - {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, + {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, + {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, + {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, + {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, + {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, + {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, + {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, + {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, + {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, + {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, + {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, + {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, + {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, ] [package.dependencies] @@ -3024,4 +3024,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "6a0b2b076b3010227250036671f7f37ecc1f32e4469af9cf89623d674430b876" +content-hash = "a124842eabf8eeae56034567022f0ded37efc2f77172f91185aa9c54aab6e07d" diff --git a/pyproject.toml b/pyproject.toml index 14a3ea0..92612ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a12" +jkit = "^3.0.0a13" beanie = "^1.25.0" sspeedup = "^0.25.1" diff --git a/requirements-dev.txt b/requirements-dev.txt index e3a9ce3..a75612f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a12 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -57,7 +57,7 @@ motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" @@ -67,9 +67,9 @@ prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" -pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" +pydantic==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" pyright==1.1.351 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index ab5ad17..a5db0b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a12 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -56,7 +56,7 @@ mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.9.14 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" @@ -66,9 +66,9 @@ prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.16.2 ; python_version >= "3.8" and python_version < "4.0" -pydantic==2.6.1 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" +pydantic==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/utils/job_model.py b/utils/job_model.py index 75c2017..fbba2a8 100644 --- a/utils/job_model.py +++ b/utils/job_model.py @@ -1,14 +1,14 @@ from typing import Any, Callable, Coroutine, List, Optional, Union from msgspec import Struct -from prefect import Flow +from prefect import Flow, State from prefect.tasks import exponential_backoff from utils.config import CONFIG class Job(Struct): - func: Flow[[], Coroutine[Any, Any, None]] + func: Flow[[], Coroutine[Any, Any, State]] name: str version: str = CONFIG.version From 95c78f9fb2f8769f9fa25d2fc9704a1f4d6f1923 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 24 Feb 2024 23:09:15 +0800 Subject: [PATCH 25/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E4=BA=A4=E4=BA=92=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 45 ++++++------- jobs/fetch_assets_ranking_records.py | 35 ++++++----- jobs/fetch_daily_update_ranking_records.py | 37 +++++------ jobs/fetch_jianshu_lottery_win_records.py | 53 ++++++++-------- jobs/fetch_jpep_ftn_trade_orders.py | 63 ++++++++++--------- poetry.lock | 40 +----------- pyproject.toml | 1 - requirements-dev.txt | 3 - requirements.txt | 3 - utils/db.py | 9 +-- utils/document_model.py | 30 +++++++++ 11 files changed, 154 insertions(+), 165 deletions(-) create mode 100644 utils/document_model.py diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index a044be8..765dcb3 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -1,45 +1,50 @@ from datetime import date, datetime, timedelta from typing import List, Optional -from beanie import Document +from bson import ObjectId +from jkit._constraints import PositiveFloat, PositiveInt from jkit.article import Article from jkit.config import CONFIG from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State -from pydantic import BaseModel, Field, PastDate, PositiveFloat, PositiveInt -from utils.db import init_db +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) from utils.job_model import Job +COLLECTION = DB.article_earning_ranking_records + -class ArticleField(BaseModel): +class ArticleField(Field, **FIELD_OBJECT_CONFIG): title: Optional[str] slug: Optional[str] -class AuthorField(BaseModel): +class AuthorField(Field, **FIELD_OBJECT_CONFIG): id: Optional[PositiveInt] slug: Optional[str] name: Optional[str] -class EarningField(BaseModel): - to_author: PositiveFloat = Field(serialization_alias="toAuthor") - to_voter: PositiveFloat = Field(serialization_alias="toVoter") +class EarningField(Field, **FIELD_OBJECT_CONFIG): + to_author: PositiveFloat + to_voter: PositiveFloat -class ArticleEarningRankingRecordModel(Document): - date: PastDate +class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date ranking: PositiveInt article: ArticleField author: AuthorField earning: EarningField - class Settings: - name = "article_earning_ranking_records" - async def get_article_author(article_slug: str, /) -> User: article = Article.from_slug(article_slug)._as_checked() @@ -49,7 +54,7 @@ async def get_article_author(article_slug: str, /) -> User: async def process_item( item: RecordField, /, *, target_date: date -) -> ArticleEarningRankingRecordModel: +) -> ArticleEarningRankingRecordDocument: logger = get_run_logger() if item.slug: @@ -64,7 +69,8 @@ async def process_item( author_id = None author_slug = None - return ArticleEarningRankingRecordModel( + return ArticleEarningRankingRecordDocument( + _id=ObjectId(), date=target_date, ranking=item.ranking, article=ArticleField( @@ -85,19 +91,14 @@ async def process_item( @flow async def main() -> State: - logger = get_run_logger() - - await init_db([ArticleEarningRankingRecordModel]) - logger.info("初始化 ODM 模型成功") - target_date = datetime.now().date() - timedelta(days=1) - data: List[ArticleEarningRankingRecordModel] = [] + data: List[ArticleEarningRankingRecordDocument] = [] async for item in ArticleEarningRanking(target_date): processed_item = await process_item(item, target_date=target_date) data.append(processed_item) - await ArticleEarningRankingRecordModel.insert_many(data) + await COLLECTION.insert_many(x.to_dict() for x in data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 76161ff..6f54058 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -1,25 +1,33 @@ from datetime import date, datetime from typing import List, Optional -from beanie import Document +from bson import ObjectId +from jkit._constraints import NonNegativeFloat, PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord from prefect import flow, get_run_logger from prefect.states import Completed, State -from pydantic import BaseModel, NonNegativeFloat, PositiveFloat, PositiveInt -from utils.db import init_db +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) from utils.job_model import Job +COLLECTION = DB.assets_ranking_records + -class UserInfoField(BaseModel): +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): id: Optional[PositiveInt] slug: Optional[str] name: Optional[str] -class AssetsRankingRecordModel(Document): +class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt @@ -29,13 +37,10 @@ class AssetsRankingRecordModel(Document): user_info: UserInfoField - class Settings: - name = "assets_ranking_records" - async def process_item( item: AssetsRankingRecord, /, *, target_date: date -) -> AssetsRankingRecordModel: +) -> AssetsRankingRecordDocument: logger = get_run_logger() if item.user_info.slug: @@ -61,7 +66,8 @@ async def process_item( fp_amount = None ftn_amount = None - return AssetsRankingRecordModel( + return AssetsRankingRecordDocument( + _id=ObjectId(), date=target_date, ranking=item.ranking, fp_amount=fp_amount, @@ -77,14 +83,9 @@ async def process_item( @flow async def main() -> State: - logger = get_run_logger() - - await init_db([AssetsRankingRecordModel]) - logger.info("初始化 ODM 模型成功") - target_date = datetime.now().date() - data: List[AssetsRankingRecordModel] = [] + data: List[AssetsRankingRecordDocument] = [] async for item in AssetsRanking(): processed_item = await process_item(item, target_date=target_date) data.append(processed_item) @@ -92,7 +93,7 @@ async def main() -> State: if len(data) == 1000: break - await AssetsRankingRecordModel.insert_many(data) + await COLLECTION.insert_many(x.to_dict() for x in data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index 895ec6a..8171791 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -1,35 +1,41 @@ from datetime import date, datetime from typing import List -from beanie import Document +from bson import ObjectId +from jkit._constraints import PositiveInt from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord -from prefect import flow, get_run_logger +from prefect import flow from prefect.states import Completed, State -from pydantic import BaseModel, PositiveInt -from utils.db import init_db +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) from utils.job_model import Job +COLLECTION = DB.daily_update_ranking_records + -class UserInfoField(BaseModel): +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): slug: str name: str -class DailyUpdateRankingRecordModel(Document): +class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt days: PositiveInt user_info: UserInfoField - class Settings: - name = "daily_update_ranking_records" - def process_item( item: DailyUpdateRankingRecord, /, *, current_date: date -) -> DailyUpdateRankingRecordModel: - return DailyUpdateRankingRecordModel( +) -> DailyUpdateRankingRecordDocument: + return DailyUpdateRankingRecordDocument( + _id=ObjectId(), date=current_date, ranking=item.ranking, days=item.days, @@ -42,19 +48,14 @@ def process_item( @flow async def main() -> State: - logger = get_run_logger() - current_date = datetime.now().date() - await init_db([DailyUpdateRankingRecordModel]) - logger.info("初始化 ODM 模型成功") - - data: List[DailyUpdateRankingRecordModel] = [] + data: List[DailyUpdateRankingRecordDocument] = [] async for item in DailyUpdateRanking(): processed_item = process_item(item, current_date=current_date) data.append(processed_item) - await DailyUpdateRankingRecordModel.insert_many(data) + await COLLECTION.insert_many(x.to_dict() for x in data) return Completed(message=f"data_count={len(data)}") diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 86d9578..b52a085 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -1,45 +1,51 @@ +from datetime import datetime from typing import List -from beanie import Document +from jkit._constraints import PositiveInt from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord from prefect import flow, get_run_logger from prefect.states import Completed, State -from pydantic import BaseModel, PastDatetime, PositiveInt - -from utils.db import init_db +from pymongo import DESCENDING + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) from utils.job_model import Job +COLLECTION = DB.jianshu_lottery_win_records + -class UserInfoField(BaseModel): +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): id: PositiveInt slug: str name: str -class JianshuLotteryWinRecordModel(Document): - record_id: PositiveInt - time: PastDatetime +class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + _id: PositiveInt + time: datetime award_name: str user_info: UserInfoField - class Settings: - name = "jianshu_lottery_win_records" - indexes = ("record_id",) - async def get_latest_stored_record_id() -> int: - latest_data = ( - await JianshuLotteryWinRecordModel.find().sort("-record_id").first_or_none() - ) - if not latest_data: + try: + latest_data = JianshuLotteryWinRecordDocument.from_dict( + await COLLECTION.find().sort("_id", DESCENDING).__anext__() + ) + except StopAsyncIteration: return 0 - return latest_data.record_id + return latest_data._id -def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordModel: - return JianshuLotteryWinRecordModel( - record_id=item.id, +def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: + return JianshuLotteryWinRecordDocument( + _id=item.id, time=item.time, award_name=item.award_name, user_info=UserInfoField( @@ -54,15 +60,12 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordMod async def main() -> State: logger = get_run_logger() - await init_db([JianshuLotteryWinRecordModel]) - logger.info("初始化 ODM 模型成功") - stop_id = await get_latest_stored_record_id() logger.info(f"获取到最新的已存储 ID:{stop_id}") if stop_id == 0: logger.warning("数据库中没有记录") - data: List[JianshuLotteryWinRecordModel] = [] + data: List[JianshuLotteryWinRecordDocument] = [] async for item in JianshuLottery().iter_win_records(): if item.id == stop_id: break @@ -73,7 +76,7 @@ async def main() -> State: logger.warning("采集数据量达到上限") if data: - await JianshuLotteryWinRecordModel.insert_many(data) + await COLLECTION.insert_many(x.to_dict() for x in data) else: logger.info("无数据,不执行保存操作") diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index e8fd7e2..26f585c 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -1,23 +1,29 @@ from datetime import datetime -from typing import List, Optional +from typing import List, Literal, Optional -from beanie import Document -from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord -from prefect import flow, get_run_logger -from prefect.states import Completed, State -from pydantic import ( - BaseModel, +from bson import ObjectId +from jkit._constraints import ( NonNegativeInt, - PastDatetime, PositiveFloat, PositiveInt, ) +from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord +from prefect import flow +from prefect.states import Completed, State -from utils.db import init_db +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) from utils.job_model import Job +COLLECTION = DB.jpep_ftn_trade_orders -class PublisherInfoField(BaseModel): + +class PublisherInfoField(Field, **FIELD_OBJECT_CONFIG): is_anonymous: bool id: Optional[PositiveInt] name: Optional[str] @@ -25,9 +31,10 @@ class PublisherInfoField(BaseModel): credit: Optional[NonNegativeInt] -class JPEPFTNTradeOrder(Document): +class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): fetch_time: datetime order_id: PositiveInt + type: Literal["buy", "sell"] price: PositiveFloat total_amount: PositiveInt @@ -36,13 +43,10 @@ class JPEPFTNTradeOrder(Document): minimum_trade_amount: PositiveInt traded_count: NonNegativeInt - publish_time: PastDatetime + publish_time: datetime publisher_info: PublisherInfoField - class Settings: - name = "jpep_ftn_trade_orders" - def get_fetch_time() -> datetime: current_dt = datetime.now() @@ -52,9 +56,15 @@ def get_fetch_time() -> datetime: def process_item( - item: FTNMacketOrderRecord, /, *, fetch_time: datetime -) -> JPEPFTNTradeOrder: - return JPEPFTNTradeOrder( + item: FTNMacketOrderRecord, + /, + *, + fetch_time: datetime, + type: Literal["buy", "sell"], # noqa: A002 +) -> JPEPFTNTradeOrderDocument: + return JPEPFTNTradeOrderDocument( + _id=ObjectId(), + type=type, fetch_time=fetch_time, order_id=item.id, price=item.price, @@ -76,26 +86,21 @@ def process_item( @flow async def main() -> State: - logger = get_run_logger() - fetch_time = get_fetch_time() - await init_db([JPEPFTNTradeOrder]) - logger.info("初始化 ODM 模型成功") - - buy_data: List[JPEPFTNTradeOrder] = [] + buy_data: List[JPEPFTNTradeOrderDocument] = [] async for item in FTNMacket().iter_orders(type="buy"): - processed_item = process_item(item, fetch_time=fetch_time) + processed_item = process_item(item, fetch_time=fetch_time, type="buy") buy_data.append(processed_item) - await JPEPFTNTradeOrder.insert_many(buy_data) + await COLLECTION.insert_many(x.to_dict() for x in buy_data) - sell_data: List[JPEPFTNTradeOrder] = [] + sell_data: List[JPEPFTNTradeOrderDocument] = [] async for item in FTNMacket().iter_orders(type="sell"): - processed_item = process_item(item, fetch_time=fetch_time) + processed_item = process_item(item, fetch_time=fetch_time, type="sell") sell_data.append(processed_item) - await JPEPFTNTradeOrder.insert_many(sell_data) + await COLLECTION.insert_many(x.to_dict() for x in sell_data) return Completed( message=f"fetch_time={fetch_time}, buy_data_count={len(buy_data)}, " diff --git a/poetry.lock b/poetry.lock index f2d26fe..d2ba0d2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -222,30 +222,6 @@ files = [ [package.extras] tzdata = ["tzdata"] -[[package]] -name = "beanie" -version = "1.25.0" -description = "Asynchronous Python ODM for MongoDB" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "beanie-1.25.0-py3-none-any.whl", hash = "sha256:4436ac740718ccd62b21576778679ac972359fce2938557890c576adbbf5e244"}, - {file = "beanie-1.25.0.tar.gz", hash = "sha256:f153866b9ba015274102e10a397602d088fc039b705bd806cb447c898cd2979b"}, -] - -[package.dependencies] -click = ">=7" -lazy-model = "0.2.0" -motor = ">=2.5.0,<4.0.0" -pydantic = ">=1.10,<3.0" -toml = "*" -typing-extensions = {version = ">=4.7", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Markdown (>=3.3)", "Pygments (>=2.8.0)", "jinja2 (>=3.0.3)", "mkdocs (>=1.4)", "mkdocs-material (>=9.0)", "pydoc-markdown (>=4.8)"] -queue = ["beanie-batteries-queue (>=0.2)"] -test = ["asgi-lifespan (>=1.0.1)", "dnspython (>=2.1.0)", "fastapi (>=0.100)", "flake8 (>=3)", "httpx (>=0.23.0)", "pre-commit (>=2.3.0)", "pydantic-extra-types (>=2)", "pydantic-settings (>=2)", "pydantic[email]", "pyright (>=0)", "pytest (>=6.0.0)", "pytest-asyncio (>=0.21.0)", "pytest-cov (>=2.8.1)"] - [[package]] name = "cachetools" version = "5.3.2" @@ -1074,20 +1050,6 @@ websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] adal = ["adal (>=1.0.2)"] -[[package]] -name = "lazy-model" -version = "0.2.0" -description = "" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "lazy-model-0.2.0.tar.gz", hash = "sha256:57c0e91e171530c4fca7aebc3ac05a163a85cddd941bf7527cc46c0ddafca47c"}, - {file = "lazy_model-0.2.0-py3-none-any.whl", hash = "sha256:5a3241775c253e36d9069d236be8378288a93d4fc53805211fd152e04cc9c342"}, -] - -[package.dependencies] -pydantic = ">=1.9.0" - [[package]] name = "lxml" version = "5.1.0" @@ -3024,4 +2986,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "a124842eabf8eeae56034567022f0ded37efc2f77172f91185aa9c54aab6e07d" +content-hash = "da6597a11cb3d8f6e587ec8aa35d1e9b0827496a9ffba20b352c03cf434e2b46" diff --git a/pyproject.toml b/pyproject.toml index 92612ed..3d5ebc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,6 @@ readme = "README.md" python = "^3.8" prefect = "^2.16.0" jkit = "^3.0.0a13" -beanie = "^1.25.0" sspeedup = "^0.25.1" [tool.poetry.group.dev.dependencies] diff --git a/requirements-dev.txt b/requirements-dev.txt index a75612f..fb10d23 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,7 +8,6 @@ async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -beanie==1.25.0 ; python_version >= "3.8" and python_version < "4.0" cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" @@ -46,7 +45,6 @@ jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -lazy-model==0.2.0 ; python_version >= "3.8" and python_version < "4.0" lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -68,7 +66,6 @@ pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index a5db0b0..8fb8a8a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,6 @@ async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -beanie==1.25.0 ; python_version >= "3.8" and python_version < "4.0" cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" @@ -46,7 +45,6 @@ jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -lazy-model==0.2.0 ; python_version >= "3.8" and python_version < "4.0" lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -67,7 +65,6 @@ pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/utils/db.py b/utils/db.py index 2d85c23..2a3e112 100644 --- a/utils/db.py +++ b/utils/db.py @@ -1,13 +1,6 @@ -from typing import List, Optional, Type - -from beanie import Document, init_beanie from motor.motor_asyncio import AsyncIOMotorClient from utils.config import CONFIG _CLIENT = AsyncIOMotorClient(CONFIG.mongodb.host, CONFIG.mongodb.port) -_DB = _CLIENT[CONFIG.mongodb.database] - - -async def init_db(models: Optional[List[Type[Document]]]) -> None: - await init_beanie(database=_DB, document_models=models) # type: ignore +DB = _CLIENT[CONFIG.mongodb.database] diff --git a/utils/document_model.py b/utils/document_model.py new file mode 100644 index 0000000..96ca77a --- /dev/null +++ b/utils/document_model.py @@ -0,0 +1,30 @@ +from typing import Any, Dict + +from bson import ObjectId +from msgspec import Struct, convert, to_builtins +from typing_extensions import Self + +FIELD_OBJECT_CONFIG = { + "kw_only": True, + "rename": "camel", +} + +DOCUMENT_OBJECT_CONFIG = { + "kw_only": True, + "rename": "camel", +} + + +class Field(Struct, **FIELD_OBJECT_CONFIG): + pass + + +class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): + _id: ObjectId + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> Self: + return convert(data, type=cls) + + def to_dict(self) -> Dict[str, Any]: + return to_builtins(self, builtin_types=(ObjectId,)) From 86bbe5f2b6c6b7c27f7a185fece1e944766d2f48 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 24 Feb 2024 23:35:06 +0800 Subject: [PATCH 26/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=B7=A5=E4=BD=9C=E6=B5=81=E8=BF=90=E8=A1=8C=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 47 ++++++++------- jobs/fetch_assets_ranking_records.py | 58 +++++++++++-------- jobs/fetch_jianshu_lottery_win_records.py | 2 +- 3 files changed, 61 insertions(+), 46 deletions(-) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 765dcb3..b315fd4 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -1,12 +1,11 @@ from datetime import date, datetime, timedelta -from typing import List, Optional +from typing import List, Optional, Tuple from bson import ObjectId from jkit._constraints import PositiveFloat, PositiveInt -from jkit.article import Article from jkit.config import CONFIG +from jkit.exceptions import ResourceUnavailableError from jkit.ranking.article_earning import ArticleEarningRanking, RecordField -from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State @@ -46,28 +45,36 @@ class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): earning: EarningField -async def get_article_author(article_slug: str, /) -> User: - article = Article.from_slug(article_slug)._as_checked() - article_info = await article.info - return article_info.author_info.to_user_obj() - - -async def process_item( - item: RecordField, /, *, target_date: date -) -> ArticleEarningRankingRecordDocument: +async def get_author_id_and_slug( + item: RecordField, / +) -> Tuple[Optional[int], Optional[str]]: logger = get_run_logger() - if item.slug: + if not item.slug: + logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") + return None, None + + try: # TODO: 临时解决简书系统问题数据负数导致的报错 CONFIG.data_validation.enabled = False - author = await get_article_author(item.slug) - author_id = await author.id - author_slug = author.slug + article_obj = item.to_article_obj() + author = (await article_obj.info).author_info.to_user_obj() + + result = (await author.id, author.slug) CONFIG.data_validation.enabled = True - else: - logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") - author_id = None - author_slug = None + + return result + except ResourceUnavailableError: + logger.warning( + f"文章或作者状态异常,跳过采集文章与作者信息 ranking={item.ranking}" + ) + return None, None + + +async def process_item( + item: RecordField, /, *, target_date: date +) -> ArticleEarningRankingRecordDocument: + author_id, author_slug = await get_author_id_and_slug(item) return ArticleEarningRankingRecordDocument( _id=ObjectId(), diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 6f54058..9997e78 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -1,11 +1,12 @@ from datetime import date, datetime -from typing import List, Optional +from typing import List, Optional, Tuple from bson import ObjectId from jkit._constraints import NonNegativeFloat, PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord +from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State @@ -38,33 +39,38 @@ class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_info: UserInfoField +async def get_fp_ftn_amount( + item: AssetsRankingRecord, / +) -> Tuple[Optional[float], Optional[float]]: + logger = get_run_logger() + + if not item.user_info.slug: + logger.warning( + f"用户已注销或被封禁,跳过采集简书钻与简书贝信息 ranking={item.ranking}" + ) + return None, None + + try: + # TODO: 临时解决简书系统问题数据负数导致的报错 + CONFIG.data_validation.enabled = False + # 此处使用用户 Slug 初始化用户对象,以对其进行可用性检查 + user_obj = User.from_slug(item.user_info.slug) + fp_amount = await user_obj.fp_amount + ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) + CONFIG.data_validation.enabled = True + + return fp_amount, ftn_amount + except ResourceUnavailableError: + logger.warning( + f"用户已注销或被封禁,跳过采集简书钻与简书贝信息 ranking={item.ranking}" + ) + return None, None + + async def process_item( item: AssetsRankingRecord, /, *, target_date: date ) -> AssetsRankingRecordDocument: - logger = get_run_logger() - - if item.user_info.slug: - user_obj = item.user_info.to_user_obj() - try: - # TODO: 强制重新检查 - # TODO: 临时解决简书系统问题数据负数导致的报错 - CONFIG.resource_check.force_check_safe_data = True - CONFIG.data_validation.enabled = False - fp_amount = await user_obj.fp_amount - ftn_amount = abs(round(item.assets_amount - fp_amount, 3)) - CONFIG.data_validation.enabled = True - CONFIG.resource_check.force_check_safe_data = False - except ResourceUnavailableError: - logger.warning( - f"用户已注销或被封禁,跳过采集简书钻与简书贝信息 ranking={item.ranking}" - ) - fp_amount = None - ftn_amount = None - - else: - logger.warning(f"用户不存在,跳过采集简书钻与简书贝信息 ranking={item.ranking}") - fp_amount = None - ftn_amount = None + fp_amount, ftn_amount = await get_fp_ftn_amount(item) return AssetsRankingRecordDocument( _id=ObjectId(), @@ -86,6 +92,8 @@ async def main() -> State: target_date = datetime.now().date() data: List[AssetsRankingRecordDocument] = [] + # FIXME: jkit.exceptions.ValidationError: Expected `str` matching regex + # '^https?:\\/\\/.*\\.jianshu\\.io\\/[\\w%-\\/]*\\/?$' - at `$.user_info.avatar_url` async for item in AssetsRanking(): processed_item = await process_item(item, target_date=target_date) data.append(processed_item) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index b52a085..11b0da2 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -26,7 +26,7 @@ class UserInfoField(Field, **FIELD_OBJECT_CONFIG): class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - _id: PositiveInt + _id: PositiveInt # type: ignore time: datetime award_name: str user_info: UserInfoField From 59cb287261f0054ee8ce902c59c7eff44009f9b2 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 08:42:25 +0800 Subject: [PATCH 27/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=AE=9A=E4=B9=89=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 57 +++++-------------- jobs/fetch_article_earning_ranking_records.py | 19 ++++--- jobs/fetch_assets_ranking_records.py | 19 ++++--- jobs/fetch_daily_update_ranking_records.py | 19 ++++--- jobs/fetch_jianshu_lottery_win_records.py | 19 ++++--- jobs/fetch_jpep_ftn_trade_orders.py | 19 ++++--- utils/config_generators.py | 31 ++++++++++ utils/job_model.py | 24 -------- 8 files changed, 105 insertions(+), 102 deletions(-) create mode 100644 utils/config_generators.py delete mode 100644 utils/job_model.py diff --git a/jobs/__init__.py b/jobs/__init__.py index 64603ac..e05b662 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -1,56 +1,27 @@ -from typing import Any, Coroutine, Tuple +from importlib import import_module +from typing import Any, Coroutine, Set, Tuple -from prefect import Flow -from prefect.client.schemas.schedules import CronSchedule from prefect.deployments.runner import RunnerDeployment -from prefect.states import State -from jobs.fetch_article_earning_ranking_records import ( - fetch_article_earning_ranking_records_job, -) -from jobs.fetch_assets_ranking_records import fetch_assets_ranking_records_job -from jobs.fetch_daily_update_ranking_records import ( - fetch_daily_update_ranking_records_job, -) -from jobs.fetch_jianshu_lottery_win_records import fetch_jianshu_lottery_win_records_job -from jobs.fetch_jpep_ftn_trade_orders import fetch_jpep_ftn_trade_orders_job -from utils.job_model import Job - -FlowType = Flow[[], Coroutine[Any, Any, State]] DeploymentType = Coroutine[Any, Any, RunnerDeployment] -def create_flow(job: Job) -> FlowType: - job.func.name = job.name - job.func.version = job.version +def import_deployment(path: str) -> DeploymentType: + module_name, func_name = path.split(":") - job.func.retries = job.retries - job.func.retry_delay_seconds = job.retry_delay - job.func.timeout_seconds = job.timeout + module = import_module(module_name) + return getattr(module, func_name) - return job.func +DEPLOYMENT_PATHS: Set[str] = { + "jobs.fetch_article_earning_ranking_records:deployment", + "jobs.fetch_assets_ranking_records:deployment", + "jobs.fetch_daily_update_ranking_records:deployment", + "jobs.fetch_jianshu_lottery_win_records:deployment", + "jobs.fetch_jpep_ftn_trade_orders:deployment", +} -def create_deployment(job: Job, flow: FlowType) -> DeploymentType: - return flow.to_deployment( - name=f"JFetcher - {flow.name}", - version=job.version, - schedule=CronSchedule( - cron=job.cron, - timezone="Asia/Shanghai", - ), - ) - - -JOBS: Tuple[Job, ...] = ( - fetch_article_earning_ranking_records_job, - fetch_assets_ranking_records_job, - fetch_daily_update_ranking_records_job, - fetch_jianshu_lottery_win_records_job, - fetch_jpep_ftn_trade_orders_job, -) -FLOWS: Tuple[FlowType, ...] = tuple(map(create_flow, JOBS)) DEPLOYMENTS: Tuple[DeploymentType, ...] = tuple( - (create_deployment(job, flow) for job, flow in zip(JOBS, FLOWS)) + import_deployment(x) for x in DEPLOYMENT_PATHS ) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index b315fd4..cdd7e81 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -9,6 +9,7 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State +from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -16,7 +17,6 @@ Documemt, Field, ) -from utils.job_model import Job COLLECTION = DB.article_earning_ranking_records @@ -96,8 +96,12 @@ async def process_item( ) -@flow -async def main() -> State: +@flow( + **generate_flow_config( + name="采集文章收益排行榜记录", + ) +) +async def flow_func() -> State: target_date = datetime.now().date() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] @@ -110,8 +114,9 @@ async def main() -> State: return Completed(message=f"target_date={target_date}, data_count={len(data)}") -fetch_article_earning_ranking_records_job = Job( - func=main, - name="采集文章收益排行榜记录", - cron="0 1 * * *", +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集文章收益排行榜记录", + cron="0 1 * * *", + ) ) diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 9997e78..87fc3fe 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -10,6 +10,7 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State +from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -17,7 +18,6 @@ Documemt, Field, ) -from utils.job_model import Job COLLECTION = DB.assets_ranking_records @@ -87,8 +87,12 @@ async def process_item( ) -@flow -async def main() -> State: +@flow( + **generate_flow_config( + name="采集资产排行榜记录", + ) +) +async def flow_func() -> State: target_date = datetime.now().date() data: List[AssetsRankingRecordDocument] = [] @@ -106,8 +110,9 @@ async def main() -> State: return Completed(message=f"target_date={target_date}, data_count={len(data)}") -fetch_assets_ranking_records_job = Job( - func=main, - name="采集资产排行榜记录", - cron="0 1 * * *", +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集资产排行榜记录", + cron="0 1 * * *", + ) ) diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index 8171791..c98302b 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -7,6 +7,7 @@ from prefect import flow from prefect.states import Completed, State +from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -14,7 +15,6 @@ Documemt, Field, ) -from utils.job_model import Job COLLECTION = DB.daily_update_ranking_records @@ -46,8 +46,12 @@ def process_item( ) -@flow -async def main() -> State: +@flow( + **generate_flow_config( + name="采集日更排行榜记录", + ) +) +async def flow_func() -> State: current_date = datetime.now().date() data: List[DailyUpdateRankingRecordDocument] = [] @@ -60,8 +64,9 @@ async def main() -> State: return Completed(message=f"data_count={len(data)}") -fetch_daily_update_ranking_records_job = Job( - func=main, - name="采集日更排行榜记录", - cron="0 1 * * *", +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集日更排行榜记录", + cron="0 1 * * *", + ) ) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 11b0da2..8ecf3d6 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -7,6 +7,7 @@ from prefect.states import Completed, State from pymongo import DESCENDING +from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -14,7 +15,6 @@ Documemt, Field, ) -from utils.job_model import Job COLLECTION = DB.jianshu_lottery_win_records @@ -56,8 +56,12 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDoc ) -@flow -async def main() -> State: +@flow( + **generate_flow_config( + name="采集简书大转盘抽奖中奖记录", + ) +) +async def flow_func() -> State: logger = get_run_logger() stop_id = await get_latest_stored_record_id() @@ -83,8 +87,9 @@ async def main() -> State: return Completed(message=f"data_count={len(data)}") -fetch_jianshu_lottery_win_records_job = Job( - func=main, - name="采集简书大转盘抽奖中奖记录", - cron="*/10 * * * *", +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集简书大转盘抽奖中奖记录", + cron="*/10 * * * *", + ) ) diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 26f585c..ac4d429 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -11,6 +11,7 @@ from prefect import flow from prefect.states import Completed, State +from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -18,7 +19,6 @@ Documemt, Field, ) -from utils.job_model import Job COLLECTION = DB.jpep_ftn_trade_orders @@ -84,8 +84,12 @@ def process_item( ) -@flow -async def main() -> State: +@flow( + **generate_flow_config( + name="采集简书积分兑换平台简书贝交易挂单", + ), +) +async def flow_func() -> State: fetch_time = get_fetch_time() buy_data: List[JPEPFTNTradeOrderDocument] = [] @@ -108,8 +112,9 @@ async def main() -> State: ) -fetch_jpep_ftn_trade_orders_job = Job( - func=main, - name="采集简书积分兑换平台简书贝交易挂单", - cron="*/10 * * * *", +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集简书积分兑换平台简书贝交易挂单", + cron="*/10 * * * *", + ) ) diff --git a/utils/config_generators.py b/utils/config_generators.py new file mode 100644 index 0000000..499c6d3 --- /dev/null +++ b/utils/config_generators.py @@ -0,0 +1,31 @@ +from typing import Any, Dict, Union + +from prefect.client.schemas.schedules import CronSchedule + +from utils.config import CONFIG + + +def generate_flow_config( + name: str, + retries: int = 1, + retry_delay_seconds: Union[int, float] = 5, + timeout: int = 3600, +) -> Dict[str, Any]: + return { + "name": name, + "version": CONFIG.version, + "retries": retries, + "retry_delay_seconds": retry_delay_seconds, + "timeout_seconds": timeout, + } + + +def generate_deployment_config(name: str, cron: str) -> Dict[str, Any]: + return { + "name": f"JFetcher - {name}", + "version": CONFIG.version, + "schedule": CronSchedule( + cron=cron, + timezone="Asia/Shanghai", + ), + } diff --git a/utils/job_model.py b/utils/job_model.py deleted file mode 100644 index fbba2a8..0000000 --- a/utils/job_model.py +++ /dev/null @@ -1,24 +0,0 @@ -from typing import Any, Callable, Coroutine, List, Optional, Union - -from msgspec import Struct -from prefect import Flow, State -from prefect.tasks import exponential_backoff - -from utils.config import CONFIG - - -class Job(Struct): - func: Flow[[], Coroutine[Any, Any, State]] - - name: str - version: str = CONFIG.version - cron: Optional[str] = None - - retries: int = 3 - retry_delay: Union[ - int, - float, - List[Union[int, float]], - Callable[[int], List[Union[int, float]]], - ] = exponential_backoff(10) - timeout: int = 3600 From 705546e722a2f7d6439fe7e6aa5b2d4d274b058e Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 08:48:48 +0800 Subject: [PATCH 28/93] =?UTF-8?q?feat:=20=E6=8B=86=E5=88=86=E8=B4=9D?= =?UTF-8?q?=E5=B8=82=E6=8C=82=E5=8D=95=E4=BF=A1=E6=81=AF=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E4=B8=BA=E4=B9=B0=E5=8D=96=E5=8D=95=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 3 ++- jobs/fetch_jpep_ftn_trade_orders.py | 37 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/jobs/__init__.py b/jobs/__init__.py index e05b662..c78ff80 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -18,7 +18,8 @@ def import_deployment(path: str) -> DeploymentType: "jobs.fetch_assets_ranking_records:deployment", "jobs.fetch_daily_update_ranking_records:deployment", "jobs.fetch_jianshu_lottery_win_records:deployment", - "jobs.fetch_jpep_ftn_trade_orders:deployment", + "jobs.fetch_jpep_ftn_trade_orders:buy_deployment", + "jobs.fetch_jpep_ftn_trade_orders:sell_deployment", } diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index ac4d429..3d8735a 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -89,32 +89,31 @@ def process_item( name="采集简书积分兑换平台简书贝交易挂单", ), ) -async def flow_func() -> State: +async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 fetch_time = get_fetch_time() - buy_data: List[JPEPFTNTradeOrderDocument] = [] - async for item in FTNMacket().iter_orders(type="buy"): - processed_item = process_item(item, fetch_time=fetch_time, type="buy") - buy_data.append(processed_item) + data: List[JPEPFTNTradeOrderDocument] = [] + async for item in FTNMacket().iter_orders(type=type): + processed_item = process_item(item, fetch_time=fetch_time, type=type) + data.append(processed_item) - await COLLECTION.insert_many(x.to_dict() for x in buy_data) + await COLLECTION.insert_many(x.to_dict() for x in data) - sell_data: List[JPEPFTNTradeOrderDocument] = [] - async for item in FTNMacket().iter_orders(type="sell"): - processed_item = process_item(item, fetch_time=fetch_time, type="sell") - sell_data.append(processed_item) + return Completed(message=f"fetch_time={fetch_time}, data_count={len(data)}") - await COLLECTION.insert_many(x.to_dict() for x in sell_data) - - return Completed( - message=f"fetch_time={fetch_time}, buy_data_count={len(buy_data)}, " - f"sell_data_count={len(sell_data)}" - ) +buy_deployment = flow_func.to_deployment( + parameters={"type": "buy"}, + **generate_deployment_config( + name="采集简书积分兑换平台简书贝交易买单", + cron="*/10 * * * *", + ), +) -deployment = flow_func.to_deployment( +sell_deployment = flow_func.to_deployment( + parameters={"type": "sell"}, **generate_deployment_config( - name="采集简书积分兑换平台简书贝交易挂单", + name="采集简书积分兑换平台简书贝交易卖单", cron="*/10 * * * *", - ) + ), ) From ae4bf0132f237f0b420d80e35b93d35b91794f4c Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 08:52:30 +0800 Subject: [PATCH 29/93] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=A8=A1=E5=9E=8B=E6=97=B6=E8=BF=9B=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 2 +- jobs/fetch_assets_ranking_records.py | 2 +- jobs/fetch_daily_update_ranking_records.py | 2 +- jobs/fetch_jianshu_lottery_win_records.py | 2 +- jobs/fetch_jpep_ftn_trade_orders.py | 2 +- utils/document_model.py | 3 +++ 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index cdd7e81..fda2801 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -93,7 +93,7 @@ async def process_item( to_author=item.fp_to_author_anount, to_voter=item.fp_to_voter_amount, ), - ) + ).validate() @flow( diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 87fc3fe..fe30c3d 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -84,7 +84,7 @@ async def process_item( slug=item.user_info.slug, name=item.user_info.name, ), - ) + ).validate() @flow( diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index c98302b..bed61c9 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -43,7 +43,7 @@ def process_item( slug=item.user_info.slug, name=item.user_info.name, ), - ) + ).validate() @flow( diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 8ecf3d6..02acdd2 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -53,7 +53,7 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDoc slug=item.user_info.slug, name=item.user_info.name, ), - ) + ).validate() @flow( diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 3d8735a..97b95aa 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -81,7 +81,7 @@ def process_item( hashed_name=item.publisher_info.hashed_name, credit=item.publisher_info.credit, ), - ) + ).validate() @flow( diff --git a/utils/document_model.py b/utils/document_model.py index 96ca77a..686efed 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -22,6 +22,9 @@ class Field(Struct, **FIELD_OBJECT_CONFIG): class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): _id: ObjectId + def validate(self) -> Self: + return convert(to_builtins(self), type=self.__class__) + @classmethod def from_dict(cls, data: Dict[str, Any]) -> Self: return convert(data, type=cls) From 4cca9e2193e60d0430a9797f713b2a06956becdc Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 08:59:13 +0800 Subject: [PATCH 30/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=A8=A1=E5=9E=8B=20ObjectId=20=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/document_model.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/utils/document_model.py b/utils/document_model.py index 686efed..2345f3a 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -23,7 +23,10 @@ class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): _id: ObjectId def validate(self) -> Self: - return convert(to_builtins(self), type=self.__class__) + return convert( + to_builtins(self, builtin_types=(ObjectId,)), + type=self.__class__, + ) @classmethod def from_dict(cls, data: Dict[str, Any]) -> Self: From ecb5d68fe1d163b82d2043f6a7c3de2c805582b3 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 09:26:05 +0800 Subject: [PATCH 31/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=87=87?= =?UTF-8?q?=E9=9B=86=20LP=20=E6=8E=A8=E8=8D=90=E6=96=87=E7=AB=A0=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 1 + jobs/fetch_lp_recommended_article_records.py | 132 +++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 jobs/fetch_lp_recommended_article_records.py diff --git a/jobs/__init__.py b/jobs/__init__.py index c78ff80..97deb1f 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -20,6 +20,7 @@ def import_deployment(path: str) -> DeploymentType: "jobs.fetch_jianshu_lottery_win_records:deployment", "jobs.fetch_jpep_ftn_trade_orders:buy_deployment", "jobs.fetch_jpep_ftn_trade_orders:sell_deployment", + "jobs.fetch_lp_recommended_article_records:deployment" } diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py new file mode 100644 index 0000000..5f8ee6f --- /dev/null +++ b/jobs/fetch_lp_recommended_article_records.py @@ -0,0 +1,132 @@ +from datetime import date, datetime +from typing import List, Optional + +from bson import ObjectId +from jkit._constraints import ( + ArticleSlug, + NonEmptyStr, + NonNegativeFloat, + NonNegativeInt, + PositiveInt, +) +from jkit.collection import Collection, CollectionArticleInfo +from msgspec import field +from prefect import flow, get_run_logger +from prefect.states import Completed, State + +from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.lp_recommended_article_records + +# 理事会点赞汇总专题 +LP_RECOMMENDED_COLLECTION = Collection.from_slug("f61832508891") + + +class AuthorInfoField(Field, **FIELD_OBJECT_CONFIG): + id: PositiveInt + slug: str + name: str + + +class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date + id: PositiveInt + slug: ArticleSlug + title: NonEmptyStr + published_at: datetime + + views_count: NonNegativeInt + likes_count: NonNegativeInt + comments_count: NonNegativeInt + tips_count: NonNegativeFloat + earned_fp_amount: NonNegativeFloat = field(name="EarnedFPAmount") + + is_paid: bool + can_comment: bool + description: str + + author_info: AuthorInfoField + + +async def is_stored(item: CollectionArticleInfo) -> bool: + result = await COLLECTION.find_one({"slug": item.slug}) + if result: + return True + + return False + + +async def process_item( + item: CollectionArticleInfo, /, *, current_date: date +) -> Optional[LPRecommendedArticleRecord]: + logger = get_run_logger() + + if await is_stored(item): + logger.warning(f"已保存过该文章记录,跳过 slug={item.slug}") + return None + + return LPRecommendedArticleRecord( + _id=ObjectId(), + date=current_date, + id=item.id, + slug=item.slug, + title=item.title, + published_at=item.published_at, + views_count=item.views_count, + likes_count=item.likes_count, + comments_count=item.comments_count, + tips_count=item.tips_count, + earned_fp_amount=item.earned_fp_amount, + is_paid=item.is_paid, + can_comment=item.can_comment, + description=item.description, + author_info=AuthorInfoField( + id=item.author_info.id, + slug=item.author_info.slug, + name=item.author_info.name, + ), + ).validate() + + +@flow( + **generate_flow_config( + name="采集 LP 推荐文章记录", + ) +) +async def flow_func() -> State: + logger = get_run_logger() + + current_date = datetime.now().date() + + data: List[LPRecommendedArticleRecord] = [] + itered_items_count = 0 + async for item in LP_RECOMMENDED_COLLECTION.iter_articles(): + processed_item = await process_item(item, current_date=current_date) + if processed_item: + data.append(processed_item) + + itered_items_count += 1 + if itered_items_count == 100: + break + + if data: + await COLLECTION.insert_many(x.to_dict() for x in data) + else: + logger.info("无数据,不执行保存操作") + + return Completed(message=f"data_count={len(data)}") + + +deployment = flow_func.to_deployment( + **generate_deployment_config( + name="采集 LP 推荐文章记录", + cron="0 1 * * *", + ) +) From e79b86e92eb2781edf52782e00e1dc5b002d3da8 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 25 Feb 2024 09:36:29 +0800 Subject: [PATCH 32/93] =?UTF-8?q?feat:=20=E5=A4=84=E7=90=86=20date=20?= =?UTF-8?q?=E4=B8=8E=20datetime=20=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/document_model.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/utils/document_model.py b/utils/document_model.py index 2345f3a..f61db20 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -1,4 +1,5 @@ -from typing import Any, Dict +from datetime import date, datetime +from typing import Any, Dict, Tuple from bson import ObjectId from msgspec import Struct, convert, to_builtins @@ -14,6 +15,19 @@ "rename": "camel", } +_BUILDIN_TYPES: Tuple[object, ...] = (ObjectId, datetime, date) + + +def convert_date_to_datetime(data: Dict[str, Any]) -> Dict[str, Any]: + for key, value in data.items(): + if isinstance(value, date): + data[key] = datetime.fromisoformat(value.isoformat()) + + if isinstance(value, dict): + data[key] = convert_date_to_datetime(value) + + return data + class Field(Struct, **FIELD_OBJECT_CONFIG): pass @@ -24,7 +38,7 @@ class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): def validate(self) -> Self: return convert( - to_builtins(self, builtin_types=(ObjectId,)), + to_builtins(self, builtin_types=_BUILDIN_TYPES), type=self.__class__, ) @@ -33,4 +47,9 @@ def from_dict(cls, data: Dict[str, Any]) -> Self: return convert(data, type=cls) def to_dict(self) -> Dict[str, Any]: - return to_builtins(self, builtin_types=(ObjectId,)) + return convert_date_to_datetime( + to_builtins( + self, + builtin_types=_BUILDIN_TYPES, + ) + ) From ea391674e3d99e71eda86fa6697c0582fff91467 Mon Sep 17 00:00:00 2001 From: yezi Date: Mon, 26 Feb 2024 06:32:04 +0800 Subject: [PATCH 33/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=BF=90=E8=A1=8C=E5=A4=B1=E8=B4=A5=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=8E=A8=E9=80=81=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.example.yaml | 6 +++++- utils/config.py | 7 +++++++ utils/config_generators.py | 3 +++ utils/event_handlers.py | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 utils/event_handlers.py diff --git a/config.example.yaml b/config.example.yaml index a2a47be..9da2905 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -5,4 +5,8 @@ mongodb: database: jfetcher log: save_level: DEBUG - print_level: DEBUG \ No newline at end of file + print_level: DEBUG +feishu_notification: + enabled: false + webhook_url: + failure_card_id: \ No newline at end of file diff --git a/utils/config.py b/utils/config.py index 57d5fde..15b0242 100644 --- a/utils/config.py +++ b/utils/config.py @@ -7,10 +7,17 @@ ) +class _FeishuNotification(Struct, **CONFIG_STRUCT_CONFIG): + enabled: bool = False + webhook_url: str = "" + failure_card_id: str = "" + + class _Config(Struct, **CONFIG_STRUCT_CONFIG): version: str = "v3.0.0" mongodb: MongoDBConfig = MongoDBConfig() log: LoggingConfig = LoggingConfig() + feishu_notification: _FeishuNotification = _FeishuNotification() CONFIG = load_or_save_default_config(_Config) diff --git a/utils/config_generators.py b/utils/config_generators.py index 499c6d3..d83758a 100644 --- a/utils/config_generators.py +++ b/utils/config_generators.py @@ -3,6 +3,7 @@ from prefect.client.schemas.schedules import CronSchedule from utils.config import CONFIG +from utils.event_handlers import on_failure_or_crashed def generate_flow_config( @@ -17,6 +18,8 @@ def generate_flow_config( "retries": retries, "retry_delay_seconds": retry_delay_seconds, "timeout_seconds": timeout, + "on_failure": [on_failure_or_crashed], + "on_crashed": [on_failure_or_crashed], } diff --git a/utils/event_handlers.py b/utils/event_handlers.py new file mode 100644 index 0000000..531a813 --- /dev/null +++ b/utils/event_handlers.py @@ -0,0 +1,37 @@ +from httpx import AsyncClient +from prefect.client.schemas.objects import Flow, FlowRun, State + +from utils.config import CONFIG + +CLIENT = AsyncClient(http2=True) + + +async def on_failure_or_crashed(flow: Flow, flow_run: FlowRun, state: State) -> None: + if not CONFIG.feishu_notification.enabled: + return + + response = await CLIENT.post( + url=CONFIG.feishu_notification.webhook_url, + json={ + "msg_type": "interactive", + "card": { + "type": "template", + "data": { + "template_id": CONFIG.feishu_notification.failure_card_id, + "template_variable": { + "status": flow_run.state_name, + "flow_name": flow.name, + "run_name": flow_run.name, + "deployment_name": "[To-Do]", + "start_time": flow_run.start_time.strftime(r"%Y-%m-%d %H:%M:%S") + if flow_run.start_time + else "[未知]", + "error_message": state.message, + "details_url": f"http://prod-server:4200/flow-runs/flow-run/{flow_run.id}", + }, + }, + }, + }, + ) + + response.raise_for_status() From 585745d7d675214cc7f5b71e4344255a5c3e286f Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 28 Feb 2024 06:18:20 +0800 Subject: [PATCH 34/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=80=9A=E7=9F=A5=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/config_generators.py | 5 +++-- utils/event_handlers.py | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/utils/config_generators.py b/utils/config_generators.py index d83758a..145c61e 100644 --- a/utils/config_generators.py +++ b/utils/config_generators.py @@ -1,3 +1,4 @@ +from functools import partial from typing import Any, Dict, Union from prefect.client.schemas.schedules import CronSchedule @@ -18,8 +19,8 @@ def generate_flow_config( "retries": retries, "retry_delay_seconds": retry_delay_seconds, "timeout_seconds": timeout, - "on_failure": [on_failure_or_crashed], - "on_crashed": [on_failure_or_crashed], + "on_failure": [partial(on_failure_or_crashed, status="Failed")], + "on_crashed": [partial(on_failure_or_crashed, status="Crashed")], } diff --git a/utils/event_handlers.py b/utils/event_handlers.py index 531a813..bbc9776 100644 --- a/utils/event_handlers.py +++ b/utils/event_handlers.py @@ -1,3 +1,5 @@ +from typing import Literal + from httpx import AsyncClient from prefect.client.schemas.objects import Flow, FlowRun, State @@ -6,7 +8,9 @@ CLIENT = AsyncClient(http2=True) -async def on_failure_or_crashed(flow: Flow, flow_run: FlowRun, state: State) -> None: +async def on_failure_or_crashed( + status: Literal["Failed", "Crashed"], flow: Flow, flow_run: FlowRun, state: State +) -> None: if not CONFIG.feishu_notification.enabled: return @@ -19,14 +23,19 @@ async def on_failure_or_crashed(flow: Flow, flow_run: FlowRun, state: State) -> "data": { "template_id": CONFIG.feishu_notification.failure_card_id, "template_variable": { - "status": flow_run.state_name, + "status": status, "flow_name": flow.name, "run_name": flow_run.name, - "deployment_name": "[To-Do]", + "parameters": str(flow_run.parameters), "start_time": flow_run.start_time.strftime(r"%Y-%m-%d %H:%M:%S") if flow_run.start_time else "[未知]", - "error_message": state.message, + "retries": flow_run.empirical_policy.retries, + "error_message": state.message.replace( + "Flow run encountered an exception. ", "" + ) + if state.message + else "[未知]", "details_url": f"http://prod-server:4200/flow-runs/flow-run/{flow_run.id}", }, }, From 3a8345a4af57a8cca684a37bdea8b4cda9c2593b Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 28 Feb 2024 06:22:15 +0800 Subject: [PATCH 35/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=20=5Fid=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 2 -- jobs/fetch_assets_ranking_records.py | 2 -- jobs/fetch_daily_update_ranking_records.py | 2 -- jobs/fetch_jpep_ftn_trade_orders.py | 2 -- jobs/fetch_lp_recommended_article_records.py | 2 -- utils/document_model.py | 5 +++-- 6 files changed, 3 insertions(+), 12 deletions(-) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index fda2801..042733b 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -1,7 +1,6 @@ from datetime import date, datetime, timedelta from typing import List, Optional, Tuple -from bson import ObjectId from jkit._constraints import PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError @@ -77,7 +76,6 @@ async def process_item( author_id, author_slug = await get_author_id_and_slug(item) return ArticleEarningRankingRecordDocument( - _id=ObjectId(), date=target_date, ranking=item.ranking, article=ArticleField( diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index fe30c3d..6c3dc01 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -1,7 +1,6 @@ from datetime import date, datetime from typing import List, Optional, Tuple -from bson import ObjectId from jkit._constraints import NonNegativeFloat, PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError @@ -73,7 +72,6 @@ async def process_item( fp_amount, ftn_amount = await get_fp_ftn_amount(item) return AssetsRankingRecordDocument( - _id=ObjectId(), date=target_date, ranking=item.ranking, fp_amount=fp_amount, diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index bed61c9..dbf971b 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -1,7 +1,6 @@ from datetime import date, datetime from typing import List -from bson import ObjectId from jkit._constraints import PositiveInt from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord from prefect import flow @@ -35,7 +34,6 @@ def process_item( item: DailyUpdateRankingRecord, /, *, current_date: date ) -> DailyUpdateRankingRecordDocument: return DailyUpdateRankingRecordDocument( - _id=ObjectId(), date=current_date, ranking=item.ranking, days=item.days, diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 97b95aa..419021a 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -1,7 +1,6 @@ from datetime import datetime from typing import List, Literal, Optional -from bson import ObjectId from jkit._constraints import ( NonNegativeInt, PositiveFloat, @@ -63,7 +62,6 @@ def process_item( type: Literal["buy", "sell"], # noqa: A002 ) -> JPEPFTNTradeOrderDocument: return JPEPFTNTradeOrderDocument( - _id=ObjectId(), type=type, fetch_time=fetch_time, order_id=item.id, diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py index 5f8ee6f..f321198 100644 --- a/jobs/fetch_lp_recommended_article_records.py +++ b/jobs/fetch_lp_recommended_article_records.py @@ -1,7 +1,6 @@ from datetime import date, datetime from typing import List, Optional -from bson import ObjectId from jkit._constraints import ( ArticleSlug, NonEmptyStr, @@ -73,7 +72,6 @@ async def process_item( return None return LPRecommendedArticleRecord( - _id=ObjectId(), date=current_date, id=item.id, slug=item.slug, diff --git a/utils/document_model.py b/utils/document_model.py index f61db20..b009746 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -34,8 +34,6 @@ class Field(Struct, **FIELD_OBJECT_CONFIG): class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): - _id: ObjectId - def validate(self) -> Self: return convert( to_builtins(self, builtin_types=_BUILDIN_TYPES), @@ -44,6 +42,9 @@ def validate(self) -> Self: @classmethod def from_dict(cls, data: Dict[str, Any]) -> Self: + if not hasattr(cls, "_id") and "_id" in data: + del data["_id"] + return convert(data, type=cls) def to_dict(self) -> Dict[str, Any]: From 0e4b5a2dc4b377a4d0f472f705c0d604952f0037 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 28 Feb 2024 06:39:09 +0800 Subject: [PATCH 36/93] =?UTF-8?q?feat:=20=E6=96=87=E7=AB=A0=E6=94=B6?= =?UTF-8?q?=E7=9B=8A=E6=8E=92=E8=A1=8C=E6=A6=9C=E5=8A=A0=E5=85=A5=E5=94=AF?= =?UTF-8?q?=E4=B8=80=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 042733b..07f8a7e 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -7,6 +7,7 @@ from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from prefect import flow, get_run_logger from prefect.states import Completed, State +from pymongo import ASCENDING, IndexModel from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB @@ -100,6 +101,10 @@ async def process_item( ) ) async def flow_func() -> State: + await COLLECTION.create_indexes( + [IndexModel([("date", ASCENDING), ("ranking", ASCENDING)], unique=True)] + ) + target_date = datetime.now().date() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] From f7d4fc9819a2669836fec572cdc65a14eb36243b Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 28 Feb 2024 06:40:48 +0800 Subject: [PATCH 37/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E5=A4=A7=E8=BD=AC=E7=9B=98=E6=8A=BD=E5=A5=96=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=B7=A5=E4=BD=9C=E6=B5=81=20record=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_jianshu_lottery_win_records.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 02acdd2..70d70bd 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -5,7 +5,7 @@ from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import DESCENDING +from pymongo import ASCENDING, DESCENDING, IndexModel from utils.config_generators import generate_deployment_config, generate_flow_config from utils.db import DB @@ -26,7 +26,7 @@ class UserInfoField(Field, **FIELD_OBJECT_CONFIG): class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - _id: PositiveInt # type: ignore + record_id: PositiveInt time: datetime award_name: str user_info: UserInfoField @@ -40,12 +40,12 @@ async def get_latest_stored_record_id() -> int: except StopAsyncIteration: return 0 - return latest_data._id + return latest_data.record_id def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: return JianshuLotteryWinRecordDocument( - _id=item.id, + record_id=item.id, time=item.time, award_name=item.award_name, user_info=UserInfoField( @@ -62,6 +62,10 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDoc ) ) async def flow_func() -> State: + await COLLECTION.create_indexes( + [IndexModel([("recordId", ASCENDING)], unique=True)] + ) + logger = get_run_logger() stop_id = await get_latest_stored_record_id() From e6c0c480a6def109484276f68184bb94a5faffb4 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 1 Mar 2024 06:34:06 +0800 Subject: [PATCH 38/93] =?UTF-8?q?feat:=20=E5=B0=86=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E6=8B=86=E5=88=86=E4=B8=BA?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 2 +- jobs/fetch_article_earning_ranking_records.py | 15 ++++++++++----- jobs/fetch_assets_ranking_records.py | 12 +++++++++++- jobs/fetch_daily_update_ranking_records.py | 14 +++++++++++++- jobs/fetch_jianshu_lottery_win_records.py | 17 +++++++++++------ jobs/fetch_jpep_ftn_trade_orders.py | 12 +++++++++++- jobs/fetch_lp_recommended_article_records.py | 12 +++++++++++- 7 files changed, 68 insertions(+), 16 deletions(-) diff --git a/jobs/__init__.py b/jobs/__init__.py index 97deb1f..4e2e2ce 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -20,7 +20,7 @@ def import_deployment(path: str) -> DeploymentType: "jobs.fetch_jianshu_lottery_win_records:deployment", "jobs.fetch_jpep_ftn_trade_orders:buy_deployment", "jobs.fetch_jpep_ftn_trade_orders:sell_deployment", - "jobs.fetch_lp_recommended_article_records:deployment" + "jobs.fetch_lp_recommended_article_records:deployment", } diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 07f8a7e..bfa1d06 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -7,9 +7,12 @@ from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import ASCENDING, IndexModel +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -71,6 +74,10 @@ async def get_author_id_and_slug( return None, None +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel([("date", "ranking")], unique=True)]) + + async def process_item( item: RecordField, /, *, target_date: date ) -> ArticleEarningRankingRecordDocument: @@ -101,9 +108,7 @@ async def process_item( ) ) async def flow_func() -> State: - await COLLECTION.create_indexes( - [IndexModel([("date", ASCENDING), ("ranking", ASCENDING)], unique=True)] - ) + await init_db() target_date = datetime.now().date() - timedelta(days=1) diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 6c3dc01..283ffc6 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -8,8 +8,12 @@ from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -66,6 +70,10 @@ async def get_fp_ftn_amount( return None, None +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel(("date", "ranking"), unique=True)]) + + async def process_item( item: AssetsRankingRecord, /, *, target_date: date ) -> AssetsRankingRecordDocument: @@ -91,6 +99,8 @@ async def process_item( ) ) async def flow_func() -> State: + await init_db() + target_date = datetime.now().date() data: List[AssetsRankingRecordDocument] = [] diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index dbf971b..ef5e061 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -5,8 +5,12 @@ from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord from prefect import flow from prefect.states import Completed, State +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -30,6 +34,12 @@ class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_info: UserInfoField +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(("date", "user_info.slug"), unique=True)] + ) + + def process_item( item: DailyUpdateRankingRecord, /, *, current_date: date ) -> DailyUpdateRankingRecordDocument: @@ -50,6 +60,8 @@ def process_item( ) ) async def flow_func() -> State: + await init_db() + current_date = datetime.now().date() data: List[DailyUpdateRankingRecordDocument] = [] diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 70d70bd..eea525e 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -5,9 +5,12 @@ from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import ASCENDING, DESCENDING, IndexModel +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -35,7 +38,7 @@ class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): async def get_latest_stored_record_id() -> int: try: latest_data = JianshuLotteryWinRecordDocument.from_dict( - await COLLECTION.find().sort("_id", DESCENDING).__anext__() + await COLLECTION.find().sort("_id", -1).__anext__() ) except StopAsyncIteration: return 0 @@ -43,6 +46,10 @@ async def get_latest_stored_record_id() -> int: return latest_data.record_id +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel(("recordId",), unique=True)]) + + def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: return JianshuLotteryWinRecordDocument( record_id=item.id, @@ -62,9 +69,7 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDoc ) ) async def flow_func() -> State: - await COLLECTION.create_indexes( - [IndexModel([("recordId", ASCENDING)], unique=True)] - ) + await init_db() logger = get_run_logger() diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 419021a..6ae2cf6 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -9,8 +9,12 @@ from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord from prefect import flow from prefect.states import Completed, State +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -54,6 +58,10 @@ def get_fetch_time() -> datetime: return current_dt.replace(minute=current_dt.minute // 10, second=0, microsecond=0) +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel(("fetchTime", "orderId"), unique=True)]) + + def process_item( item: FTNMacketOrderRecord, /, @@ -88,6 +96,8 @@ def process_item( ), ) async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 + await init_db() + fetch_time = get_fetch_time() data: List[JPEPFTNTradeOrderDocument] = [] diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py index f321198..a3cc3f6 100644 --- a/jobs/fetch_lp_recommended_article_records.py +++ b/jobs/fetch_lp_recommended_article_records.py @@ -12,8 +12,12 @@ from msgspec import field from prefect import flow, get_run_logger from prefect.states import Completed, State +from pymongo import IndexModel -from utils.config_generators import generate_deployment_config, generate_flow_config +from utils.config_generators import ( + generate_deployment_config, + generate_flow_config, +) from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, @@ -62,6 +66,10 @@ async def is_stored(item: CollectionArticleInfo) -> bool: return False +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel(("date", "slug"), unique=True)]) + + async def process_item( item: CollectionArticleInfo, /, *, current_date: date ) -> Optional[LPRecommendedArticleRecord]: @@ -99,6 +107,8 @@ async def process_item( ) ) async def flow_func() -> State: + await init_db() + logger = get_run_logger() current_date = datetime.now().date() From aa781b4aa74e2d4e0eb3ee0d7c3b6353a9c1f677 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 1 Mar 2024 06:34:36 +0800 Subject: [PATCH 39/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E5=A4=B1=E8=B4=A5=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=9C=AA=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E6=97=B6=E5=8C=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/event_handlers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/event_handlers.py b/utils/event_handlers.py index bbc9776..26a9bac 100644 --- a/utils/event_handlers.py +++ b/utils/event_handlers.py @@ -27,7 +27,9 @@ async def on_failure_or_crashed( "flow_name": flow.name, "run_name": flow_run.name, "parameters": str(flow_run.parameters), - "start_time": flow_run.start_time.strftime(r"%Y-%m-%d %H:%M:%S") + "start_time": flow_run.start_time.in_timezone( + "Asia/Shanghai" + ).strftime(r"%Y-%m-%d %H:%M:%S") if flow_run.start_time else "[未知]", "retries": flow_run.empirical_policy.retries, From 5a7851264bac639376ee892e1c57054af4318159 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 1 Mar 2024 22:52:27 +0800 Subject: [PATCH 40/93] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 208 +++++++++++++++++++++++++------------------ pyproject.toml | 2 +- requirements-dev.txt | 30 ++++--- requirements.txt | 26 +++--- 4 files changed, 150 insertions(+), 116 deletions(-) diff --git a/poetry.lock b/poetry.lock index d2ba0d2..87946a2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -107,6 +107,21 @@ files = [ [package.dependencies] sniffio = "*" +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + [[package]] name = "async-timeout" version = "4.0.3" @@ -224,13 +239,13 @@ tzdata = ["tzdata"] [[package]] name = "cachetools" -version = "5.3.2" +version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, - {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] @@ -456,13 +471,13 @@ files = [ [[package]] name = "croniter" -version = "2.0.1" +version = "2.0.2" description = "croniter provides iteration for datetime object with cron like format" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "croniter-2.0.1-py2.py3-none-any.whl", hash = "sha256:4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7"}, - {file = "croniter-2.0.1.tar.gz", hash = "sha256:d199b2ec3ea5e82988d1f72022433c5f9302b3b3ea9e6bfd6a1518f6ea5e700a"}, + {file = "croniter-2.0.2-py2.py3-none-any.whl", hash = "sha256:78bf110a2c7dbbfdd98b926318ae6c64a731a4c637c7befe3685755110834746"}, + {file = "croniter-2.0.2.tar.gz", hash = "sha256:8bff16c9af4ef1fb6f05416973b8f7cb54997c02f2f8365251f9bf1dded91866"}, ] [package.dependencies] @@ -471,43 +486,43 @@ pytz = ">2021.1" [[package]] name = "cryptography" -version = "42.0.4" +version = "42.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449"}, - {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b"}, - {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824"}, - {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b"}, - {file = "cryptography-42.0.4-cp37-abi3-win32.whl", hash = "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925"}, - {file = "cryptography-42.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923"}, - {file = "cryptography-42.0.4-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9"}, - {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929"}, - {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0"}, - {file = "cryptography-42.0.4-cp39-abi3-win32.whl", hash = "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129"}, - {file = "cryptography-42.0.4-cp39-abi3-win_amd64.whl", hash = "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20"}, - {file = "cryptography-42.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b"}, - {file = "cryptography-42.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660"}, - {file = "cryptography-42.0.4.tar.gz", hash = "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, ] [package.dependencies] @@ -588,13 +603,13 @@ ssh = ["paramiko (>=2.4.3)"] [[package]] name = "email-validator" -version = "2.1.0.post1" +version = "2.1.1" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.0.post1-py3-none-any.whl", hash = "sha256:c973053efbeddfef924dc0bd93f6e77a1ea7ee0fce935aea7103c7a3d6d2d637"}, - {file = "email_validator-2.1.0.post1.tar.gz", hash = "sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44"}, + {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, + {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, ] [package.dependencies] @@ -762,16 +777,17 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.40.1" +version = "0.41.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.40.1-py3-none-any.whl", hash = "sha256:5b8c023f366fe273e762131fe4bfd141ea56c09b3cb825aa92d06a82681cfd93"}, - {file = "griffe-0.40.1.tar.gz", hash = "sha256:66c48a62e2ce5784b6940e603300fcfb807b6f099b94e7f753f1841661fd5c7c"}, + {file = "griffe-0.41.1-py3-none-any.whl", hash = "sha256:9b71b82d0177a278467ce362827296957f0ca59ff5437ee41a0d6247aee257fa"}, + {file = "griffe-0.41.1.tar.gz", hash = "sha256:09d12f955004102d7deeec2e1d87d07434fb2d42905d21b4e03c7cbf9cf78754"}, ] [package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" [[package]] @@ -900,13 +916,13 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.1.1" +version = "6.1.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-6.1.2-py3-none-any.whl", hash = "sha256:9a0a862501dc38b68adebc82970140c9e4209fc99601782925178f8386339938"}, + {file = "importlib_resources-6.1.2.tar.gz", hash = "sha256:308abf8474e2dba5f867d279237cd4076482c3de7104a40b41426370e891549b"}, ] [package.dependencies] @@ -914,7 +930,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "itsdangerous" @@ -1617,13 +1633,13 @@ files = [ [[package]] name = "prefect" -version = "2.16.0" +version = "2.16.1" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.16.0-py3-none-any.whl", hash = "sha256:19f431962bc51df3d46cd22f206c20b22ae224c9ee46e04ed3d37ea03f92ba65"}, - {file = "prefect-2.16.0.tar.gz", hash = "sha256:5143adb2da972a2fadc6d1de959adb82a8498d347fc3896d839ae4cda7642a8f"}, + {file = "prefect-2.16.1-py3-none-any.whl", hash = "sha256:e43dd326a584aaa771b68f21edea70ca39b8153825bf14d57a174d13d00e3a84"}, + {file = "prefect-2.16.1.tar.gz", hash = "sha256:9611bb37515bf36e27e49dc5ce51a35a88d8ce7354b0803af75e299be95971bb"}, ] [package.dependencies] @@ -1718,13 +1734,13 @@ files = [ [[package]] name = "pydantic" -version = "2.6.2" +version = "2.6.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.2-py3-none-any.whl", hash = "sha256:37a5432e54b12fecaa1049c5195f3d860a10e01bdfd24f1840ef14bd0d3aeab3"}, - {file = "pydantic-2.6.2.tar.gz", hash = "sha256:a09be1c3d28f3abe37f8a78af58284b236a92ce520105ddc91a6d29ea1176ba7"}, + {file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"}, + {file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"}, ] [package.dependencies] @@ -1947,13 +1963,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.351" +version = "1.1.352" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.351-py3-none-any.whl", hash = "sha256:83b44b25396ae20661fc5f133c3fce30928ff1296d4f2e5ff0bca5fcf03eb89d"}, - {file = "pyright-1.1.351.tar.gz", hash = "sha256:01124099714eebd7f6525d8cbfa350626b56dfaf771cfcd55c03e69f0f1efbbd"}, + {file = "pyright-1.1.352-py3-none-any.whl", hash = "sha256:0040cf173c6a60704e553bfd129dfe54de59cc76d0b2b80f77cfab4f50701d64"}, + {file = "pyright-1.1.352.tar.gz", hash = "sha256:a621c0dfbcf1291b3610641a07380fefaa1d0e182890a1b2a7f13b446e8109a9"}, ] [package.dependencies] @@ -1965,13 +1981,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.tar.gz", hash = "sha256:78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709"}, + {file = "python_dateutil-2.9.0-py2.py3-none-any.whl", hash = "sha256:cbf2f1da5e6083ac2fbfd4da39a25f34312230110440f424a14c7558bb85d82e"}, ] [package.dependencies] @@ -2285,13 +2301,13 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.7.0" +version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] @@ -2503,28 +2519,28 @@ files = [ [[package]] name = "ruff" -version = "0.2.2" +version = "0.3.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, - {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, - {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, - {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, - {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, - {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, - {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, - {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, + {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"}, + {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"}, + {file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"}, + {file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"}, + {file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"}, + {file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"}, + {file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"}, + {file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"}, ] [[package]] @@ -2556,13 +2572,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -2723,13 +2739,13 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] @@ -2968,6 +2984,20 @@ files = [ {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] +[[package]] +name = "wheel" +version = "0.42.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "zipp" version = "3.17.0" @@ -2986,4 +3016,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "da6597a11cb3d8f6e587ec8aa35d1e9b0827496a9ffba20b352c03cf434e2b46" +content-hash = "5790736e0f78682fddeb8bdd6209a21fd80aaf6b7d8dcedde43d1702df7941ed" diff --git a/pyproject.toml b/pyproject.toml index 3d5ebc4..520153e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ jkit = "^3.0.0a13" sspeedup = "^0.25.1" [tool.poetry.group.dev.dependencies] -ruff = "^0.2.0" +ruff = "^0.3.0" pyright = "^1.1.0" [build-system] diff --git a/requirements-dev.txt b/requirements-dev.txt index fb10d23..0061b20 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,11 +4,12 @@ annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" +astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.3 ; python_version >= "3.8" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" @@ -16,18 +17,18 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.1 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.4 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.41.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -36,7 +37,7 @@ httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" +importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" @@ -61,16 +62,16 @@ pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.1 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.351 ; python_version >= "3.8" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.352 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.9.0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" @@ -82,22 +83,22 @@ referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" -rich==13.7.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.2.2 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.3.0 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" -sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" @@ -105,4 +106,5 @@ urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" +wheel==0.42.0 ; python_version >= "3.8" and python_version < "3.9" zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" diff --git a/requirements.txt b/requirements.txt index 8fb8a8a..f126b32 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,11 +4,12 @@ annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" +astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" -cachetools==5.3.2 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.3 ; python_version >= "3.8" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" @@ -16,18 +17,18 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.1 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.4 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -email-validator==2.1.0.post1 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.40.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.41.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -36,7 +37,7 @@ httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.9" +importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" @@ -60,15 +61,15 @@ pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.1 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.9.0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" @@ -80,21 +81,21 @@ referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" -rich==13.7.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" -sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" @@ -102,4 +103,5 @@ urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" +wheel==0.42.0 ; python_version >= "3.8" and python_version < "3.9" zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" From 44bd827399deff0d939bcaa60afea73ed840eb34 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 1 Mar 2024 22:57:21 +0800 Subject: [PATCH 41/93] =?UTF-8?q?ci:=20=E4=BF=AE=E6=94=B9=20CI=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/static-check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/static-check.yaml b/.github/workflows/static-check.yaml index 6213fa7..d3a4a73 100644 --- a/.github/workflows/static-check.yaml +++ b/.github/workflows/static-check.yaml @@ -4,7 +4,7 @@ on: push: jobs: - static-check-backend: + static-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From fabeaa5587d2e7b3c56c756faa02ea4abe02568d Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 3 Mar 2024 08:43:38 +0800 Subject: [PATCH 42/93] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=8E=E5=B7=A5=E4=BD=9C=E6=B5=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 49 +++----------- jobs/fetch_assets_ranking_records.py | 42 ++---------- jobs/fetch_daily_update_ranking_records.py | 42 +++--------- jobs/fetch_jianshu_lottery_win_records.py | 53 +++------------ jobs/fetch_jpep_ftn_trade_orders.py | 54 +++------------ jobs/fetch_lp_recommended_article_records.py | 67 +++---------------- models/article_earning_ranking_record.py | 56 ++++++++++++++++ models/assets_ranking_record.py | 48 +++++++++++++ models/daily_update_ranking_record.py | 41 ++++++++++++ models/jianshu_lottery_win_record.py | 54 +++++++++++++++ models/jpep_ftn_trade_order.py | 54 +++++++++++++++ models/lp_recommend_article_record.py | 62 +++++++++++++++++ poetry.lock | 14 ++-- pyproject.toml | 2 +- requirements-dev.txt | 4 +- requirements.txt | 4 +- 16 files changed, 381 insertions(+), 265 deletions(-) create mode 100644 models/article_earning_ranking_record.py create mode 100644 models/assets_ranking_record.py create mode 100644 models/daily_update_ranking_record.py create mode 100644 models/jianshu_lottery_win_record.py create mode 100644 models/jpep_ftn_trade_order.py create mode 100644 models/lp_recommend_article_record.py diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index bfa1d06..476afac 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -1,51 +1,24 @@ from datetime import date, datetime, timedelta from typing import List, Optional, Tuple -from jkit._constraints import PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.article_earning import ArticleEarningRanking, RecordField from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import IndexModel +from models.article_earning_ranking_record import ( + ArticleEarningRankingRecordDocument, + ArticleField, + AuthorField, + EarningField, + init_db, + insert_many, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.article_earning_ranking_records - - -class ArticleField(Field, **FIELD_OBJECT_CONFIG): - title: Optional[str] - slug: Optional[str] - - -class AuthorField(Field, **FIELD_OBJECT_CONFIG): - id: Optional[PositiveInt] - slug: Optional[str] - name: Optional[str] - - -class EarningField(Field, **FIELD_OBJECT_CONFIG): - to_author: PositiveFloat - to_voter: PositiveFloat - - -class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - date: date - ranking: PositiveInt - article: ArticleField - author: AuthorField - earning: EarningField async def get_author_id_and_slug( @@ -74,10 +47,6 @@ async def get_author_id_and_slug( return None, None -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel([("date", "ranking")], unique=True)]) - - async def process_item( item: RecordField, /, *, target_date: date ) -> ArticleEarningRankingRecordDocument: @@ -117,7 +86,7 @@ async def flow_func() -> State: processed_item = await process_item(item, target_date=target_date) data.append(processed_item) - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 283ffc6..99ee453 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -1,45 +1,23 @@ from datetime import date, datetime from typing import List, Optional, Tuple -from jkit._constraints import NonNegativeFloat, PositiveFloat, PositiveInt from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.assets import AssetsRanking, AssetsRankingRecord from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import IndexModel +from models.assets_ranking_record import ( + AssetsRankingRecordDocument, + UserInfoField, + init_db, + insert_many, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.assets_ranking_records - - -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): - id: Optional[PositiveInt] - slug: Optional[str] - name: Optional[str] - - -class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - date: date - ranking: PositiveInt - - fp_amount: Optional[NonNegativeFloat] - ftn_amount: Optional[NonNegativeFloat] - assets_amount: PositiveFloat - - user_info: UserInfoField async def get_fp_ftn_amount( @@ -70,10 +48,6 @@ async def get_fp_ftn_amount( return None, None -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel(("date", "ranking"), unique=True)]) - - async def process_item( item: AssetsRankingRecord, /, *, target_date: date ) -> AssetsRankingRecordDocument: @@ -104,8 +78,6 @@ async def flow_func() -> State: target_date = datetime.now().date() data: List[AssetsRankingRecordDocument] = [] - # FIXME: jkit.exceptions.ValidationError: Expected `str` matching regex - # '^https?:\\/\\/.*\\.jianshu\\.io\\/[\\w%-\\/]*\\/?$' - at `$.user_info.avatar_url` async for item in AssetsRanking(): processed_item = await process_item(item, target_date=target_date) data.append(processed_item) @@ -113,7 +85,7 @@ async def flow_func() -> State: if len(data) == 1000: break - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index ef5e061..f0f191b 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -1,43 +1,23 @@ from datetime import date, datetime from typing import List -from jkit._constraints import PositiveInt -from jkit.ranking.daily_update import DailyUpdateRanking, DailyUpdateRankingRecord +from jkit.ranking.daily_update import ( + DailyUpdateRanking, + DailyUpdateRankingRecord, +) from prefect import flow from prefect.states import Completed, State -from pymongo import IndexModel +from models.daily_update_ranking_record import ( + DailyUpdateRankingRecordDocument, + UserInfoField, + init_db, + insert_many, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.daily_update_ranking_records - - -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): - slug: str - name: str - - -class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - date: date - ranking: PositiveInt - days: PositiveInt - user_info: UserInfoField - - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(("date", "user_info.slug"), unique=True)] - ) def process_item( @@ -69,7 +49,7 @@ async def flow_func() -> State: processed_item = process_item(item, current_date=current_date) data.append(processed_item) - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) return Completed(message=f"data_count={len(data)}") diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index eea525e..7e6fd1e 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -1,53 +1,20 @@ -from datetime import datetime from typing import List -from jkit._constraints import PositiveInt from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import IndexModel +from models.jianshu_lottery_win_record import ( + JianshuLotteryWinRecordDocument, + UserInfoField, + get_latest_record_id, + init_db, + insert_many, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.jianshu_lottery_win_records - - -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): - id: PositiveInt - slug: str - name: str - - -class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - record_id: PositiveInt - time: datetime - award_name: str - user_info: UserInfoField - - -async def get_latest_stored_record_id() -> int: - try: - latest_data = JianshuLotteryWinRecordDocument.from_dict( - await COLLECTION.find().sort("_id", -1).__anext__() - ) - except StopAsyncIteration: - return 0 - - return latest_data.record_id - - -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel(("recordId",), unique=True)]) def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: @@ -73,8 +40,8 @@ async def flow_func() -> State: logger = get_run_logger() - stop_id = await get_latest_stored_record_id() - logger.info(f"获取到最新的已存储 ID:{stop_id}") + stop_id = await get_latest_record_id() + logger.info(f"获取到最新的记录 ID:{stop_id}") if stop_id == 0: logger.warning("数据库中没有记录") @@ -89,7 +56,7 @@ async def flow_func() -> State: logger.warning("采集数据量达到上限") if data: - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) else: logger.info("无数据,不执行保存操作") diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 6ae2cf6..ab51fc3 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -1,54 +1,20 @@ from datetime import datetime -from typing import List, Literal, Optional +from typing import List, Literal -from jkit._constraints import ( - NonNegativeInt, - PositiveFloat, - PositiveInt, -) from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord from prefect import flow from prefect.states import Completed, State -from pymongo import IndexModel +from models.jpep_ftn_trade_order import ( + JPEPFTNTradeOrderDocument, + PublisherInfoField, + init_db, + insert_many, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.jpep_ftn_trade_orders - - -class PublisherInfoField(Field, **FIELD_OBJECT_CONFIG): - is_anonymous: bool - id: Optional[PositiveInt] - name: Optional[str] - hashed_name: Optional[str] - credit: Optional[NonNegativeInt] - - -class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - fetch_time: datetime - order_id: PositiveInt - type: Literal["buy", "sell"] - price: PositiveFloat - - total_amount: PositiveInt - traded_amount: NonNegativeInt - tradable_amount: NonNegativeInt - minimum_trade_amount: PositiveInt - - traded_count: NonNegativeInt - publish_time: datetime - - publisher_info: PublisherInfoField def get_fetch_time() -> datetime: @@ -58,10 +24,6 @@ def get_fetch_time() -> datetime: return current_dt.replace(minute=current_dt.minute // 10, second=0, microsecond=0) -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel(("fetchTime", "orderId"), unique=True)]) - - def process_item( item: FTNMacketOrderRecord, /, @@ -105,7 +67,7 @@ async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 processed_item = process_item(item, fetch_time=fetch_time, type=type) data.append(processed_item) - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) return Completed(message=f"fetch_time={fetch_time}, data_count={len(data)}") diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py index a3cc3f6..710db4c 100644 --- a/jobs/fetch_lp_recommended_article_records.py +++ b/jobs/fetch_lp_recommended_article_records.py @@ -1,81 +1,32 @@ from datetime import date, datetime from typing import List, Optional -from jkit._constraints import ( - ArticleSlug, - NonEmptyStr, - NonNegativeFloat, - NonNegativeInt, - PositiveInt, -) from jkit.collection import Collection, CollectionArticleInfo -from msgspec import field from prefect import flow, get_run_logger from prefect.states import Completed, State -from pymongo import IndexModel +from models.lp_recommend_article_record import ( + AuthorInfoField, + LPRecommendedArticleRecord, + init_db, + insert_many, + is_record_stored, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -from utils.db import DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Documemt, - Field, -) - -COLLECTION = DB.lp_recommended_article_records # 理事会点赞汇总专题 LP_RECOMMENDED_COLLECTION = Collection.from_slug("f61832508891") -class AuthorInfoField(Field, **FIELD_OBJECT_CONFIG): - id: PositiveInt - slug: str - name: str - - -class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): - date: date - id: PositiveInt - slug: ArticleSlug - title: NonEmptyStr - published_at: datetime - - views_count: NonNegativeInt - likes_count: NonNegativeInt - comments_count: NonNegativeInt - tips_count: NonNegativeFloat - earned_fp_amount: NonNegativeFloat = field(name="EarnedFPAmount") - - is_paid: bool - can_comment: bool - description: str - - author_info: AuthorInfoField - - -async def is_stored(item: CollectionArticleInfo) -> bool: - result = await COLLECTION.find_one({"slug": item.slug}) - if result: - return True - - return False - - -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel(("date", "slug"), unique=True)]) - - async def process_item( item: CollectionArticleInfo, /, *, current_date: date ) -> Optional[LPRecommendedArticleRecord]: logger = get_run_logger() - if await is_stored(item): + if await is_record_stored(item.slug): logger.warning(f"已保存过该文章记录,跳过 slug={item.slug}") return None @@ -125,7 +76,7 @@ async def flow_func() -> State: break if data: - await COLLECTION.insert_many(x.to_dict() for x in data) + await insert_many(data) else: logger.info("无数据,不执行保存操作") diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py new file mode 100644 index 0000000..1e932ff --- /dev/null +++ b/models/article_earning_ranking_record.py @@ -0,0 +1,56 @@ +from datetime import date +from typing import Optional, Sequence + +from jkit._constraints import ( + ArticleSlug, + NonEmptyStr, + PositiveFloat, + PositiveInt, + UserName, + UserSlug, +) +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.article_earning_ranking_records + + +class ArticleField(Field, **FIELD_OBJECT_CONFIG): + slug: Optional[ArticleSlug] + title: Optional[NonEmptyStr] + + +class AuthorField(Field, **FIELD_OBJECT_CONFIG): + id: Optional[PositiveInt] + slug: Optional[UserSlug] + name: Optional[UserName] + + +class EarningField(Field, **FIELD_OBJECT_CONFIG): + to_author: PositiveFloat + to_voter: PositiveFloat + + +class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date + ranking: PositiveInt + article: ArticleField + author: AuthorField + earning: EarningField + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(["date", "ranking"], unique=True)], + ) + + +async def insert_many(data: Sequence[ArticleEarningRankingRecordDocument]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py new file mode 100644 index 0000000..8abbcd5 --- /dev/null +++ b/models/assets_ranking_record.py @@ -0,0 +1,48 @@ +from datetime import date +from typing import Optional, Sequence + +from jkit._constraints import ( + NonNegativeFloat, + PositiveFloat, + PositiveInt, + UserName, + UserSlug, +) +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.assets_ranking_records + + +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): + id: Optional[PositiveInt] + slug: Optional[UserSlug] + name: Optional[UserName] + + +class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date + ranking: PositiveInt + + fp_amount: Optional[NonNegativeFloat] + ftn_amount: Optional[NonNegativeFloat] + assets_amount: PositiveFloat + + user_info: UserInfoField + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(["date", "ranking"], unique=True)], + ) + + +async def insert_many(data: Sequence[AssetsRankingRecordDocument]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py new file mode 100644 index 0000000..406f57c --- /dev/null +++ b/models/daily_update_ranking_record.py @@ -0,0 +1,41 @@ +from datetime import date +from typing import Sequence + +from jkit._constraints import ( + PositiveInt, + UserName, + UserSlug, +) +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.daily_update_ranking_records + + +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): + slug: UserSlug + name: UserName + + +class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date + ranking: PositiveInt + days: PositiveInt + user_info: UserInfoField + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(["date", "userInfo.slug"], unique=True)], + ) + + +async def insert_many(data: Sequence[DailyUpdateRankingRecordDocument]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py new file mode 100644 index 0000000..9679e39 --- /dev/null +++ b/models/jianshu_lottery_win_record.py @@ -0,0 +1,54 @@ +from datetime import datetime +from typing import Sequence + +from jkit._constraints import ( + NonEmptyStr, + PositiveInt, + UserName, + UserSlug, +) +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.jianshu_lottery_win_records + + +class UserInfoField(Field, **FIELD_OBJECT_CONFIG): + id: PositiveInt + slug: UserSlug + name: UserName + + +class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + record_id: PositiveInt + time: datetime + award_name: NonEmptyStr + user_info: UserInfoField + + +async def get_latest_record_id() -> int: + try: + latest_data = JianshuLotteryWinRecordDocument.from_dict( + await COLLECTION.find().sort("recordId", -1).__anext__() + ) + except StopAsyncIteration: + return 0 + + return latest_data.record_id + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(["recordId"], unique=True)], + ) + + +async def insert_many(data: Sequence[JianshuLotteryWinRecordDocument]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py new file mode 100644 index 0000000..da9e21d --- /dev/null +++ b/models/jpep_ftn_trade_order.py @@ -0,0 +1,54 @@ +from datetime import datetime +from typing import Literal, Optional, Sequence + +from jkit._constraints import ( + NonNegativeInt, + PositiveFloat, + PositiveInt, +) +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.jpep_ftn_trade_orders + + +class PublisherInfoField(Field, **FIELD_OBJECT_CONFIG): + is_anonymous: bool + id: Optional[PositiveInt] + name: Optional[str] + hashed_name: Optional[str] + credit: Optional[NonNegativeInt] + + +class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): + fetch_time: datetime + order_id: PositiveInt + type: Literal["buy", "sell"] + price: PositiveFloat + + total_amount: PositiveInt + traded_amount: NonNegativeInt + tradable_amount: NonNegativeInt + minimum_trade_amount: PositiveInt + + traded_count: NonNegativeInt + publish_time: datetime + + publisher_info: PublisherInfoField + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [IndexModel(["fetchTime", "orderId"], unique=True)], + ) + + +async def insert_many(data: Sequence[JPEPFTNTradeOrderDocument]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py new file mode 100644 index 0000000..b2b1bfa --- /dev/null +++ b/models/lp_recommend_article_record.py @@ -0,0 +1,62 @@ +from datetime import date, datetime +from typing import Sequence + +from jkit._constraints import ( + ArticleSlug, + NonEmptyStr, + NonNegativeFloat, + NonNegativeInt, + PositiveInt, +) +from msgspec import field +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Documemt, + Field, +) + +COLLECTION = DB.lp_recommended_article_records + + +class AuthorInfoField(Field, **FIELD_OBJECT_CONFIG): + id: PositiveInt + slug: str + name: str + + +class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): + date: date + id: PositiveInt + slug: ArticleSlug + title: NonEmptyStr + published_at: datetime + + views_count: NonNegativeInt + likes_count: NonNegativeInt + comments_count: NonNegativeInt + tips_count: NonNegativeFloat + earned_fp_amount: NonNegativeFloat = field(name="EarnedFPAmount") + + is_paid: bool + can_comment: bool + description: str + + author_info: AuthorInfoField + + +async def is_record_stored(article_slug: str) -> bool: + result = await COLLECTION.find_one({"slug": article_slug}) + + return result is not None + + +async def init_db() -> None: + await COLLECTION.create_indexes([IndexModel(["date", "slug"], unique=True)]) + + +async def insert_many(data: Sequence[LPRecommendedArticleRecord]) -> None: + await COLLECTION.insert_many(x.to_dict() for x in data) diff --git a/poetry.lock b/poetry.lock index 87946a2..a1e0712 100644 --- a/poetry.lock +++ b/poetry.lock @@ -962,13 +962,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a13" +version = "3.0.0a14" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a13-py3-none-any.whl", hash = "sha256:cdaf86ceda1e65139c750c98cd0d5cc91f36d05804664cceccfe580395560216"}, - {file = "jkit-3.0.0a13.tar.gz", hash = "sha256:2cc74a013a0af8bfd9daa939362ac600f0e38723dbcd6ab023a54aea2b362e7c"}, + {file = "jkit-3.0.0a14-py3-none-any.whl", hash = "sha256:6690c4f0b8c952a7d60f0a4f157bd06b8a9e5f8d20c8c360eb6cc89ff7fcbbea"}, + {file = "jkit-3.0.0a14.tar.gz", hash = "sha256:a49e00cf2112ebd5327a43cd55fed924ee818f20b6f51c8ec609f1edeec687a5"}, ] [package.dependencies] @@ -1981,13 +1981,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "python-dateutil" -version = "2.9.0" +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" files = [ - {file = "python-dateutil-2.9.0.tar.gz", hash = "sha256:78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709"}, - {file = "python_dateutil-2.9.0-py2.py3-none-any.whl", hash = "sha256:cbf2f1da5e6083ac2fbfd4da39a25f34312230110440f424a14c7558bb85d82e"}, + {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"}, ] [package.dependencies] @@ -3016,4 +3016,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5790736e0f78682fddeb8bdd6209a21fd80aaf6b7d8dcedde43d1702df7941ed" +content-hash = "f106c2768e5f0da7718862c618fbd12d954628138e16b4edb2181f8e50af93f2" diff --git a/pyproject.toml b/pyproject.toml index 520153e..b462e88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a13" +jkit = "^3.0.0a14" sspeedup = "^0.25.1" [tool.poetry.group.dev.dependencies] diff --git a/requirements-dev.txt b/requirements-dev.txt index 0061b20..7a605dc 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a14 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -71,7 +71,7 @@ pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" pyright==1.1.352 ; python_version >= "3.8" and python_version < "4.0" -python-dateutil==2.9.0 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index f126b32..40b1684 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a13 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a14 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -69,7 +69,7 @@ pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" -python-dateutil==2.9.0 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" From 5442104f5a935389c1bdbad19aecef7d00e13a57 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 3 Mar 2024 09:08:53 +0800 Subject: [PATCH 43/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=98=E5=82=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_assets_ranking_records.py | 13 +++++++---- jobs/fetch_daily_update_ranking_records.py | 4 ++-- jobs/fetch_jianshu_lottery_win_records.py | 6 ++--- jobs/fetch_jpep_ftn_trade_orders.py | 21 +++++++++-------- jobs/fetch_lp_recommended_article_records.py | 4 ++-- models/article_earning_ranking_record.py | 1 + models/assets_ranking_record.py | 15 +++++++----- models/daily_update_ranking_record.py | 7 +++--- models/jianshu_lottery_win_record.py | 13 ++++++----- models/jpep_ftn_trade_order.py | 24 +++++++++++--------- models/lp_recommend_article_record.py | 4 ++-- 11 files changed, 63 insertions(+), 49 deletions(-) diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 99ee453..12025f8 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -9,8 +9,9 @@ from prefect.states import Completed, State from models.assets_ranking_record import ( + AmountField, AssetsRankingRecordDocument, - UserInfoField, + UserField, init_db, insert_many, ) @@ -56,10 +57,12 @@ async def process_item( return AssetsRankingRecordDocument( date=target_date, ranking=item.ranking, - fp_amount=fp_amount, - ftn_amount=ftn_amount, - assets_amount=item.assets_amount, - user_info=UserInfoField( + amount=AmountField( + fp=fp_amount, + ftn=ftn_amount, + assets=item.assets_amount, + ), + user=UserField( id=item.user_info.id, slug=item.user_info.slug, name=item.user_info.name, diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index f0f191b..fc957fa 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -10,7 +10,7 @@ from models.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, - UserInfoField, + UserField, init_db, insert_many, ) @@ -27,7 +27,7 @@ def process_item( date=current_date, ranking=item.ranking, days=item.days, - user_info=UserInfoField( + user=UserField( slug=item.user_info.slug, name=item.user_info.name, ), diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index 7e6fd1e..a0668af 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -6,7 +6,7 @@ from models.jianshu_lottery_win_record import ( JianshuLotteryWinRecordDocument, - UserInfoField, + UserField, get_latest_record_id, init_db, insert_many, @@ -19,10 +19,10 @@ def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: return JianshuLotteryWinRecordDocument( - record_id=item.id, + id=item.id, time=item.time, award_name=item.award_name, - user_info=UserInfoField( + user=UserField( id=item.user_info.id, slug=item.user_info.slug, name=item.user_info.name, diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index ab51fc3..1fe3e55 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -6,8 +6,9 @@ from prefect.states import Completed, State from models.jpep_ftn_trade_order import ( + AmountField, JPEPFTNTradeOrderDocument, - PublisherInfoField, + PublisherField, init_db, insert_many, ) @@ -32,17 +33,19 @@ def process_item( type: Literal["buy", "sell"], # noqa: A002 ) -> JPEPFTNTradeOrderDocument: return JPEPFTNTradeOrderDocument( - type=type, fetch_time=fetch_time, - order_id=item.id, + id=item.id, + published_at=item.publish_time, + type=type, price=item.price, - total_amount=item.total_amount, - traded_amount=item.traded_amount, - tradable_amount=item.tradable_amount, - minimum_trade_amount=item.minimum_trade_amount, traded_count=item.traded_count, - publish_time=item.publish_time, - publisher_info=PublisherInfoField( + amount=AmountField( + total=item.total_amount, + traded=item.traded_amount, + tradable=item.tradable_amount, + minimum_trade=item.minimum_trade_amount, + ), + publisher=PublisherField( is_anonymous=item.publisher_info.is_anonymous, id=item.publisher_info.id, name=item.publisher_info.name, diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py index 710db4c..7f43aaf 100644 --- a/jobs/fetch_lp_recommended_article_records.py +++ b/jobs/fetch_lp_recommended_article_records.py @@ -6,7 +6,7 @@ from prefect.states import Completed, State from models.lp_recommend_article_record import ( - AuthorInfoField, + AuthorField, LPRecommendedArticleRecord, init_db, insert_many, @@ -44,7 +44,7 @@ async def process_item( is_paid=item.is_paid, can_comment=item.can_comment, description=item.description, - author_info=AuthorInfoField( + author=AuthorField( id=item.author_info.id, slug=item.author_info.slug, name=item.author_info.name, diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py index 1e932ff..4776fc9 100644 --- a/models/article_earning_ranking_record.py +++ b/models/article_earning_ranking_record.py @@ -41,6 +41,7 @@ class EarningField(Field, **FIELD_OBJECT_CONFIG): class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt + article: ArticleField author: AuthorField earning: EarningField diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index 8abbcd5..7f19a55 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -21,7 +21,13 @@ COLLECTION = DB.assets_ranking_records -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): +class AmountField(Field, **FIELD_OBJECT_CONFIG): + fp: Optional[NonNegativeFloat] + ftn: Optional[NonNegativeFloat] + assets: PositiveFloat + + +class UserField(Field, **FIELD_OBJECT_CONFIG): id: Optional[PositiveInt] slug: Optional[UserSlug] name: Optional[UserName] @@ -31,11 +37,8 @@ class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt - fp_amount: Optional[NonNegativeFloat] - ftn_amount: Optional[NonNegativeFloat] - assets_amount: PositiveFloat - - user_info: UserInfoField + amount: AmountField + user: UserField async def init_db() -> None: diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index 406f57c..5bbda00 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -19,7 +19,7 @@ COLLECTION = DB.daily_update_ranking_records -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): +class UserField(Field, **FIELD_OBJECT_CONFIG): slug: UserSlug name: UserName @@ -28,12 +28,13 @@ class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt days: PositiveInt - user_info: UserInfoField + + user: UserField async def init_db() -> None: await COLLECTION.create_indexes( - [IndexModel(["date", "userInfo.slug"], unique=True)], + [IndexModel(["date", "user.slug"], unique=True)], ) diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py index 9679e39..8911ca0 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu_lottery_win_record.py @@ -20,33 +20,34 @@ COLLECTION = DB.jianshu_lottery_win_records -class UserInfoField(Field, **FIELD_OBJECT_CONFIG): +class UserField(Field, **FIELD_OBJECT_CONFIG): id: PositiveInt slug: UserSlug name: UserName class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): - record_id: PositiveInt + id: PositiveInt time: datetime award_name: NonEmptyStr - user_info: UserInfoField + + user: UserField async def get_latest_record_id() -> int: try: latest_data = JianshuLotteryWinRecordDocument.from_dict( - await COLLECTION.find().sort("recordId", -1).__anext__() + await COLLECTION.find().sort("id", -1).__anext__() ) except StopAsyncIteration: return 0 - return latest_data.record_id + return latest_data.id async def init_db() -> None: await COLLECTION.create_indexes( - [IndexModel(["recordId"], unique=True)], + [IndexModel(["id"], unique=True)], ) diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index da9e21d..b3e199f 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -19,7 +19,14 @@ COLLECTION = DB.jpep_ftn_trade_orders -class PublisherInfoField(Field, **FIELD_OBJECT_CONFIG): +class AmountField(Field, **FIELD_OBJECT_CONFIG): + total: PositiveInt + traded: NonNegativeInt + tradable: NonNegativeInt + minimum_trade: PositiveInt + + +class PublisherField(Field, **FIELD_OBJECT_CONFIG): is_anonymous: bool id: Optional[PositiveInt] name: Optional[str] @@ -29,24 +36,19 @@ class PublisherInfoField(Field, **FIELD_OBJECT_CONFIG): class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): fetch_time: datetime - order_id: PositiveInt + id: PositiveInt + published_at: datetime type: Literal["buy", "sell"] price: PositiveFloat - - total_amount: PositiveInt - traded_amount: NonNegativeInt - tradable_amount: NonNegativeInt - minimum_trade_amount: PositiveInt - traded_count: NonNegativeInt - publish_time: datetime - publisher_info: PublisherInfoField + amount: AmountField + publisher: PublisherField async def init_db() -> None: await COLLECTION.create_indexes( - [IndexModel(["fetchTime", "orderId"], unique=True)], + [IndexModel(["fetchTime", "id"], unique=True)], ) diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py index b2b1bfa..7102f5d 100644 --- a/models/lp_recommend_article_record.py +++ b/models/lp_recommend_article_record.py @@ -22,7 +22,7 @@ COLLECTION = DB.lp_recommended_article_records -class AuthorInfoField(Field, **FIELD_OBJECT_CONFIG): +class AuthorField(Field, **FIELD_OBJECT_CONFIG): id: PositiveInt slug: str name: str @@ -45,7 +45,7 @@ class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): can_comment: bool description: str - author_info: AuthorInfoField + author: AuthorField async def is_record_stored(article_slug: str) -> bool: From 61a37e4cac0f9a8d433d7fe4fa8fbd0d418084c2 Mon Sep 17 00:00:00 2001 From: yezi Date: Mon, 4 Mar 2024 06:03:20 +0800 Subject: [PATCH 44/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B4=9D?= =?UTF-8?q?=E5=B8=82=E4=BA=A4=E6=98=93=E5=8D=95=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E6=A6=82=E7=8E=87=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_jpep_ftn_trade_orders.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/fetch_jpep_ftn_trade_orders.py index 1fe3e55..e41786f 100644 --- a/jobs/fetch_jpep_ftn_trade_orders.py +++ b/jobs/fetch_jpep_ftn_trade_orders.py @@ -22,7 +22,9 @@ def get_fetch_time() -> datetime: current_dt = datetime.now() # 保证采集时间对齐 10 分钟间隔 - return current_dt.replace(minute=current_dt.minute // 10, second=0, microsecond=0) + return current_dt.replace( + minute=round(current_dt.minute / 10) * 10, second=0, microsecond=0 + ) def process_item( From 1487e972f15fd41723ea1a448cc9222b38d70c4d Mon Sep 17 00:00:00 2001 From: yezi Date: Mon, 4 Mar 2024 06:20:50 +0800 Subject: [PATCH 45/93] =?UTF-8?q?feat:=20=E7=BD=91=E7=BB=9C=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=8F=91=E7=94=9F=E9=94=99=E8=AF=AF=E6=97=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 2 ++ jobs/fetch_assets_ranking_records.py | 2 ++ utils/async_retry.py | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 utils/async_retry.py diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index 476afac..dbd863c 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -15,12 +15,14 @@ init_db, insert_many, ) +from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) +@async_retry() async def get_author_id_and_slug( item: RecordField, / ) -> Tuple[Optional[int], Optional[str]]: diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index 12025f8..d326ec4 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -15,12 +15,14 @@ init_db, insert_many, ) +from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) +@async_retry() async def get_fp_ftn_amount( item: AssetsRankingRecord, / ) -> Tuple[Optional[float], Optional[float]]: diff --git a/utils/async_retry.py b/utils/async_retry.py new file mode 100644 index 0000000..2744cbd --- /dev/null +++ b/utils/async_retry.py @@ -0,0 +1,19 @@ +from asyncio import sleep +from typing import Any, Callable + + +def async_retry(*, attempts: int = 3, delay: float = 5.0) -> Callable: + def outer(func: Callable) -> Callable: + async def inner(*args: Any, **kwargs: Any) -> Any: # noqa: ANN401 + for i in range(attempts): + try: + return await func(*args, **kwargs) + except Exception: # noqa: PERF203, BLE001 + if i == attempts - 1: + raise + await sleep(delay) + return None + + return inner + + return outer From 5b30224fb9c5dbb7eed17329aea3fa7668755302 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:08:00 +0800 Subject: [PATCH 46/93] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E6=96=B9=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/fetch_article_earning_ranking_records.py | 14 +-- jobs/fetch_assets_ranking_records.py | 16 ++-- jobs/fetch_daily_update_ranking_records.py | 17 ++-- jobs/fetch_jianshu_lottery_win_records.py | 22 +++-- jobs/fetch_lp_recommended_article_records.py | 15 +-- models/article_earning_ranking_record.py | 9 +- models/assets_ranking_record.py | 9 +- models/daily_update_ranking_record.py | 12 +-- models/jianshu_lottery_win_record.py | 11 +-- models/jianshu_user.py | 91 +++++++++++++++++++ models/lp_recommend_article_record.py | 11 +-- 11 files changed, 149 insertions(+), 78 deletions(-) create mode 100644 models/jianshu_user.py diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/fetch_article_earning_ranking_records.py index dbd863c..95acaa6 100644 --- a/jobs/fetch_article_earning_ranking_records.py +++ b/jobs/fetch_article_earning_ranking_records.py @@ -10,11 +10,11 @@ from models.article_earning_ranking_record import ( ArticleEarningRankingRecordDocument, ArticleField, - AuthorField, EarningField, init_db, insert_many, ) +from models.jianshu_user import insert_or_update_one from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, @@ -54,6 +54,12 @@ async def process_item( ) -> ArticleEarningRankingRecordDocument: author_id, author_slug = await get_author_id_and_slug(item) + if author_slug: + await insert_or_update_one( + slug=author_slug, + id=author_id, + ) + return ArticleEarningRankingRecordDocument( date=target_date, ranking=item.ranking, @@ -61,11 +67,7 @@ async def process_item( title=item.title, slug=item.slug, ), - author=AuthorField( - id=author_id, - slug=author_slug, - name=item.author_info.name, - ), + author_slug=author_slug, earning=EarningField( to_author=item.fp_to_author_anount, to_voter=item.fp_to_voter_amount, diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/fetch_assets_ranking_records.py index d326ec4..8f15c79 100644 --- a/jobs/fetch_assets_ranking_records.py +++ b/jobs/fetch_assets_ranking_records.py @@ -11,10 +11,10 @@ from models.assets_ranking_record import ( AmountField, AssetsRankingRecordDocument, - UserField, init_db, insert_many, ) +from models.jianshu_user import insert_or_update_one from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, @@ -56,6 +56,14 @@ async def process_item( ) -> AssetsRankingRecordDocument: fp_amount, ftn_amount = await get_fp_ftn_amount(item) + if item.user_info.slug: + await insert_or_update_one( + slug=item.user_info.slug, + id=item.user_info.id, + name=item.user_info.name, + avatar_url=item.user_info.avatar_url, + ) + return AssetsRankingRecordDocument( date=target_date, ranking=item.ranking, @@ -64,11 +72,7 @@ async def process_item( ftn=ftn_amount, assets=item.assets_amount, ), - user=UserField( - id=item.user_info.id, - slug=item.user_info.slug, - name=item.user_info.name, - ), + user_slug=item.user_info.slug, ).validate() diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/fetch_daily_update_ranking_records.py index fc957fa..e32f4b9 100644 --- a/jobs/fetch_daily_update_ranking_records.py +++ b/jobs/fetch_daily_update_ranking_records.py @@ -10,27 +10,30 @@ from models.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, - UserField, init_db, insert_many, ) +from models.jianshu_user import insert_or_update_one from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -def process_item( +async def process_item( item: DailyUpdateRankingRecord, /, *, current_date: date ) -> DailyUpdateRankingRecordDocument: + await insert_or_update_one( + slug=item.user_info.slug, + name=item.user_info.name, + avatar_url=item.user_info.avatar_url, + ) + return DailyUpdateRankingRecordDocument( date=current_date, ranking=item.ranking, days=item.days, - user=UserField( - slug=item.user_info.slug, - name=item.user_info.name, - ), + user_slug=item.user_info.slug, ).validate() @@ -46,7 +49,7 @@ async def flow_func() -> State: data: List[DailyUpdateRankingRecordDocument] = [] async for item in DailyUpdateRanking(): - processed_item = process_item(item, current_date=current_date) + processed_item = await process_item(item, current_date=current_date) data.append(processed_item) await insert_many(data) diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/fetch_jianshu_lottery_win_records.py index a0668af..c8869b1 100644 --- a/jobs/fetch_jianshu_lottery_win_records.py +++ b/jobs/fetch_jianshu_lottery_win_records.py @@ -6,27 +6,33 @@ from models.jianshu_lottery_win_record import ( JianshuLotteryWinRecordDocument, - UserField, get_latest_record_id, init_db, insert_many, ) +from models.jianshu_user import insert_or_update_one from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -def process_item(item: JianshuLotteryWinRecord, /) -> JianshuLotteryWinRecordDocument: +async def process_item( + item: JianshuLotteryWinRecord, / +) -> JianshuLotteryWinRecordDocument: + await insert_or_update_one( + slug=item.user_info.slug, + updated_at=item.time, + id=item.user_info.id, + name=item.user_info.name, + avatar_url=item.user_info.avatar_url, + ) + return JianshuLotteryWinRecordDocument( id=item.id, time=item.time, award_name=item.award_name, - user=UserField( - id=item.user_info.id, - slug=item.user_info.slug, - name=item.user_info.name, - ), + user_slug=item.user_info.slug, ).validate() @@ -50,7 +56,7 @@ async def flow_func() -> State: if item.id == stop_id: break - processed_item = process_item(item) + processed_item = await process_item(item) data.append(processed_item) else: logger.warning("采集数据量达到上限") diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/fetch_lp_recommended_article_records.py index 7f43aaf..9c5b878 100644 --- a/jobs/fetch_lp_recommended_article_records.py +++ b/jobs/fetch_lp_recommended_article_records.py @@ -5,8 +5,8 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State +from models.jianshu_user import insert_or_update_one from models.lp_recommend_article_record import ( - AuthorField, LPRecommendedArticleRecord, init_db, insert_many, @@ -30,6 +30,13 @@ async def process_item( logger.warning(f"已保存过该文章记录,跳过 slug={item.slug}") return None + await insert_or_update_one( + slug=item.author_info.slug, + id=item.author_info.id, + name=item.author_info.name, + avatar_url=item.author_info.avatar_url, + ) + return LPRecommendedArticleRecord( date=current_date, id=item.id, @@ -44,11 +51,7 @@ async def process_item( is_paid=item.is_paid, can_comment=item.can_comment, description=item.description, - author=AuthorField( - id=item.author_info.id, - slug=item.author_info.slug, - name=item.author_info.name, - ), + author_slug=item.author_info.slug, ).validate() diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py index 4776fc9..d443fcb 100644 --- a/models/article_earning_ranking_record.py +++ b/models/article_earning_ranking_record.py @@ -6,7 +6,6 @@ NonEmptyStr, PositiveFloat, PositiveInt, - UserName, UserSlug, ) from pymongo import IndexModel @@ -27,12 +26,6 @@ class ArticleField(Field, **FIELD_OBJECT_CONFIG): title: Optional[NonEmptyStr] -class AuthorField(Field, **FIELD_OBJECT_CONFIG): - id: Optional[PositiveInt] - slug: Optional[UserSlug] - name: Optional[UserName] - - class EarningField(Field, **FIELD_OBJECT_CONFIG): to_author: PositiveFloat to_voter: PositiveFloat @@ -43,7 +36,7 @@ class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): ranking: PositiveInt article: ArticleField - author: AuthorField + author_slug: Optional[UserSlug] earning: EarningField diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index 7f19a55..753a6ea 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -5,7 +5,6 @@ NonNegativeFloat, PositiveFloat, PositiveInt, - UserName, UserSlug, ) from pymongo import IndexModel @@ -27,18 +26,12 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): assets: PositiveFloat -class UserField(Field, **FIELD_OBJECT_CONFIG): - id: Optional[PositiveInt] - slug: Optional[UserSlug] - name: Optional[UserName] - - class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt amount: AmountField - user: UserField + user_slug: Optional[UserSlug] async def init_db() -> None: diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index 5bbda00..b534fd8 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -3,7 +3,6 @@ from jkit._constraints import ( PositiveInt, - UserName, UserSlug, ) from pymongo import IndexModel @@ -11,30 +10,23 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, Documemt, - Field, ) COLLECTION = DB.daily_update_ranking_records -class UserField(Field, **FIELD_OBJECT_CONFIG): - slug: UserSlug - name: UserName - - class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt days: PositiveInt - user: UserField + user_slug: UserSlug async def init_db() -> None: await COLLECTION.create_indexes( - [IndexModel(["date", "user.slug"], unique=True)], + [IndexModel(["date", "user_slug"], unique=True)], ) diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py index 8911ca0..3182aa5 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu_lottery_win_record.py @@ -4,7 +4,6 @@ from jkit._constraints import ( NonEmptyStr, PositiveInt, - UserName, UserSlug, ) from pymongo import IndexModel @@ -12,26 +11,18 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, Documemt, - Field, ) COLLECTION = DB.jianshu_lottery_win_records -class UserField(Field, **FIELD_OBJECT_CONFIG): - id: PositiveInt - slug: UserSlug - name: UserName - - class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): id: PositiveInt time: datetime award_name: NonEmptyStr - user: UserField + user_slug: UserSlug async def get_latest_record_id() -> int: diff --git a/models/jianshu_user.py b/models/jianshu_user.py new file mode 100644 index 0000000..0021683 --- /dev/null +++ b/models/jianshu_user.py @@ -0,0 +1,91 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional + +from jkit._constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import Documemt + +COLLECTION = DB.jianshu_users + + +class JianshuUser(Documemt): + slug: UserSlug + updated_at: datetime + id: Optional[PositiveInt] + name: Optional[UserName] + history_names: List[UserName] + avatar_url: Optional[UserUploadedUrl] + + +async def init_db() -> None: + await COLLECTION.create_indexes( + [ + IndexModel(["slug"], unique=True), + IndexModel(["updatedAt"]), + ], + ) + + +async def is_exist(slug: str) -> bool: + return await COLLECTION.find_one({"slug": slug}) is not None + + +async def insert_or_update_one( + *, + slug: str, + updated_at: Optional[datetime] = None, + id: Optional[int] = None, # noqa: A002 + name: Optional[str] = None, + avatar_url: Optional[str] = None, +) -> None: + if not updated_at: + updated_at = datetime.now() + + if not await is_exist(slug): + await COLLECTION.insert_one( + JianshuUser( + slug=slug, + updated_at=updated_at, + id=id, + name=name, + history_names=[], + avatar_url=avatar_url, + ).to_dict() + ) + + # 此处用户必定存在,因此 current_data 不为 None + current_data = JianshuUser.from_dict(await COLLECTION.find_one({"slug": slug})) # type: ignore + + update_data: Dict[str, Any] = { + "$set": { + # 即使没有要更新的数据,也视为对数据更新时间的刷新 + "updatedAt": updated_at, + } + } + # 如果新数据中的 ID 与数据库不一致,报错 + if id and current_data.id and id != current_data.id: + raise ValueError(f"ID 不一致({id} 和 {current_data.id})") + + # 如果获取到了之前未知的 ID,添加之 + if id and not current_data.id: + update_data["$set"]["id"] = id + + # 如果获取到了之前未知的昵称,添加之 + if name and not current_data.name: + update_data["$set"]["name"] = name + + # 如果新数据中的昵称与数据库不一致,说明昵称更改过 + # 更新数据库中的昵称,并将之前的昵称加入历史昵称列表 + if current_data.name is not None: + update_data["$set"]["name"] = name + update_data["$push"] = {"historyNames": current_data.name} + + # 如果获取到了之前未知的头像链接,或头像链接与之前不一致,添加 / 更新之 + if avatar_url and ( + not current_data.avatar_url or avatar_url != current_data.avatar_url + ): + update_data["$set"]["avatarUrl"] = avatar_url + + await COLLECTION.update_one({"slug": slug}, update_data) diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py index 7102f5d..6c09d23 100644 --- a/models/lp_recommend_article_record.py +++ b/models/lp_recommend_article_record.py @@ -7,6 +7,7 @@ NonNegativeFloat, NonNegativeInt, PositiveInt, + UserSlug, ) from msgspec import field from pymongo import IndexModel @@ -14,20 +15,12 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, Documemt, - Field, ) COLLECTION = DB.lp_recommended_article_records -class AuthorField(Field, **FIELD_OBJECT_CONFIG): - id: PositiveInt - slug: str - name: str - - class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date id: PositiveInt @@ -45,7 +38,7 @@ class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): can_comment: bool description: str - author: AuthorField + author_slug: UserSlug async def is_record_stored(article_slug: str) -> bool: From 7d707be75d3c9fd9450034074d9a88996362eaed Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:10:12 +0800 Subject: [PATCH 47/93] =?UTF-8?q?feat:=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E6=9B=B4=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 14 +++++++------- ...nking_records.py => article_earning_ranking.py} | 0 ...assets_ranking_records.py => assets_ranking.py} | 0 ..._ranking_records.py => daily_update_ranking.py} | 0 ...u_lottery_win_records.py => jianshu_lottery.py} | 0 ..._jpep_ftn_trade_orders.py => jpep_ftn_trade.py} | 0 ...ticle_records.py => lp_recommended_articles.py} | 0 7 files changed, 7 insertions(+), 7 deletions(-) rename jobs/{fetch_article_earning_ranking_records.py => article_earning_ranking.py} (100%) rename jobs/{fetch_assets_ranking_records.py => assets_ranking.py} (100%) rename jobs/{fetch_daily_update_ranking_records.py => daily_update_ranking.py} (100%) rename jobs/{fetch_jianshu_lottery_win_records.py => jianshu_lottery.py} (100%) rename jobs/{fetch_jpep_ftn_trade_orders.py => jpep_ftn_trade.py} (100%) rename jobs/{fetch_lp_recommended_article_records.py => lp_recommended_articles.py} (100%) diff --git a/jobs/__init__.py b/jobs/__init__.py index 4e2e2ce..2f0a65f 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -14,13 +14,13 @@ def import_deployment(path: str) -> DeploymentType: DEPLOYMENT_PATHS: Set[str] = { - "jobs.fetch_article_earning_ranking_records:deployment", - "jobs.fetch_assets_ranking_records:deployment", - "jobs.fetch_daily_update_ranking_records:deployment", - "jobs.fetch_jianshu_lottery_win_records:deployment", - "jobs.fetch_jpep_ftn_trade_orders:buy_deployment", - "jobs.fetch_jpep_ftn_trade_orders:sell_deployment", - "jobs.fetch_lp_recommended_article_records:deployment", + "jobs.article_earning_ranking:deployment", + "jobs.assets_ranking:deployment", + "jobs.daily_update_ranking:deployment", + "jobs.jianshu_lottery:deployment", + "jobs.jpep_ftn_trade:buy_deployment", + "jobs.jpep_ftn_trade:sell_deployment", + "jobs.lp_recommended_articles:deployment", } diff --git a/jobs/fetch_article_earning_ranking_records.py b/jobs/article_earning_ranking.py similarity index 100% rename from jobs/fetch_article_earning_ranking_records.py rename to jobs/article_earning_ranking.py diff --git a/jobs/fetch_assets_ranking_records.py b/jobs/assets_ranking.py similarity index 100% rename from jobs/fetch_assets_ranking_records.py rename to jobs/assets_ranking.py diff --git a/jobs/fetch_daily_update_ranking_records.py b/jobs/daily_update_ranking.py similarity index 100% rename from jobs/fetch_daily_update_ranking_records.py rename to jobs/daily_update_ranking.py diff --git a/jobs/fetch_jianshu_lottery_win_records.py b/jobs/jianshu_lottery.py similarity index 100% rename from jobs/fetch_jianshu_lottery_win_records.py rename to jobs/jianshu_lottery.py diff --git a/jobs/fetch_jpep_ftn_trade_orders.py b/jobs/jpep_ftn_trade.py similarity index 100% rename from jobs/fetch_jpep_ftn_trade_orders.py rename to jobs/jpep_ftn_trade.py diff --git a/jobs/fetch_lp_recommended_article_records.py b/jobs/lp_recommended_articles.py similarity index 100% rename from jobs/fetch_lp_recommended_article_records.py rename to jobs/lp_recommended_articles.py From e2c4029a9ac1e04d4319792be21678b51bd9a91f Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:15:18 +0800 Subject: [PATCH 48/93] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/article_earning_ranking.py | 8 ++++++-- jobs/assets_ranking.py | 8 ++++++-- jobs/daily_update_ranking.py | 8 ++++++-- jobs/jianshu_lottery.py | 8 ++++++-- jobs/lp_recommended_articles.py | 8 ++++++-- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/jobs/article_earning_ranking.py b/jobs/article_earning_ranking.py index 95acaa6..562bbea 100644 --- a/jobs/article_earning_ranking.py +++ b/jobs/article_earning_ranking.py @@ -11,9 +11,12 @@ ArticleEarningRankingRecordDocument, ArticleField, EarningField, - init_db, insert_many, ) +from models.article_earning_ranking_record import ( + init_db as init_article_earning_ranking_record_db, +) +from models.jianshu_user import init_db as init_jianshu_user_db from models.jianshu_user import insert_or_update_one from utils.async_retry import async_retry from utils.config_generators import ( @@ -81,7 +84,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_db() + await init_article_earning_ranking_record_db() + await init_jianshu_user_db() target_date = datetime.now().date() - timedelta(days=1) diff --git a/jobs/assets_ranking.py b/jobs/assets_ranking.py index 8f15c79..6440fa0 100644 --- a/jobs/assets_ranking.py +++ b/jobs/assets_ranking.py @@ -11,9 +11,12 @@ from models.assets_ranking_record import ( AmountField, AssetsRankingRecordDocument, - init_db, insert_many, ) +from models.assets_ranking_record import ( + init_db as init_assets_ranking_record_db, +) +from models.jianshu_user import init_db as init_jianshu_user_db from models.jianshu_user import insert_or_update_one from utils.async_retry import async_retry from utils.config_generators import ( @@ -82,7 +85,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_db() + await init_assets_ranking_record_db() + await init_jianshu_user_db() target_date = datetime.now().date() diff --git a/jobs/daily_update_ranking.py b/jobs/daily_update_ranking.py index e32f4b9..bedd1e6 100644 --- a/jobs/daily_update_ranking.py +++ b/jobs/daily_update_ranking.py @@ -10,9 +10,12 @@ from models.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, - init_db, insert_many, ) +from models.daily_update_ranking_record import ( + init_db as init_daily_update_ranking_record_db, +) +from models.jianshu_user import init_db as init_jianshu_user_db from models.jianshu_user import insert_or_update_one from utils.config_generators import ( generate_deployment_config, @@ -43,7 +46,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_db() + await init_daily_update_ranking_record_db() + await init_jianshu_user_db() current_date = datetime.now().date() diff --git a/jobs/jianshu_lottery.py b/jobs/jianshu_lottery.py index c8869b1..1b4efc2 100644 --- a/jobs/jianshu_lottery.py +++ b/jobs/jianshu_lottery.py @@ -7,9 +7,12 @@ from models.jianshu_lottery_win_record import ( JianshuLotteryWinRecordDocument, get_latest_record_id, - init_db, insert_many, ) +from models.jianshu_lottery_win_record import ( + init_db as init_jianshu_lottery_win_record_db, +) +from models.jianshu_user import init_db as init_jianshu_user_db from models.jianshu_user import insert_or_update_one from utils.config_generators import ( generate_deployment_config, @@ -42,7 +45,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_db() + await init_jianshu_lottery_win_record_db() + await init_jianshu_user_db() logger = get_run_logger() diff --git a/jobs/lp_recommended_articles.py b/jobs/lp_recommended_articles.py index 9c5b878..f8fdef1 100644 --- a/jobs/lp_recommended_articles.py +++ b/jobs/lp_recommended_articles.py @@ -5,13 +5,16 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State +from models.jianshu_user import init_db as init_jianshu_user_db from models.jianshu_user import insert_or_update_one from models.lp_recommend_article_record import ( LPRecommendedArticleRecord, - init_db, insert_many, is_record_stored, ) +from models.lp_recommend_article_record import ( + init_db as init_lp_recommend_article_record_db, +) from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -61,7 +64,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_db() + await init_lp_recommend_article_record_db() + await init_jianshu_user_db() logger = get_run_logger() From fe09b1d93ae9b49175f4817eae5a069b94bcf273 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:19:44 +0800 Subject: [PATCH 49/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E7=B4=A2=E5=BC=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/daily_update_ranking_record.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index b534fd8..f063107 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -26,7 +26,7 @@ class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): async def init_db() -> None: await COLLECTION.create_indexes( - [IndexModel(["date", "user_slug"], unique=True)], + [IndexModel(["date", "userSlug"], unique=True)], ) From 3b781383a7736a771b89321bf4c13d133b36835a Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:32:37 +0800 Subject: [PATCH 50/93] =?UTF-8?q?feat:=20=E6=96=87=E7=AB=A0=E6=94=B6?= =?UTF-8?q?=E7=9B=8A=E6=8E=92=E8=A1=8C=E6=A6=9C=E9=87=87=E9=9B=86=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E4=BD=9C=E8=80=85=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/article_earning_ranking.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/jobs/article_earning_ranking.py b/jobs/article_earning_ranking.py index 562bbea..2aff521 100644 --- a/jobs/article_earning_ranking.py +++ b/jobs/article_earning_ranking.py @@ -4,6 +4,7 @@ from jkit.config import CONFIG from jkit.exceptions import ResourceUnavailableError from jkit.ranking.article_earning import ArticleEarningRanking, RecordField +from jkit.user import UserInfo from prefect import flow, get_run_logger from prefect.states import Completed, State @@ -26,13 +27,13 @@ @async_retry() -async def get_author_id_and_slug( +async def get_author_slug_and_info( item: RecordField, / -) -> Tuple[Optional[int], Optional[str]]: +) -> Tuple[Optional[str], Optional[UserInfo]]: logger = get_run_logger() if not item.slug: - logger.warning(f"文章走丢了,跳过采集文章与作者信息 ranking={item.ranking}") + logger.warning(f"文章走丢了,跳过采集作者信息 ranking={item.ranking}") return None, None try: @@ -41,26 +42,26 @@ async def get_author_id_and_slug( article_obj = item.to_article_obj() author = (await article_obj.info).author_info.to_user_obj() - result = (await author.id, author.slug) + author_info = await author.info CONFIG.data_validation.enabled = True - return result + return (author.slug, author_info) except ResourceUnavailableError: - logger.warning( - f"文章或作者状态异常,跳过采集文章与作者信息 ranking={item.ranking}" - ) + logger.warning(f"文章或作者状态异常,跳过采集作者信息 ranking={item.ranking}") return None, None async def process_item( item: RecordField, /, *, target_date: date ) -> ArticleEarningRankingRecordDocument: - author_id, author_slug = await get_author_id_and_slug(item) + author_slug, author_info = await get_author_slug_and_info(item) - if author_slug: + if author_slug is not None and author_info is not None: await insert_or_update_one( slug=author_slug, - id=author_id, + id=author_info.id, + name=author_info.name, + avatar_url=author_info.avatar_url, ) return ArticleEarningRankingRecordDocument( From b64ed05a3f4f5872ae87b353e9bf93bd05b8de11 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 6 Mar 2024 06:42:32 +0800 Subject: [PATCH 51/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E7=AE=80=E4=B9=A6=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jianshu_user.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 0021683..d927fee 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -55,8 +55,8 @@ async def insert_or_update_one( ).to_dict() ) - # 此处用户必定存在,因此 current_data 不为 None - current_data = JianshuUser.from_dict(await COLLECTION.find_one({"slug": slug})) # type: ignore + # 此处用户必定存在,因此 db_data 不为 None + db_data = JianshuUser.from_dict(await COLLECTION.find_one({"slug": slug})) # type: ignore update_data: Dict[str, Any] = { "$set": { @@ -65,26 +65,31 @@ async def insert_or_update_one( } } # 如果新数据中的 ID 与数据库不一致,报错 - if id and current_data.id and id != current_data.id: - raise ValueError(f"ID 不一致({id} 和 {current_data.id})") + if (id is not None and db_data.id is not None) and id != db_data.id: + raise ValueError(f"ID 不一致({id} 和 {db_data.id})") # 如果获取到了之前未知的 ID,添加之 - if id and not current_data.id: + if id is not None and db_data.id is None: update_data["$set"]["id"] = id # 如果获取到了之前未知的昵称,添加之 - if name and not current_data.name: + if name is not None and db_data.name is None: update_data["$set"]["name"] = name # 如果新数据中的昵称与数据库不一致,说明昵称更改过 - # 更新数据库中的昵称,并将之前的昵称加入历史昵称列表 - if current_data.name is not None: + # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 + # 则更新数据库中的昵称,并将之前的昵称加入历史昵称列表 + if ( + (name is not None and db_data.name is not None) + and name != db_data.name + and updated_at > db_data.updated_at + ): update_data["$set"]["name"] = name - update_data["$push"] = {"historyNames": current_data.name} + update_data["$push"] = {"historyNames": db_data.name} # 如果获取到了之前未知的头像链接,或头像链接与之前不一致,添加 / 更新之 - if avatar_url and ( - not current_data.avatar_url or avatar_url != current_data.avatar_url + if avatar_url is not None and ( + db_data.avatar_url is None or avatar_url != db_data.avatar_url ): update_data["$set"]["avatarUrl"] = avatar_url From bf239b18bd6bd712e8bae7cbc1a805ccdb4ad7f5 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 7 Mar 2024 06:12:23 +0800 Subject: [PATCH 52/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E5=8D=95=E6=95=B0=E6=8D=AE=E9=87=87=E9=9B=86?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jpep_ftn_trade.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/jobs/jpep_ftn_trade.py b/jobs/jpep_ftn_trade.py index e41786f..692c843 100644 --- a/jobs/jpep_ftn_trade.py +++ b/jobs/jpep_ftn_trade.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from typing import List, Literal from jkit.jpep.ftn_macket import FTNMacket, FTNMacketOrderRecord @@ -19,12 +19,18 @@ def get_fetch_time() -> datetime: - current_dt = datetime.now() + dt = datetime.now() # 保证采集时间对齐 10 分钟间隔 - return current_dt.replace( - minute=round(current_dt.minute / 10) * 10, second=0, microsecond=0 + discard = timedelta( + minutes=dt.minute % 10, + seconds=dt.second, + microseconds=dt.microsecond, ) + dt -= discard + if discard >= timedelta(minutes=5): + dt += timedelta(minutes=10) + return dt def process_item( From b76dbd111531fc0326a9203aeb1a27e73cab3dd0 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 7 Mar 2024 06:28:27 +0800 Subject: [PATCH 53/93] =?UTF-8?q?feat:=20=E7=AE=80=E4=B9=A6=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=95=B0=E6=8D=AE=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jianshu_user.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/models/jianshu_user.py b/models/jianshu_user.py index d927fee..4e4d6c5 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -1,4 +1,5 @@ from datetime import datetime +from enum import Enum from typing import Any, Dict, List, Optional from jkit._constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl @@ -10,8 +11,14 @@ COLLECTION = DB.jianshu_users +class JianshuUserStatus(Enum): + NORMAL = "NORMAL" + INACCESSABLE = "INACCESSIBLE" + + class JianshuUser(Documemt): slug: UserSlug + status: JianshuUserStatus updated_at: datetime id: Optional[PositiveInt] name: Optional[UserName] @@ -47,6 +54,7 @@ async def insert_or_update_one( await COLLECTION.insert_one( JianshuUser( slug=slug, + status=JianshuUserStatus.NORMAL, updated_at=updated_at, id=id, name=name, From febd498a73a040c4d537f5cd08c3ddbe53cd04ac Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 7 Mar 2024 06:35:18 +0800 Subject: [PATCH 54/93] =?UTF-8?q?feat:=20=E4=B8=8D=E5=86=8D=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=B7=A5=E4=BD=9C=E6=B5=81=E4=B8=8E=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/config_generators.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/utils/config_generators.py b/utils/config_generators.py index 145c61e..49b8bca 100644 --- a/utils/config_generators.py +++ b/utils/config_generators.py @@ -3,7 +3,6 @@ from prefect.client.schemas.schedules import CronSchedule -from utils.config import CONFIG from utils.event_handlers import on_failure_or_crashed @@ -15,7 +14,7 @@ def generate_flow_config( ) -> Dict[str, Any]: return { "name": name, - "version": CONFIG.version, + "version": None, "retries": retries, "retry_delay_seconds": retry_delay_seconds, "timeout_seconds": timeout, @@ -27,7 +26,7 @@ def generate_flow_config( def generate_deployment_config(name: str, cron: str) -> Dict[str, Any]: return { "name": f"JFetcher - {name}", - "version": CONFIG.version, + "version": None, "schedule": CronSchedule( cron=cron, timezone="Asia/Shanghai", From e5fbd40313178f9bb993284492c3841090c769fc Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 8 Mar 2024 06:36:27 +0800 Subject: [PATCH 55/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E4=BA=A4=E4=BA=92=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/article_earning_ranking.py | 15 +-- jobs/assets_ranking.py | 15 +-- jobs/daily_update_ranking.py | 15 +-- jobs/jianshu_lottery.py | 18 +-- jobs/jpep_ftn_trade.py | 6 +- jobs/lp_recommended_articles.py | 26 ++-- models/article_earning_ranking_record.py | 16 +-- models/assets_ranking_record.py | 16 +-- models/daily_update_ranking_record.py | 16 +-- models/jianshu_lottery_win_record.py | 38 +++--- models/jianshu_user.py | 149 ++++++++++++----------- models/jpep_ftn_trade_order.py | 16 +-- models/lp_recommend_article_record.py | 24 ++-- utils/document_model.py | 23 +++- 14 files changed, 181 insertions(+), 212 deletions(-) diff --git a/jobs/article_earning_ranking.py b/jobs/article_earning_ranking.py index 2aff521..3dfb7e0 100644 --- a/jobs/article_earning_ranking.py +++ b/jobs/article_earning_ranking.py @@ -12,13 +12,8 @@ ArticleEarningRankingRecordDocument, ArticleField, EarningField, - insert_many, ) -from models.article_earning_ranking_record import ( - init_db as init_article_earning_ranking_record_db, -) -from models.jianshu_user import init_db as init_jianshu_user_db -from models.jianshu_user import insert_or_update_one +from models.jianshu_user import JianshuUserDocument from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, @@ -57,7 +52,7 @@ async def process_item( author_slug, author_info = await get_author_slug_and_info(item) if author_slug is not None and author_info is not None: - await insert_or_update_one( + await JianshuUserDocument.insert_or_update_one( slug=author_slug, id=author_info.id, name=author_info.name, @@ -85,8 +80,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_article_earning_ranking_record_db() - await init_jianshu_user_db() + await ArticleEarningRankingRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() target_date = datetime.now().date() - timedelta(days=1) @@ -95,7 +90,7 @@ async def flow_func() -> State: processed_item = await process_item(item, target_date=target_date) data.append(processed_item) - await insert_many(data) + await ArticleEarningRankingRecordDocument.insert_many(data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/assets_ranking.py b/jobs/assets_ranking.py index 6440fa0..6b78414 100644 --- a/jobs/assets_ranking.py +++ b/jobs/assets_ranking.py @@ -11,13 +11,8 @@ from models.assets_ranking_record import ( AmountField, AssetsRankingRecordDocument, - insert_many, ) -from models.assets_ranking_record import ( - init_db as init_assets_ranking_record_db, -) -from models.jianshu_user import init_db as init_jianshu_user_db -from models.jianshu_user import insert_or_update_one +from models.jianshu_user import JianshuUserDocument from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, @@ -60,7 +55,7 @@ async def process_item( fp_amount, ftn_amount = await get_fp_ftn_amount(item) if item.user_info.slug: - await insert_or_update_one( + await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, id=item.user_info.id, name=item.user_info.name, @@ -85,8 +80,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_assets_ranking_record_db() - await init_jianshu_user_db() + await AssetsRankingRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() target_date = datetime.now().date() @@ -98,7 +93,7 @@ async def flow_func() -> State: if len(data) == 1000: break - await insert_many(data) + await AssetsRankingRecordDocument.insert_many(data) return Completed(message=f"target_date={target_date}, data_count={len(data)}") diff --git a/jobs/daily_update_ranking.py b/jobs/daily_update_ranking.py index bedd1e6..19585f9 100644 --- a/jobs/daily_update_ranking.py +++ b/jobs/daily_update_ranking.py @@ -10,13 +10,8 @@ from models.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, - insert_many, ) -from models.daily_update_ranking_record import ( - init_db as init_daily_update_ranking_record_db, -) -from models.jianshu_user import init_db as init_jianshu_user_db -from models.jianshu_user import insert_or_update_one +from models.jianshu_user import JianshuUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -26,7 +21,7 @@ async def process_item( item: DailyUpdateRankingRecord, /, *, current_date: date ) -> DailyUpdateRankingRecordDocument: - await insert_or_update_one( + await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, name=item.user_info.name, avatar_url=item.user_info.avatar_url, @@ -46,8 +41,8 @@ async def process_item( ) ) async def flow_func() -> State: - await init_daily_update_ranking_record_db() - await init_jianshu_user_db() + await DailyUpdateRankingRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() current_date = datetime.now().date() @@ -56,7 +51,7 @@ async def flow_func() -> State: processed_item = await process_item(item, current_date=current_date) data.append(processed_item) - await insert_many(data) + await DailyUpdateRankingRecordDocument.insert_many(data) return Completed(message=f"data_count={len(data)}") diff --git a/jobs/jianshu_lottery.py b/jobs/jianshu_lottery.py index 1b4efc2..807f168 100644 --- a/jobs/jianshu_lottery.py +++ b/jobs/jianshu_lottery.py @@ -6,14 +6,8 @@ from models.jianshu_lottery_win_record import ( JianshuLotteryWinRecordDocument, - get_latest_record_id, - insert_many, ) -from models.jianshu_lottery_win_record import ( - init_db as init_jianshu_lottery_win_record_db, -) -from models.jianshu_user import init_db as init_jianshu_user_db -from models.jianshu_user import insert_or_update_one +from models.jianshu_user import JianshuUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -23,7 +17,7 @@ async def process_item( item: JianshuLotteryWinRecord, / ) -> JianshuLotteryWinRecordDocument: - await insert_or_update_one( + await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, updated_at=item.time, id=item.user_info.id, @@ -45,12 +39,12 @@ async def process_item( ) ) async def flow_func() -> State: - await init_jianshu_lottery_win_record_db() - await init_jianshu_user_db() + await JianshuLotteryWinRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() logger = get_run_logger() - stop_id = await get_latest_record_id() + stop_id = await JianshuLotteryWinRecordDocument.get_latest_record_id() logger.info(f"获取到最新的记录 ID:{stop_id}") if stop_id == 0: logger.warning("数据库中没有记录") @@ -66,7 +60,7 @@ async def flow_func() -> State: logger.warning("采集数据量达到上限") if data: - await insert_many(data) + await JianshuLotteryWinRecordDocument.insert_many(data) else: logger.info("无数据,不执行保存操作") diff --git a/jobs/jpep_ftn_trade.py b/jobs/jpep_ftn_trade.py index 692c843..89c86bf 100644 --- a/jobs/jpep_ftn_trade.py +++ b/jobs/jpep_ftn_trade.py @@ -9,8 +9,6 @@ AmountField, JPEPFTNTradeOrderDocument, PublisherField, - init_db, - insert_many, ) from utils.config_generators import ( generate_deployment_config, @@ -69,7 +67,7 @@ def process_item( ), ) async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 - await init_db() + await JPEPFTNTradeOrderDocument.ensure_indexes() fetch_time = get_fetch_time() @@ -78,7 +76,7 @@ async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 processed_item = process_item(item, fetch_time=fetch_time, type=type) data.append(processed_item) - await insert_many(data) + await JPEPFTNTradeOrderDocument.insert_many(data) return Completed(message=f"fetch_time={fetch_time}, data_count={len(data)}") diff --git a/jobs/lp_recommended_articles.py b/jobs/lp_recommended_articles.py index f8fdef1..a2bca43 100644 --- a/jobs/lp_recommended_articles.py +++ b/jobs/lp_recommended_articles.py @@ -5,15 +5,9 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State -from models.jianshu_user import init_db as init_jianshu_user_db -from models.jianshu_user import insert_or_update_one +from models.jianshu_user import JianshuUserDocument from models.lp_recommend_article_record import ( - LPRecommendedArticleRecord, - insert_many, - is_record_stored, -) -from models.lp_recommend_article_record import ( - init_db as init_lp_recommend_article_record_db, + LPRecommendedArticleRecordDocument, ) from utils.config_generators import ( generate_deployment_config, @@ -26,21 +20,21 @@ async def process_item( item: CollectionArticleInfo, /, *, current_date: date -) -> Optional[LPRecommendedArticleRecord]: +) -> Optional[LPRecommendedArticleRecordDocument]: logger = get_run_logger() - if await is_record_stored(item.slug): + if await LPRecommendedArticleRecordDocument.is_record_exist(item.slug): logger.warning(f"已保存过该文章记录,跳过 slug={item.slug}") return None - await insert_or_update_one( + await JianshuUserDocument.insert_or_update_one( slug=item.author_info.slug, id=item.author_info.id, name=item.author_info.name, avatar_url=item.author_info.avatar_url, ) - return LPRecommendedArticleRecord( + return LPRecommendedArticleRecordDocument( date=current_date, id=item.id, slug=item.slug, @@ -64,14 +58,14 @@ async def process_item( ) ) async def flow_func() -> State: - await init_lp_recommend_article_record_db() - await init_jianshu_user_db() + await LPRecommendedArticleRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() logger = get_run_logger() current_date = datetime.now().date() - data: List[LPRecommendedArticleRecord] = [] + data: List[LPRecommendedArticleRecordDocument] = [] itered_items_count = 0 async for item in LP_RECOMMENDED_COLLECTION.iter_articles(): processed_item = await process_item(item, current_date=current_date) @@ -83,7 +77,7 @@ async def flow_func() -> State: break if data: - await insert_many(data) + await LPRecommendedArticleRecordDocument.insert_many(data) else: logger.info("无数据,不执行保存操作") diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py index d443fcb..0b46295 100644 --- a/models/article_earning_ranking_record.py +++ b/models/article_earning_ranking_record.py @@ -1,5 +1,5 @@ from datetime import date -from typing import Optional, Sequence +from typing import ClassVar, List, Optional from jkit._constraints import ( ArticleSlug, @@ -39,12 +39,8 @@ class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): author_slug: Optional[UserSlug] earning: EarningField - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(["date", "ranking"], unique=True)], - ) - - -async def insert_many(data: Sequence[ArticleEarningRankingRecordDocument]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "ranking"], unique=True), + ] diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index 753a6ea..6ba9cf6 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -1,5 +1,5 @@ from datetime import date -from typing import Optional, Sequence +from typing import ClassVar, List, Optional from jkit._constraints import ( NonNegativeFloat, @@ -33,12 +33,8 @@ class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): amount: AmountField user_slug: Optional[UserSlug] - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(["date", "ranking"], unique=True)], - ) - - -async def insert_many(data: Sequence[AssetsRankingRecordDocument]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "ranking"], unique=True), + ] diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index f063107..7c7038d 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -1,5 +1,5 @@ from datetime import date -from typing import Sequence +from typing import ClassVar, List from jkit._constraints import ( PositiveInt, @@ -23,12 +23,8 @@ class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(["date", "userSlug"], unique=True)], - ) - - -async def insert_many(data: Sequence[DailyUpdateRankingRecordDocument]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "userSlug"], unique=True), + ] diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py index 3182aa5..b506be1 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu_lottery_win_record.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Sequence +from typing import ClassVar, List from jkit._constraints import ( NonEmptyStr, @@ -24,23 +24,19 @@ class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug - -async def get_latest_record_id() -> int: - try: - latest_data = JianshuLotteryWinRecordDocument.from_dict( - await COLLECTION.find().sort("id", -1).__anext__() - ) - except StopAsyncIteration: - return 0 - - return latest_data.id - - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(["id"], unique=True)], - ) - - -async def insert_many(data: Sequence[JianshuLotteryWinRecordDocument]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["id"], unique=True), + ] + + @classmethod + async def get_latest_record_id(cls) -> int: + try: + latest_data = JianshuLotteryWinRecordDocument.from_dict( + await COLLECTION.find().sort("id", -1).__anext__() + ) + except StopAsyncIteration: + return 0 + + return latest_data.id diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 4e4d6c5..558796f 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -1,6 +1,6 @@ from datetime import datetime from enum import Enum -from typing import Any, Dict, List, Optional +from typing import Any, ClassVar, Dict, List, Optional from jkit._constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl from pymongo import IndexModel @@ -16,7 +16,7 @@ class JianshuUserStatus(Enum): INACCESSABLE = "INACCESSIBLE" -class JianshuUser(Documemt): +class JianshuUserDocument(Documemt): slug: UserSlug status: JianshuUserStatus updated_at: datetime @@ -25,80 +25,81 @@ class JianshuUser(Documemt): history_names: List[UserName] avatar_url: Optional[UserUploadedUrl] - -async def init_db() -> None: - await COLLECTION.create_indexes( - [ + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ IndexModel(["slug"], unique=True), IndexModel(["updatedAt"]), - ], - ) - - -async def is_exist(slug: str) -> bool: - return await COLLECTION.find_one({"slug": slug}) is not None - - -async def insert_or_update_one( - *, - slug: str, - updated_at: Optional[datetime] = None, - id: Optional[int] = None, # noqa: A002 - name: Optional[str] = None, - avatar_url: Optional[str] = None, -) -> None: - if not updated_at: - updated_at = datetime.now() - - if not await is_exist(slug): - await COLLECTION.insert_one( - JianshuUser( - slug=slug, - status=JianshuUserStatus.NORMAL, - updated_at=updated_at, - id=id, - name=name, - history_names=[], - avatar_url=avatar_url, - ).to_dict() + ] + + @classmethod + async def is_record_exist(cls, slug: str) -> bool: + return await COLLECTION.find_one({"slug": slug}) is not None + + @classmethod + async def insert_or_update_one( + cls, + *, + slug: str, + updated_at: Optional[datetime] = None, + id: Optional[int] = None, # noqa: A002 + name: Optional[str] = None, + avatar_url: Optional[str] = None, + ) -> None: + if not updated_at: + updated_at = datetime.now() + + if not await cls.is_record_exist(slug): + await COLLECTION.insert_one( + JianshuUserDocument( + slug=slug, + status=JianshuUserStatus.NORMAL, + updated_at=updated_at, + id=id, + name=name, + history_names=[], + avatar_url=avatar_url, + ).to_dict() + ) + + # 此处用户必定存在,因此 db_data 不为 None + db_data = JianshuUserDocument.from_dict( + await COLLECTION.find_one({"slug": slug}) # type: ignore ) - # 此处用户必定存在,因此 db_data 不为 None - db_data = JianshuUser.from_dict(await COLLECTION.find_one({"slug": slug})) # type: ignore - - update_data: Dict[str, Any] = { - "$set": { - # 即使没有要更新的数据,也视为对数据更新时间的刷新 - "updatedAt": updated_at, + update_data: Dict[str, Any] = { + "$set": { + # 即使没有要更新的数据,也视为对数据更新时间的刷新 + "updatedAt": updated_at, + } } - } - # 如果新数据中的 ID 与数据库不一致,报错 - if (id is not None and db_data.id is not None) and id != db_data.id: - raise ValueError(f"ID 不一致({id} 和 {db_data.id})") - - # 如果获取到了之前未知的 ID,添加之 - if id is not None and db_data.id is None: - update_data["$set"]["id"] = id - - # 如果获取到了之前未知的昵称,添加之 - if name is not None and db_data.name is None: - update_data["$set"]["name"] = name - - # 如果新数据中的昵称与数据库不一致,说明昵称更改过 - # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 - # 则更新数据库中的昵称,并将之前的昵称加入历史昵称列表 - if ( - (name is not None and db_data.name is not None) - and name != db_data.name - and updated_at > db_data.updated_at - ): - update_data["$set"]["name"] = name - update_data["$push"] = {"historyNames": db_data.name} - - # 如果获取到了之前未知的头像链接,或头像链接与之前不一致,添加 / 更新之 - if avatar_url is not None and ( - db_data.avatar_url is None or avatar_url != db_data.avatar_url - ): - update_data["$set"]["avatarUrl"] = avatar_url - - await COLLECTION.update_one({"slug": slug}, update_data) + # 如果新数据中的 ID 与数据库不一致,报错 + if (id is not None and db_data.id is not None) and id != db_data.id: + raise ValueError(f"ID 不一致({id} 和 {db_data.id})") + + # 如果获取到了之前未知的 ID,添加之 + if id is not None and db_data.id is None: + update_data["$set"]["id"] = id + + # 如果获取到了之前未知的昵称,添加之 + if name is not None and db_data.name is None: + update_data["$set"]["name"] = name + + # 如果新数据中的昵称与数据库不一致,说明昵称更改过 + # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 + # 则更新数据库中的昵称,并将之前的昵称加入历史昵称列表 + if ( + (name is not None and db_data.name is not None) + and name != db_data.name + and updated_at > db_data.updated_at + ): + update_data["$set"]["name"] = name + update_data["$push"] = {"historyNames": db_data.name} + + # 如果获取到了之前未知的头像链接,或头像链接与之前不一致,添加 / 更新之 + if avatar_url is not None and ( + db_data.avatar_url is None or avatar_url != db_data.avatar_url + ): + update_data["$set"]["avatarUrl"] = avatar_url + + await COLLECTION.update_one({"slug": slug}, update_data) diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index b3e199f..fec0990 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Literal, Optional, Sequence +from typing import ClassVar, List, Literal, Optional from jkit._constraints import ( NonNegativeInt, @@ -45,12 +45,8 @@ class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): amount: AmountField publisher: PublisherField - -async def init_db() -> None: - await COLLECTION.create_indexes( - [IndexModel(["fetchTime", "id"], unique=True)], - ) - - -async def insert_many(data: Sequence[JPEPFTNTradeOrderDocument]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["fetchTime", "id"], unique=True), + ] diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py index 6c09d23..4d56e57 100644 --- a/models/lp_recommend_article_record.py +++ b/models/lp_recommend_article_record.py @@ -1,5 +1,5 @@ from datetime import date, datetime -from typing import Sequence +from typing import ClassVar, List from jkit._constraints import ( ArticleSlug, @@ -21,7 +21,7 @@ COLLECTION = DB.lp_recommended_article_records -class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): +class LPRecommendedArticleRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date id: PositiveInt slug: ArticleSlug @@ -40,16 +40,12 @@ class LPRecommendedArticleRecord(Documemt, **DOCUMENT_OBJECT_CONFIG): author_slug: UserSlug + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "slug"], unique=True), + ] -async def is_record_stored(article_slug: str) -> bool: - result = await COLLECTION.find_one({"slug": article_slug}) - - return result is not None - - -async def init_db() -> None: - await COLLECTION.create_indexes([IndexModel(["date", "slug"], unique=True)]) - - -async def insert_many(data: Sequence[LPRecommendedArticleRecord]) -> None: - await COLLECTION.insert_many(x.to_dict() for x in data) + @classmethod + async def is_record_exist(cls, slug: str) -> bool: + return await COLLECTION.find_one({"slug": slug}) is not None diff --git a/utils/document_model.py b/utils/document_model.py index b009746..a1155c1 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -1,8 +1,10 @@ from datetime import date, datetime -from typing import Any, Dict, Tuple +from typing import Any, ClassVar, Dict, List, Sequence, Tuple from bson import ObjectId +from motor.core import AgnosticCollection from msgspec import Struct, convert, to_builtins +from pymongo import IndexModel from typing_extensions import Self FIELD_OBJECT_CONFIG = { @@ -34,6 +36,10 @@ class Field(Struct, **FIELD_OBJECT_CONFIG): class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): + class Settings(Struct): + collection: ClassVar[AgnosticCollection] + indexes: ClassVar[List[IndexModel]] + def validate(self) -> Self: return convert( to_builtins(self, builtin_types=_BUILDIN_TYPES), @@ -54,3 +60,18 @@ def to_dict(self) -> Dict[str, Any]: builtin_types=_BUILDIN_TYPES, ) ) + + @classmethod + async def ensure_indexes(cls) -> None: + if not cls.Settings.indexes: + return + + await cls.Settings.collection.create_indexes(cls.Settings.indexes) + + @classmethod + async def insert_one(cls, data: Self) -> None: + await cls.Settings.collection.insert_one(data.to_dict()) + + @classmethod + async def insert_many(cls, data: Sequence[Self]) -> None: + await cls.Settings.collection.insert_many(x.to_dict() for x in data) From f1494d19262519a4eb32a37ae21a60002e69f0cf Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 06:09:55 +0800 Subject: [PATCH 56/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jpep_ftn_trade.py | 24 ++++---- models/jianshu_user.py | 4 +- models/jpep_ftn_trade_order.py | 10 +--- models/jpep_user.py | 100 +++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 21 deletions(-) create mode 100644 models/jpep_user.py diff --git a/jobs/jpep_ftn_trade.py b/jobs/jpep_ftn_trade.py index 89c86bf..5d941c6 100644 --- a/jobs/jpep_ftn_trade.py +++ b/jobs/jpep_ftn_trade.py @@ -8,8 +8,8 @@ from models.jpep_ftn_trade_order import ( AmountField, JPEPFTNTradeOrderDocument, - PublisherField, ) +from models.jpep_user import JPEPUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -31,13 +31,23 @@ def get_fetch_time() -> datetime: return dt -def process_item( +async def process_item( item: FTNMacketOrderRecord, /, *, fetch_time: datetime, type: Literal["buy", "sell"], # noqa: A002 ) -> JPEPFTNTradeOrderDocument: + if item.publisher_info.id: + await JPEPUserDocument.insert_or_update_one( + updated_at=fetch_time, + id=item.publisher_info.id, + name=item.publisher_info.name, # type: ignore + hashed_name=item.publisher_info.hashed_name, # type: ignore + avatar_url=item.publisher_info.avatar_url, # type: ignore + credit=item.publisher_info.credit, # type: ignore + ) + return JPEPFTNTradeOrderDocument( fetch_time=fetch_time, id=item.id, @@ -51,13 +61,7 @@ def process_item( tradable=item.tradable_amount, minimum_trade=item.minimum_trade_amount, ), - publisher=PublisherField( - is_anonymous=item.publisher_info.is_anonymous, - id=item.publisher_info.id, - name=item.publisher_info.name, - hashed_name=item.publisher_info.hashed_name, - credit=item.publisher_info.credit, - ), + publisher_id=item.publisher_info.id, ).validate() @@ -73,7 +77,7 @@ async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 data: List[JPEPFTNTradeOrderDocument] = [] async for item in FTNMacket().iter_orders(type=type): - processed_item = process_item(item, fetch_time=fetch_time, type=type) + processed_item = await process_item(item, fetch_time=fetch_time, type=type) data.append(processed_item) await JPEPFTNTradeOrderDocument.insert_many(data) diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 558796f..b7ab359 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -50,7 +50,7 @@ async def insert_or_update_one( updated_at = datetime.now() if not await cls.is_record_exist(slug): - await COLLECTION.insert_one( + await cls.insert_one( JianshuUserDocument( slug=slug, status=JianshuUserStatus.NORMAL, @@ -59,7 +59,7 @@ async def insert_or_update_one( name=name, history_names=[], avatar_url=avatar_url, - ).to_dict() + ) ) # 此处用户必定存在,因此 db_data 不为 None diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index fec0990..dbe1033 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -26,14 +26,6 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): minimum_trade: PositiveInt -class PublisherField(Field, **FIELD_OBJECT_CONFIG): - is_anonymous: bool - id: Optional[PositiveInt] - name: Optional[str] - hashed_name: Optional[str] - credit: Optional[NonNegativeInt] - - class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): fetch_time: datetime id: PositiveInt @@ -43,7 +35,7 @@ class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): traded_count: NonNegativeInt amount: AmountField - publisher: PublisherField + publisher_id: Optional[PositiveInt] class Settings: # type: ignore collection = COLLECTION diff --git a/models/jpep_user.py b/models/jpep_user.py new file mode 100644 index 0000000..6191c2d --- /dev/null +++ b/models/jpep_user.py @@ -0,0 +1,100 @@ +from datetime import datetime +from typing import Any, ClassVar, Dict, List, Optional + +from jkit._constraints import NonNegativeInt, PositiveInt +from pymongo import IndexModel + +from utils.db import DB +from utils.document_model import FIELD_OBJECT_CONFIG, Documemt, Field + +COLLECTION = DB.jpep_users + + +class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): + time: datetime + value: NonNegativeInt + + +class JPEPUserDocument(Documemt): + updated_at: datetime + id: PositiveInt + name: str + hashed_name: str + avatar_url: Optional[str] + credit_history: List[CreditHistoryFieldItem] + + class Settings: # type: ignore + collection = COLLECTION + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["id"], unique=True), + IndexModel(["updatedAt"]), + ] + + @classmethod + async def is_record_exist(cls, id: int) -> bool: # noqa: A002 + return await COLLECTION.find_one({"id": id}) is not None + + @classmethod + async def insert_or_update_one( + cls, + *, + updated_at: Optional[datetime] = None, + id: int, # noqa: A002 + name: str, + hashed_name: str, + avatar_url: Optional[str], + credit: int, + ) -> None: + if not updated_at: + updated_at = datetime.now() + + if not await cls.is_record_exist(id): + await cls.insert_one( + JPEPUserDocument( + updated_at=updated_at, + id=id, + name=name, + hashed_name=hashed_name, + avatar_url=avatar_url, + credit_history=[ + CreditHistoryFieldItem( + time=updated_at, + value=credit, + ), + ], + ) + ) + + # 此处用户必定存在,因此 db_data 不为 None + db_data = JPEPUserDocument.from_dict( + await COLLECTION.find_one({"id": id}) # type: ignore + ) + + update_data: Dict[str, Any] = { + "$set": { + # 即使没有要更新的数据,也视为对数据更新时间的刷新 + "updatedAt": updated_at, + } + } + # 如果新数据中的昵称与数据库不一致,说明昵称更改过 + # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 + # 则更新数据库中的昵称 + if ( + (name is not None and db_data.name is not None) + and name != db_data.name + and updated_at > db_data.updated_at + ): + update_data["$set"]["name"] = name + + # 如果头像链接与之前不一致,更新之 + if avatar_url is not None and avatar_url != db_data.avatar_url: + update_data["$set"]["avatarUrl"] = avatar_url + + # 如果信用值有变动,更新之 + if credit != db_data.credit_history[-1].value: + update_data["$push"]["creditHistory"] = { + "time": updated_at, + "value": credit, + } + + await COLLECTION.update_one({"id": id}, update_data) From 45a003eaa11b36b032b54e8c35987afe0a8a59aa Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 06:18:00 +0800 Subject: [PATCH 57/93] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=95=B0=E6=8D=AE=E5=B9=B6=E5=8F=91=E5=86=B2=E7=AA=81?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jianshu_user.py | 18 ++++++++---------- models/jpep_user.py | 15 ++++++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/models/jianshu_user.py b/models/jianshu_user.py index b7ab359..97b1d3c 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -66,10 +66,14 @@ async def insert_or_update_one( db_data = JianshuUserDocument.from_dict( await COLLECTION.find_one({"slug": slug}) # type: ignore ) + # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 + # 此时跳过更新 + if updated_at < db_data.updated_at: + return update_data: Dict[str, Any] = { "$set": { - # 即使没有要更新的数据,也视为对数据更新时间的刷新 + # 即使没有要更新的数据,也要刷新更新时间 "updatedAt": updated_at, } } @@ -85,18 +89,12 @@ async def insert_or_update_one( if name is not None and db_data.name is None: update_data["$set"]["name"] = name - # 如果新数据中的昵称与数据库不一致,说明昵称更改过 - # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 - # 则更新数据库中的昵称,并将之前的昵称加入历史昵称列表 - if ( - (name is not None and db_data.name is not None) - and name != db_data.name - and updated_at > db_data.updated_at - ): + # 如果昵称有变动,更新之,并将之前的昵称加入历史昵称列表 + if (name is not None and db_data.name is not None) and name != db_data.name: update_data["$set"]["name"] = name update_data["$push"] = {"historyNames": db_data.name} - # 如果获取到了之前未知的头像链接,或头像链接与之前不一致,添加 / 更新之 + # 如果获取到了之前未知的头像链接,或头像链接有变动,添加 / 更新之 if avatar_url is not None and ( db_data.avatar_url is None or avatar_url != db_data.avatar_url ): diff --git a/models/jpep_user.py b/models/jpep_user.py index 6191c2d..53294eb 100644 --- a/models/jpep_user.py +++ b/models/jpep_user.py @@ -69,28 +69,29 @@ async def insert_or_update_one( db_data = JPEPUserDocument.from_dict( await COLLECTION.find_one({"id": id}) # type: ignore ) + # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 + # 此时跳过更新 + if updated_at < db_data.updated_at: + return update_data: Dict[str, Any] = { "$set": { - # 即使没有要更新的数据,也视为对数据更新时间的刷新 + # 即使没有要更新的数据,也要刷新更新时间 "updatedAt": updated_at, } } - # 如果新数据中的昵称与数据库不一致,说明昵称更改过 - # 此时需要比较数据的更新时间,如果数据库中的数据相对较旧 - # 则更新数据库中的昵称 + # 如果昵称不一致,更新之 if ( (name is not None and db_data.name is not None) and name != db_data.name - and updated_at > db_data.updated_at ): update_data["$set"]["name"] = name - # 如果头像链接与之前不一致,更新之 + # 如果头像链接有变动,更新之 if avatar_url is not None and avatar_url != db_data.avatar_url: update_data["$set"]["avatarUrl"] = avatar_url - # 如果信用值有变动,更新之 + # 如果信用值有变动,将变动信息添加至信用值历史 if credit != db_data.credit_history[-1].value: update_data["$push"]["creditHistory"] = { "time": updated_at, From 35e1b482c251bd8665ba3b021fa8158f109abdf3 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 06:23:13 +0800 Subject: [PATCH 58/93] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=85=83=E6=95=B0=E6=8D=AE=E8=A1=A8=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/article_earning_ranking_record.py | 6 ++---- models/assets_ranking_record.py | 6 ++---- models/daily_update_ranking_record.py | 6 ++---- models/jianshu_lottery_win_record.py | 8 +++----- models/jianshu_user.py | 12 +++++------- models/jpep_ftn_trade_order.py | 6 ++---- models/jpep_user.py | 17 ++++++----------- models/lp_recommend_article_record.py | 8 +++----- utils/document_model.py | 10 +++++----- 9 files changed, 30 insertions(+), 49 deletions(-) diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py index 0b46295..aca3dfa 100644 --- a/models/article_earning_ranking_record.py +++ b/models/article_earning_ranking_record.py @@ -18,8 +18,6 @@ Field, ) -COLLECTION = DB.article_earning_ranking_records - class ArticleField(Field, **FIELD_OBJECT_CONFIG): slug: Optional[ArticleSlug] @@ -39,8 +37,8 @@ class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): author_slug: Optional[UserSlug] earning: EarningField - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.article_earning_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "ranking"], unique=True), ] diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index 6ba9cf6..3936b93 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -17,8 +17,6 @@ Field, ) -COLLECTION = DB.assets_ranking_records - class AmountField(Field, **FIELD_OBJECT_CONFIG): fp: Optional[NonNegativeFloat] @@ -33,8 +31,8 @@ class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): amount: AmountField user_slug: Optional[UserSlug] - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.assets_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "ranking"], unique=True), ] diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index 7c7038d..863f1da 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -13,8 +13,6 @@ Documemt, ) -COLLECTION = DB.daily_update_ranking_records - class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date @@ -23,8 +21,8 @@ class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.daily_update_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "userSlug"], unique=True), ] diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py index b506be1..ff1b56d 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu_lottery_win_record.py @@ -14,8 +14,6 @@ Documemt, ) -COLLECTION = DB.jianshu_lottery_win_records - class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): id: PositiveInt @@ -24,8 +22,8 @@ class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.jianshu_lottery_win_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["id"], unique=True), ] @@ -34,7 +32,7 @@ class Settings: # type: ignore async def get_latest_record_id(cls) -> int: try: latest_data = JianshuLotteryWinRecordDocument.from_dict( - await COLLECTION.find().sort("id", -1).__anext__() + await cls.Meta.collection.find().sort("id", -1).__anext__() ) except StopAsyncIteration: return 0 diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 97b1d3c..219a76b 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -8,8 +8,6 @@ from utils.db import DB from utils.document_model import Documemt -COLLECTION = DB.jianshu_users - class JianshuUserStatus(Enum): NORMAL = "NORMAL" @@ -25,8 +23,8 @@ class JianshuUserDocument(Documemt): history_names: List[UserName] avatar_url: Optional[UserUploadedUrl] - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.jianshu_users indexes: ClassVar[List[IndexModel]] = [ IndexModel(["slug"], unique=True), IndexModel(["updatedAt"]), @@ -34,7 +32,7 @@ class Settings: # type: ignore @classmethod async def is_record_exist(cls, slug: str) -> bool: - return await COLLECTION.find_one({"slug": slug}) is not None + return await cls.Meta.collection.find_one({"slug": slug}) is not None @classmethod async def insert_or_update_one( @@ -64,7 +62,7 @@ async def insert_or_update_one( # 此处用户必定存在,因此 db_data 不为 None db_data = JianshuUserDocument.from_dict( - await COLLECTION.find_one({"slug": slug}) # type: ignore + await cls.Meta.collection.find_one({"slug": slug}) # type: ignore ) # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 # 此时跳过更新 @@ -100,4 +98,4 @@ async def insert_or_update_one( ): update_data["$set"]["avatarUrl"] = avatar_url - await COLLECTION.update_one({"slug": slug}, update_data) + await cls.Meta.collection.update_one({"slug": slug}, update_data) diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index dbe1033..3394817 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -16,8 +16,6 @@ Field, ) -COLLECTION = DB.jpep_ftn_trade_orders - class AmountField(Field, **FIELD_OBJECT_CONFIG): total: PositiveInt @@ -37,8 +35,8 @@ class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): amount: AmountField publisher_id: Optional[PositiveInt] - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.jpep_ftn_trade_orders indexes: ClassVar[List[IndexModel]] = [ IndexModel(["fetchTime", "id"], unique=True), ] diff --git a/models/jpep_user.py b/models/jpep_user.py index 53294eb..b152b30 100644 --- a/models/jpep_user.py +++ b/models/jpep_user.py @@ -7,8 +7,6 @@ from utils.db import DB from utils.document_model import FIELD_OBJECT_CONFIG, Documemt, Field -COLLECTION = DB.jpep_users - class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): time: datetime @@ -23,8 +21,8 @@ class JPEPUserDocument(Documemt): avatar_url: Optional[str] credit_history: List[CreditHistoryFieldItem] - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.jpep_users indexes: ClassVar[List[IndexModel]] = [ IndexModel(["id"], unique=True), IndexModel(["updatedAt"]), @@ -32,7 +30,7 @@ class Settings: # type: ignore @classmethod async def is_record_exist(cls, id: int) -> bool: # noqa: A002 - return await COLLECTION.find_one({"id": id}) is not None + return await cls.Meta.collection.find_one({"id": id}) is not None @classmethod async def insert_or_update_one( @@ -67,7 +65,7 @@ async def insert_or_update_one( # 此处用户必定存在,因此 db_data 不为 None db_data = JPEPUserDocument.from_dict( - await COLLECTION.find_one({"id": id}) # type: ignore + await cls.Meta.collection.find_one({"id": id}) # type: ignore ) # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 # 此时跳过更新 @@ -81,10 +79,7 @@ async def insert_or_update_one( } } # 如果昵称不一致,更新之 - if ( - (name is not None and db_data.name is not None) - and name != db_data.name - ): + if (name is not None and db_data.name is not None) and name != db_data.name: update_data["$set"]["name"] = name # 如果头像链接有变动,更新之 @@ -98,4 +93,4 @@ async def insert_or_update_one( "value": credit, } - await COLLECTION.update_one({"id": id}, update_data) + await cls.Meta.collection.update_one({"id": id}, update_data) diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py index 4d56e57..47ac00c 100644 --- a/models/lp_recommend_article_record.py +++ b/models/lp_recommend_article_record.py @@ -18,8 +18,6 @@ Documemt, ) -COLLECTION = DB.lp_recommended_article_records - class LPRecommendedArticleRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): date: date @@ -40,12 +38,12 @@ class LPRecommendedArticleRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): author_slug: UserSlug - class Settings: # type: ignore - collection = COLLECTION + class Meta: # type: ignore + collection = DB.lp_recommended_article_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "slug"], unique=True), ] @classmethod async def is_record_exist(cls, slug: str) -> bool: - return await COLLECTION.find_one({"slug": slug}) is not None + return await cls.Meta.collection.find_one({"slug": slug}) is not None diff --git a/utils/document_model.py b/utils/document_model.py index a1155c1..7134721 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -36,7 +36,7 @@ class Field(Struct, **FIELD_OBJECT_CONFIG): class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): - class Settings(Struct): + class Meta(Struct): collection: ClassVar[AgnosticCollection] indexes: ClassVar[List[IndexModel]] @@ -63,15 +63,15 @@ def to_dict(self) -> Dict[str, Any]: @classmethod async def ensure_indexes(cls) -> None: - if not cls.Settings.indexes: + if not cls.Meta.indexes: return - await cls.Settings.collection.create_indexes(cls.Settings.indexes) + await cls.Meta.collection.create_indexes(cls.Meta.indexes) @classmethod async def insert_one(cls, data: Self) -> None: - await cls.Settings.collection.insert_one(data.to_dict()) + await cls.Meta.collection.insert_one(data.to_dict()) @classmethod async def insert_many(cls, data: Sequence[Self]) -> None: - await cls.Settings.collection.insert_many(x.to_dict() for x in data) + await cls.Meta.collection.insert_many(x.to_dict() for x in data) From d1139d9b303a9ce88d8eab133e5fe96a8ea42df8 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 06:39:27 +0800 Subject: [PATCH 59/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=A8=A1=E5=9E=8B=E5=91=BD=E5=90=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/article_earning_ranking_record.py | 4 ++-- models/assets_ranking_record.py | 4 ++-- models/daily_update_ranking_record.py | 4 ++-- models/jianshu_lottery_win_record.py | 4 ++-- models/jianshu_user.py | 4 ++-- models/jpep_ftn_trade_order.py | 4 ++-- models/jpep_user.py | 4 ++-- models/lp_recommend_article_record.py | 4 ++-- utils/document_model.py | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/models/article_earning_ranking_record.py b/models/article_earning_ranking_record.py index aca3dfa..e69caa1 100644 --- a/models/article_earning_ranking_record.py +++ b/models/article_earning_ranking_record.py @@ -14,7 +14,7 @@ from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, - Documemt, + Document, Field, ) @@ -29,7 +29,7 @@ class EarningField(Field, **FIELD_OBJECT_CONFIG): to_voter: PositiveFloat -class ArticleEarningRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class ArticleEarningRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index 3936b93..e757f11 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -13,7 +13,7 @@ from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, - Documemt, + Document, Field, ) @@ -24,7 +24,7 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): assets: PositiveFloat -class AssetsRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt diff --git a/models/daily_update_ranking_record.py b/models/daily_update_ranking_record.py index 863f1da..014e0c0 100644 --- a/models/daily_update_ranking_record.py +++ b/models/daily_update_ranking_record.py @@ -10,11 +10,11 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - Documemt, + Document, ) -class DailyUpdateRankingRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class DailyUpdateRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): date: date ranking: PositiveInt days: PositiveInt diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu_lottery_win_record.py index ff1b56d..8a32e0f 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu_lottery_win_record.py @@ -11,11 +11,11 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - Documemt, + Document, ) -class JianshuLotteryWinRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class JianshuLotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): id: PositiveInt time: datetime award_name: NonEmptyStr diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 219a76b..664484c 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -6,7 +6,7 @@ from pymongo import IndexModel from utils.db import DB -from utils.document_model import Documemt +from utils.document_model import Document class JianshuUserStatus(Enum): @@ -14,7 +14,7 @@ class JianshuUserStatus(Enum): INACCESSABLE = "INACCESSIBLE" -class JianshuUserDocument(Documemt): +class JianshuUserDocument(Document): slug: UserSlug status: JianshuUserStatus updated_at: datetime diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index 3394817..46407d0 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -12,7 +12,7 @@ from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, - Documemt, + Document, Field, ) @@ -24,7 +24,7 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): minimum_trade: PositiveInt -class JPEPFTNTradeOrderDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class JPEPFTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): fetch_time: datetime id: PositiveInt published_at: datetime diff --git a/models/jpep_user.py b/models/jpep_user.py index b152b30..2e153d1 100644 --- a/models/jpep_user.py +++ b/models/jpep_user.py @@ -5,7 +5,7 @@ from pymongo import IndexModel from utils.db import DB -from utils.document_model import FIELD_OBJECT_CONFIG, Documemt, Field +from utils.document_model import FIELD_OBJECT_CONFIG, Document, Field class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): @@ -13,7 +13,7 @@ class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): value: NonNegativeInt -class JPEPUserDocument(Documemt): +class JPEPUserDocument(Document): updated_at: datetime id: PositiveInt name: str diff --git a/models/lp_recommend_article_record.py b/models/lp_recommend_article_record.py index 47ac00c..f9b560e 100644 --- a/models/lp_recommend_article_record.py +++ b/models/lp_recommend_article_record.py @@ -15,11 +15,11 @@ from utils.db import DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, - Documemt, + Document, ) -class LPRecommendedArticleRecordDocument(Documemt, **DOCUMENT_OBJECT_CONFIG): +class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): date: date id: PositiveInt slug: ArticleSlug diff --git a/utils/document_model.py b/utils/document_model.py index 7134721..449d3f0 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -35,7 +35,7 @@ class Field(Struct, **FIELD_OBJECT_CONFIG): pass -class Documemt(Struct, **DOCUMENT_OBJECT_CONFIG): +class Document(Struct, **DOCUMENT_OBJECT_CONFIG): class Meta(Struct): collection: ClassVar[AgnosticCollection] indexes: ClassVar[List[IndexModel]] From 2fd10cfd55c62717c11a62060cd67d1cad636460 Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 23:07:34 +0800 Subject: [PATCH 60/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E7=94=A8=E5=80=BC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jpep_user.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/models/jpep_user.py b/models/jpep_user.py index 2e153d1..ba486dd 100644 --- a/models/jpep_user.py +++ b/models/jpep_user.py @@ -88,9 +88,11 @@ async def insert_or_update_one( # 如果信用值有变动,将变动信息添加至信用值历史 if credit != db_data.credit_history[-1].value: - update_data["$push"]["creditHistory"] = { - "time": updated_at, - "value": credit, + update_data["$push"] = { + "creditHistory": { + "time": updated_at, + "value": credit, + } } await cls.Meta.collection.update_one({"id": id}, update_data) From b56088c5c7581fed9f0112ab6c1fb8b4e0ccb0bd Mon Sep 17 00:00:00 2001 From: yezi Date: Sat, 9 Mar 2024 23:28:38 +0800 Subject: [PATCH 61/93] =?UTF-8?q?feat:=20=E5=81=87=E8=AE=BE=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=8C=82=E5=8D=95=E7=94=A8=E6=88=B7=E9=9D=9E=E5=8C=BF=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jpep_ftn_trade.py | 2 +- models/jpep_ftn_trade_order.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jobs/jpep_ftn_trade.py b/jobs/jpep_ftn_trade.py index 5d941c6..0c70d86 100644 --- a/jobs/jpep_ftn_trade.py +++ b/jobs/jpep_ftn_trade.py @@ -61,7 +61,7 @@ async def process_item( tradable=item.tradable_amount, minimum_trade=item.minimum_trade_amount, ), - publisher_id=item.publisher_info.id, + publisher_id=item.publisher_info.id, # type: ignore ).validate() diff --git a/models/jpep_ftn_trade_order.py b/models/jpep_ftn_trade_order.py index 46407d0..fc5eb1a 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep_ftn_trade_order.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import ClassVar, List, Literal, Optional +from typing import ClassVar, List, Literal from jkit._constraints import ( NonNegativeInt, @@ -33,7 +33,7 @@ class JPEPFTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): traded_count: NonNegativeInt amount: AmountField - publisher_id: Optional[PositiveInt] + publisher_id: PositiveInt class Meta: # type: ignore collection = DB.jpep_ftn_trade_orders From 2bdd5721111e55e0f24f28aacc68b508a8f1de59 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 10 Mar 2024 08:33:59 +0800 Subject: [PATCH 62/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=97=A7?= =?UTF-8?q?=E7=89=88=E6=A8=A1=E5=9E=8B=E4=BB=A5=E5=A4=87=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- old_models/__init__.py | 3 ++ old_models/article_fp_rank.py | 45 +++++++++++++++++++++++++++++ old_models/assets_rank.py | 40 ++++++++++++++++++++++++++ old_models/daily_update_rank.py | 31 ++++++++++++++++++++ old_models/jpep_ftn_macket.py | 47 +++++++++++++++++++++++++++++++ old_models/lottery_data.py | 31 ++++++++++++++++++++ old_models/lp_collections.py | 50 +++++++++++++++++++++++++++++++++ 7 files changed, 247 insertions(+) create mode 100644 old_models/__init__.py create mode 100644 old_models/article_fp_rank.py create mode 100644 old_models/assets_rank.py create mode 100644 old_models/daily_update_rank.py create mode 100644 old_models/jpep_ftn_macket.py create mode 100644 old_models/lottery_data.py create mode 100644 old_models/lp_collections.py diff --git a/old_models/__init__.py b/old_models/__init__.py new file mode 100644 index 0000000..228da90 --- /dev/null +++ b/old_models/__init__.py @@ -0,0 +1,3 @@ +from utils.db import _CLIENT + +OLD_DB = _CLIENT.JFetcherData diff --git a/old_models/article_fp_rank.py b/old_models/article_fp_rank.py new file mode 100644 index 0000000..0d08f70 --- /dev/null +++ b/old_models/article_fp_rank.py @@ -0,0 +1,45 @@ +from datetime import datetime +from typing import ClassVar, List, Optional + +from msgspec import field +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldArticleField(Field, **FIELD_OBJECT_CONFIG): + title: Optional[str] + url: Optional[str] + + +class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): + name: Optional[str] = None + id: Optional[int] = None + url: Optional[str] = None + + +class OldRewardField(Field, **FIELD_OBJECT_CONFIG): + to_author: float = field(name="to_author") + to_voter: float = field(name="to_voter") + total: float + + +class OldArticleFPRank(Document, **DOCUMENT_OBJECT_CONFIG): + date: datetime + ranking: int + + article: OldArticleField + author: OldAuthorField + reward: OldRewardField + + class Meta: # type: ignore + collection = OLD_DB.article_FP_rank + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "ranking"], unique=True), + ] diff --git a/old_models/assets_rank.py b/old_models/assets_rank.py new file mode 100644 index 0000000..d2d9a1a --- /dev/null +++ b/old_models/assets_rank.py @@ -0,0 +1,40 @@ +from datetime import datetime +from typing import ClassVar, List, Optional + +from msgspec import field +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldUserField(Field, **FIELD_OBJECT_CONFIG): + id: Optional[int] + url: Optional[str] + name: Optional[str] + + +class OldAssetsField(Field, **FIELD_OBJECT_CONFIG): + fp: Optional[float] = field(name="FP") + ftn: Optional[float] = field(name="FTN") + total: Optional[float] + + +class OldAssetsRank(Document, **DOCUMENT_OBJECT_CONFIG): + date: datetime + ranking: int + + user: OldUserField + assets: OldAssetsField + + class Meta: # type: ignore + collection = OLD_DB.assets_rank + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "ranking"], unique=True), + ] + diff --git a/old_models/daily_update_rank.py b/old_models/daily_update_rank.py new file mode 100644 index 0000000..6983427 --- /dev/null +++ b/old_models/daily_update_rank.py @@ -0,0 +1,31 @@ +from datetime import datetime +from typing import ClassVar, List + +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldUserField(Field, **FIELD_OBJECT_CONFIG): + url: str + name: str + + +class OldDailyUpdateRank(Document, **DOCUMENT_OBJECT_CONFIG): + date: datetime + ranking: int + + user: OldUserField + days: int + + class Meta: # type: ignore + collection = OLD_DB.daily_update_rank + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["date", "ranking"]), + ] diff --git a/old_models/jpep_ftn_macket.py b/old_models/jpep_ftn_macket.py new file mode 100644 index 0000000..f66f626 --- /dev/null +++ b/old_models/jpep_ftn_macket.py @@ -0,0 +1,47 @@ +from datetime import datetime +from typing import ClassVar, List, Literal + +from msgspec import field +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldAmountField(Field, **FIELD_OBJECT_CONFIG): + total: int + traded: int + remaining: int + tradable: int + + +class OldUserField(Field, **FIELD_OBJECT_CONFIG): + id: int + name: str + name_md5: str = field(name="name_md5") + + +class OldJPEPFTNMacket(Document, **DOCUMENT_OBJECT_CONFIG): + fetch_time: datetime = field(name="fetch_time") + order_id: int = field(name="order_id") + trade_type: Literal["buy", "sell"] = field(name="trade_type") + publish_time: datetime = field(name="publish_time") + is_anonymous: bool = field(name="is_anonymous") + price: float + + amount: OldAmountField + traded_percentage: float = field(name="traded_percentage") + minimum_trade_count: int = field(name="minimum_trade_count") + transactions_count: int = field(name="transactions_count") + user: OldUserField + + class Meta: # type: ignore + collection = OLD_DB.JPEP_FTN_macket + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["fetch_time"]), + ] diff --git a/old_models/lottery_data.py b/old_models/lottery_data.py new file mode 100644 index 0000000..52fd755 --- /dev/null +++ b/old_models/lottery_data.py @@ -0,0 +1,31 @@ +from datetime import datetime +from typing import ClassVar, List + +from msgspec import field +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldUserField(Field, **FIELD_OBJECT_CONFIG): + id: int + url: str + + +class OldLotteryData(Document, **DOCUMENT_OBJECT_CONFIG): + time: datetime + reward_name: str = field(name="reward_name") + + user: OldUserField + + class Meta: # type: ignore + collection = OLD_DB.lottery_data + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["time"]), + ] diff --git a/old_models/lp_collections.py b/old_models/lp_collections.py new file mode 100644 index 0000000..95f47ee --- /dev/null +++ b/old_models/lp_collections.py @@ -0,0 +1,50 @@ +from datetime import datetime +from typing import ClassVar, List + +from msgspec import field +from pymongo import IndexModel + +from old_models import OLD_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + FIELD_OBJECT_CONFIG, + Document, + Field, +) + + +class OldArticleField(Field, **FIELD_OBJECT_CONFIG): + id: int + url: str + title: str + release_time: datetime = field(name="release_time") + + views_count: int = field(name="views_count") + likes_count: int = field(name="likes_count") + comments_count: int = field(name="comments_count") + rewards_count: int = field(name="rewards_count") + total_fp_amount: float = field(name="total_FP_amount") + + is_paid: bool = field(name="is_paid") + is_commentable: bool = field(name="is_commentable") + summary: str + + +class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): + id: int + url: str + name: str + + +class OldLPCollections(Document, **DOCUMENT_OBJECT_CONFIG): + fetch_date: datetime = field(name="fetch_date") + from_collection: str = field(name="from_collection") + + article: OldArticleField + author: OldAuthorField + + class Meta: # type: ignore + collection = OLD_DB.LP_collections + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["fetch_date"]), + ] From 4003f929598f59289182ba5147dbbdfe63695189 Mon Sep 17 00:00:00 2001 From: yezi Date: Mon, 11 Mar 2024 18:07:54 +0800 Subject: [PATCH 63/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=E5=BA=93=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=98=B5=E7=A7=B0=E5=88=97=E8=A1=A8=E5=8C=85=E5=90=AB?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=98=B5=E7=A7=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jianshu_user.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/models/jianshu_user.py b/models/jianshu_user.py index 664484c..66e9e14 100644 --- a/models/jianshu_user.py +++ b/models/jianshu_user.py @@ -87,10 +87,21 @@ async def insert_or_update_one( if name is not None and db_data.name is None: update_data["$set"]["name"] = name - # 如果昵称有变动,更新之,并将之前的昵称加入历史昵称列表 + # 如果昵称有变动,更新之 if (name is not None and db_data.name is not None) and name != db_data.name: update_data["$set"]["name"] = name - update_data["$push"] = {"historyNames": db_data.name} + + new_history_names = db_data.history_names.copy() + + # 将旧昵称添加到历史昵称列表 + new_history_names.append(db_data.name) + # 如果新昵称在历史昵称列表中,移除之 + if name in new_history_names: + new_history_names.remove(name) + + # 如果有变动,将历史昵称列表更新提交至数据库 + if new_history_names != db_data.history_names: + update_data["$set"]["historyNames"] = new_history_names # 如果获取到了之前未知的头像链接,或头像链接有变动,添加 / 更新之 if avatar_url is not None and ( From b318865939eeda9a3bb40c5353dc404a372432f7 Mon Sep 17 00:00:00 2001 From: yezi Date: Tue, 12 Mar 2024 05:41:31 +0800 Subject: [PATCH 64/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E6=94=B6=E7=9B=8A=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=BF=81?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_01_article_fp_rank.py | 102 ++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 migrate_01_article_fp_rank.py diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py new file mode 100644 index 0000000..8b4dbbc --- /dev/null +++ b/migrate_01_article_fp_rank.py @@ -0,0 +1,102 @@ +import asyncio +from datetime import datetime +from typing import List + +from jkit.identifier_convert import article_url_to_slug, user_url_to_slug +from sspeedup.logging.run_logger import RunLogger + +from models.article_earning_ranking_record import ( + ArticleEarningRankingRecordDocument, + ArticleField, + EarningField, +) +from models.jianshu_user import JianshuUserDocument +from old_models.article_fp_rank import OldArticleFPRank + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldArticleFPRank.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await JianshuUserDocument.ensure_indexes() + await ArticleEarningRankingRecordDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldArticleFPRank) -> None: + if item.author.url: + await JianshuUserDocument.insert_or_update_one( + slug=user_url_to_slug(item.author.url), + updated_at=datetime.fromisoformat(item.date.isoformat()), + id=item.author.id, + name=item.author.name, + ) + + +async def convert_item(item: OldArticleFPRank) -> ArticleEarningRankingRecordDocument: + return ArticleEarningRankingRecordDocument( + date=item.date, + ranking=item.ranking, + article=ArticleField( + slug=article_url_to_slug(item.article.url) if item.article.url else None, + title=item.article.title, + ), + author_slug=user_url_to_slug(item.author.url) if item.author.url else None, + earning=EarningField( + to_author=item.reward.to_author, to_voter=item.reward.to_voter + ), + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_collection_data_count = await OldArticleFPRank.Meta.collection.count_documents( + {} + ) + logger.info(f"旧集合数据量:{old_collection_data_count}") + + data_to_save: List[ArticleEarningRankingRecordDocument] = [] + async for item in OldArticleFPRank.Meta.collection.find().sort( + {"date": 1, "ranking": 1} + ): + item = OldArticleFPRank.from_dict(item) + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 1000: + await ArticleEarningRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + if len(data_to_save): + await ArticleEarningRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始进行校验") + new_collection_data_count = ( + await ArticleEarningRankingRecordDocument.Meta.collection.count_documents({}) + ) + if old_collection_data_count != new_collection_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_collection_data_count}," + f"迁移后 {new_collection_data_count})" + ) + exit() + + logger.info("数据校验成功,迁移流程结束") + + +asyncio.run(main()) From f9fa30383f590a9b02644d710ed7b8555edda116 Mon Sep 17 00:00:00 2001 From: yezi Date: Tue, 12 Mar 2024 06:14:53 +0800 Subject: [PATCH 65/93] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_01_article_fp_rank.py | 37 ++++++++--- migrate_02_assets_rank.py | 111 ++++++++++++++++++++++++++++++++ migrate_03_daily_update_rank.py | 106 ++++++++++++++++++++++++++++++ models/assets_ranking_record.py | 2 +- utils/migrate_helper.py | 21 ++++++ 5 files changed, 266 insertions(+), 11 deletions(-) create mode 100644 migrate_02_assets_rank.py create mode 100644 migrate_03_daily_update_rank.py create mode 100644 utils/migrate_helper.py diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py index 8b4dbbc..82c37cf 100644 --- a/migrate_01_article_fp_rank.py +++ b/migrate_01_article_fp_rank.py @@ -12,6 +12,10 @@ ) from models.jianshu_user import JianshuUserDocument from old_models.article_fp_rank import OldArticleFPRank +from utils.migrate_helper import ( + get_collection_data_count, + get_collection_data_time_range, +) logger = RunLogger() @@ -56,10 +60,14 @@ async def main() -> None: await ensure_all_new_collection_indexes() logger.info("已为新版数据构建索引") - old_collection_data_count = await OldArticleFPRank.Meta.collection.count_documents( - {} + old_data_count = await get_collection_data_count(OldArticleFPRank) + old_start_time, old_end_time = await get_collection_data_time_range( + OldArticleFPRank, "date" + ) + logger.info( + f"旧集合数据量:{old_data_count}," + f"数据时间范围:{old_start_time} - {old_end_time}" ) - logger.info(f"旧集合数据量:{old_collection_data_count}") data_to_save: List[ArticleEarningRankingRecordDocument] = [] async for item in OldArticleFPRank.Meta.collection.find().sort( @@ -85,18 +93,27 @@ async def main() -> None: ) data_to_save.clear() - logger.info("数据转换完成,开始进行校验") - new_collection_data_count = ( - await ArticleEarningRankingRecordDocument.Meta.collection.count_documents({}) + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count( + ArticleEarningRankingRecordDocument + ) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + new_start_time, new_end_time = await get_collection_data_time_range( + ArticleEarningRankingRecordDocument, "date" ) - if old_collection_data_count != new_collection_data_count: + if old_start_time != new_start_time or old_end_time != new_end_time: logger.critical( - f"数据量不匹配(迁移前 {old_collection_data_count}," - f"迁移后 {new_collection_data_count})" + "数据时间范围不匹配" + f"(迁移前 {old_start_time} - {old_end_time}," + f"迁移后 {new_start_time} - {new_end_time})" ) exit() - logger.info("数据校验成功,迁移流程结束") + logger.info("校验成功,迁移流程结束") asyncio.run(main()) diff --git a/migrate_02_assets_rank.py b/migrate_02_assets_rank.py new file mode 100644 index 0000000..30d9486 --- /dev/null +++ b/migrate_02_assets_rank.py @@ -0,0 +1,111 @@ +import asyncio +from datetime import datetime +from typing import List + +from jkit.identifier_convert import user_url_to_slug +from sspeedup.logging.run_logger import RunLogger + +from models.assets_ranking_record import AmountField, AssetsRankingRecordDocument +from models.jianshu_user import JianshuUserDocument +from old_models.assets_rank import OldAssetsRank +from utils.migrate_helper import ( + get_collection_data_count, + get_collection_data_time_range, +) + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldAssetsRank.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await JianshuUserDocument.ensure_indexes() + await AssetsRankingRecordDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldAssetsRank) -> None: + if item.user.url: + await JianshuUserDocument.insert_or_update_one( + slug=user_url_to_slug(item.user.url), + updated_at=datetime.fromisoformat(item.date.isoformat()), + id=item.user.id, + name=item.user.name, + ) + + +async def convert_item(item: OldAssetsRank) -> AssetsRankingRecordDocument: + return AssetsRankingRecordDocument( + date=item.date, + ranking=item.ranking, + amount=AmountField( + fp=item.assets.fp, + ftn=item.assets.ftn, + assets=item.assets.total, + ), + user_slug=user_url_to_slug(item.user.url) if item.user.url else None, + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_data_count = await get_collection_data_count(OldAssetsRank) + old_start_time, old_end_time = await get_collection_data_time_range( + OldAssetsRank, "date" + ) + logger.info( + f"旧集合数据量:{old_data_count}," + f"数据时间范围:{old_start_time} - {old_end_time}" + ) + + data_to_save: List[AssetsRankingRecordDocument] = [] + async for item in OldAssetsRank.Meta.collection.find().sort( + {"date": 1, "ranking": 1} + ): + item = OldAssetsRank.from_dict(item) + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 1000: + await AssetsRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + if len(data_to_save): + await AssetsRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count(AssetsRankingRecordDocument) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + new_start_time, new_end_time = await get_collection_data_time_range( + AssetsRankingRecordDocument, "date" + ) + if old_start_time != new_start_time or old_end_time != new_end_time: + logger.critical( + "数据时间范围不匹配" + f"(迁移前 {old_start_time} - {old_end_time}," + f"迁移后 {new_start_time} - {new_end_time})" + ) + exit() + + logger.info("校验成功,迁移流程结束") + + +asyncio.run(main()) diff --git a/migrate_03_daily_update_rank.py b/migrate_03_daily_update_rank.py new file mode 100644 index 0000000..1dca503 --- /dev/null +++ b/migrate_03_daily_update_rank.py @@ -0,0 +1,106 @@ +import asyncio +from datetime import datetime +from typing import List + +from jkit.identifier_convert import user_url_to_slug +from sspeedup.logging.run_logger import RunLogger + +from models.daily_update_ranking_record import DailyUpdateRankingRecordDocument +from models.jianshu_user import JianshuUserDocument +from old_models.daily_update_rank import OldDailyUpdateRank +from utils.migrate_helper import ( + get_collection_data_count, + get_collection_data_time_range, +) + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldDailyUpdateRank.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await JianshuUserDocument.ensure_indexes() + await DailyUpdateRankingRecordDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldDailyUpdateRank) -> None: + if item.user.url: + await JianshuUserDocument.insert_or_update_one( + slug=user_url_to_slug(item.user.url), + updated_at=datetime.fromisoformat(item.date.isoformat()), + name=item.user.name, + ) + + +async def convert_item(item: OldDailyUpdateRank) -> DailyUpdateRankingRecordDocument: + return DailyUpdateRankingRecordDocument( + date=item.date, + ranking=item.ranking, + days=item.days, + user_slug=user_url_to_slug(item.user.url), + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_data_count = await get_collection_data_count(OldDailyUpdateRank) + old_start_time, old_end_time = await get_collection_data_time_range( + OldDailyUpdateRank, "date" + ) + logger.info( + f"旧集合数据量:{old_data_count}," + f"数据时间范围:{old_start_time} - {old_end_time}" + ) + + data_to_save: List[DailyUpdateRankingRecordDocument] = [] + async for item in OldDailyUpdateRank.Meta.collection.find().sort( + {"date": 1, "ranking": 1} + ): + item = OldDailyUpdateRank.from_dict(item) + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 1000: + await DailyUpdateRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + if len(data_to_save): + await DailyUpdateRankingRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count(DailyUpdateRankingRecordDocument) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + new_start_time, new_end_time = await get_collection_data_time_range( + DailyUpdateRankingRecordDocument, "date" + ) + if old_start_time != new_start_time or old_end_time != new_end_time: + logger.critical( + "数据时间范围不匹配" + f"(迁移前 {old_start_time} - {old_end_time}," + f"迁移后 {new_start_time} - {new_end_time})" + ) + exit() + + logger.info("校验成功,迁移流程结束") + + +asyncio.run(main()) diff --git a/models/assets_ranking_record.py b/models/assets_ranking_record.py index e757f11..bb07c05 100644 --- a/models/assets_ranking_record.py +++ b/models/assets_ranking_record.py @@ -21,7 +21,7 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): fp: Optional[NonNegativeFloat] ftn: Optional[NonNegativeFloat] - assets: PositiveFloat + assets: Optional[PositiveFloat] class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): diff --git a/utils/migrate_helper.py b/utils/migrate_helper.py new file mode 100644 index 0000000..a6d59e1 --- /dev/null +++ b/utils/migrate_helper.py @@ -0,0 +1,21 @@ +from datetime import datetime +from typing import Tuple, Type + +from utils.document_model import Document + + +async def get_collection_data_count(document: Type[Document]) -> int: + return await document.Meta.collection.count_documents({}) + + +async def get_collection_data_time_range( + document: Type[Document], key: str +) -> Tuple[datetime, datetime]: + start_time = ( + await document.Meta.collection.find().sort({key: 1}).limit(1).__anext__() + ) + end_time = ( + await document.Meta.collection.find().sort({key: -1}).limit(1).__anext__() + ) + + return (start_time, end_time) From a11df0a8fc2d6c0978c49e07322c3adc72b23a34 Mon Sep 17 00:00:00 2001 From: yezi Date: Tue, 12 Mar 2024 06:28:02 +0800 Subject: [PATCH 66/93] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=BB=93=E6=9E=84=E4=B8=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 14 +++++++------- jobs/{ => jianshu}/article_earning_ranking.py | 4 ++-- jobs/{ => jianshu}/assets_ranking.py | 4 ++-- jobs/{ => jianshu}/daily_update_ranking.py | 4 ++-- .../{jianshu_lottery.py => jianshu/lottery.py} | 18 +++++++++--------- .../lp_recommend.py} | 4 ++-- jobs/{jpep_ftn_trade.py => jpep/ftn_trade.py} | 18 +++++++++--------- migrate_01_article_fp_rank.py | 4 ++-- migrate_02_assets_rank.py | 7 +++++-- migrate_03_daily_update_rank.py | 4 ++-- .../article_earning_ranking_record.py | 4 ++-- models/{ => jianshu}/assets_ranking_record.py | 4 ++-- .../daily_update_ranking_record.py | 4 ++-- .../lottery_win_record.py} | 8 ++++---- .../lp_recommend_article_record.py | 4 ++-- models/{jianshu_user.py => jianshu/user.py} | 4 ++-- .../ftn_trade_order.py} | 6 +++--- models/{jpep_user.py => jpep/user.py} | 10 +++++----- utils/db.py | 4 +++- 19 files changed, 67 insertions(+), 62 deletions(-) rename jobs/{ => jianshu}/article_earning_ranking.py (96%) rename jobs/{ => jianshu}/assets_ranking.py (96%) rename jobs/{ => jianshu}/daily_update_ranking.py (93%) rename jobs/{jianshu_lottery.py => jianshu/lottery.py} (77%) rename jobs/{lp_recommended_articles.py => jianshu/lp_recommend.py} (95%) rename jobs/{jpep_ftn_trade.py => jpep/ftn_trade.py} (86%) rename models/{ => jianshu}/article_earning_ranking_record.py (90%) rename models/{ => jianshu}/assets_ranking_record.py (90%) rename models/{ => jianshu}/daily_update_ranking_record.py (85%) rename models/{jianshu_lottery_win_record.py => jianshu/lottery_win_record.py} (77%) rename models/{ => jianshu}/lp_recommend_article_record.py (92%) rename models/{jianshu_user.py => jianshu/user.py} (98%) rename models/{jpep_ftn_trade_order.py => jpep/ftn_trade_order.py} (85%) rename models/{jpep_user.py => jpep/user.py} (94%) diff --git a/jobs/__init__.py b/jobs/__init__.py index 2f0a65f..746ec63 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -14,13 +14,13 @@ def import_deployment(path: str) -> DeploymentType: DEPLOYMENT_PATHS: Set[str] = { - "jobs.article_earning_ranking:deployment", - "jobs.assets_ranking:deployment", - "jobs.daily_update_ranking:deployment", - "jobs.jianshu_lottery:deployment", - "jobs.jpep_ftn_trade:buy_deployment", - "jobs.jpep_ftn_trade:sell_deployment", - "jobs.lp_recommended_articles:deployment", + "jobs.jianshu.article_earning_ranking:deployment", + "jobs.jianshu.assets_ranking:deployment", + "jobs.jianshu.daily_update_ranking:deployment", + "jobs.jianshu.lottery:deployment", + "jobs.jianshu.lp_recommend:deployment", + "jobs.jpep.ftn_trade:buy_deployment", + "jobs.jpep.ftn_trade:sell_deployment", } diff --git a/jobs/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py similarity index 96% rename from jobs/article_earning_ranking.py rename to jobs/jianshu/article_earning_ranking.py index 3dfb7e0..7435756 100644 --- a/jobs/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -8,12 +8,12 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State -from models.article_earning_ranking_record import ( +from models.jianshu.article_earning_ranking_record import ( ArticleEarningRankingRecordDocument, ArticleField, EarningField, ) -from models.jianshu_user import JianshuUserDocument +from models.jianshu.user import JianshuUserDocument from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, diff --git a/jobs/assets_ranking.py b/jobs/jianshu/assets_ranking.py similarity index 96% rename from jobs/assets_ranking.py rename to jobs/jianshu/assets_ranking.py index 6b78414..395fc43 100644 --- a/jobs/assets_ranking.py +++ b/jobs/jianshu/assets_ranking.py @@ -8,11 +8,11 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State -from models.assets_ranking_record import ( +from models.jianshu.assets_ranking_record import ( AmountField, AssetsRankingRecordDocument, ) -from models.jianshu_user import JianshuUserDocument +from models.jianshu.user import JianshuUserDocument from utils.async_retry import async_retry from utils.config_generators import ( generate_deployment_config, diff --git a/jobs/daily_update_ranking.py b/jobs/jianshu/daily_update_ranking.py similarity index 93% rename from jobs/daily_update_ranking.py rename to jobs/jianshu/daily_update_ranking.py index 19585f9..ea75e45 100644 --- a/jobs/daily_update_ranking.py +++ b/jobs/jianshu/daily_update_ranking.py @@ -8,10 +8,10 @@ from prefect import flow from prefect.states import Completed, State -from models.daily_update_ranking_record import ( +from models.jianshu.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, ) -from models.jianshu_user import JianshuUserDocument +from models.jianshu.user import JianshuUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, diff --git a/jobs/jianshu_lottery.py b/jobs/jianshu/lottery.py similarity index 77% rename from jobs/jianshu_lottery.py rename to jobs/jianshu/lottery.py index 807f168..ddc3e2d 100644 --- a/jobs/jianshu_lottery.py +++ b/jobs/jianshu/lottery.py @@ -4,10 +4,10 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State -from models.jianshu_lottery_win_record import ( - JianshuLotteryWinRecordDocument, +from models.jianshu.lottery_win_record import ( + LotteryWinRecordDocument, ) -from models.jianshu_user import JianshuUserDocument +from models.jianshu.user import JianshuUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -16,7 +16,7 @@ async def process_item( item: JianshuLotteryWinRecord, / -) -> JianshuLotteryWinRecordDocument: +) -> LotteryWinRecordDocument: await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, updated_at=item.time, @@ -25,7 +25,7 @@ async def process_item( avatar_url=item.user_info.avatar_url, ) - return JianshuLotteryWinRecordDocument( + return LotteryWinRecordDocument( id=item.id, time=item.time, award_name=item.award_name, @@ -39,17 +39,17 @@ async def process_item( ) ) async def flow_func() -> State: - await JianshuLotteryWinRecordDocument.ensure_indexes() + await LotteryWinRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() logger = get_run_logger() - stop_id = await JianshuLotteryWinRecordDocument.get_latest_record_id() + stop_id = await LotteryWinRecordDocument.get_latest_record_id() logger.info(f"获取到最新的记录 ID:{stop_id}") if stop_id == 0: logger.warning("数据库中没有记录") - data: List[JianshuLotteryWinRecordDocument] = [] + data: List[LotteryWinRecordDocument] = [] async for item in JianshuLottery().iter_win_records(): if item.id == stop_id: break @@ -60,7 +60,7 @@ async def flow_func() -> State: logger.warning("采集数据量达到上限") if data: - await JianshuLotteryWinRecordDocument.insert_many(data) + await LotteryWinRecordDocument.insert_many(data) else: logger.info("无数据,不执行保存操作") diff --git a/jobs/lp_recommended_articles.py b/jobs/jianshu/lp_recommend.py similarity index 95% rename from jobs/lp_recommended_articles.py rename to jobs/jianshu/lp_recommend.py index a2bca43..818617c 100644 --- a/jobs/lp_recommended_articles.py +++ b/jobs/jianshu/lp_recommend.py @@ -5,10 +5,10 @@ from prefect import flow, get_run_logger from prefect.states import Completed, State -from models.jianshu_user import JianshuUserDocument -from models.lp_recommend_article_record import ( +from models.jianshu.lp_recommend_article_record import ( LPRecommendedArticleRecordDocument, ) +from models.jianshu.user import JianshuUserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, diff --git a/jobs/jpep_ftn_trade.py b/jobs/jpep/ftn_trade.py similarity index 86% rename from jobs/jpep_ftn_trade.py rename to jobs/jpep/ftn_trade.py index 0c70d86..2521e82 100644 --- a/jobs/jpep_ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -5,11 +5,11 @@ from prefect import flow from prefect.states import Completed, State -from models.jpep_ftn_trade_order import ( +from models.jpep.ftn_trade_order import ( AmountField, - JPEPFTNTradeOrderDocument, + FTNTradeOrderDocument, ) -from models.jpep_user import JPEPUserDocument +from models.jpep.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -37,9 +37,9 @@ async def process_item( *, fetch_time: datetime, type: Literal["buy", "sell"], # noqa: A002 -) -> JPEPFTNTradeOrderDocument: +) -> FTNTradeOrderDocument: if item.publisher_info.id: - await JPEPUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( updated_at=fetch_time, id=item.publisher_info.id, name=item.publisher_info.name, # type: ignore @@ -48,7 +48,7 @@ async def process_item( credit=item.publisher_info.credit, # type: ignore ) - return JPEPFTNTradeOrderDocument( + return FTNTradeOrderDocument( fetch_time=fetch_time, id=item.id, published_at=item.publish_time, @@ -71,16 +71,16 @@ async def process_item( ), ) async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 - await JPEPFTNTradeOrderDocument.ensure_indexes() + await FTNTradeOrderDocument.ensure_indexes() fetch_time = get_fetch_time() - data: List[JPEPFTNTradeOrderDocument] = [] + data: List[FTNTradeOrderDocument] = [] async for item in FTNMacket().iter_orders(type=type): processed_item = await process_item(item, fetch_time=fetch_time, type=type) data.append(processed_item) - await JPEPFTNTradeOrderDocument.insert_many(data) + await FTNTradeOrderDocument.insert_many(data) return Completed(message=f"fetch_time={fetch_time}, data_count={len(data)}") diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py index 82c37cf..4cc4135 100644 --- a/migrate_01_article_fp_rank.py +++ b/migrate_01_article_fp_rank.py @@ -5,12 +5,12 @@ from jkit.identifier_convert import article_url_to_slug, user_url_to_slug from sspeedup.logging.run_logger import RunLogger -from models.article_earning_ranking_record import ( +from models.jianshu.article_earning_ranking_record import ( ArticleEarningRankingRecordDocument, ArticleField, EarningField, ) -from models.jianshu_user import JianshuUserDocument +from models.jianshu.user import JianshuUserDocument from old_models.article_fp_rank import OldArticleFPRank from utils.migrate_helper import ( get_collection_data_count, diff --git a/migrate_02_assets_rank.py b/migrate_02_assets_rank.py index 30d9486..8763a46 100644 --- a/migrate_02_assets_rank.py +++ b/migrate_02_assets_rank.py @@ -5,8 +5,11 @@ from jkit.identifier_convert import user_url_to_slug from sspeedup.logging.run_logger import RunLogger -from models.assets_ranking_record import AmountField, AssetsRankingRecordDocument -from models.jianshu_user import JianshuUserDocument +from models.jianshu.assets_ranking_record import ( + AmountField, + AssetsRankingRecordDocument, +) +from models.jianshu.user import JianshuUserDocument from old_models.assets_rank import OldAssetsRank from utils.migrate_helper import ( get_collection_data_count, diff --git a/migrate_03_daily_update_rank.py b/migrate_03_daily_update_rank.py index 1dca503..7f8726d 100644 --- a/migrate_03_daily_update_rank.py +++ b/migrate_03_daily_update_rank.py @@ -5,8 +5,8 @@ from jkit.identifier_convert import user_url_to_slug from sspeedup.logging.run_logger import RunLogger -from models.daily_update_ranking_record import DailyUpdateRankingRecordDocument -from models.jianshu_user import JianshuUserDocument +from models.jianshu.daily_update_ranking_record import DailyUpdateRankingRecordDocument +from models.jianshu.user import JianshuUserDocument from old_models.daily_update_rank import OldDailyUpdateRank from utils.migrate_helper import ( get_collection_data_count, diff --git a/models/article_earning_ranking_record.py b/models/jianshu/article_earning_ranking_record.py similarity index 90% rename from models/article_earning_ranking_record.py rename to models/jianshu/article_earning_ranking_record.py index e69caa1..9465898 100644 --- a/models/article_earning_ranking_record.py +++ b/models/jianshu/article_earning_ranking_record.py @@ -10,7 +10,7 @@ ) from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, @@ -38,7 +38,7 @@ class ArticleEarningRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): earning: EarningField class Meta: # type: ignore - collection = DB.article_earning_ranking_records + collection = JIANSHU_DB.article_earning_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "ranking"], unique=True), ] diff --git a/models/assets_ranking_record.py b/models/jianshu/assets_ranking_record.py similarity index 90% rename from models/assets_ranking_record.py rename to models/jianshu/assets_ranking_record.py index bb07c05..a2ca2b6 100644 --- a/models/assets_ranking_record.py +++ b/models/jianshu/assets_ranking_record.py @@ -9,7 +9,7 @@ ) from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, @@ -32,7 +32,7 @@ class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): user_slug: Optional[UserSlug] class Meta: # type: ignore - collection = DB.assets_ranking_records + collection = JIANSHU_DB.assets_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "ranking"], unique=True), ] diff --git a/models/daily_update_ranking_record.py b/models/jianshu/daily_update_ranking_record.py similarity index 85% rename from models/daily_update_ranking_record.py rename to models/jianshu/daily_update_ranking_record.py index 014e0c0..073b89f 100644 --- a/models/daily_update_ranking_record.py +++ b/models/jianshu/daily_update_ranking_record.py @@ -7,7 +7,7 @@ ) from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, Document, @@ -22,7 +22,7 @@ class DailyUpdateRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug class Meta: # type: ignore - collection = DB.daily_update_ranking_records + collection = JIANSHU_DB.daily_update_ranking_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "userSlug"], unique=True), ] diff --git a/models/jianshu_lottery_win_record.py b/models/jianshu/lottery_win_record.py similarity index 77% rename from models/jianshu_lottery_win_record.py rename to models/jianshu/lottery_win_record.py index 8a32e0f..837a23a 100644 --- a/models/jianshu_lottery_win_record.py +++ b/models/jianshu/lottery_win_record.py @@ -8,14 +8,14 @@ ) from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, Document, ) -class JianshuLotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class LotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): id: PositiveInt time: datetime award_name: NonEmptyStr @@ -23,7 +23,7 @@ class JianshuLotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): user_slug: UserSlug class Meta: # type: ignore - collection = DB.jianshu_lottery_win_records + collection = JIANSHU_DB.lottery_win_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["id"], unique=True), ] @@ -31,7 +31,7 @@ class Meta: # type: ignore @classmethod async def get_latest_record_id(cls) -> int: try: - latest_data = JianshuLotteryWinRecordDocument.from_dict( + latest_data = LotteryWinRecordDocument.from_dict( await cls.Meta.collection.find().sort("id", -1).__anext__() ) except StopAsyncIteration: diff --git a/models/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py similarity index 92% rename from models/lp_recommend_article_record.py rename to models/jianshu/lp_recommend_article_record.py index f9b560e..b4225d5 100644 --- a/models/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -12,7 +12,7 @@ from msgspec import field from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, Document, @@ -39,7 +39,7 @@ class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): author_slug: UserSlug class Meta: # type: ignore - collection = DB.lp_recommended_article_records + collection = JIANSHU_DB.lp_recommended_article_records indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "slug"], unique=True), ] diff --git a/models/jianshu_user.py b/models/jianshu/user.py similarity index 98% rename from models/jianshu_user.py rename to models/jianshu/user.py index 66e9e14..bf491be 100644 --- a/models/jianshu_user.py +++ b/models/jianshu/user.py @@ -5,7 +5,7 @@ from jkit._constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl from pymongo import IndexModel -from utils.db import DB +from utils.db import JIANSHU_DB from utils.document_model import Document @@ -24,7 +24,7 @@ class JianshuUserDocument(Document): avatar_url: Optional[UserUploadedUrl] class Meta: # type: ignore - collection = DB.jianshu_users + collection = JIANSHU_DB.users indexes: ClassVar[List[IndexModel]] = [ IndexModel(["slug"], unique=True), IndexModel(["updatedAt"]), diff --git a/models/jpep_ftn_trade_order.py b/models/jpep/ftn_trade_order.py similarity index 85% rename from models/jpep_ftn_trade_order.py rename to models/jpep/ftn_trade_order.py index fc5eb1a..a713a61 100644 --- a/models/jpep_ftn_trade_order.py +++ b/models/jpep/ftn_trade_order.py @@ -8,7 +8,7 @@ ) from pymongo import IndexModel -from utils.db import DB +from utils.db import JPEP_DB from utils.document_model import ( DOCUMENT_OBJECT_CONFIG, FIELD_OBJECT_CONFIG, @@ -24,7 +24,7 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): minimum_trade: PositiveInt -class JPEPFTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class FTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): fetch_time: datetime id: PositiveInt published_at: datetime @@ -36,7 +36,7 @@ class JPEPFTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): publisher_id: PositiveInt class Meta: # type: ignore - collection = DB.jpep_ftn_trade_orders + collection = JPEP_DB.ftn_trade_orders indexes: ClassVar[List[IndexModel]] = [ IndexModel(["fetchTime", "id"], unique=True), ] diff --git a/models/jpep_user.py b/models/jpep/user.py similarity index 94% rename from models/jpep_user.py rename to models/jpep/user.py index ba486dd..7fbd97e 100644 --- a/models/jpep_user.py +++ b/models/jpep/user.py @@ -4,7 +4,7 @@ from jkit._constraints import NonNegativeInt, PositiveInt from pymongo import IndexModel -from utils.db import DB +from utils.db import JPEP_DB from utils.document_model import FIELD_OBJECT_CONFIG, Document, Field @@ -13,7 +13,7 @@ class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): value: NonNegativeInt -class JPEPUserDocument(Document): +class UserDocument(Document): updated_at: datetime id: PositiveInt name: str @@ -22,7 +22,7 @@ class JPEPUserDocument(Document): credit_history: List[CreditHistoryFieldItem] class Meta: # type: ignore - collection = DB.jpep_users + collection = JPEP_DB.users indexes: ClassVar[List[IndexModel]] = [ IndexModel(["id"], unique=True), IndexModel(["updatedAt"]), @@ -48,7 +48,7 @@ async def insert_or_update_one( if not await cls.is_record_exist(id): await cls.insert_one( - JPEPUserDocument( + UserDocument( updated_at=updated_at, id=id, name=name, @@ -64,7 +64,7 @@ async def insert_or_update_one( ) # 此处用户必定存在,因此 db_data 不为 None - db_data = JPEPUserDocument.from_dict( + db_data = UserDocument.from_dict( await cls.Meta.collection.find_one({"id": id}) # type: ignore ) # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 diff --git a/utils/db.py b/utils/db.py index 2a3e112..5dd6fe5 100644 --- a/utils/db.py +++ b/utils/db.py @@ -3,4 +3,6 @@ from utils.config import CONFIG _CLIENT = AsyncIOMotorClient(CONFIG.mongodb.host, CONFIG.mongodb.port) -DB = _CLIENT[CONFIG.mongodb.database] + +JIANSHU_DB = _CLIENT.jianshu +JPEP_DB = _CLIENT.jpep From 605232a6f990f37c8f472bb37ee089f157c89380 Mon Sep 17 00:00:00 2001 From: yezi Date: Tue, 12 Mar 2024 06:29:28 +0800 Subject: [PATCH 67/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20migrate=5Fhel?= =?UTF-8?q?per=20=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/migrate_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/migrate_helper.py b/utils/migrate_helper.py index a6d59e1..00625f2 100644 --- a/utils/migrate_helper.py +++ b/utils/migrate_helper.py @@ -13,9 +13,9 @@ async def get_collection_data_time_range( ) -> Tuple[datetime, datetime]: start_time = ( await document.Meta.collection.find().sort({key: 1}).limit(1).__anext__() - ) + )[key] end_time = ( await document.Meta.collection.find().sort({key: -1}).limit(1).__anext__() - ) + )[key] return (start_time, end_time) From 683b94d18e6a52ef8b4ba99c05fbf88efa8673a0 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 13 Mar 2024 06:07:50 +0800 Subject: [PATCH 68/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E8=BF=81=E7=A7=BB=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_04_lottery_data.py | 89 ++++++++++++++++++++++++++ migrate_05_lp_collections.py | 117 +++++++++++++++++++++++++++++++++++ old_models/lottery_data.py | 2 + 3 files changed, 208 insertions(+) create mode 100644 migrate_04_lottery_data.py create mode 100644 migrate_05_lp_collections.py diff --git a/migrate_04_lottery_data.py b/migrate_04_lottery_data.py new file mode 100644 index 0000000..b7a5406 --- /dev/null +++ b/migrate_04_lottery_data.py @@ -0,0 +1,89 @@ +import asyncio +from typing import List + +from jkit.identifier_convert import user_url_to_slug +from sspeedup.logging.run_logger import RunLogger + +from models.jianshu.lottery_win_record import LotteryWinRecordDocument +from models.jianshu.user import JianshuUserDocument +from old_models.lottery_data import OldLotteryData +from utils.migrate_helper import ( + get_collection_data_count, +) + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldLotteryData.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await JianshuUserDocument.ensure_indexes() + await LotteryWinRecordDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldLotteryData) -> None: + if item.user.url: + await JianshuUserDocument.insert_or_update_one( + slug=user_url_to_slug(item.user.url), + updated_at=item.time, + id=item.user.id, + name=item.user.name, + ) + + +async def convert_item(item: OldLotteryData) -> LotteryWinRecordDocument: + return LotteryWinRecordDocument( + id=item._id, + time=item.time, + award_name=item.reward_name, + user_slug=user_url_to_slug(item.user.url), + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_data_count = await get_collection_data_count(OldLotteryData) + logger.info(f"旧集合数据量:{old_data_count}") + + data_to_save: List[LotteryWinRecordDocument] = [] + async for item in OldLotteryData.Meta.collection.find().sort( + {"date": 1, "ranking": 1} + ): + item = OldLotteryData.from_dict(item) + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 1000: + await LotteryWinRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的 ID 为 {data_to_save[-1].id}" + ) + data_to_save.clear() + + if len(data_to_save): + await LotteryWinRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的 ID 为 {data_to_save[-1].id}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count(LotteryWinRecordDocument) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + + logger.info("校验成功,迁移流程结束") + + +asyncio.run(main()) diff --git a/migrate_05_lp_collections.py b/migrate_05_lp_collections.py new file mode 100644 index 0000000..aa45f57 --- /dev/null +++ b/migrate_05_lp_collections.py @@ -0,0 +1,117 @@ +import asyncio +from typing import List + +from jkit.identifier_convert import article_url_to_slug, user_url_to_slug +from sspeedup.logging.run_logger import RunLogger + +from models.jianshu.lp_recommend_article_record import ( + LPRecommendedArticleRecordDocument, +) +from models.jianshu.user import JianshuUserDocument +from old_models.lp_collections import OldLPCollections +from utils.migrate_helper import ( + get_collection_data_count, + get_collection_data_time_range, +) + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldLPCollections.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await JianshuUserDocument.ensure_indexes() + await LPRecommendedArticleRecordDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldLPCollections) -> None: + await JianshuUserDocument.insert_or_update_one( + slug=user_url_to_slug(item.author.url), + updated_at=item.fetch_date, + id=item.author.id, + name=item.author.name, + ) + + +async def convert_item(item: OldLPCollections) -> LPRecommendedArticleRecordDocument: + return LPRecommendedArticleRecordDocument( + date=item.fetch_date, + id=item.article.id, + slug=article_url_to_slug(item.article.url), + title=item.article.title, + published_at=item.article.release_time, + views_count=item.article.views_count, + likes_count=item.article.likes_count, + comments_count=item.article.comments_count, + tips_count=item.article.rewards_count, + earned_fp_amount=item.article.total_fp_amount, + is_paid=item.article.is_paid, + can_comment=item.article.is_commentable, + description=item.article.summary, + author_slug=user_url_to_slug(item.author.url), + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_data_count = await get_collection_data_count(OldLPCollections) + old_start_time, old_end_time = await get_collection_data_time_range( + OldLPCollections, "date" + ) + logger.info( + f"旧集合数据量:{old_data_count}," + f"数据时间范围:{old_start_time} - {old_end_time}" + ) + + data_to_save: List[LPRecommendedArticleRecordDocument] = [] + async for item in OldLPCollections.Meta.collection.find().sort( + {"date": 1, "ranking": 1} + ): + item = OldLPCollections.from_dict(item) + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 1000: + await LPRecommendedArticleRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + if len(data_to_save): + await LPRecommendedArticleRecordDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的日期为 {data_to_save[-1].date}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count(LPRecommendedArticleRecordDocument) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + new_start_time, new_end_time = await get_collection_data_time_range( + LPRecommendedArticleRecordDocument, "date" + ) + if old_start_time != new_start_time or old_end_time != new_end_time: + logger.critical( + "数据时间范围不匹配" + f"(迁移前 {old_start_time} - {old_end_time}," + f"迁移后 {new_start_time} - {new_end_time})" + ) + exit() + + logger.info("校验成功,迁移流程结束") + + +asyncio.run(main()) diff --git a/old_models/lottery_data.py b/old_models/lottery_data.py index 52fd755..4cc1f7b 100644 --- a/old_models/lottery_data.py +++ b/old_models/lottery_data.py @@ -16,9 +16,11 @@ class OldUserField(Field, **FIELD_OBJECT_CONFIG): id: int url: str + name: str class OldLotteryData(Document, **DOCUMENT_OBJECT_CONFIG): + _id: int time: datetime reward_name: str = field(name="reward_name") From feefec748e357de911534c23ddc671ee2a872bf8 Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 13 Mar 2024 06:36:56 +0800 Subject: [PATCH 69/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=9F=A5=E8=AF=A2=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/lottery.py | 4 +- jobs/jpep/ftn_trade.py | 2 +- migrate_01_article_fp_rank.py | 5 +- migrate_02_assets_rank.py | 5 +- migrate_03_daily_update_rank.py | 5 +- migrate_04_lottery_data.py | 5 +- migrate_05_lp_collections.py | 12 ++-- models/jianshu/lottery_win_record.py | 7 +- models/jianshu/lp_recommend_article_record.py | 4 +- models/jianshu/user.py | 11 ++- models/jpep/user.py | 11 ++- old_models/assets_rank.py | 1 - old_models/lp_collections.py | 4 +- utils/document_model.py | 69 +++++++++++++++++-- utils/migrate_helper.py | 10 +-- 15 files changed, 98 insertions(+), 57 deletions(-) diff --git a/jobs/jianshu/lottery.py b/jobs/jianshu/lottery.py index ddc3e2d..aa8c148 100644 --- a/jobs/jianshu/lottery.py +++ b/jobs/jianshu/lottery.py @@ -14,9 +14,7 @@ ) -async def process_item( - item: JianshuLotteryWinRecord, / -) -> LotteryWinRecordDocument: +async def process_item(item: JianshuLotteryWinRecord, /) -> LotteryWinRecordDocument: await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, updated_at=item.time, diff --git a/jobs/jpep/ftn_trade.py b/jobs/jpep/ftn_trade.py index 2521e82..acae816 100644 --- a/jobs/jpep/ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -61,7 +61,7 @@ async def process_item( tradable=item.tradable_amount, minimum_trade=item.minimum_trade_amount, ), - publisher_id=item.publisher_info.id, # type: ignore + publisher_id=item.publisher_info.id, # type: ignore ).validate() diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py index 4cc4135..1d6c234 100644 --- a/migrate_01_article_fp_rank.py +++ b/migrate_01_article_fp_rank.py @@ -70,10 +70,9 @@ async def main() -> None: ) data_to_save: List[ArticleEarningRankingRecordDocument] = [] - async for item in OldArticleFPRank.Meta.collection.find().sort( - {"date": 1, "ranking": 1} + async for item in OldArticleFPRank.find_many( + sort={"date": "ASC", "ranking": "ASC"} ): - item = OldArticleFPRank.from_dict(item) await insert_or_update_user(item) data_to_save.append(await convert_item(item)) diff --git a/migrate_02_assets_rank.py b/migrate_02_assets_rank.py index 8763a46..37059df 100644 --- a/migrate_02_assets_rank.py +++ b/migrate_02_assets_rank.py @@ -67,10 +67,7 @@ async def main() -> None: ) data_to_save: List[AssetsRankingRecordDocument] = [] - async for item in OldAssetsRank.Meta.collection.find().sort( - {"date": 1, "ranking": 1} - ): - item = OldAssetsRank.from_dict(item) + async for item in OldAssetsRank.find_many(sort={"date": "ASC", "ranking": "ASC"}): await insert_or_update_user(item) data_to_save.append(await convert_item(item)) diff --git a/migrate_03_daily_update_rank.py b/migrate_03_daily_update_rank.py index 7f8726d..4b7c2e5 100644 --- a/migrate_03_daily_update_rank.py +++ b/migrate_03_daily_update_rank.py @@ -59,10 +59,9 @@ async def main() -> None: ) data_to_save: List[DailyUpdateRankingRecordDocument] = [] - async for item in OldDailyUpdateRank.Meta.collection.find().sort( - {"date": 1, "ranking": 1} + async for item in OldDailyUpdateRank.find_many( + sort={"date": "ASC", "ranking": "ASC"} ): - item = OldDailyUpdateRank.from_dict(item) await insert_or_update_user(item) data_to_save.append(await convert_item(item)) diff --git a/migrate_04_lottery_data.py b/migrate_04_lottery_data.py index b7a5406..c70bfb8 100644 --- a/migrate_04_lottery_data.py +++ b/migrate_04_lottery_data.py @@ -52,10 +52,7 @@ async def main() -> None: logger.info(f"旧集合数据量:{old_data_count}") data_to_save: List[LotteryWinRecordDocument] = [] - async for item in OldLotteryData.Meta.collection.find().sort( - {"date": 1, "ranking": 1} - ): - item = OldLotteryData.from_dict(item) + async for item in OldLotteryData.find_many(sort={"date": "ASC", "ranking": "ASC"}): await insert_or_update_user(item) data_to_save.append(await convert_item(item)) diff --git a/migrate_05_lp_collections.py b/migrate_05_lp_collections.py index aa45f57..32b6525 100644 --- a/migrate_05_lp_collections.py +++ b/migrate_05_lp_collections.py @@ -1,4 +1,5 @@ import asyncio +from datetime import datetime from typing import List from jkit.identifier_convert import article_url_to_slug, user_url_to_slug @@ -29,7 +30,7 @@ async def ensure_all_new_collection_indexes() -> None: async def insert_or_update_user(item: OldLPCollections) -> None: await JianshuUserDocument.insert_or_update_one( slug=user_url_to_slug(item.author.url), - updated_at=item.fetch_date, + updated_at=datetime.fromisoformat(item.fetch_date.isoformat()), id=item.author.id, name=item.author.name, ) @@ -62,7 +63,7 @@ async def main() -> None: old_data_count = await get_collection_data_count(OldLPCollections) old_start_time, old_end_time = await get_collection_data_time_range( - OldLPCollections, "date" + OldLPCollections, "fetch_date" ) logger.info( f"旧集合数据量:{old_data_count}," @@ -70,10 +71,9 @@ async def main() -> None: ) data_to_save: List[LPRecommendedArticleRecordDocument] = [] - async for item in OldLPCollections.Meta.collection.find().sort( - {"date": 1, "ranking": 1} + async for item in OldLPCollections.find_many( + sort={"date": "ASC", "ranking": "ASC"} ): - item = OldLPCollections.from_dict(item) await insert_or_update_user(item) data_to_save.append(await convert_item(item)) @@ -101,7 +101,7 @@ async def main() -> None: ) exit() new_start_time, new_end_time = await get_collection_data_time_range( - LPRecommendedArticleRecordDocument, "date" + LPRecommendedArticleRecordDocument, "fetch_date" ) if old_start_time != new_start_time or old_end_time != new_end_time: logger.critical( diff --git a/models/jianshu/lottery_win_record.py b/models/jianshu/lottery_win_record.py index 837a23a..0646992 100644 --- a/models/jianshu/lottery_win_record.py +++ b/models/jianshu/lottery_win_record.py @@ -30,11 +30,8 @@ class Meta: # type: ignore @classmethod async def get_latest_record_id(cls) -> int: - try: - latest_data = LotteryWinRecordDocument.from_dict( - await cls.Meta.collection.find().sort("id", -1).__anext__() - ) - except StopAsyncIteration: + latest_data = await LotteryWinRecordDocument.find_one(sort={"id": "DESC"}) + if not latest_data: return 0 return latest_data.id diff --git a/models/jianshu/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py index b4225d5..09a84d9 100644 --- a/models/jianshu/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -30,7 +30,7 @@ class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): likes_count: NonNegativeInt comments_count: NonNegativeInt tips_count: NonNegativeFloat - earned_fp_amount: NonNegativeFloat = field(name="EarnedFPAmount") + earned_fp_amount: NonNegativeFloat = field(name="earnedFPAmount") is_paid: bool can_comment: bool @@ -46,4 +46,4 @@ class Meta: # type: ignore @classmethod async def is_record_exist(cls, slug: str) -> bool: - return await cls.Meta.collection.find_one({"slug": slug}) is not None + return await cls.find_one({"slug": slug}) is not None diff --git a/models/jianshu/user.py b/models/jianshu/user.py index bf491be..1063c3e 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -32,7 +32,7 @@ class Meta: # type: ignore @classmethod async def is_record_exist(cls, slug: str) -> bool: - return await cls.Meta.collection.find_one({"slug": slug}) is not None + return await cls.find_one({"slug": slug}) is not None @classmethod async def insert_or_update_one( @@ -60,10 +60,9 @@ async def insert_or_update_one( ) ) - # 此处用户必定存在,因此 db_data 不为 None - db_data = JianshuUserDocument.from_dict( - await cls.Meta.collection.find_one({"slug": slug}) # type: ignore - ) + db_data = await cls.find_one({"slug": slug}) + if not db_data: + raise AssertionError("意外的空值") # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 # 此时跳过更新 if updated_at < db_data.updated_at: @@ -109,4 +108,4 @@ async def insert_or_update_one( ): update_data["$set"]["avatarUrl"] = avatar_url - await cls.Meta.collection.update_one({"slug": slug}, update_data) + await cls.get_collection().update_one({"slug": slug}, update_data) diff --git a/models/jpep/user.py b/models/jpep/user.py index 7fbd97e..541acbb 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -30,7 +30,7 @@ class Meta: # type: ignore @classmethod async def is_record_exist(cls, id: int) -> bool: # noqa: A002 - return await cls.Meta.collection.find_one({"id": id}) is not None + return await cls.find_one({"id": id}) is not None @classmethod async def insert_or_update_one( @@ -63,10 +63,9 @@ async def insert_or_update_one( ) ) - # 此处用户必定存在,因此 db_data 不为 None - db_data = UserDocument.from_dict( - await cls.Meta.collection.find_one({"id": id}) # type: ignore - ) + db_data = await cls.find_one({"id": id}) + if not db_data: + raise AssertionError("意外的空值") # 如果数据库中数据的更新时间晚于本次更新时间,则本次数据已不是最新 # 此时跳过更新 if updated_at < db_data.updated_at: @@ -95,4 +94,4 @@ async def insert_or_update_one( } } - await cls.Meta.collection.update_one({"id": id}, update_data) + await cls.get_collection().update_one({"id": id}, update_data) diff --git a/old_models/assets_rank.py b/old_models/assets_rank.py index d2d9a1a..1f295fc 100644 --- a/old_models/assets_rank.py +++ b/old_models/assets_rank.py @@ -37,4 +37,3 @@ class Meta: # type: ignore indexes: ClassVar[List[IndexModel]] = [ IndexModel(["date", "ranking"], unique=True), ] - diff --git a/old_models/lp_collections.py b/old_models/lp_collections.py index 95f47ee..10c3cb5 100644 --- a/old_models/lp_collections.py +++ b/old_models/lp_collections.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import date, datetime from typing import ClassVar, List from msgspec import field @@ -37,7 +37,7 @@ class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): class OldLPCollections(Document, **DOCUMENT_OBJECT_CONFIG): - fetch_date: datetime = field(name="fetch_date") + fetch_date: date = field(name="fetch_date") from_collection: str = field(name="from_collection") article: OldArticleField diff --git a/utils/document_model.py b/utils/document_model.py index 449d3f0..ff90b34 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -1,5 +1,15 @@ from datetime import date, datetime -from typing import Any, ClassVar, Dict, List, Sequence, Tuple +from typing import ( + Any, + AsyncGenerator, + ClassVar, + Dict, + List, + Literal, + Optional, + Sequence, + Tuple, +) from bson import ObjectId from motor.core import AgnosticCollection @@ -40,6 +50,10 @@ class Meta(Struct): collection: ClassVar[AgnosticCollection] indexes: ClassVar[List[IndexModel]] + @classmethod + def get_collection(cls) -> AgnosticCollection: + return cls.Meta.collection + def validate(self) -> Self: return convert( to_builtins(self, builtin_types=_BUILDIN_TYPES), @@ -66,12 +80,59 @@ async def ensure_indexes(cls) -> None: if not cls.Meta.indexes: return - await cls.Meta.collection.create_indexes(cls.Meta.indexes) + await cls.get_collection().create_indexes(cls.Meta.indexes) + + @classmethod + async def find_one( + cls, + filter: Optional[Dict[str, Any]] = None, # noqa: A002 + /, + *, + sort: Optional[Dict[str, Literal["ASC", "DESC"]]] = None, + ) -> Optional[Self]: + cursor = cls.get_collection().find(filter) + if sort: + cursor = cursor.sort( + {key: 1 if order == "ASC" else -1 for key, order in sort.items()} + ) + cursor = cursor.limit(1) + + try: + return cls.from_dict(await cursor.__anext__()) + except StopAsyncIteration: + return None + + @classmethod + async def find_many( + cls, + filter: Optional[Dict[str, Any]] = None, # noqa: A002 + /, + *, + sort: Optional[Dict[str, Literal["ASC", "DESC"]]] = None, + skip: Optional[int] = None, + limit: Optional[int] = None, + ) -> AsyncGenerator[Self, None]: + cursor = cls.get_collection().find(filter) + if sort: + cursor = cursor.sort( + {key: 1 if order == "ASC" else -1 for key, order in sort.items()} + ) + if skip: + cursor = cursor.skip(skip) + if limit: + cursor = cursor.limit(limit) + + async for item in cursor: + yield cls.from_dict(item) @classmethod async def insert_one(cls, data: Self) -> None: - await cls.Meta.collection.insert_one(data.to_dict()) + await cls.get_collection().insert_one(data.to_dict()) @classmethod async def insert_many(cls, data: Sequence[Self]) -> None: - await cls.Meta.collection.insert_many(x.to_dict() for x in data) + await cls.get_collection().insert_many(x.to_dict() for x in data) + + @classmethod + async def count(cls, filter: Optional[Dict[str, Any]] = None) -> int: # noqa: A002 + return await cls.get_collection().count_documents(filter if filter else {}) diff --git a/utils/migrate_helper.py b/utils/migrate_helper.py index 00625f2..6abd7ff 100644 --- a/utils/migrate_helper.py +++ b/utils/migrate_helper.py @@ -5,17 +5,13 @@ async def get_collection_data_count(document: Type[Document]) -> int: - return await document.Meta.collection.count_documents({}) + return await document.count() async def get_collection_data_time_range( document: Type[Document], key: str ) -> Tuple[datetime, datetime]: - start_time = ( - await document.Meta.collection.find().sort({key: 1}).limit(1).__anext__() - )[key] - end_time = ( - await document.Meta.collection.find().sort({key: -1}).limit(1).__anext__() - )[key] + start_time = (await document.find_one(sort={key: "ASC"})).__getattribute__(key) + end_time = (await document.find_one(sort={key: "DESC"})).__getattribute__(key) return (start_time, end_time) From 8ac89a03734f068df3fa7fcf4055b06abaa15aed Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 14 Mar 2024 06:10:33 +0800 Subject: [PATCH 70/93] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/article_earning_ranking.py | 7 +++--- jobs/jianshu/assets_ranking.py | 7 +++--- jobs/jianshu/daily_update_ranking.py | 7 +++--- jobs/jianshu/lp_recommend.py | 7 +++--- .../jianshu/article_earning_ranking_record.py | 4 ++-- models/jianshu/assets_ranking_record.py | 4 ++-- models/jianshu/daily_update_ranking_record.py | 4 ++-- models/jianshu/lp_recommend_article_record.py | 4 ++-- old_models/lp_collections.py | 4 ++-- utils/document_model.py | 23 ++++--------------- 10 files changed, 31 insertions(+), 40 deletions(-) diff --git a/jobs/jianshu/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py index 7435756..6924185 100644 --- a/jobs/jianshu/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, timedelta +from datetime import datetime, timedelta from typing import List, Optional, Tuple from jkit.config import CONFIG @@ -7,6 +7,7 @@ from jkit.user import UserInfo from prefect import flow, get_run_logger from prefect.states import Completed, State +from sspeedup.time_helper import get_today_in_datetime_obj from models.jianshu.article_earning_ranking_record import ( ArticleEarningRankingRecordDocument, @@ -47,7 +48,7 @@ async def get_author_slug_and_info( async def process_item( - item: RecordField, /, *, target_date: date + item: RecordField, /, *, target_date: datetime ) -> ArticleEarningRankingRecordDocument: author_slug, author_info = await get_author_slug_and_info(item) @@ -83,7 +84,7 @@ async def flow_func() -> State: await ArticleEarningRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - target_date = datetime.now().date() - timedelta(days=1) + target_date = get_today_in_datetime_obj() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] async for item in ArticleEarningRanking(target_date): diff --git a/jobs/jianshu/assets_ranking.py b/jobs/jianshu/assets_ranking.py index 395fc43..17f86fa 100644 --- a/jobs/jianshu/assets_ranking.py +++ b/jobs/jianshu/assets_ranking.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from typing import List, Optional, Tuple from jkit.config import CONFIG @@ -7,6 +7,7 @@ from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State +from sspeedup.time_helper import get_today_in_datetime_obj from models.jianshu.assets_ranking_record import ( AmountField, @@ -50,7 +51,7 @@ async def get_fp_ftn_amount( async def process_item( - item: AssetsRankingRecord, /, *, target_date: date + item: AssetsRankingRecord, /, *, target_date: datetime ) -> AssetsRankingRecordDocument: fp_amount, ftn_amount = await get_fp_ftn_amount(item) @@ -83,7 +84,7 @@ async def flow_func() -> State: await AssetsRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - target_date = datetime.now().date() + target_date = get_today_in_datetime_obj() data: List[AssetsRankingRecordDocument] = [] async for item in AssetsRanking(): diff --git a/jobs/jianshu/daily_update_ranking.py b/jobs/jianshu/daily_update_ranking.py index ea75e45..92ba82b 100644 --- a/jobs/jianshu/daily_update_ranking.py +++ b/jobs/jianshu/daily_update_ranking.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from typing import List from jkit.ranking.daily_update import ( @@ -7,6 +7,7 @@ ) from prefect import flow from prefect.states import Completed, State +from sspeedup.time_helper import get_today_in_datetime_obj from models.jianshu.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, @@ -19,7 +20,7 @@ async def process_item( - item: DailyUpdateRankingRecord, /, *, current_date: date + item: DailyUpdateRankingRecord, /, *, current_date: datetime ) -> DailyUpdateRankingRecordDocument: await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, @@ -44,7 +45,7 @@ async def flow_func() -> State: await DailyUpdateRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - current_date = datetime.now().date() + current_date = get_today_in_datetime_obj() data: List[DailyUpdateRankingRecordDocument] = [] async for item in DailyUpdateRanking(): diff --git a/jobs/jianshu/lp_recommend.py b/jobs/jianshu/lp_recommend.py index 818617c..d9dc26b 100644 --- a/jobs/jianshu/lp_recommend.py +++ b/jobs/jianshu/lp_recommend.py @@ -1,9 +1,10 @@ -from datetime import date, datetime +from datetime import datetime from typing import List, Optional from jkit.collection import Collection, CollectionArticleInfo from prefect import flow, get_run_logger from prefect.states import Completed, State +from sspeedup.time_helper import get_today_in_datetime_obj from models.jianshu.lp_recommend_article_record import ( LPRecommendedArticleRecordDocument, @@ -19,7 +20,7 @@ async def process_item( - item: CollectionArticleInfo, /, *, current_date: date + item: CollectionArticleInfo, /, *, current_date: datetime ) -> Optional[LPRecommendedArticleRecordDocument]: logger = get_run_logger() @@ -63,7 +64,7 @@ async def flow_func() -> State: logger = get_run_logger() - current_date = datetime.now().date() + current_date = get_today_in_datetime_obj() data: List[LPRecommendedArticleRecordDocument] = [] itered_items_count = 0 diff --git a/models/jianshu/article_earning_ranking_record.py b/models/jianshu/article_earning_ranking_record.py index 9465898..52e84dc 100644 --- a/models/jianshu/article_earning_ranking_record.py +++ b/models/jianshu/article_earning_ranking_record.py @@ -1,4 +1,4 @@ -from datetime import date +from datetime import datetime from typing import ClassVar, List, Optional from jkit._constraints import ( @@ -30,7 +30,7 @@ class EarningField(Field, **FIELD_OBJECT_CONFIG): class ArticleEarningRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): - date: date + date: datetime ranking: PositiveInt article: ArticleField diff --git a/models/jianshu/assets_ranking_record.py b/models/jianshu/assets_ranking_record.py index a2ca2b6..be07716 100644 --- a/models/jianshu/assets_ranking_record.py +++ b/models/jianshu/assets_ranking_record.py @@ -1,4 +1,4 @@ -from datetime import date +from datetime import datetime from typing import ClassVar, List, Optional from jkit._constraints import ( @@ -25,7 +25,7 @@ class AmountField(Field, **FIELD_OBJECT_CONFIG): class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): - date: date + date: datetime ranking: PositiveInt amount: AmountField diff --git a/models/jianshu/daily_update_ranking_record.py b/models/jianshu/daily_update_ranking_record.py index 073b89f..edeafc1 100644 --- a/models/jianshu/daily_update_ranking_record.py +++ b/models/jianshu/daily_update_ranking_record.py @@ -1,4 +1,4 @@ -from datetime import date +from datetime import datetime from typing import ClassVar, List from jkit._constraints import ( @@ -15,7 +15,7 @@ class DailyUpdateRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): - date: date + date: datetime ranking: PositiveInt days: PositiveInt diff --git a/models/jianshu/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py index 09a84d9..630d1ec 100644 --- a/models/jianshu/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from typing import ClassVar, List from jkit._constraints import ( @@ -20,7 +20,7 @@ class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): - date: date + date: datetime id: PositiveInt slug: ArticleSlug title: NonEmptyStr diff --git a/old_models/lp_collections.py b/old_models/lp_collections.py index 10c3cb5..95f47ee 100644 --- a/old_models/lp_collections.py +++ b/old_models/lp_collections.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from typing import ClassVar, List from msgspec import field @@ -37,7 +37,7 @@ class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): class OldLPCollections(Document, **DOCUMENT_OBJECT_CONFIG): - fetch_date: date = field(name="fetch_date") + fetch_date: datetime = field(name="fetch_date") from_collection: str = field(name="from_collection") article: OldArticleField diff --git a/utils/document_model.py b/utils/document_model.py index ff90b34..340deff 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from typing import ( Any, AsyncGenerator, @@ -27,18 +27,7 @@ "rename": "camel", } -_BUILDIN_TYPES: Tuple[object, ...] = (ObjectId, datetime, date) - - -def convert_date_to_datetime(data: Dict[str, Any]) -> Dict[str, Any]: - for key, value in data.items(): - if isinstance(value, date): - data[key] = datetime.fromisoformat(value.isoformat()) - - if isinstance(value, dict): - data[key] = convert_date_to_datetime(value) - - return data +_BUILDIN_TYPES: Tuple[object, ...] = (ObjectId, datetime) class Field(Struct, **FIELD_OBJECT_CONFIG): @@ -68,11 +57,9 @@ def from_dict(cls, data: Dict[str, Any]) -> Self: return convert(data, type=cls) def to_dict(self) -> Dict[str, Any]: - return convert_date_to_datetime( - to_builtins( - self, - builtin_types=_BUILDIN_TYPES, - ) + return to_builtins( + self, + builtin_types=_BUILDIN_TYPES, ) @classmethod From 01d2f3cdf4584c7823198981cb46d564eca6cd69 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 14 Mar 2024 06:37:23 +0800 Subject: [PATCH 71/93] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/jianshu/user.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/models/jianshu/user.py b/models/jianshu/user.py index 1063c3e..dedd147 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -59,6 +59,7 @@ async def insert_or_update_one( avatar_url=avatar_url, ) ) + return db_data = await cls.find_one({"slug": slug}) if not db_data: @@ -68,27 +69,26 @@ async def insert_or_update_one( if updated_at < db_data.updated_at: return - update_data: Dict[str, Any] = { - "$set": { - # 即使没有要更新的数据,也要刷新更新时间 - "updatedAt": updated_at, - } + data_to_set: Dict[str, Any] = { + # 刷新数据更新时间 + "updatedAt": updated_at } + # 如果新数据中的 ID 与数据库不一致,报错 if (id is not None and db_data.id is not None) and id != db_data.id: raise ValueError(f"ID 不一致({id} 和 {db_data.id})") # 如果获取到了之前未知的 ID,添加之 if id is not None and db_data.id is None: - update_data["$set"]["id"] = id + data_to_set["id"] = id # 如果获取到了之前未知的昵称,添加之 if name is not None and db_data.name is None: - update_data["$set"]["name"] = name + data_to_set["name"] = name # 如果昵称有变动,更新之 if (name is not None and db_data.name is not None) and name != db_data.name: - update_data["$set"]["name"] = name + data_to_set["name"] = name new_history_names = db_data.history_names.copy() @@ -100,12 +100,12 @@ async def insert_or_update_one( # 如果有变动,将历史昵称列表更新提交至数据库 if new_history_names != db_data.history_names: - update_data["$set"]["historyNames"] = new_history_names + data_to_set["historyNames"] = new_history_names # 如果获取到了之前未知的头像链接,或头像链接有变动,添加 / 更新之 if avatar_url is not None and ( db_data.avatar_url is None or avatar_url != db_data.avatar_url ): - update_data["$set"]["avatarUrl"] = avatar_url + data_to_set["avatarUrl"] = avatar_url - await cls.get_collection().update_one({"slug": slug}, update_data) + await cls.get_collection().update_one({"slug": slug}, {"$set": data_to_set}) From 763dc67a5f95194a77369a56590e960b0d3b59e7 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 15 Mar 2024 05:58:34 +0800 Subject: [PATCH 72/93] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E7=94=A8=E5=80=BC=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jpep/ftn_trade.py | 14 +++++++++++++- models/jpep/credit_history.py | 31 +++++++++++++++++++++++++++++++ models/jpep/user.py | 17 ----------------- 3 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 models/jpep/credit_history.py diff --git a/jobs/jpep/ftn_trade.py b/jobs/jpep/ftn_trade.py index acae816..ace3842 100644 --- a/jobs/jpep/ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -5,6 +5,7 @@ from prefect import flow from prefect.states import Completed, State +from models.jpep.credit_history import CreditHistoryDocument from models.jpep.ftn_trade_order import ( AmountField, FTNTradeOrderDocument, @@ -45,9 +46,20 @@ async def process_item( name=item.publisher_info.name, # type: ignore hashed_name=item.publisher_info.hashed_name, # type: ignore avatar_url=item.publisher_info.avatar_url, # type: ignore - credit=item.publisher_info.credit, # type: ignore ) + latest_credit_value = await CreditHistoryDocument.get_latest_value( + item.publisher_info.id + ) + if not latest_credit_value or latest_credit_value != item.publisher_info.credit: + await CreditHistoryDocument.insert_one( + CreditHistoryDocument( + time=fetch_time, + user_id=item.publisher_info.id, + value=item.publisher_info.credit, # type: ignore + ) + ) + return FTNTradeOrderDocument( fetch_time=fetch_time, id=item.id, diff --git a/models/jpep/credit_history.py b/models/jpep/credit_history.py new file mode 100644 index 0000000..9190160 --- /dev/null +++ b/models/jpep/credit_history.py @@ -0,0 +1,31 @@ +from datetime import datetime +from typing import ClassVar, List, Optional + +from jkit._constraints import NonNegativeInt, PositiveInt +from pymongo import IndexModel + +from utils.db import JPEP_DB +from utils.document_model import ( + DOCUMENT_OBJECT_CONFIG, + Document, +) + + +class CreditHistoryDocument(Document, **DOCUMENT_OBJECT_CONFIG): + time: datetime + user_id: PositiveInt + value: NonNegativeInt + + class Meta: # type: ignore + collection = JPEP_DB.credit_history + indexes: ClassVar[List[IndexModel]] = [ + IndexModel(["time", "userId"], unique=True), + ] + + @classmethod + async def get_latest_value(cls, user_id: int) -> Optional[int]: + latest_record = await cls.find_one({"userId": user_id}, sort={"time": "DESC"}) + if not latest_record: + return None + + return latest_record.value diff --git a/models/jpep/user.py b/models/jpep/user.py index 541acbb..93ba80c 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -19,7 +19,6 @@ class UserDocument(Document): name: str hashed_name: str avatar_url: Optional[str] - credit_history: List[CreditHistoryFieldItem] class Meta: # type: ignore collection = JPEP_DB.users @@ -41,7 +40,6 @@ async def insert_or_update_one( name: str, hashed_name: str, avatar_url: Optional[str], - credit: int, ) -> None: if not updated_at: updated_at = datetime.now() @@ -54,12 +52,6 @@ async def insert_or_update_one( name=name, hashed_name=hashed_name, avatar_url=avatar_url, - credit_history=[ - CreditHistoryFieldItem( - time=updated_at, - value=credit, - ), - ], ) ) @@ -85,13 +77,4 @@ async def insert_or_update_one( if avatar_url is not None and avatar_url != db_data.avatar_url: update_data["$set"]["avatarUrl"] = avatar_url - # 如果信用值有变动,将变动信息添加至信用值历史 - if credit != db_data.credit_history[-1].value: - update_data["$push"] = { - "creditHistory": { - "time": updated_at, - "value": credit, - } - } - await cls.get_collection().update_one({"id": id}, update_data) From def9945b63af4070544d4430c17931c7730f103e Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 15 Mar 2024 05:59:59 +0800 Subject: [PATCH 73/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E6=94=B6=E7=9B=8A=E6=8E=92=E8=A1=8C=E6=A6=9C=E9=87=87?= =?UTF-8?q?=E9=9B=86=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/article_earning_ranking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/jianshu/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py index 6924185..485efd0 100644 --- a/jobs/jianshu/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -87,7 +87,7 @@ async def flow_func() -> State: target_date = get_today_in_datetime_obj() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] - async for item in ArticleEarningRanking(target_date): + async for item in ArticleEarningRanking(target_date.date()): processed_item = await process_item(item, target_date=target_date) data.append(processed_item) From 9cf7859fb39f968ea40bd44f2735380c6fbabbbc Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 15 Mar 2024 06:46:01 +0800 Subject: [PATCH 74/93] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/lottery.py | 6 +- jobs/jpep/ftn_trade.py | 10 +- .../jianshu/article_earning_ranking_record.py | 2 +- models/jianshu/assets_ranking_record.py | 2 +- models/jianshu/daily_update_ranking_record.py | 2 +- models/jianshu/lottery_win_record.py | 2 +- models/jianshu/lp_recommend_article_record.py | 2 +- models/jianshu/user.py | 2 +- models/jpep/credit_history.py | 2 +- models/jpep/ftn_trade_order.py | 2 +- models/jpep/user.py | 2 +- poetry.lock | 263 +++++++++--------- pyproject.toml | 2 +- requirements-dev.txt | 39 +-- requirements.txt | 35 +-- 15 files changed, 195 insertions(+), 178 deletions(-) diff --git a/jobs/jianshu/lottery.py b/jobs/jianshu/lottery.py index aa8c148..cc98dcb 100644 --- a/jobs/jianshu/lottery.py +++ b/jobs/jianshu/lottery.py @@ -1,6 +1,6 @@ from typing import List -from jkit.jianshu_lottery import JianshuLottery, JianshuLotteryWinRecord +from jkit.lottery import Lottery, LotteryWinRecord from prefect import flow, get_run_logger from prefect.states import Completed, State @@ -14,7 +14,7 @@ ) -async def process_item(item: JianshuLotteryWinRecord, /) -> LotteryWinRecordDocument: +async def process_item(item: LotteryWinRecord, /) -> LotteryWinRecordDocument: await JianshuUserDocument.insert_or_update_one( slug=item.user_info.slug, updated_at=item.time, @@ -48,7 +48,7 @@ async def flow_func() -> State: logger.warning("数据库中没有记录") data: List[LotteryWinRecordDocument] = [] - async for item in JianshuLottery().iter_win_records(): + async for item in Lottery().iter_win_records(): if item.id == stop_id: break diff --git a/jobs/jpep/ftn_trade.py b/jobs/jpep/ftn_trade.py index ace3842..e9050ef 100644 --- a/jobs/jpep/ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -43,9 +43,9 @@ async def process_item( await UserDocument.insert_or_update_one( updated_at=fetch_time, id=item.publisher_info.id, - name=item.publisher_info.name, # type: ignore - hashed_name=item.publisher_info.hashed_name, # type: ignore - avatar_url=item.publisher_info.avatar_url, # type: ignore + name=item.publisher_info.name, + hashed_name=item.publisher_info.hashed_name, + avatar_url=item.publisher_info.avatar_url, ) latest_credit_value = await CreditHistoryDocument.get_latest_value( @@ -56,7 +56,7 @@ async def process_item( CreditHistoryDocument( time=fetch_time, user_id=item.publisher_info.id, - value=item.publisher_info.credit, # type: ignore + value=item.publisher_info.credit, ) ) @@ -73,7 +73,7 @@ async def process_item( tradable=item.tradable_amount, minimum_trade=item.minimum_trade_amount, ), - publisher_id=item.publisher_info.id, # type: ignore + publisher_id=item.publisher_info.id, ).validate() diff --git a/models/jianshu/article_earning_ranking_record.py b/models/jianshu/article_earning_ranking_record.py index 52e84dc..d63875b 100644 --- a/models/jianshu/article_earning_ranking_record.py +++ b/models/jianshu/article_earning_ranking_record.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List, Optional -from jkit._constraints import ( +from jkit.msgspec_constraints import ( ArticleSlug, NonEmptyStr, PositiveFloat, diff --git a/models/jianshu/assets_ranking_record.py b/models/jianshu/assets_ranking_record.py index be07716..74a5e20 100644 --- a/models/jianshu/assets_ranking_record.py +++ b/models/jianshu/assets_ranking_record.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List, Optional -from jkit._constraints import ( +from jkit.msgspec_constraints import ( NonNegativeFloat, PositiveFloat, PositiveInt, diff --git a/models/jianshu/daily_update_ranking_record.py b/models/jianshu/daily_update_ranking_record.py index edeafc1..b485ce4 100644 --- a/models/jianshu/daily_update_ranking_record.py +++ b/models/jianshu/daily_update_ranking_record.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List -from jkit._constraints import ( +from jkit.msgspec_constraints import ( PositiveInt, UserSlug, ) diff --git a/models/jianshu/lottery_win_record.py b/models/jianshu/lottery_win_record.py index 0646992..ec75a90 100644 --- a/models/jianshu/lottery_win_record.py +++ b/models/jianshu/lottery_win_record.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List -from jkit._constraints import ( +from jkit.msgspec_constraints import ( NonEmptyStr, PositiveInt, UserSlug, diff --git a/models/jianshu/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py index 630d1ec..96421c1 100644 --- a/models/jianshu/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List -from jkit._constraints import ( +from jkit.msgspec_constraints import ( ArticleSlug, NonEmptyStr, NonNegativeFloat, diff --git a/models/jianshu/user.py b/models/jianshu/user.py index dedd147..b8bfd8e 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -2,7 +2,7 @@ from enum import Enum from typing import Any, ClassVar, Dict, List, Optional -from jkit._constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl +from jkit.msgspec_constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl from pymongo import IndexModel from utils.db import JIANSHU_DB diff --git a/models/jpep/credit_history.py b/models/jpep/credit_history.py index 9190160..be64d18 100644 --- a/models/jpep/credit_history.py +++ b/models/jpep/credit_history.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List, Optional -from jkit._constraints import NonNegativeInt, PositiveInt +from jkit.msgspec_constraints import NonNegativeInt, PositiveInt from pymongo import IndexModel from utils.db import JPEP_DB diff --git a/models/jpep/ftn_trade_order.py b/models/jpep/ftn_trade_order.py index a713a61..9beb471 100644 --- a/models/jpep/ftn_trade_order.py +++ b/models/jpep/ftn_trade_order.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import ClassVar, List, Literal -from jkit._constraints import ( +from jkit.msgspec_constraints import ( NonNegativeInt, PositiveFloat, PositiveInt, diff --git a/models/jpep/user.py b/models/jpep/user.py index 93ba80c..55cfa27 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Any, ClassVar, Dict, List, Optional -from jkit._constraints import NonNegativeInt, PositiveInt +from jkit.msgspec_constraints import NonNegativeInt, PositiveInt from pymongo import IndexModel from utils.db import JPEP_DB diff --git a/poetry.lock b/poetry.lock index a1e0712..0b7ca34 100644 --- a/poetry.lock +++ b/poetry.lock @@ -76,13 +76,13 @@ trio = ["trio (<0.22)"] [[package]] name = "apprise" -version = "1.7.2" +version = "1.7.4" description = "Push Notifications that work with just about every platform!" optional = false python-versions = ">=3.6" files = [ - {file = "apprise-1.7.2-py3-none-any.whl", hash = "sha256:f3192e62924e54334d4ca0c5723d7de9293500e1a0fbf3a890433ea5b6b56df8"}, - {file = "apprise-1.7.2.tar.gz", hash = "sha256:09e159b29008e6c8e93d7ffc3c15d419c0bbae41620405f8f2d3432b72a2e9bf"}, + {file = "apprise-1.7.4-py3-none-any.whl", hash = "sha256:71edb0f29532c0c35b6c52d882880f1649f8bd1bdc97c7480fda3e1358603325"}, + {file = "apprise-1.7.4.tar.gz", hash = "sha256:ef5e830051140d4228a759c5bc2d6857bcc7f8664df3e44f30f64617ce0c7a73"}, ] [package.dependencies] @@ -667,13 +667,13 @@ tqdm = ["tqdm"] [[package]] name = "google-auth" -version = "2.28.1" +version = "2.28.2" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.28.1.tar.gz", hash = "sha256:34fc3046c257cedcf1622fc4b31fc2be7923d9b4d44973d481125ecc50d83885"}, - {file = "google_auth-2.28.1-py2.py3-none-any.whl", hash = "sha256:25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72"}, + {file = "google-auth-2.28.2.tar.gz", hash = "sha256:80b8b4969aa9ed5938c7828308f20f035bc79f9d8fb8120bf9dc8db20b41ba30"}, + {file = "google_auth-2.28.2-py2.py3-none-any.whl", hash = "sha256:9fd67bbcd40f16d9d42f950228e9cf02a2ded4ae49198b27432d0cded5a74c38"}, ] [package.dependencies] @@ -777,13 +777,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.41.1" +version = "0.42.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.41.1-py3-none-any.whl", hash = "sha256:9b71b82d0177a278467ce362827296957f0ca59ff5437ee41a0d6247aee257fa"}, - {file = "griffe-0.41.1.tar.gz", hash = "sha256:09d12f955004102d7deeec2e1d87d07434fb2d42905d21b4e03c7cbf9cf78754"}, + {file = "griffe-0.42.0-py3-none-any.whl", hash = "sha256:384df6b802a60f70e65fdb7e83f5b27e2da869a12eac85b25b55250012dbc263"}, + {file = "griffe-0.42.0.tar.gz", hash = "sha256:fb83ee602701ffdf99c9a6bf5f0a5a3bd877364b3bffb2c451dc8fbd9645b0cf"}, ] [package.dependencies] @@ -897,32 +897,32 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.0.2" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.0.2-py3-none-any.whl", hash = "sha256:f4bc4c0c070c490abf4ce96d715f68e95923320370efb66143df00199bb6c100"}, + {file = "importlib_metadata-7.0.2.tar.gz", hash = "sha256:198f568f3230878cb1b44fbd7975f87906c22336dba2e4a7f05278c281fbd792"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.1.2" +version = "6.3.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.2-py3-none-any.whl", hash = "sha256:9a0a862501dc38b68adebc82970140c9e4209fc99601782925178f8386339938"}, - {file = "importlib_resources-6.1.2.tar.gz", hash = "sha256:308abf8474e2dba5f867d279237cd4076482c3de7104a40b41426370e891549b"}, + {file = "importlib_resources-6.3.0-py3-none-any.whl", hash = "sha256:783407aa1cd05550e3aa123e8f7cfaebee35ffa9cb0242919e2d1e4172222705"}, + {file = "importlib_resources-6.3.0.tar.gz", hash = "sha256:166072a97e86917a9025876f34286f549b9caf1d10b35a1b372bffa1600c6569"}, ] [package.dependencies] @@ -930,7 +930,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +testing = ["jaraco.collections", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "itsdangerous" @@ -962,13 +962,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a14" +version = "3.0.0a15" description = "简书非官方 SDK - 创造可能性" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "jkit-3.0.0a14-py3-none-any.whl", hash = "sha256:6690c4f0b8c952a7d60f0a4f157bd06b8a9e5f8d20c8c360eb6cc89ff7fcbbea"}, - {file = "jkit-3.0.0a14.tar.gz", hash = "sha256:a49e00cf2112ebd5327a43cd55fed924ee818f20b6f51c8ec609f1edeec687a5"}, + {file = "jkit-3.0.0a15-py3-none-any.whl", hash = "sha256:4d9fd0705241088373e6bb9300dfa11fb2c2d9f0601cd24576a598c39250700a"}, + {file = "jkit-3.0.0a15.tar.gz", hash = "sha256:f71f6fc225d936cfb0dfb6a068b579fdbf6033ba1937ebedd8624d20bd7ebdab"}, ] [package.dependencies] @@ -1180,13 +1180,13 @@ testing = ["pytest"] [[package]] name = "markdown" -version = "3.5.2" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, - {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.dependencies] @@ -1467,13 +1467,13 @@ files = [ [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -1633,13 +1633,13 @@ files = [ [[package]] name = "prefect" -version = "2.16.1" +version = "2.16.3" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.16.1-py3-none-any.whl", hash = "sha256:e43dd326a584aaa771b68f21edea70ca39b8153825bf14d57a174d13d00e3a84"}, - {file = "prefect-2.16.1.tar.gz", hash = "sha256:9611bb37515bf36e27e49dc5ce51a35a88d8ce7354b0803af75e299be95971bb"}, + {file = "prefect-2.16.3-py3-none-any.whl", hash = "sha256:0d9bf51b2e03276d7dd91f7e7dfbcf204a8bc09b9e086f72ada6d9fea0743182"}, + {file = "prefect-2.16.3.tar.gz", hash = "sha256:26fc38400f789b3a73a85f447deec01d5fc5821d7004c834f81022b859148d4e"}, ] [package.dependencies] @@ -1682,6 +1682,7 @@ python-slugify = ">=5.0,<9.0" pytz = ">=2021.1,<2025" pyyaml = ">=5.4.1,<7.0.0" readchar = ">=4.0.0,<5.0.0" +rfc3339-validator = ">=0.1.4,<0.2.0" rich = ">=11.0,<14.0" "ruamel.yaml" = ">=0.17.0" sniffio = ">=1.3.0,<2.0.0" @@ -1734,13 +1735,13 @@ files = [ [[package]] name = "pydantic" -version = "2.6.3" +version = "2.6.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"}, - {file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"}, + {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, + {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, ] [package.dependencies] @@ -1963,13 +1964,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.352" +version = "1.1.354" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.352-py3-none-any.whl", hash = "sha256:0040cf173c6a60704e553bfd129dfe54de59cc76d0b2b80f77cfab4f50701d64"}, - {file = "pyright-1.1.352.tar.gz", hash = "sha256:a621c0dfbcf1291b3610641a07380fefaa1d0e182890a1b2a7f13b446e8109a9"}, + {file = "pyright-1.1.354-py3-none-any.whl", hash = "sha256:f28d61ae8ae035fc52ded1070e8d9e786051a26a4127bbd7a4ba0399b81b37b5"}, + {file = "pyright-1.1.354.tar.gz", hash = "sha256:b1070dc774ff2e79eb0523fe87f4ba9a90550de7e4b030a2bc9e031864029a1f"}, ] [package.dependencies] @@ -2283,13 +2284,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "1.4.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-1.4.0.tar.gz", hash = "sha256:acee623221e4a39abcbb919312c8ff04bd44e7e417087fb4bd5e2a2f53d5e79a"}, + {file = "requests_oauthlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:7a3130d94a17520169e38db6c8d75f2c974643788465ecc2e4b36d288bf13033"}, ] [package.dependencies] @@ -2299,6 +2300,20 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + [[package]] name = "rich" version = "13.7.1" @@ -2519,44 +2534,44 @@ files = [ [[package]] name = "ruff" -version = "0.3.0" +version = "0.3.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"}, - {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"}, - {file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"}, - {file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"}, - {file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"}, - {file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, + {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, + {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, + {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, + {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, ] [[package]] name = "setuptools" -version = "69.1.1" +version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, - {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2583,60 +2598,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.27" +version = "2.0.28" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-win32.whl", hash = "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-win32.whl", hash = "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-win32.whl", hash = "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-win32.whl", hash = "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-win_amd64.whl", hash = "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-win32.whl", hash = "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-win_amd64.whl", hash = "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-win32.whl", hash = "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620"}, - {file = "SQLAlchemy-2.0.27-py3-none-any.whl", hash = "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac"}, - {file = "SQLAlchemy-2.0.27.tar.gz", hash = "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, + {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, + {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, ] [package.dependencies] @@ -2870,13 +2885,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.27.1" +version = "0.28.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"}, - {file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"}, + {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"}, + {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"}, ] [package.dependencies] @@ -2986,13 +3001,13 @@ files = [ [[package]] name = "wheel" -version = "0.42.0" +version = "0.43.0" description = "A built-package format for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, - {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, ] [package.extras] @@ -3000,20 +3015,20 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f106c2768e5f0da7718862c618fbd12d954628138e16b4edb2181f8e50af93f2" +content-hash = "ed1d69514e8ce89ebc241f85ca6bab85898df4b20cdbdc45c0e0bb7183b2713c" diff --git a/pyproject.toml b/pyproject.toml index b462e88..c87dab9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a14" +jkit = "^3.0.0a15" sspeedup = "^0.25.1" [tool.poetry.group.dev.dependencies] diff --git a/requirements-dev.txt b/requirements-dev.txt index 7a605dc..66f4c9c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.4 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -25,10 +25,10 @@ docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.2 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.41.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.42.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -36,11 +36,11 @@ httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==7.0.2 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.3.0 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a14 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a15 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -49,7 +49,7 @@ kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" -markdown==3.5.2 ; python_version >= "3.8" and python_version < "4.0" +markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" @@ -57,20 +57,20 @@ msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.1 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.3 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.352 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.354 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -81,19 +81,20 @@ pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" -requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.4.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.3.0 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.3.2 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" @@ -103,8 +104,8 @@ tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platfo tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.28.0 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" -wheel==0.42.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" +wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" diff --git a/requirements.txt b/requirements.txt index 40b1684..0293975 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.2 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.4 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -25,10 +25,10 @@ docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.28.2 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.41.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.42.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -36,11 +36,11 @@ httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.1.2 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==7.0.2 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.3.0 ; python_version >= "3.8" and python_version < "3.9" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a14 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a15 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" @@ -49,24 +49,24 @@ kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" -markdown==3.5.2 ; python_version >= "3.8" and python_version < "4.0" +markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.1 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.16.3 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.3 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" @@ -79,18 +79,19 @@ pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" -requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.4.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.1.1 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.27 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.27 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" @@ -100,8 +101,8 @@ tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platfo tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.27.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.28.0 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" -wheel==0.42.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10" +wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" From 1f659894fb7813dec4d5f2a6d4bbabfe00269182 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 17 Mar 2024 06:46:17 +0800 Subject: [PATCH 75/93] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20LP=20?= =?UTF-8?q?=E7=90=86=E4=BA=8B=E4=BC=9A=E6=8E=A8=E8=8D=90=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=A0=A1=E9=AA=8C=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_05_lp_collections.py => migrate_04_lp_collections.py | 2 +- migrate_04_lottery_data.py => migrate_05_lottery_data.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename migrate_05_lp_collections.py => migrate_04_lp_collections.py (98%) rename migrate_04_lottery_data.py => migrate_05_lottery_data.py (100%) diff --git a/migrate_05_lp_collections.py b/migrate_04_lp_collections.py similarity index 98% rename from migrate_05_lp_collections.py rename to migrate_04_lp_collections.py index 32b6525..a4e658b 100644 --- a/migrate_05_lp_collections.py +++ b/migrate_04_lp_collections.py @@ -101,7 +101,7 @@ async def main() -> None: ) exit() new_start_time, new_end_time = await get_collection_data_time_range( - LPRecommendedArticleRecordDocument, "fetch_date" + LPRecommendedArticleRecordDocument, "date" ) if old_start_time != new_start_time or old_end_time != new_end_time: logger.critical( diff --git a/migrate_04_lottery_data.py b/migrate_05_lottery_data.py similarity index 100% rename from migrate_04_lottery_data.py rename to migrate_05_lottery_data.py From 9bdca8dcbcfb8a5f9b92015adc6196531c0ee77f Mon Sep 17 00:00:00 2001 From: yezi Date: Wed, 20 Mar 2024 05:58:58 +0800 Subject: [PATCH 76/93] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=AE=80?= =?UTF-8?q?=E4=B9=A6=E7=A7=AF=E5=88=86=E5=85=91=E6=8D=A2=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_06_jpep.py | 95 +++++++++++++++++++++++++++++++++++ models/jpep/user.py | 22 +++++++- old_models/jpep_ftn_macket.py | 4 +- 3 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 migrate_06_jpep.py diff --git a/migrate_06_jpep.py b/migrate_06_jpep.py new file mode 100644 index 0000000..9a2c147 --- /dev/null +++ b/migrate_06_jpep.py @@ -0,0 +1,95 @@ +import asyncio +from typing import List + +from sspeedup.logging.run_logger import RunLogger + +from models.jpep.credit_history import CreditHistoryDocument +from models.jpep.ftn_trade_order import AmountField, FTNTradeOrderDocument +from models.jpep.user import UserDocument +from old_models.jpep_ftn_macket import OldJPEPFTNMacket +from utils.migrate_helper import ( + get_collection_data_count, +) + +logger = RunLogger() + + +async def ensure_all_old_collection_indexes() -> None: + await OldJPEPFTNMacket.ensure_indexes() + + +async def ensure_all_new_collection_indexes() -> None: + await FTNTradeOrderDocument.ensure_indexes() + await UserDocument.ensure_indexes() + await CreditHistoryDocument.ensure_indexes() + + +async def insert_or_update_user(item: OldJPEPFTNMacket) -> None: + await UserDocument.insert_one_if_not_exist( + updated_at=item.fetch_time, + id=item.user.id, + name=item.user.name, + hashed_name=item.user.name_md5, + ) + + +async def convert_item(item: OldJPEPFTNMacket) -> FTNTradeOrderDocument: + return FTNTradeOrderDocument( + fetch_time=item.fetch_time, + id=item.order_id, + published_at=item.publish_time, + type=item.trade_type, + price=item.price, + traded_count=item.transactions_count, + amount=AmountField( + total=item.amount.total, + traded=item.amount.traded, + tradable=item.amount.tradable, + minimum_trade=item.minimum_trade_count, + ), + publisher_id=item.user.id, + ) + + +async def main() -> None: + await ensure_all_old_collection_indexes() + logger.info("已为旧版数据构建索引") + await ensure_all_new_collection_indexes() + logger.info("已为新版数据构建索引") + + old_data_count = await OldJPEPFTNMacket.get_collection().estimated_document_count() + logger.info(f"旧集合数据量:{old_data_count}") + + data_to_save: List[FTNTradeOrderDocument] = [] + async for item in OldJPEPFTNMacket.find_many(sort={"fetch_time": "ASC"}): + await insert_or_update_user(item) + data_to_save.append(await convert_item(item)) + + if len(data_to_save) == 5000: + await FTNTradeOrderDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的时间为 {data_to_save[-1].fetch_time}" + ) + data_to_save.clear() + + if len(data_to_save): + await FTNTradeOrderDocument.insert_many(data_to_save) + logger.debug( + f"已转换 {len(data_to_save)} 条数据," + f"最新数据的时间为 {data_to_save[-1].fetch_time}" + ) + data_to_save.clear() + + logger.info("数据转换完成,开始校验") + new_data_count = await get_collection_data_count(FTNTradeOrderDocument) + if old_data_count != new_data_count: + logger.critical( + f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" + ) + exit() + + logger.info("校验成功,迁移流程结束") + + +asyncio.run(main()) diff --git a/models/jpep/user.py b/models/jpep/user.py index 55cfa27..b312134 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -17,7 +17,7 @@ class UserDocument(Document): updated_at: datetime id: PositiveInt name: str - hashed_name: str + hashed_name: Optional[str] avatar_url: Optional[str] class Meta: # type: ignore @@ -78,3 +78,23 @@ async def insert_or_update_one( update_data["$set"]["avatarUrl"] = avatar_url await cls.get_collection().update_one({"id": id}, update_data) + + @classmethod + async def insert_one_if_not_exist( + cls, + *, + updated_at: datetime, + id: int, # noqa: A002 + name: str, + hashed_name: Optional[str], + ) -> None: + if not await cls.is_record_exist(id): + await cls.insert_one( + UserDocument( + updated_at=updated_at, + id=id, + name=name, + hashed_name=hashed_name, + avatar_url=None, + ) + ) diff --git a/old_models/jpep_ftn_macket.py b/old_models/jpep_ftn_macket.py index f66f626..ad8a88b 100644 --- a/old_models/jpep_ftn_macket.py +++ b/old_models/jpep_ftn_macket.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import ClassVar, List, Literal +from typing import ClassVar, List, Literal, Optional from msgspec import field from pymongo import IndexModel @@ -23,7 +23,7 @@ class OldAmountField(Field, **FIELD_OBJECT_CONFIG): class OldUserField(Field, **FIELD_OBJECT_CONFIG): id: int name: str - name_md5: str = field(name="name_md5") + name_md5: Optional[str] = field(name="name_md5") class OldJPEPFTNMacket(Document, **DOCUMENT_OBJECT_CONFIG): From fdd76c073e985ac44248a9abb7b84b394f1cae76 Mon Sep 17 00:00:00 2001 From: yezi Date: Fri, 22 Mar 2024 06:36:08 +0800 Subject: [PATCH 77/93] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=B1=9E=E6=80=A7=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/document_model.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/utils/document_model.py b/utils/document_model.py index 340deff..4959c20 100644 --- a/utils/document_model.py +++ b/utils/document_model.py @@ -14,6 +14,7 @@ from bson import ObjectId from motor.core import AgnosticCollection from msgspec import Struct, convert, to_builtins +from msgspec.inspect import type_info from pymongo import IndexModel from typing_extensions import Self @@ -39,6 +40,17 @@ class Meta(Struct): collection: ClassVar[AgnosticCollection] indexes: ClassVar[List[IndexModel]] + @classmethod + def _get_field_name(cls, field: object) -> str: + attr_name = field.__qualname__.split(".")[-1] + for field_obj in type_info(cls).fields: # type: ignore + if field_obj.name != attr_name: + continue + + return field_obj.encode_name + + raise ValueError("未找到属性对应的字段名称") + @classmethod def get_collection(cls) -> AgnosticCollection: return cls.Meta.collection From ac1929f73aa2fa1f53e479432b76306a212dd07c Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 31 Mar 2024 08:39:28 +0800 Subject: [PATCH 78/93] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20sshared=20?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/article_earning_ranking.py | 4 +- jobs/jianshu/assets_ranking.py | 4 +- jobs/jianshu/daily_update_ranking.py | 4 +- jobs/jianshu/lp_recommend.py | 4 +- .../jianshu/article_earning_ranking_record.py | 20 +-- models/jianshu/assets_ranking_record.py | 18 +-- models/jianshu/daily_update_ranking_record.py | 13 +- models/jianshu/lottery_win_record.py | 13 +- models/jianshu/lp_recommend_article_record.py | 13 +- models/jianshu/user.py | 15 +- models/jpep/credit_history.py | 14 +- models/jpep/ftn_trade_order.py | 18 +-- models/jpep/user.py | 15 +- old_models/article_fp_rank.py | 22 +-- old_models/assets_rank.py | 20 +-- old_models/daily_update_rank.py | 17 +-- old_models/jpep_ftn_macket.py | 20 +-- old_models/lottery_data.py | 17 +-- old_models/lp_collections.py | 19 +-- poetry.lock | 22 ++- pyproject.toml | 2 + requirements-dev.txt | 1 + requirements.txt | 1 + utils/document_model.py | 137 ------------------ utils/migrate_helper.py | 2 +- 25 files changed, 108 insertions(+), 327 deletions(-) delete mode 100644 utils/document_model.py diff --git a/jobs/jianshu/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py index 485efd0..fdd1e8f 100644 --- a/jobs/jianshu/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -7,7 +7,7 @@ from jkit.user import UserInfo from prefect import flow, get_run_logger from prefect.states import Completed, State -from sspeedup.time_helper import get_today_in_datetime_obj +from sshared.time import get_today_as_datetime from models.jianshu.article_earning_ranking_record import ( ArticleEarningRankingRecordDocument, @@ -84,7 +84,7 @@ async def flow_func() -> State: await ArticleEarningRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - target_date = get_today_in_datetime_obj() - timedelta(days=1) + target_date = get_today_as_datetime() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] async for item in ArticleEarningRanking(target_date.date()): diff --git a/jobs/jianshu/assets_ranking.py b/jobs/jianshu/assets_ranking.py index 17f86fa..623a6fa 100644 --- a/jobs/jianshu/assets_ranking.py +++ b/jobs/jianshu/assets_ranking.py @@ -7,7 +7,7 @@ from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State -from sspeedup.time_helper import get_today_in_datetime_obj +from sshared.time import get_today_as_datetime from models.jianshu.assets_ranking_record import ( AmountField, @@ -84,7 +84,7 @@ async def flow_func() -> State: await AssetsRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - target_date = get_today_in_datetime_obj() + target_date = get_today_as_datetime() data: List[AssetsRankingRecordDocument] = [] async for item in AssetsRanking(): diff --git a/jobs/jianshu/daily_update_ranking.py b/jobs/jianshu/daily_update_ranking.py index 92ba82b..38b27c1 100644 --- a/jobs/jianshu/daily_update_ranking.py +++ b/jobs/jianshu/daily_update_ranking.py @@ -7,7 +7,7 @@ ) from prefect import flow from prefect.states import Completed, State -from sspeedup.time_helper import get_today_in_datetime_obj +from sshared.time import get_today_as_datetime from models.jianshu.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, @@ -45,7 +45,7 @@ async def flow_func() -> State: await DailyUpdateRankingRecordDocument.ensure_indexes() await JianshuUserDocument.ensure_indexes() - current_date = get_today_in_datetime_obj() + current_date = get_today_as_datetime() data: List[DailyUpdateRankingRecordDocument] = [] async for item in DailyUpdateRanking(): diff --git a/jobs/jianshu/lp_recommend.py b/jobs/jianshu/lp_recommend.py index d9dc26b..3997b25 100644 --- a/jobs/jianshu/lp_recommend.py +++ b/jobs/jianshu/lp_recommend.py @@ -4,7 +4,7 @@ from jkit.collection import Collection, CollectionArticleInfo from prefect import flow, get_run_logger from prefect.states import Completed, State -from sspeedup.time_helper import get_today_in_datetime_obj +from sshared.time import get_today_as_datetime from models.jianshu.lp_recommend_article_record import ( LPRecommendedArticleRecordDocument, @@ -64,7 +64,7 @@ async def flow_func() -> State: logger = get_run_logger() - current_date = get_today_in_datetime_obj() + current_date = get_today_as_datetime() data: List[LPRecommendedArticleRecordDocument] = [] itered_items_count = 0 diff --git a/models/jianshu/article_earning_ranking_record.py b/models/jianshu/article_earning_ranking_record.py index d63875b..90f5102 100644 --- a/models/jianshu/article_earning_ranking_record.py +++ b/models/jianshu/article_earning_ranking_record.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import ClassVar, List, Optional +from typing import Optional from jkit.msgspec_constraints import ( ArticleSlug, @@ -8,28 +8,22 @@ PositiveInt, UserSlug, ) -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from utils.db import JIANSHU_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class ArticleField(Field, **FIELD_OBJECT_CONFIG): +class ArticleField(Field, **MODEL_META): slug: Optional[ArticleSlug] title: Optional[NonEmptyStr] -class EarningField(Field, **FIELD_OBJECT_CONFIG): +class EarningField(Field, **MODEL_META): to_author: PositiveFloat to_voter: PositiveFloat -class ArticleEarningRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class ArticleEarningRankingRecordDocument(Document, **MODEL_META): date: datetime ranking: PositiveInt @@ -39,6 +33,4 @@ class ArticleEarningRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JIANSHU_DB.article_earning_ranking_records - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "ranking"], unique=True), - ] + indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/models/jianshu/assets_ranking_record.py b/models/jianshu/assets_ranking_record.py index 74a5e20..2b8f9b1 100644 --- a/models/jianshu/assets_ranking_record.py +++ b/models/jianshu/assets_ranking_record.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import ClassVar, List, Optional +from typing import Optional from jkit.msgspec_constraints import ( NonNegativeFloat, @@ -7,24 +7,18 @@ PositiveInt, UserSlug, ) -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from utils.db import JIANSHU_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class AmountField(Field, **FIELD_OBJECT_CONFIG): +class AmountField(Field, **MODEL_META): fp: Optional[NonNegativeFloat] ftn: Optional[NonNegativeFloat] assets: Optional[PositiveFloat] -class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class AssetsRankingRecordDocument(Document, **MODEL_META): date: datetime ranking: PositiveInt @@ -33,6 +27,4 @@ class AssetsRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JIANSHU_DB.assets_ranking_records - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "ranking"], unique=True), - ] + indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/models/jianshu/daily_update_ranking_record.py b/models/jianshu/daily_update_ranking_record.py index b485ce4..85e36f2 100644 --- a/models/jianshu/daily_update_ranking_record.py +++ b/models/jianshu/daily_update_ranking_record.py @@ -1,20 +1,15 @@ from datetime import datetime -from typing import ClassVar, List from jkit.msgspec_constraints import ( PositiveInt, UserSlug, ) -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Index from utils.db import JIANSHU_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - Document, -) -class DailyUpdateRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class DailyUpdateRankingRecordDocument(Document, **MODEL_META): date: datetime ranking: PositiveInt days: PositiveInt @@ -23,6 +18,4 @@ class DailyUpdateRankingRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JIANSHU_DB.daily_update_ranking_records - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "userSlug"], unique=True), - ] + indexes = (Index(keys=("date", "userSlug"), unique=True),) diff --git a/models/jianshu/lottery_win_record.py b/models/jianshu/lottery_win_record.py index ec75a90..cdfeba5 100644 --- a/models/jianshu/lottery_win_record.py +++ b/models/jianshu/lottery_win_record.py @@ -1,21 +1,16 @@ from datetime import datetime -from typing import ClassVar, List from jkit.msgspec_constraints import ( NonEmptyStr, PositiveInt, UserSlug, ) -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Index from utils.db import JIANSHU_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - Document, -) -class LotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class LotteryWinRecordDocument(Document, **MODEL_META): id: PositiveInt time: datetime award_name: NonEmptyStr @@ -24,9 +19,7 @@ class LotteryWinRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JIANSHU_DB.lottery_win_records - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["id"], unique=True), - ] + indexes = (Index(keys=("id",), unique=True),) @classmethod async def get_latest_record_id(cls) -> int: diff --git a/models/jianshu/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py index 96421c1..00fa89a 100644 --- a/models/jianshu/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -1,5 +1,4 @@ from datetime import datetime -from typing import ClassVar, List from jkit.msgspec_constraints import ( ArticleSlug, @@ -10,16 +9,12 @@ UserSlug, ) from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Index from utils.db import JIANSHU_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - Document, -) -class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class LPRecommendedArticleRecordDocument(Document, **MODEL_META): date: datetime id: PositiveInt slug: ArticleSlug @@ -40,9 +35,7 @@ class LPRecommendedArticleRecordDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JIANSHU_DB.lp_recommended_article_records - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "slug"], unique=True), - ] + indexes = (Index(keys=("date", "slug"), unique=True),) @classmethod async def is_record_exist(cls, slug: str) -> bool: diff --git a/models/jianshu/user.py b/models/jianshu/user.py index b8bfd8e..2fed954 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -1,12 +1,11 @@ from datetime import datetime from enum import Enum -from typing import Any, ClassVar, Dict, List, Optional +from typing import Any, Dict, List, Optional from jkit.msgspec_constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Index from utils.db import JIANSHU_DB -from utils.document_model import Document class JianshuUserStatus(Enum): @@ -14,7 +13,7 @@ class JianshuUserStatus(Enum): INACCESSABLE = "INACCESSIBLE" -class JianshuUserDocument(Document): +class JianshuUserDocument(Document, **MODEL_META): slug: UserSlug status: JianshuUserStatus updated_at: datetime @@ -25,10 +24,10 @@ class JianshuUserDocument(Document): class Meta: # type: ignore collection = JIANSHU_DB.users - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["slug"], unique=True), - IndexModel(["updatedAt"]), - ] + indexes = ( + Index(keys=("slug",), unique=True), + Index(keys=("updatedAt",)), + ) @classmethod async def is_record_exist(cls, slug: str) -> bool: diff --git a/models/jpep/credit_history.py b/models/jpep/credit_history.py index be64d18..80076af 100644 --- a/models/jpep/credit_history.py +++ b/models/jpep/credit_history.py @@ -1,26 +1,20 @@ from datetime import datetime -from typing import ClassVar, List, Optional +from typing import Optional from jkit.msgspec_constraints import NonNegativeInt, PositiveInt -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Index from utils.db import JPEP_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - Document, -) -class CreditHistoryDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class CreditHistoryDocument(Document, **MODEL_META): time: datetime user_id: PositiveInt value: NonNegativeInt class Meta: # type: ignore collection = JPEP_DB.credit_history - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["time", "userId"], unique=True), - ] + indexes = (Index(keys=("time", "userId"), unique=True),) @classmethod async def get_latest_value(cls, user_id: int) -> Optional[int]: diff --git a/models/jpep/ftn_trade_order.py b/models/jpep/ftn_trade_order.py index 9beb471..06be6b7 100644 --- a/models/jpep/ftn_trade_order.py +++ b/models/jpep/ftn_trade_order.py @@ -1,30 +1,24 @@ from datetime import datetime -from typing import ClassVar, List, Literal +from typing import Literal from jkit.msgspec_constraints import ( NonNegativeInt, PositiveFloat, PositiveInt, ) -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from utils.db import JPEP_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class AmountField(Field, **FIELD_OBJECT_CONFIG): +class AmountField(Field, **MODEL_META): total: PositiveInt traded: NonNegativeInt tradable: NonNegativeInt minimum_trade: PositiveInt -class FTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): +class FTNTradeOrderDocument(Document, **MODEL_META): fetch_time: datetime id: PositiveInt published_at: datetime @@ -37,6 +31,4 @@ class FTNTradeOrderDocument(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = JPEP_DB.ftn_trade_orders - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["fetchTime", "id"], unique=True), - ] + indexes = (Index(keys=("fetchTime", "id"), unique=True),) diff --git a/models/jpep/user.py b/models/jpep/user.py index b312134..3f750a2 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -1,14 +1,13 @@ from datetime import datetime -from typing import Any, ClassVar, Dict, List, Optional +from typing import Any, Dict, Optional from jkit.msgspec_constraints import NonNegativeInt, PositiveInt -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from utils.db import JPEP_DB -from utils.document_model import FIELD_OBJECT_CONFIG, Document, Field -class CreditHistoryFieldItem(Field, **FIELD_OBJECT_CONFIG): +class CreditHistoryFieldItem(Field, **MODEL_META): time: datetime value: NonNegativeInt @@ -22,10 +21,10 @@ class UserDocument(Document): class Meta: # type: ignore collection = JPEP_DB.users - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["id"], unique=True), - IndexModel(["updatedAt"]), - ] + indexes = ( + Index(keys=("id",), unique=True), + Index(keys=("updatedAt",)), + ) @classmethod async def is_record_exist(cls, id: int) -> bool: # noqa: A002 diff --git a/old_models/article_fp_rank.py b/old_models/article_fp_rank.py index 0d08f70..f6dc15a 100644 --- a/old_models/article_fp_rank.py +++ b/old_models/article_fp_rank.py @@ -1,36 +1,30 @@ from datetime import datetime -from typing import ClassVar, List, Optional +from typing import Optional from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldArticleField(Field, **FIELD_OBJECT_CONFIG): +class OldArticleField(Field, **MODEL_META): title: Optional[str] url: Optional[str] -class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): +class OldAuthorField(Field, **MODEL_META): name: Optional[str] = None id: Optional[int] = None url: Optional[str] = None -class OldRewardField(Field, **FIELD_OBJECT_CONFIG): +class OldRewardField(Field, **MODEL_META): to_author: float = field(name="to_author") to_voter: float = field(name="to_voter") total: float -class OldArticleFPRank(Document, **DOCUMENT_OBJECT_CONFIG): +class OldArticleFPRank(Document, **MODEL_META): date: datetime ranking: int @@ -40,6 +34,4 @@ class OldArticleFPRank(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.article_FP_rank - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "ranking"], unique=True), - ] + indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/old_models/assets_rank.py b/old_models/assets_rank.py index 1f295fc..6c76580 100644 --- a/old_models/assets_rank.py +++ b/old_models/assets_rank.py @@ -1,31 +1,25 @@ from datetime import datetime -from typing import ClassVar, List, Optional +from typing import Optional from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldUserField(Field, **FIELD_OBJECT_CONFIG): +class OldUserField(Field, **MODEL_META): id: Optional[int] url: Optional[str] name: Optional[str] -class OldAssetsField(Field, **FIELD_OBJECT_CONFIG): +class OldAssetsField(Field, **MODEL_META): fp: Optional[float] = field(name="FP") ftn: Optional[float] = field(name="FTN") total: Optional[float] -class OldAssetsRank(Document, **DOCUMENT_OBJECT_CONFIG): +class OldAssetsRank(Document, **MODEL_META): date: datetime ranking: int @@ -34,6 +28,4 @@ class OldAssetsRank(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.assets_rank - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "ranking"], unique=True), - ] + indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/old_models/daily_update_rank.py b/old_models/daily_update_rank.py index 6983427..287eaeb 100644 --- a/old_models/daily_update_rank.py +++ b/old_models/daily_update_rank.py @@ -1,23 +1,16 @@ from datetime import datetime -from typing import ClassVar, List -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldUserField(Field, **FIELD_OBJECT_CONFIG): +class OldUserField(Field, **MODEL_META): url: str name: str -class OldDailyUpdateRank(Document, **DOCUMENT_OBJECT_CONFIG): +class OldDailyUpdateRank(Document, **MODEL_META): date: datetime ranking: int @@ -26,6 +19,4 @@ class OldDailyUpdateRank(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.daily_update_rank - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["date", "ranking"]), - ] + indexes = (Index(keys=("date", "ranking")),) diff --git a/old_models/jpep_ftn_macket.py b/old_models/jpep_ftn_macket.py index ad8a88b..26c5b69 100644 --- a/old_models/jpep_ftn_macket.py +++ b/old_models/jpep_ftn_macket.py @@ -1,32 +1,26 @@ from datetime import datetime -from typing import ClassVar, List, Literal, Optional +from typing import Literal, Optional from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldAmountField(Field, **FIELD_OBJECT_CONFIG): +class OldAmountField(Field, **MODEL_META): total: int traded: int remaining: int tradable: int -class OldUserField(Field, **FIELD_OBJECT_CONFIG): +class OldUserField(Field, **MODEL_META): id: int name: str name_md5: Optional[str] = field(name="name_md5") -class OldJPEPFTNMacket(Document, **DOCUMENT_OBJECT_CONFIG): +class OldJPEPFTNMacket(Document, **MODEL_META): fetch_time: datetime = field(name="fetch_time") order_id: int = field(name="order_id") trade_type: Literal["buy", "sell"] = field(name="trade_type") @@ -42,6 +36,4 @@ class OldJPEPFTNMacket(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.JPEP_FTN_macket - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["fetch_time"]), - ] + indexes = (Index(keys=("fetch_time",)),) diff --git a/old_models/lottery_data.py b/old_models/lottery_data.py index 4cc1f7b..44dda68 100644 --- a/old_models/lottery_data.py +++ b/old_models/lottery_data.py @@ -1,25 +1,18 @@ from datetime import datetime -from typing import ClassVar, List from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldUserField(Field, **FIELD_OBJECT_CONFIG): +class OldUserField(Field, **MODEL_META): id: int url: str name: str -class OldLotteryData(Document, **DOCUMENT_OBJECT_CONFIG): +class OldLotteryData(Document, **MODEL_META): _id: int time: datetime reward_name: str = field(name="reward_name") @@ -28,6 +21,4 @@ class OldLotteryData(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.lottery_data - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["time"]), - ] + indexes = (Index(keys=("time",)),) diff --git a/old_models/lp_collections.py b/old_models/lp_collections.py index 95f47ee..f27e06b 100644 --- a/old_models/lp_collections.py +++ b/old_models/lp_collections.py @@ -1,19 +1,12 @@ from datetime import datetime -from typing import ClassVar, List from msgspec import field -from pymongo import IndexModel +from sshared.mongo import MODEL_META, Document, Field, Index from old_models import OLD_DB -from utils.document_model import ( - DOCUMENT_OBJECT_CONFIG, - FIELD_OBJECT_CONFIG, - Document, - Field, -) -class OldArticleField(Field, **FIELD_OBJECT_CONFIG): +class OldArticleField(Field, **MODEL_META): id: int url: str title: str @@ -30,13 +23,13 @@ class OldArticleField(Field, **FIELD_OBJECT_CONFIG): summary: str -class OldAuthorField(Field, **FIELD_OBJECT_CONFIG): +class OldAuthorField(Field, **MODEL_META): id: int url: str name: str -class OldLPCollections(Document, **DOCUMENT_OBJECT_CONFIG): +class OldLPCollections(Document, **MODEL_META): fetch_date: datetime = field(name="fetch_date") from_collection: str = field(name="from_collection") @@ -45,6 +38,4 @@ class OldLPCollections(Document, **DOCUMENT_OBJECT_CONFIG): class Meta: # type: ignore collection = OLD_DB.LP_collections - indexes: ClassVar[List[IndexModel]] = [ - IndexModel(["fetch_date"]), - ] + indexes = (Index(keys=("fetch_date",)),) diff --git a/poetry.lock b/poetry.lock index 0b7ca34..8744305 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiosqlite" @@ -2683,6 +2683,24 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "sshared" +version = "0.2.0" +description = "后端共享组件" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "sshared-0.2.0-py3-none-any.whl", hash = "sha256:d2abb6889464081292caaf2d7604db5f288f5d5d625b2995af09e4765c1219e9"}, + {file = "sshared-0.2.0.tar.gz", hash = "sha256:a63b5515fca4eac890b6f7b74b23aab2f807bfb78c2cfacec4e06b995490c00e"}, +] + +[package.dependencies] +msgspec = ">=0.18.0,<0.19.0" +typing-extensions = ">=4.10.0,<5.0.0" + +[package.extras] +mongo = ["motor (>=3.3.0,<4.0.0)"] + [[package]] name = "sspeedup" version = "0.25.1" @@ -3031,4 +3049,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "ed1d69514e8ce89ebc241f85ca6bab85898df4b20cdbdc45c0e0bb7183b2713c" +content-hash = "c5c31b8b285be307b37af31878a5a50c8c2ae27086749eef4742b59acd35aac6" diff --git a/pyproject.toml b/pyproject.toml index c87dab9..ac70e80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,12 +5,14 @@ description = "简书数据采集服务" authors = ["yezi "] license = "MIT" readme = "README.md" +package-mode = false [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" jkit = "^3.0.0a15" sspeedup = "^0.25.1" +sshared = "^0.2.0" [tool.poetry.group.dev.dependencies] ruff = "^0.3.0" diff --git a/requirements-dev.txt b/requirements-dev.txt index 66f4c9c..8ddb418 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -95,6 +95,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 0293975..79d9420 100644 --- a/requirements.txt +++ b/requirements.txt @@ -92,6 +92,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/utils/document_model.py b/utils/document_model.py deleted file mode 100644 index 4959c20..0000000 --- a/utils/document_model.py +++ /dev/null @@ -1,137 +0,0 @@ -from datetime import datetime -from typing import ( - Any, - AsyncGenerator, - ClassVar, - Dict, - List, - Literal, - Optional, - Sequence, - Tuple, -) - -from bson import ObjectId -from motor.core import AgnosticCollection -from msgspec import Struct, convert, to_builtins -from msgspec.inspect import type_info -from pymongo import IndexModel -from typing_extensions import Self - -FIELD_OBJECT_CONFIG = { - "kw_only": True, - "rename": "camel", -} - -DOCUMENT_OBJECT_CONFIG = { - "kw_only": True, - "rename": "camel", -} - -_BUILDIN_TYPES: Tuple[object, ...] = (ObjectId, datetime) - - -class Field(Struct, **FIELD_OBJECT_CONFIG): - pass - - -class Document(Struct, **DOCUMENT_OBJECT_CONFIG): - class Meta(Struct): - collection: ClassVar[AgnosticCollection] - indexes: ClassVar[List[IndexModel]] - - @classmethod - def _get_field_name(cls, field: object) -> str: - attr_name = field.__qualname__.split(".")[-1] - for field_obj in type_info(cls).fields: # type: ignore - if field_obj.name != attr_name: - continue - - return field_obj.encode_name - - raise ValueError("未找到属性对应的字段名称") - - @classmethod - def get_collection(cls) -> AgnosticCollection: - return cls.Meta.collection - - def validate(self) -> Self: - return convert( - to_builtins(self, builtin_types=_BUILDIN_TYPES), - type=self.__class__, - ) - - @classmethod - def from_dict(cls, data: Dict[str, Any]) -> Self: - if not hasattr(cls, "_id") and "_id" in data: - del data["_id"] - - return convert(data, type=cls) - - def to_dict(self) -> Dict[str, Any]: - return to_builtins( - self, - builtin_types=_BUILDIN_TYPES, - ) - - @classmethod - async def ensure_indexes(cls) -> None: - if not cls.Meta.indexes: - return - - await cls.get_collection().create_indexes(cls.Meta.indexes) - - @classmethod - async def find_one( - cls, - filter: Optional[Dict[str, Any]] = None, # noqa: A002 - /, - *, - sort: Optional[Dict[str, Literal["ASC", "DESC"]]] = None, - ) -> Optional[Self]: - cursor = cls.get_collection().find(filter) - if sort: - cursor = cursor.sort( - {key: 1 if order == "ASC" else -1 for key, order in sort.items()} - ) - cursor = cursor.limit(1) - - try: - return cls.from_dict(await cursor.__anext__()) - except StopAsyncIteration: - return None - - @classmethod - async def find_many( - cls, - filter: Optional[Dict[str, Any]] = None, # noqa: A002 - /, - *, - sort: Optional[Dict[str, Literal["ASC", "DESC"]]] = None, - skip: Optional[int] = None, - limit: Optional[int] = None, - ) -> AsyncGenerator[Self, None]: - cursor = cls.get_collection().find(filter) - if sort: - cursor = cursor.sort( - {key: 1 if order == "ASC" else -1 for key, order in sort.items()} - ) - if skip: - cursor = cursor.skip(skip) - if limit: - cursor = cursor.limit(limit) - - async for item in cursor: - yield cls.from_dict(item) - - @classmethod - async def insert_one(cls, data: Self) -> None: - await cls.get_collection().insert_one(data.to_dict()) - - @classmethod - async def insert_many(cls, data: Sequence[Self]) -> None: - await cls.get_collection().insert_many(x.to_dict() for x in data) - - @classmethod - async def count(cls, filter: Optional[Dict[str, Any]] = None) -> int: # noqa: A002 - return await cls.get_collection().count_documents(filter if filter else {}) diff --git a/utils/migrate_helper.py b/utils/migrate_helper.py index 6abd7ff..df57dbf 100644 --- a/utils/migrate_helper.py +++ b/utils/migrate_helper.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Tuple, Type -from utils.document_model import Document +from sshared.mongo import Document async def get_collection_data_count(document: Type[Document]) -> int: From 66f9917dc9c1fc997c1208ce4cad9f1fcfa06a79 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 31 Mar 2024 08:46:55 +0800 Subject: [PATCH 79/93] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 710 ++++++++++++++++++++----------------------- pyproject.toml | 4 +- requirements-dev.txt | 56 ++-- requirements.txt | 52 ++-- 4 files changed, 387 insertions(+), 435 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8744305..f68d9bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -76,13 +76,13 @@ trio = ["trio (<0.22)"] [[package]] name = "apprise" -version = "1.7.4" +version = "1.7.5" description = "Push Notifications that work with just about every platform!" optional = false python-versions = ">=3.6" files = [ - {file = "apprise-1.7.4-py3-none-any.whl", hash = "sha256:71edb0f29532c0c35b6c52d882880f1649f8bd1bdc97c7480fda3e1358603325"}, - {file = "apprise-1.7.4.tar.gz", hash = "sha256:ef5e830051140d4228a759c5bc2d6857bcc7f8664df3e44f30f64617ce0c7a73"}, + {file = "apprise-1.7.5-py3-none-any.whl", hash = "sha256:4e5bba4ba763b237f80a8e386266a5538e6be262c3da4d4578e877c556d7070c"}, + {file = "apprise-1.7.5.tar.gz", hash = "sha256:0ac34b27009d5c625e87d33ec85fa577062b57f3bced6d7223e17c5afbb40e68"}, ] [package.dependencies] @@ -471,13 +471,13 @@ files = [ [[package]] name = "croniter" -version = "2.0.2" +version = "2.0.3" description = "croniter provides iteration for datetime object with cron like format" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "croniter-2.0.2-py2.py3-none-any.whl", hash = "sha256:78bf110a2c7dbbfdd98b926318ae6c64a731a4c637c7befe3685755110834746"}, - {file = "croniter-2.0.2.tar.gz", hash = "sha256:8bff16c9af4ef1fb6f05416973b8f7cb54997c02f2f8365251f9bf1dded91866"}, + {file = "croniter-2.0.3-py2.py3-none-any.whl", hash = "sha256:84dc95b2eb6760144cc01eca65a6b9cc1619c93b2dc37d8a27f4319b3eb740de"}, + {file = "croniter-2.0.3.tar.gz", hash = "sha256:28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1"}, ] [package.dependencies] @@ -632,13 +632,13 @@ test = ["pytest (>=6)"] [[package]] name = "fsspec" -version = "2024.2.0" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, - {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.extras] @@ -667,13 +667,13 @@ tqdm = ["tqdm"] [[package]] name = "google-auth" -version = "2.28.2" +version = "2.29.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.28.2.tar.gz", hash = "sha256:80b8b4969aa9ed5938c7828308f20f035bc79f9d8fb8120bf9dc8db20b41ba30"}, - {file = "google_auth-2.28.2-py2.py3-none-any.whl", hash = "sha256:9fd67bbcd40f16d9d42f950228e9cf02a2ded4ae49198b27432d0cded5a74c38"}, + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, ] [package.dependencies] @@ -690,19 +690,19 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "graphviz" -version = "0.20.1" +version = "0.20.3" description = "Simple Python interface for Graphviz" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, - {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, + {file = "graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5"}, + {file = "graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"}, ] [package.extras] dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] -docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] +docs = ["sphinx (>=5,<7)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] [[package]] name = "greenlet" @@ -777,13 +777,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.42.0" +version = "0.42.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.42.0-py3-none-any.whl", hash = "sha256:384df6b802a60f70e65fdb7e83f5b27e2da869a12eac85b25b55250012dbc263"}, - {file = "griffe-0.42.0.tar.gz", hash = "sha256:fb83ee602701ffdf99c9a6bf5f0a5a3bd877364b3bffb2c451dc8fbd9645b0cf"}, + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, ] [package.dependencies] @@ -829,13 +829,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.4" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, - {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -846,7 +846,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.25.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" @@ -897,13 +897,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.2" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.2-py3-none-any.whl", hash = "sha256:f4bc4c0c070c490abf4ce96d715f68e95923320370efb66143df00199bb6c100"}, - {file = "importlib_metadata-7.0.2.tar.gz", hash = "sha256:198f568f3230878cb1b44fbd7975f87906c22336dba2e4a7f05278c281fbd792"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] @@ -912,17 +912,17 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.3.0" +version = "6.1.3" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.3.0-py3-none-any.whl", hash = "sha256:783407aa1cd05550e3aa123e8f7cfaebee35ffa9cb0242919e2d1e4172222705"}, - {file = "importlib_resources-6.3.0.tar.gz", hash = "sha256:166072a97e86917a9025876f34286f549b9caf1d10b35a1b372bffa1600c6569"}, + {file = "importlib_resources-6.1.3-py3-none-any.whl", hash = "sha256:4c0269e3580fe2634d364b39b38b961540a7738c02cb984e98add8b4221d793d"}, + {file = "importlib_resources-6.1.3.tar.gz", hash = "sha256:56fb4525197b78544a3354ea27793952ab93f935bb4bf746b846bb1015020f2b"}, ] [package.dependencies] @@ -962,18 +962,17 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jkit" -version = "3.0.0a15" +version = "3.0.0a16" description = "简书非官方 SDK - 创造可能性" optional = false -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "jkit-3.0.0a15-py3-none-any.whl", hash = "sha256:4d9fd0705241088373e6bb9300dfa11fb2c2d9f0601cd24576a598c39250700a"}, - {file = "jkit-3.0.0a15.tar.gz", hash = "sha256:f71f6fc225d936cfb0dfb6a068b579fdbf6033ba1937ebedd8624d20bd7ebdab"}, + {file = "jkit-3.0.0a16-py3-none-any.whl", hash = "sha256:3ee1b6b4ffa25e56108ba28988f3612649f787fca94caf961af1f60bc6a805e3"}, + {file = "jkit-3.0.0a16.tar.gz", hash = "sha256:76f2a5949268cc4f88d799b2b2b71a2cafdfda55521b765d4920595543cd6182"}, ] [package.dependencies] httpx = {version = "*", extras = ["http2"]} -lxml = "*" msgspec = "*" typing-extensions = "*" @@ -1066,99 +1065,6 @@ websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] adal = ["adal (>=1.0.2)"] -[[package]] -name = "lxml" -version = "5.1.0" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -optional = false -python-versions = ">=3.6" -files = [ - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, - {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, - {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, - {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, - {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, - {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, - {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, - {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, - {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, - {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, - {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, - {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, - {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, - {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, - {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, - {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, - {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, - {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.7)"] - [[package]] name = "mako" version = "1.3.2" @@ -1302,13 +1208,13 @@ files = [ [[package]] name = "motor" -version = "3.3.2" +version = "3.4.0" description = "Non-blocking MongoDB driver for Tornado or asyncio" optional = false python-versions = ">=3.7" files = [ - {file = "motor-3.3.2-py3-none-any.whl", hash = "sha256:6fe7e6f0c4f430b9e030b9d22549b732f7c2226af3ab71ecc309e4a1b7d19953"}, - {file = "motor-3.3.2.tar.gz", hash = "sha256:d2fc38de15f1c8058f389c1a44a4d4105c0405c48c061cd492a654496f7bc26a"}, + {file = "motor-3.4.0-py3-none-any.whl", hash = "sha256:4b1e1a0cc5116ff73be2c080a72da078f2bb719b53bc7a6bb9e9a2f7dcd421ed"}, + {file = "motor-3.4.0.tar.gz", hash = "sha256:c89b4e4eb2e711345e91c7c9b122cb68cce0e5e869ed0387dd0acb10775e3131"}, ] [package.dependencies] @@ -1321,7 +1227,7 @@ gssapi = ["pymongo[gssapi] (>=4.5,<5)"] ocsp = ["pymongo[ocsp] (>=4.5,<5)"] snappy = ["pymongo[snappy] (>=4.5,<5)"] srv = ["pymongo[srv] (>=4.5,<5)"] -test = ["aiohttp (<3.8.6)", "mockupdb", "motor[encryption]", "pytest (>=7)", "tornado (>=5)"] +test = ["aiohttp (!=3.8.6)", "mockupdb", "motor[encryption]", "pytest (>=7)", "tornado (>=5)"] zstd = ["pymongo[zstd] (>=4.5,<5)"] [[package]] @@ -1408,61 +1314,62 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "orjson" -version = "3.9.15" +version = "3.10.0" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.9.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58"}, - {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99"}, - {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe"}, - {file = "orjson-3.9.15-cp310-none-win32.whl", hash = "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7"}, - {file = "orjson-3.9.15-cp310-none-win_amd64.whl", hash = "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb"}, - {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, - {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, - {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, - {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, - {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, - {file = "orjson-3.9.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40"}, - {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7"}, - {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1"}, - {file = "orjson-3.9.15-cp38-none-win32.whl", hash = "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5"}, - {file = "orjson-3.9.15-cp38-none-win_amd64.whl", hash = "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b"}, - {file = "orjson-3.9.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790"}, - {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b"}, - {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10"}, - {file = "orjson-3.9.15-cp39-none-win32.whl", hash = "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a"}, - {file = "orjson-3.9.15-cp39-none-win_amd64.whl", hash = "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7"}, - {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, + {file = "orjson-3.10.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47af5d4b850a2d1328660661f0881b67fdbe712aea905dadd413bdea6f792c33"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c90681333619d78360d13840c7235fdaf01b2b129cb3a4f1647783b1971542b6"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:400c5b7c4222cb27b5059adf1fb12302eebcabf1978f33d0824aa5277ca899bd"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dcb32e949eae80fb335e63b90e5808b4b0f64e31476b3777707416b41682db5"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7d507c7493252c0a0264b5cc7e20fa2f8622b8a83b04d819b5ce32c97cf57b"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e286a51def6626f1e0cc134ba2067dcf14f7f4b9550f6dd4535fd9d79000040b"}, + {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8acd4b82a5f3a3ec8b1dc83452941d22b4711964c34727eb1e65449eead353ca"}, + {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30707e646080dd3c791f22ce7e4a2fc2438765408547c10510f1f690bd336217"}, + {file = "orjson-3.10.0-cp310-none-win32.whl", hash = "sha256:115498c4ad34188dcb73464e8dc80e490a3e5e88a925907b6fedcf20e545001a"}, + {file = "orjson-3.10.0-cp310-none-win_amd64.whl", hash = "sha256:6735dd4a5a7b6df00a87d1d7a02b84b54d215fb7adac50dd24da5997ffb4798d"}, + {file = "orjson-3.10.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9587053e0cefc284e4d1cd113c34468b7d3f17666d22b185ea654f0775316a26"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bef1050b1bdc9ea6c0d08468e3e61c9386723633b397e50b82fda37b3563d72"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d16c6963ddf3b28c0d461641517cd312ad6b3cf303d8b87d5ef3fa59d6844337"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4251964db47ef090c462a2d909f16c7c7d5fe68e341dabce6702879ec26d1134"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73bbbdc43d520204d9ef0817ac03fa49c103c7f9ea94f410d2950755be2c349c"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:414e5293b82373606acf0d66313aecb52d9c8c2404b1900683eb32c3d042dbd7"}, + {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed5bb09877dc27ed0d37f037ddef6cb76d19aa34b108db270d27d3d2ef747"}, + {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5127478260db640323cea131ee88541cb1a9fbce051f0b22fa2f0892f44da302"}, + {file = "orjson-3.10.0-cp311-none-win32.whl", hash = "sha256:b98345529bafe3c06c09996b303fc0a21961820d634409b8639bc16bd4f21b63"}, + {file = "orjson-3.10.0-cp311-none-win_amd64.whl", hash = "sha256:658ca5cee3379dd3d37dbacd43d42c1b4feee99a29d847ef27a1cb18abdfb23f"}, + {file = "orjson-3.10.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4329c1d24fd130ee377e32a72dc54a3c251e6706fccd9a2ecb91b3606fddd998"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef0f19fdfb6553342b1882f438afd53c7cb7aea57894c4490c43e4431739c700"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4f60db24161534764277f798ef53b9d3063092f6d23f8f962b4a97edfa997a0"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1de3fd5c7b208d836f8ecb4526995f0d5877153a4f6f12f3e9bf11e49357de98"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f93e33f67729d460a177ba285002035d3f11425ed3cebac5f6ded4ef36b28344"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:237ba922aef472761acd697eef77fef4831ab769a42e83c04ac91e9f9e08fa0e"}, + {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98c1bfc6a9bec52bc8f0ab9b86cc0874b0299fccef3562b793c1576cf3abb570"}, + {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30d795a24be16c03dca0c35ca8f9c8eaaa51e3342f2c162d327bd0225118794a"}, + {file = "orjson-3.10.0-cp312-none-win32.whl", hash = "sha256:6a3f53dc650bc860eb26ec293dfb489b2f6ae1cbfc409a127b01229980e372f7"}, + {file = "orjson-3.10.0-cp312-none-win_amd64.whl", hash = "sha256:983db1f87c371dc6ffc52931eb75f9fe17dc621273e43ce67bee407d3e5476e9"}, + {file = "orjson-3.10.0-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a667769a96a72ca67237224a36faf57db0c82ab07d09c3aafc6f956196cfa1b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade1e21dfde1d37feee8cf6464c20a2f41fa46c8bcd5251e761903e46102dc6b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23c12bb4ced1c3308eff7ba5c63ef8f0edb3e4c43c026440247dd6c1c61cea4b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2d014cf8d4dc9f03fc9f870de191a49a03b1bcda51f2a957943fb9fafe55aac"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eadecaa16d9783affca33597781328e4981b048615c2ddc31c47a51b833d6319"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd583341218826f48bd7c6ebf3310b4126216920853cbc471e8dbeaf07b0b80e"}, + {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90bfc137c75c31d32308fd61951d424424426ddc39a40e367704661a9ee97095"}, + {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13b5d3c795b09a466ec9fcf0bd3ad7b85467d91a60113885df7b8d639a9d374b"}, + {file = "orjson-3.10.0-cp38-none-win32.whl", hash = "sha256:5d42768db6f2ce0162544845facb7c081e9364a5eb6d2ef06cd17f6050b048d8"}, + {file = "orjson-3.10.0-cp38-none-win_amd64.whl", hash = "sha256:33e6655a2542195d6fd9f850b428926559dee382f7a862dae92ca97fea03a5ad"}, + {file = "orjson-3.10.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4050920e831a49d8782a1720d3ca2f1c49b150953667eed6e5d63a62e80f46a2"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1897aa25a944cec774ce4a0e1c8e98fb50523e97366c637b7d0cddabc42e6643"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9bf565a69e0082ea348c5657401acec3cbbb31564d89afebaee884614fba36b4"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6ebc17cfbbf741f5c1a888d1854354536f63d84bee537c9a7c0335791bb9009"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2817877d0b69f78f146ab305c5975d0618df41acf8811249ee64231f5953fee"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57d017863ec8aa4589be30a328dacd13c2dc49de1c170bc8d8c8a98ece0f2925"}, + {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:22c2f7e377ac757bd3476ecb7480c8ed79d98ef89648f0176deb1da5cd014eb7"}, + {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e62ba42bfe64c60c1bc84799944f80704e996592c6b9e14789c8e2a303279912"}, + {file = "orjson-3.10.0-cp39-none-win32.whl", hash = "sha256:60c0b1bdbccd959ebd1575bd0147bd5e10fc76f26216188be4a36b691c937077"}, + {file = "orjson-3.10.0-cp39-none-win_amd64.whl", hash = "sha256:175a41500ebb2fdf320bf78e8b9a75a1279525b62ba400b2b2444e274c2c8bee"}, + {file = "orjson-3.10.0.tar.gz", hash = "sha256:ba4d8cac5f2e2cff36bea6b6481cdb92b38c202bcec603d6f5ff91960595a1ed"}, ] [[package]] @@ -1633,13 +1540,13 @@ files = [ [[package]] name = "prefect" -version = "2.16.3" +version = "2.16.8" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.16.3-py3-none-any.whl", hash = "sha256:0d9bf51b2e03276d7dd91f7e7dfbcf204a8bc09b9e086f72ada6d9fea0743182"}, - {file = "prefect-2.16.3.tar.gz", hash = "sha256:26fc38400f789b3a73a85f447deec01d5fc5821d7004c834f81022b859148d4e"}, + {file = "prefect-2.16.8-py3-none-any.whl", hash = "sha256:f570f3be390a641169c1407bbf5eae34e28481a57764e87e68defdf59e47d0ee"}, + {file = "prefect-2.16.8.tar.gz", hash = "sha256:c75eb1feac78c888f20d917e4a73dfbcfaafb4cb2db7a71ccebaaf5b6285794c"}, ] [package.dependencies] @@ -1663,6 +1570,7 @@ griffe = ">=0.20.0" httpcore = ">=0.15.0,<2.0.0" httpx = {version = ">=0.23,<0.23.2 || >0.23.2", extras = ["http2"]} importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +importlib-resources = ">=6.1.3,<6.2.0" itsdangerous = "*" jinja2 = ">=3.0.0,<4.0.0" jsonpatch = ">=1.32,<2.0" @@ -1691,46 +1599,46 @@ toml = ">=0.10.0" typer = ">=0.4.2" typing-extensions = ">=4.5.0,<5.0.0" ujson = ">=5.8.0,<6.0.0" -uvicorn = ">=0.14.0" +uvicorn = ">=0.14.0,<0.29.0" websockets = ">=10.4,<13.0" [package.extras] -dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "virtualenv", "watchfiles"] +dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "vermin", "virtualenv", "watchfiles"] [[package]] name = "pyasn1" -version = "0.5.1" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, - {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -1861,93 +1769,93 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.6.2" +version = "4.6.3" description = "Python driver for MongoDB " optional = false python-versions = ">=3.7" files = [ - {file = "pymongo-4.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7640d176ee5b0afec76a1bda3684995cb731b2af7fcfd7c7ef8dc271c5d689af"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux1_i686.whl", hash = "sha256:4e2129ec8f72806751b621470ac5d26aaa18fae4194796621508fa0e6068278a"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c43205e85cbcbdf03cff62ad8f50426dd9d20134a915cfb626d805bab89a1844"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:91ddf95cedca12f115fbc5f442b841e81197d85aa3cc30b82aee3635a5208af2"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:0fbdbf2fba1b4f5f1522e9f11e21c306e095b59a83340a69e908f8ed9b450070"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:097791d5a8d44e2444e0c8c4d6e14570ac11e22bcb833808885a5db081c3dc2a"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:e0b208ebec3b47ee78a5c836e2e885e8c1e10f8ffd101aaec3d63997a4bdcd04"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1849fd6f1917b4dc5dbf744b2f18e41e0538d08dd8e9ba9efa811c5149d665a3"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa0bbbfbd1f8ebbd5facaa10f9f333b20027b240af012748555148943616fdf3"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4522ad69a4ab0e1b46a8367d62ad3865b8cd54cf77518c157631dac1fdc97584"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397949a9cc85e4a1452f80b7f7f2175d557237177120954eff00bf79553e89d3"}, - {file = "pymongo-4.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d511db310f43222bc58d811037b176b4b88dc2b4617478c5ef01fea404f8601"}, - {file = "pymongo-4.6.2-cp310-cp310-win32.whl", hash = "sha256:991e406db5da4d89fb220a94d8caaf974ffe14ce6b095957bae9273c609784a0"}, - {file = "pymongo-4.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:94637941fe343000f728e28d3fe04f1f52aec6376b67b85583026ff8dab2a0e0"}, - {file = "pymongo-4.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84593447a5c5fe7a59ba86b72c2c89d813fbac71c07757acdf162fbfd5d005b9"}, - {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aebddb2ec2128d5fc2fe3aee6319afef8697e0374f8a1fcca3449d6f625e7b4"}, - {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f706c1a644ed33eaea91df0a8fb687ce572b53eeb4ff9b89270cb0247e5d0e1"}, - {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c422e6b08fa370ed9d8670c67e78d01f50d6517cec4522aa8627014dfa38b6"}, - {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d002ae456a15b1d790a78bb84f87af21af1cb716a63efb2c446ab6bcbbc48ca"}, - {file = "pymongo-4.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f86ba0c781b497a3c9c886765d7b6402a0e3ae079dd517365044c89cd7abb06"}, - {file = "pymongo-4.6.2-cp311-cp311-win32.whl", hash = "sha256:ac20dd0c7b42555837c86f5ea46505f35af20a08b9cf5770cd1834288d8bd1b4"}, - {file = "pymongo-4.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:e78af59fd0eb262c2a5f7c7d7e3b95e8596a75480d31087ca5f02f2d4c6acd19"}, - {file = "pymongo-4.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6125f73503407792c8b3f80165f8ab88a4e448d7d9234c762681a4d0b446fcb4"}, - {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba052446a14bd714ec83ca4e77d0d97904f33cd046d7bb60712a6be25eb31dbb"}, - {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b65433c90e07dc252b4a55dfd885ca0df94b1cf77c5b8709953ec1983aadc03"}, - {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2160d9c8cd20ce1f76a893f0daf7c0d38af093f36f1b5c9f3dcf3e08f7142814"}, - {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f251f287e6d42daa3654b686ce1fcb6d74bf13b3907c3ae25954978c70f2cd4"}, - {file = "pymongo-4.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d227a60b00925dd3aeae4675575af89c661a8e89a1f7d1677e57eba4a3693c"}, - {file = "pymongo-4.6.2-cp312-cp312-win32.whl", hash = "sha256:311794ef3ccae374aaef95792c36b0e5c06e8d5cf04a1bdb1b2bf14619ac881f"}, - {file = "pymongo-4.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:f673b64a0884edcc56073bda0b363428dc1bf4eb1b5e7d0b689f7ec6173edad6"}, - {file = "pymongo-4.6.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:fe010154dfa9e428bd2fb3e9325eff2216ab20a69ccbd6b5cac6785ca2989161"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1f5f4cd2969197e25b67e24d5b8aa2452d381861d2791d06c493eaa0b9c9fcfe"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c9519c9d341983f3a1bd19628fecb1d72a48d8666cf344549879f2e63f54463b"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c68bf4a399e37798f1b5aa4f6c02886188ef465f4ac0b305a607b7579413e366"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a509db602462eb736666989739215b4b7d8f4bb8ac31d0bffd4be9eae96c63ef"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:362a5adf6f3f938a8ff220a4c4aaa93e84ef932a409abecd837c617d17a5990f"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:ee30a9d4c27a88042d0636aca0275788af09cc237ae365cd6ebb34524bddb9cc"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:477914e13501bb1d4608339ee5bb618be056d2d0e7267727623516cfa902e652"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd343ca44982d480f1e39372c48e8e263fc6f32e9af2be456298f146a3db715"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3797e0a628534e07a36544d2bfa69e251a578c6d013e975e9e3ed2ac41f2d95"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97d81d357e1a2a248b3494d52ebc8bf15d223ee89d59ee63becc434e07438a24"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed694c0d1977cb54281cb808bc2b247c17fb64b678a6352d3b77eb678ebe1bd9"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ceaaff4b812ae368cf9774989dea81b9bbb71e5bed666feca6a9f3087c03e49"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7dd63f7c2b3727541f7f37d0fb78d9942eb12a866180fbeb898714420aad74e2"}, - {file = "pymongo-4.6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e571434633f99a81e081738721bb38e697345281ed2f79c2f290f809ba3fbb2f"}, - {file = "pymongo-4.6.2-cp37-cp37m-win32.whl", hash = "sha256:3e9f6e2f3da0a6af854a3e959a6962b5f8b43bbb8113cd0bff0421c5059b3106"}, - {file = "pymongo-4.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3a5280f496297537301e78bde250c96fadf4945e7b2c397d8bb8921861dd236d"}, - {file = "pymongo-4.6.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:5f6bcd2d012d82d25191a911a239fd05a8a72e8c5a7d81d056c0f3520cad14d1"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4fa30494601a6271a8b416554bd7cde7b2a848230f0ec03e3f08d84565b4bf8c"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bea62f03a50f363265a7a651b4e2a4429b4f138c1864b2d83d4bf6f9851994be"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b2d445f1cf147331947cc35ec10342f898329f29dd1947a3f8aeaf7e0e6878d1"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:5db133d6ec7a4f7fc7e2bd098e4df23d7ad949f7be47b27b515c9fb9301c61e4"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:9eec7140cf7513aa770ea51505d312000c7416626a828de24318fdcc9ac3214c"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:5379ca6fd325387a34cda440aec2bd031b5ef0b0aa2e23b4981945cff1dab84c"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:579508536113dbd4c56e4738955a18847e8a6c41bf3c0b4ab18b51d81a6b7be8"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bae553ca39ed52db099d76acd5e8566096064dc7614c34c9359bb239ec4081"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0257e0eebb50f242ca28a92ef195889a6ad03dcdde5bf1c7ab9f38b7e810801"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbafe3a1df21eeadb003c38fc02c1abf567648b6477ec50c4a3c042dca205371"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaecfafb407feb6f562c7f2f5b91f22bfacba6dd739116b1912788cff7124c4a"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e942945e9112075a84d2e2d6e0d0c98833cdcdfe48eb8952b917f996025c7ffa"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f7b98f8d2cf3eeebde738d080ae9b4276d7250912d9751046a9ac1efc9b1ce2"}, - {file = "pymongo-4.6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8110b78fc4b37dced85081d56795ecbee6a7937966e918e05e33a3900e8ea07d"}, - {file = "pymongo-4.6.2-cp38-cp38-win32.whl", hash = "sha256:df813f0c2c02281720ccce225edf39dc37855bf72cdfde6f789a1d1cf32ffb4b"}, - {file = "pymongo-4.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:64ec3e2dcab9af61bdbfcb1dd863c70d1b0c220b8e8ac11df8b57f80ee0402b3"}, - {file = "pymongo-4.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bff601fbfcecd2166d9a2b70777c2985cb9689e2befb3278d91f7f93a0456cae"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f1febca6f79e91feafc572906871805bd9c271b6a2d98a8bb5499b6ace0befed"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d788cb5cc947d78934be26eef1623c78cec3729dc93a30c23f049b361aa6d835"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c2f258489de12a65b81e1b803a531ee8cf633fa416ae84de65cd5f82d2ceb37"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:fb24abcd50501b25d33a074c1790a1389b6460d2509e4b240d03fd2e5c79f463"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:4d982c6db1da7cf3018183891883660ad085de97f21490d314385373f775915b"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:b2dd8c874927a27995f64a3b44c890e8a944c98dec1ba79eab50e07f1e3f801b"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:4993593de44c741d1e9f230f221fe623179f500765f9855936e4ff6f33571bad"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:658f6c028edaeb02761ebcaca8d44d519c22594b2a51dcbc9bd2432aa93319e3"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68109c13176749fbbbbbdb94dd4a58dcc604db6ea43ee300b2602154aebdd55f"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:707d28a822b918acf941cff590affaddb42a5d640614d71367c8956623a80cbc"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f251db26c239aec2a4d57fbe869e0a27b7f6b5384ec6bf54aeb4a6a5e7408234"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57c05f2e310701fc17ae358caafd99b1830014e316f0242d13ab6c01db0ab1c2"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b575fbe6396bbf21e4d0e5fd2e3cdb656dc90c930b6c5532192e9a89814f72d"}, - {file = "pymongo-4.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ca5877754f3fa6e4fe5aacf5c404575f04c2d9efc8d22ed39576ed9098d555c8"}, - {file = "pymongo-4.6.2-cp39-cp39-win32.whl", hash = "sha256:8caa73fb19070008e851a589b744aaa38edd1366e2487284c61158c77fdf72af"}, - {file = "pymongo-4.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:3e03c732cb64b96849310e1d8688fb70d75e2571385485bf2f1e7ad1d309fa53"}, - {file = "pymongo-4.6.2.tar.gz", hash = "sha256:ab7d01ac832a1663dad592ccbd92bb0f0775bc8f98a1923c5e1a7d7fead495af"}, + {file = "pymongo-4.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e344d0afdd7c06c1f1e66a4736593293f432defc2191e6b411fc9c82fa8c5adc"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:731a92dfc4022db763bfa835c6bd160f2d2cba6ada75749c2ed500e13983414b"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c4726e36a2f7e92f09f5b8e92ba4db7525daffe31a0dcbcf0533edc0ade8c7d8"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:00e6cfce111883ca63a3c12878286e0b89871f4b840290e61fb6f88ee0e687be"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:cc7a26edf79015c58eea46feb5b262cece55bc1d4929a8a9e0cbe7e6d6a9b0eb"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:4955be64d943b30f2a7ff98d818ca530f7cb37450bc6b32c37e0e74821907ef8"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:af039afc6d787502c02089759778b550cb2f25dbe2780f5b050a2e37031c3fbf"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc15a7c7a99aed7d0831eaf78a607f1db0c7a255f96e3d18984231acd72f70c"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e97c138d811e9367723fcd07c4402a9211caae20479fdd6301d57762778a69f"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebcc145c74d06296ce0cad35992185064e5cb2aadef719586778c144f0cd4d37"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:664c64b6bdb31aceb80f0556951e5e2bf50d359270732268b4e7af00a1cf5d6c"}, + {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4056bc421d4df2c61db4e584415f2b0f1eebb92cbf9222f7f38303467c37117"}, + {file = "pymongo-4.6.3-cp310-cp310-win32.whl", hash = "sha256:cdbea2aac1a4caa66ee912af3601557d2bda2f9f69feec83601c78c7e53ece64"}, + {file = "pymongo-4.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:6cec7279e5a1b74b257d0270a8c97943d745811066630a6bc6beb413c68c6a33"}, + {file = "pymongo-4.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:138b9fa18d40401c217bc038a48bcde4160b02d36d8632015b1804971a2eaa2f"}, + {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60931b0e07448afe8866ffff764cd5bf4b1a855dc84c7dcb3974c6aa6a377a59"}, + {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b35f8bded43ff91475305445fedf0613f880ff7e25c75ae1028e1260a9b7a86"}, + {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:872bad5c83f7eec9da11e1fef5f858c6a4c79fe4a83c7780e7b0fe95d560ae3f"}, + {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ad3e5bfcd345c0bfe9af69a82d720860b5b043c1657ffb513c18a0dee19c19"}, + {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e208f2ab7b495eff8fd175022abfb0abce6307ac5aee3f4de51fc1a459b71c9"}, + {file = "pymongo-4.6.3-cp311-cp311-win32.whl", hash = "sha256:4670edbb5ddd71a4d555668ef99b032a5f81b59e4145d66123aa0d831eac7883"}, + {file = "pymongo-4.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1c2761302b6cbfd12e239ce1b8061d4cf424a361d199dcb32da534985cae9350"}, + {file = "pymongo-4.6.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:722f2b709b63311c0efda4fa4c603661faa4bec6bad24a6cc41a3bc6d841bf09"}, + {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:994386a4d6ad39e18bcede6dc8d1d693ec3ed897b88f86b1841fbc37227406da"}, + {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:391aea047bba928006114282f175bc8d09c53fe1b7d8920bf888325e229302fe"}, + {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4330c022024e7994b630199cdae909123e4b0e9cf15335de71b146c0f6a2435"}, + {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01277a7e183c59081368e4efbde2b8f577014431b257959ca98d3a4e8682dd51"}, + {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d30d5d7963453b478016bf7b0d87d7089ca24d93dbdecfbc9aa32f1b4772160a"}, + {file = "pymongo-4.6.3-cp312-cp312-win32.whl", hash = "sha256:a023804a3ac0f85d4510265b60978522368b5815772262e61e3a2222a8b315c9"}, + {file = "pymongo-4.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2a6ae9a600bbc2dbff719c98bf5da584fb8a4f2bb23729a09be2e9c3dbc61c8a"}, + {file = "pymongo-4.6.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:3b909e5b1864de01510079b39bbdc480720c37747be5552b354bc73f02c24a3c"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:48c60bd32ec141c0d45d8471179430003d9fb4490da181b8165fb1dce9cc255c"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36d7049fc183fe4edda3eae7f66ea14c660921429e082fe90b4b7f4dc6664a70"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e5c161b18660f1c9d1f78236de45520a436be65e42b7bb51f25f74ad22bdde"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:e458e6fc2b7dd40d15cda04898bd2d8c9ff7ae086c516bc261628d54eb4e3158"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:e420e74c6db4594a6d09f39b58c0772679006cb0b4fc40901ba608794d87dad2"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9c9340c7161e112e36ebb97fbba1cdbe7db3dfacb694d2918b1f155a01f3d859"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:26d036e0f5de09d0b21d0fc30314fcf2ae6359e4d43ae109aa6cf27b4ce02d30"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cf28d9c90e40d4e385b858e4095739829f466f23e08674085161d86bb4bb10"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9066dff9dc0a182478ca5885d0b8a2b820b462e19459ada109df7a3ced31b272"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1e1586ebdebe0447a24842480defac17c496430a218486c96e2da3f164c0f05"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3853fb66bf34ce1b6e573e1bbb3cb28763be9d1f57758535757faf1ab2f24a"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:462684a6f5ce6f2661c30eab4d1d459231e0eed280f338e716e31a24fc09ccb3"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a4ea44e5a913bdb7c9abd34c69e9fcfac10dfaf49765463e0dc1ea922dd2a9d"}, + {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:098d420a8214ad25f872de7e8b309441995d12ece0376218a04d9ed5d2222cf3"}, + {file = "pymongo-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:7330245253fbe2e09845069d2f4d35dd27f63e377034c94cb0ddac18bc8b0d82"}, + {file = "pymongo-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:151361c101600a85cb1c1e0db4e4b28318b521fcafa9b62d389f7342faaaee80"}, + {file = "pymongo-4.6.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4d167d546352869125dc86f6fda6dffc627d8a9c8963eaee665825f2520d542b"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eaf3d594ebfd5e1f3503d81e06a5d78e33cda27418b36c2491c3d4ad4fca5972"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ee79e02a7c5ed34706ecb5dad19e6c7d267cf86d28c075ef3127c58f3081279"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af5c5112db04cf62a5d9d224a24f289aaecb47d152c08a457cca81cee061d5bd"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6b5aec78aa4840e8d6c3881900259892ab5733a366696ca10d99d68c3d73eaaf"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:9757602fb45c8ecc1883fe6db7c59c19d87eb3c645ec9342d28a6026837da931"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:dde9fb6e105ce054339256a8b7a9775212ebb29596ef4e402d7bbc63b354d202"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:7df8b166d3db6cfead4cf55b481408d8f0935d8bd8d6dbf64507c49ef82c7200"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53451190b8628e1ce7d1fe105dc376c3f10705127bd3b51fe3e107b9ff1851e6"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75107a386d4ccf5291e75cce8ca3898430e7907f4cc1208a17c9efad33a1ea84"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a0660ce32d8459b7f12dc3ca0141528fead62d3cce31b548f96f30902074cc0"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa310096450e9c461b7dfd66cbc1c41771fe36c06200440bb3e062b1d4a06b6e"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f465cca9b178e7bb782f952dd58e9e92f8ba056e585959465f2bb50feddef5f"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c67c19f653053ef2ebd7f1837c2978400058d6d7f66ec5760373a21eaf660158"}, + {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c701de8e483fb5e53874aab642235361aac6de698146b02c644389eaa8c137b6"}, + {file = "pymongo-4.6.3-cp38-cp38-win32.whl", hash = "sha256:90525454546536544307e6da9c81f331a71a1b144e2d038fec587cc9f9250285"}, + {file = "pymongo-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:3e1ba5a037c526a3f4060c28f8d45d71ed9626e2bf954b0cd9a8dcc3b45172ee"}, + {file = "pymongo-4.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14a82593528cddc93cfea5ee78fac95ae763a3a4e124ca79ee0b24fbbc6da1c9"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cd6c15242d9306ff1748681c3235284cbe9f807aeaa86cd17d85e72af626e9a7"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6de33f1b2eed91b802ec7abeb92ffb981d052f3604b45588309aae9e0f6e3c02"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0182899aafe830f25cf96c5976d724efeaaf7b6646c15424ad8dd25422b2efe1"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:8d0ea740a2faa56f930dc82c5976d96c017ece26b29a1cddafb58721c7aab960"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:5c8a4982f5eb767c6fbfb8fb378683d09bcab7c3251ba64357eef600d43f6c23"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:becfa816545a48c8e740ac2fd624c1c121e1362072d68ffcf37a6b1be8ea187e"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ff7d1f449fcad23d9bc8e8dc2b9972be38bcd76d99ea5f7d29b2efa929c2a7ff"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e097f877de4d6af13a33ef938bf2a2350f424be5deabf8b857da95f5b080487a"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:705a9bfd619301ee7e985d6f91f68b15dfcb2f6f36b8cc225cc82d4260d2bce5"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ef1b4992ee1cb8bb16745e70afa0c02c5360220a7a8bb4775888721f052d0a6"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d10bdd46cbc35a2109737d36ffbef32e7420569a87904738ad444ccb7ac2c5"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17c1c143ba77d6e21fc8b48e93f0a5ed982a23447434e9ee4fbb6d633402506b"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e51e30d67b468a2a634ade928b30cb3e420127f148a9aec60de33f39087bdc4"}, + {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bec8e4e88984be157408f1923d25869e1b575c07711cdbdde596f66931800934"}, + {file = "pymongo-4.6.3-cp39-cp39-win32.whl", hash = "sha256:98877a9c4ad42df8253a12d8d17a3265781d1feb5c91c767bd153f88feb0b670"}, + {file = "pymongo-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:6d5b35da9e16cda630baed790ffc3d0d01029d269523a7cec34d2ec7e6823e75"}, + {file = "pymongo-4.6.3.tar.gz", hash = "sha256:400074090b9a631f120b42c61b222fd743490c133a5d2f99c0208cefcccc964e"}, ] [package.dependencies] @@ -1964,13 +1872,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.354" +version = "1.1.356" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.354-py3-none-any.whl", hash = "sha256:f28d61ae8ae035fc52ded1070e8d9e786051a26a4127bbd7a4ba0399b81b37b5"}, - {file = "pyright-1.1.354.tar.gz", hash = "sha256:b1070dc774ff2e79eb0523fe87f4ba9a90550de7e4b030a2bc9e031864029a1f"}, + {file = "pyright-1.1.356-py3-none-any.whl", hash = "sha256:a101b0f375f93d7082f9046cfaa7ba15b7cf8e1939ace45e984c351f6e8feb99"}, + {file = "pyright-1.1.356.tar.gz", hash = "sha256:f05b8b29d06b96ed4a0885dad5a31d9dff691ca12b2f658249f583d5f2754021"}, ] [package.dependencies] @@ -2132,13 +2040,13 @@ files = [ [[package]] name = "readchar" -version = "4.0.5" +version = "4.0.6" description = "Library to easily read single chars and key strokes" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "readchar-4.0.5-py3-none-any.whl", hash = "sha256:76ec784a5dd2afac3b7da8003329834cdd9824294c260027f8c8d2e4d0a78f43"}, - {file = "readchar-4.0.5.tar.gz", hash = "sha256:08a456c2d7c1888cde3f4688b542621b676eb38cd6cfed7eb6cb2e2905ddc826"}, + {file = "readchar-4.0.6-py3-none-any.whl", hash = "sha256:b4b31dd35de4897be738f27e8f9f62426b5fedb54b648364987e30ae534b71bc"}, + {file = "readchar-4.0.6.tar.gz", hash = "sha256:e0dae942d3a746f8d5423f83dbad67efe704004baafe31b626477929faaee472"}, ] [package.dependencies] @@ -2146,13 +2054,13 @@ setuptools = ">=41.0" [[package]] name = "referencing" -version = "0.33.0" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -2284,13 +2192,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.4.0" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.4.0.tar.gz", hash = "sha256:acee623221e4a39abcbb919312c8ff04bd44e7e417087fb4bd5e2a2f53d5e79a"}, - {file = "requests_oauthlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:7a3130d94a17520169e38db6c8d75f2c974643788465ecc2e4b36d288bf13033"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -2534,28 +2442,28 @@ files = [ [[package]] name = "ruff" -version = "0.3.2" +version = "0.3.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, - {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, - {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, - {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, - {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, + {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, + {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, + {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, + {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, ] [[package]] @@ -2574,6 +2482,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + [[package]] name = "six" version = "1.16.0" @@ -2598,60 +2517,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.28" +version = "2.0.29" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, - {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, - {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, + {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, + {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, ] [package.dependencies] @@ -2751,24 +2670,53 @@ files = [ [[package]] name = "typer" -version = "0.9.0" +version = "0.12.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "typer-0.12.0-py3-none-any.whl", hash = "sha256:0441a0bb8962fb4383b8537ada9f7eb2d0deda0caa2cfe7387cc221290f617e4"}, + {file = "typer-0.12.0.tar.gz", hash = "sha256:900fe786ce2d0ea44653d3c8ee4594a22a496a3104370ded770c992c5e3c542d"}, +] + +[package.dependencies] +typer-cli = "0.12.0" +typer-slim = {version = "0.12.0", extras = ["standard"]} + +[[package]] +name = "typer-cli" +version = "0.12.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer_cli-0.12.0-py3-none-any.whl", hash = "sha256:7b7e2dd49f59974bb5a869747045d5444b17bffb851e006cd424f602d3578104"}, + {file = "typer_cli-0.12.0.tar.gz", hash = "sha256:603ed3d5a278827bd497e4dc73a39bb714b230371c8724090b0de2abdcdd9f6e"}, +] + +[package.dependencies] +typer-slim = {version = "0.12.0", extras = ["standard"]} + +[[package]] +name = "typer-slim" +version = "0.12.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" files = [ - {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, - {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, + {file = "typer_slim-0.12.0-py3-none-any.whl", hash = "sha256:ddd7042b29a32140528caa415750bcae54113ba0c32270ca11a6f64069ddadf9"}, + {file = "typer_slim-0.12.0.tar.gz", hash = "sha256:3e8a3f17286b173d76dca0fd4e02651c9a2ce1467b3754876b1ac4bd72572beb"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" +click = ">=8.0.0" +rich = {version = ">=10.11.0", optional = true, markers = "extra == \"standard\""} +shellingham = {version = ">=1.3.0", optional = true, markers = "extra == \"standard\""} typing-extensions = ">=3.7.4.3" [package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +all = ["rich (>=10.11.0)", "shellingham (>=1.3.0)"] +standard = ["rich (>=10.11.0)", "shellingham (>=1.3.0)"] [[package]] name = "typing-extensions" @@ -2903,13 +2851,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.28.0" +version = "0.28.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"}, - {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"}, + {file = "uvicorn-0.28.1-py3-none-any.whl", hash = "sha256:5162f6d652f545be91b1feeaee8180774af143965ca9dc8a47ff1dc6bafa4ad5"}, + {file = "uvicorn-0.28.1.tar.gz", hash = "sha256:08103e79d546b6cf20f67c7e5e434d2cf500a6e29b28773e407250c54fc4fa3c"}, ] [package.dependencies] @@ -3049,4 +2997,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "c5c31b8b285be307b37af31878a5a50c8c2ae27086749eef4742b59acd35aac6" +content-hash = "fc3b60b593210233e2733901b279e422c67b6d3052e07bcdabdd60576ecc51d4" diff --git a/pyproject.toml b/pyproject.toml index ac70e80..445f807 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,8 +10,8 @@ package-mode = false [tool.poetry.dependencies] python = "^3.8" prefect = "^2.16.0" -jkit = "^3.0.0a15" -sspeedup = "^0.25.1" +jkit = "^3.0.0a16" +sspeedup = "^0.25.0" sshared = "^0.2.0" [tool.poetry.group.dev.dependencies] diff --git a/requirements-dev.txt b/requirements-dev.txt index 8ddb418..56bd714 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.4 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.5 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -17,60 +17,59 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.3 ; python_version >= "3.8" and python_version < "4.0" cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.2 ; python_version >= "3.8" and python_version < "4.0" -graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" +fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" +graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.42.0 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.42.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" -httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +httpcore==1.0.5 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.0.2 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.3.0 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a15 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" -motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.0 ; python_version >= "3.8" and python_version < "4.0" packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" -pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +prefect==2.16.8 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.354 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.356 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -78,10 +77,10 @@ pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" -referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.34.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" -requests-oauthlib==1.4.0 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" @@ -89,23 +88,26 @@ rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.3.2 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.3.4 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" +shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" -typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" +typer-cli==0.12.0 ; python_version >= "3.8" and python_version < "4.0" +typer-slim[standard]==0.12.0 ; python_version >= "3.8" and python_version < "4.0" +typer==0.12.0 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.28.0 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" diff --git a/requirements.txt b/requirements.txt index 79d9420..0a62b0f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.4 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.5 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -17,58 +17,57 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.3 ; python_version >= "3.8" and python_version < "4.0" cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.28.2 ; python_version >= "3.8" and python_version < "4.0" -graphviz==0.20.1 ; python_version >= "3.8" and python_version < "4.0" +fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" +graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.42.0 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.42.1 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" -httpcore==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +httpcore==1.0.5 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.6 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.0.2 ; python_version >= "3.8" and python_version < "3.10" -importlib-resources==6.3.0 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" +importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" -jkit==3.0.0a15 ; python_version >= "3.8" and python_version < "4.0" +jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -lxml==5.1.0 ; python_version >= "3.8" and python_version < "4.0" mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" -motor==3.3.2 ; python_version >= "3.8" and python_version < "4.0" +motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.9.15 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.0 ; python_version >= "3.8" and python_version < "4.0" packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" -pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" +prefect==2.16.8 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.2 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -76,10 +75,10 @@ pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -readchar==4.0.5 ; python_version >= "3.8" and python_version < "4.0" -referencing==0.33.0 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.34.0 ; python_version >= "3.8" and python_version < "4.0" regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" -requests-oauthlib==1.4.0 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" @@ -88,21 +87,24 @@ rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" +shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.28 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.28 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" -typer==0.9.0 ; python_version >= "3.8" and python_version < "4.0" +typer-cli==0.12.0 ; python_version >= "3.8" and python_version < "4.0" +typer-slim[standard]==0.12.0 ; python_version >= "3.8" and python_version < "4.0" +typer==0.12.0 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.28.0 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" From b6385eeb2328676b77fce006a2bd27e517a7f9ea Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 31 Mar 2024 08:48:05 +0800 Subject: [PATCH 80/93] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d4dc43e..343f758 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3" - networks: mongodb: external: true @@ -21,7 +19,6 @@ services: deploy: resources: limits: - cpus: "1.00" memory: 512M restart_policy: condition: on-failure From e32ccd288f0b3057b605aa27a5f870894ac58b97 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:17:08 +0800 Subject: [PATCH 81/93] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=20sshared=20v0?= =?UTF-8?q?.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/static-check.yaml | 2 +- jobs/jianshu/article_earning_ranking.py | 11 ++++------- jobs/jianshu/assets_ranking.py | 11 ++++------- jobs/jianshu/daily_update_ranking.py | 7 ++----- jobs/jianshu/lottery.py | 7 ++----- jobs/jianshu/lp_recommend.py | 7 ++----- jobs/jpep/ftn_trade.py | 2 -- main.py | 25 +++++++++++++++++++++++++ migrate_01_article_fp_rank.py | 6 +++--- migrate_02_assets_rank.py | 6 +++--- migrate_03_daily_update_rank.py | 6 +++--- migrate_04_lp_collections.py | 6 +++--- migrate_05_lottery_data.py | 6 +++--- migrate_06_jpep.py | 2 -- models/jianshu/user.py | 4 ++-- poetry.lock | 8 ++++---- pyproject.toml | 2 +- requirements-dev.txt | 2 +- requirements.txt | 2 +- utils/async_retry.py | 19 ------------------- 20 files changed, 64 insertions(+), 77 deletions(-) delete mode 100644 utils/async_retry.py diff --git a/.github/workflows/static-check.yaml b/.github/workflows/static-check.yaml index d3a4a73..f880d11 100644 --- a/.github/workflows/static-check.yaml +++ b/.github/workflows/static-check.yaml @@ -15,7 +15,7 @@ jobs: python-version: "3.x" cache: "poetry" - name: Install Dependencies - run: poetry install --all-extras --no-root + run: poetry install --all-extras - name: Lint With Ruff run: poetry run ruff check --output-format=github . - name: Type checking with Pyright diff --git a/jobs/jianshu/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py index fdd1e8f..bcfb51c 100644 --- a/jobs/jianshu/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -7,6 +7,7 @@ from jkit.user import UserInfo from prefect import flow, get_run_logger from prefect.states import Completed, State +from sshared.retry.asyncio import retry from sshared.time import get_today_as_datetime from models.jianshu.article_earning_ranking_record import ( @@ -14,15 +15,14 @@ ArticleField, EarningField, ) -from models.jianshu.user import JianshuUserDocument -from utils.async_retry import async_retry +from models.jianshu.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -@async_retry() +@retry(delay=5) async def get_author_slug_and_info( item: RecordField, / ) -> Tuple[Optional[str], Optional[UserInfo]]: @@ -53,7 +53,7 @@ async def process_item( author_slug, author_info = await get_author_slug_and_info(item) if author_slug is not None and author_info is not None: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=author_slug, id=author_info.id, name=author_info.name, @@ -81,9 +81,6 @@ async def process_item( ) ) async def flow_func() -> State: - await ArticleEarningRankingRecordDocument.ensure_indexes() - await JianshuUserDocument.ensure_indexes() - target_date = get_today_as_datetime() - timedelta(days=1) data: List[ArticleEarningRankingRecordDocument] = [] diff --git a/jobs/jianshu/assets_ranking.py b/jobs/jianshu/assets_ranking.py index 623a6fa..0f1b858 100644 --- a/jobs/jianshu/assets_ranking.py +++ b/jobs/jianshu/assets_ranking.py @@ -7,21 +7,21 @@ from jkit.user import User from prefect import flow, get_run_logger from prefect.states import Completed, State +from sshared.retry.asyncio import retry from sshared.time import get_today_as_datetime from models.jianshu.assets_ranking_record import ( AmountField, AssetsRankingRecordDocument, ) -from models.jianshu.user import JianshuUserDocument -from utils.async_retry import async_retry +from models.jianshu.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, ) -@async_retry() +@retry(delay=5) async def get_fp_ftn_amount( item: AssetsRankingRecord, / ) -> Tuple[Optional[float], Optional[float]]: @@ -56,7 +56,7 @@ async def process_item( fp_amount, ftn_amount = await get_fp_ftn_amount(item) if item.user_info.slug: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=item.user_info.slug, id=item.user_info.id, name=item.user_info.name, @@ -81,9 +81,6 @@ async def process_item( ) ) async def flow_func() -> State: - await AssetsRankingRecordDocument.ensure_indexes() - await JianshuUserDocument.ensure_indexes() - target_date = get_today_as_datetime() data: List[AssetsRankingRecordDocument] = [] diff --git a/jobs/jianshu/daily_update_ranking.py b/jobs/jianshu/daily_update_ranking.py index 38b27c1..59ae3d8 100644 --- a/jobs/jianshu/daily_update_ranking.py +++ b/jobs/jianshu/daily_update_ranking.py @@ -12,7 +12,7 @@ from models.jianshu.daily_update_ranking_record import ( DailyUpdateRankingRecordDocument, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -22,7 +22,7 @@ async def process_item( item: DailyUpdateRankingRecord, /, *, current_date: datetime ) -> DailyUpdateRankingRecordDocument: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=item.user_info.slug, name=item.user_info.name, avatar_url=item.user_info.avatar_url, @@ -42,9 +42,6 @@ async def process_item( ) ) async def flow_func() -> State: - await DailyUpdateRankingRecordDocument.ensure_indexes() - await JianshuUserDocument.ensure_indexes() - current_date = get_today_as_datetime() data: List[DailyUpdateRankingRecordDocument] = [] diff --git a/jobs/jianshu/lottery.py b/jobs/jianshu/lottery.py index cc98dcb..ce115b4 100644 --- a/jobs/jianshu/lottery.py +++ b/jobs/jianshu/lottery.py @@ -7,7 +7,7 @@ from models.jianshu.lottery_win_record import ( LotteryWinRecordDocument, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -15,7 +15,7 @@ async def process_item(item: LotteryWinRecord, /) -> LotteryWinRecordDocument: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=item.user_info.slug, updated_at=item.time, id=item.user_info.id, @@ -37,9 +37,6 @@ async def process_item(item: LotteryWinRecord, /) -> LotteryWinRecordDocument: ) ) async def flow_func() -> State: - await LotteryWinRecordDocument.ensure_indexes() - await JianshuUserDocument.ensure_indexes() - logger = get_run_logger() stop_id = await LotteryWinRecordDocument.get_latest_record_id() diff --git a/jobs/jianshu/lp_recommend.py b/jobs/jianshu/lp_recommend.py index 3997b25..22d11ca 100644 --- a/jobs/jianshu/lp_recommend.py +++ b/jobs/jianshu/lp_recommend.py @@ -9,7 +9,7 @@ from models.jianshu.lp_recommend_article_record import ( LPRecommendedArticleRecordDocument, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from utils.config_generators import ( generate_deployment_config, generate_flow_config, @@ -28,7 +28,7 @@ async def process_item( logger.warning(f"已保存过该文章记录,跳过 slug={item.slug}") return None - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=item.author_info.slug, id=item.author_info.id, name=item.author_info.name, @@ -59,9 +59,6 @@ async def process_item( ) ) async def flow_func() -> State: - await LPRecommendedArticleRecordDocument.ensure_indexes() - await JianshuUserDocument.ensure_indexes() - logger = get_run_logger() current_date = get_today_as_datetime() diff --git a/jobs/jpep/ftn_trade.py b/jobs/jpep/ftn_trade.py index e9050ef..9336399 100644 --- a/jobs/jpep/ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -83,8 +83,6 @@ async def process_item( ), ) async def flow_func(type: Literal["buy", "sell"]) -> State: # noqa: A002 - await FTNTradeOrderDocument.ensure_indexes() - fetch_time = get_fetch_time() data: List[FTNTradeOrderDocument] = [] diff --git a/main.py b/main.py index 96c078b..1b94017 100644 --- a/main.py +++ b/main.py @@ -3,9 +3,34 @@ from prefect import serve from jobs import DEPLOYMENTS +from models.jianshu.article_earning_ranking_record import ( + ArticleEarningRankingRecordDocument, +) +from models.jianshu.assets_ranking_record import AssetsRankingRecordDocument +from models.jianshu.daily_update_ranking_record import DailyUpdateRankingRecordDocument +from models.jianshu.lottery_win_record import LotteryWinRecordDocument +from models.jianshu.lp_recommend_article_record import ( + LPRecommendedArticleRecordDocument, +) +from models.jianshu.user import UserDocument as JianshuUserDocument +from models.jpep.credit_history import CreditHistoryDocument +from models.jpep.ftn_trade_order import FTNTradeOrderDocument +from models.jpep.user import UserDocument as JPEPUserDocument async def main() -> None: + print("正在为数据库创建索引...") + await ArticleEarningRankingRecordDocument.ensure_indexes() + await AssetsRankingRecordDocument.ensure_indexes() + await DailyUpdateRankingRecordDocument.ensure_indexes() + await LotteryWinRecordDocument.ensure_indexes() + await LPRecommendedArticleRecordDocument.ensure_indexes() + await JianshuUserDocument.ensure_indexes() + await CreditHistoryDocument.ensure_indexes() + await FTNTradeOrderDocument.ensure_indexes() + await JPEPUserDocument.ensure_indexes() + print("索引创建完成") + print("启动工作流...") await serve(*DEPLOYMENTS, print_starting_message=False) # type: ignore diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py index 1d6c234..8fec53b 100644 --- a/migrate_01_article_fp_rank.py +++ b/migrate_01_article_fp_rank.py @@ -10,7 +10,7 @@ ArticleField, EarningField, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from old_models.article_fp_rank import OldArticleFPRank from utils.migrate_helper import ( get_collection_data_count, @@ -25,13 +25,13 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: - await JianshuUserDocument.ensure_indexes() + await UserDocument.ensure_indexes() await ArticleEarningRankingRecordDocument.ensure_indexes() async def insert_or_update_user(item: OldArticleFPRank) -> None: if item.author.url: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=user_url_to_slug(item.author.url), updated_at=datetime.fromisoformat(item.date.isoformat()), id=item.author.id, diff --git a/migrate_02_assets_rank.py b/migrate_02_assets_rank.py index 37059df..ef6c4f2 100644 --- a/migrate_02_assets_rank.py +++ b/migrate_02_assets_rank.py @@ -9,7 +9,7 @@ AmountField, AssetsRankingRecordDocument, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from old_models.assets_rank import OldAssetsRank from utils.migrate_helper import ( get_collection_data_count, @@ -24,13 +24,13 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: - await JianshuUserDocument.ensure_indexes() + await UserDocument.ensure_indexes() await AssetsRankingRecordDocument.ensure_indexes() async def insert_or_update_user(item: OldAssetsRank) -> None: if item.user.url: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=user_url_to_slug(item.user.url), updated_at=datetime.fromisoformat(item.date.isoformat()), id=item.user.id, diff --git a/migrate_03_daily_update_rank.py b/migrate_03_daily_update_rank.py index 4b7c2e5..f95f7c4 100644 --- a/migrate_03_daily_update_rank.py +++ b/migrate_03_daily_update_rank.py @@ -6,7 +6,7 @@ from sspeedup.logging.run_logger import RunLogger from models.jianshu.daily_update_ranking_record import DailyUpdateRankingRecordDocument -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from old_models.daily_update_rank import OldDailyUpdateRank from utils.migrate_helper import ( get_collection_data_count, @@ -21,13 +21,13 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: - await JianshuUserDocument.ensure_indexes() + await UserDocument.ensure_indexes() await DailyUpdateRankingRecordDocument.ensure_indexes() async def insert_or_update_user(item: OldDailyUpdateRank) -> None: if item.user.url: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=user_url_to_slug(item.user.url), updated_at=datetime.fromisoformat(item.date.isoformat()), name=item.user.name, diff --git a/migrate_04_lp_collections.py b/migrate_04_lp_collections.py index a4e658b..f433f63 100644 --- a/migrate_04_lp_collections.py +++ b/migrate_04_lp_collections.py @@ -8,7 +8,7 @@ from models.jianshu.lp_recommend_article_record import ( LPRecommendedArticleRecordDocument, ) -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from old_models.lp_collections import OldLPCollections from utils.migrate_helper import ( get_collection_data_count, @@ -23,12 +23,12 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: - await JianshuUserDocument.ensure_indexes() + await UserDocument.ensure_indexes() await LPRecommendedArticleRecordDocument.ensure_indexes() async def insert_or_update_user(item: OldLPCollections) -> None: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=user_url_to_slug(item.author.url), updated_at=datetime.fromisoformat(item.fetch_date.isoformat()), id=item.author.id, diff --git a/migrate_05_lottery_data.py b/migrate_05_lottery_data.py index c70bfb8..85de6f0 100644 --- a/migrate_05_lottery_data.py +++ b/migrate_05_lottery_data.py @@ -5,7 +5,7 @@ from sspeedup.logging.run_logger import RunLogger from models.jianshu.lottery_win_record import LotteryWinRecordDocument -from models.jianshu.user import JianshuUserDocument +from models.jianshu.user import UserDocument from old_models.lottery_data import OldLotteryData from utils.migrate_helper import ( get_collection_data_count, @@ -19,13 +19,13 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: - await JianshuUserDocument.ensure_indexes() + await UserDocument.ensure_indexes() await LotteryWinRecordDocument.ensure_indexes() async def insert_or_update_user(item: OldLotteryData) -> None: if item.user.url: - await JianshuUserDocument.insert_or_update_one( + await UserDocument.insert_or_update_one( slug=user_url_to_slug(item.user.url), updated_at=item.time, id=item.user.id, diff --git a/migrate_06_jpep.py b/migrate_06_jpep.py index 9a2c147..03ffc87 100644 --- a/migrate_06_jpep.py +++ b/migrate_06_jpep.py @@ -3,7 +3,6 @@ from sspeedup.logging.run_logger import RunLogger -from models.jpep.credit_history import CreditHistoryDocument from models.jpep.ftn_trade_order import AmountField, FTNTradeOrderDocument from models.jpep.user import UserDocument from old_models.jpep_ftn_macket import OldJPEPFTNMacket @@ -21,7 +20,6 @@ async def ensure_all_old_collection_indexes() -> None: async def ensure_all_new_collection_indexes() -> None: await FTNTradeOrderDocument.ensure_indexes() await UserDocument.ensure_indexes() - await CreditHistoryDocument.ensure_indexes() async def insert_or_update_user(item: OldJPEPFTNMacket) -> None: diff --git a/models/jianshu/user.py b/models/jianshu/user.py index 2fed954..294c1ac 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -13,7 +13,7 @@ class JianshuUserStatus(Enum): INACCESSABLE = "INACCESSIBLE" -class JianshuUserDocument(Document, **MODEL_META): +class UserDocument(Document, **MODEL_META): slug: UserSlug status: JianshuUserStatus updated_at: datetime @@ -48,7 +48,7 @@ async def insert_or_update_one( if not await cls.is_record_exist(slug): await cls.insert_one( - JianshuUserDocument( + UserDocument( slug=slug, status=JianshuUserStatus.NORMAL, updated_at=updated_at, diff --git a/poetry.lock b/poetry.lock index f68d9bc..d70da7f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2604,13 +2604,13 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sshared" -version = "0.2.0" +version = "0.3.0" description = "后端共享组件" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "sshared-0.2.0-py3-none-any.whl", hash = "sha256:d2abb6889464081292caaf2d7604db5f288f5d5d625b2995af09e4765c1219e9"}, - {file = "sshared-0.2.0.tar.gz", hash = "sha256:a63b5515fca4eac890b6f7b74b23aab2f807bfb78c2cfacec4e06b995490c00e"}, + {file = "sshared-0.3.0-py3-none-any.whl", hash = "sha256:f04b0e4319155ed9bcfb35607966b78956725b5b8a85fbe93d83497060cc1cbe"}, + {file = "sshared-0.3.0.tar.gz", hash = "sha256:cc1892ce57886c5c926f91a1d126a5eadd06dff36facb69d63bb220ccc23f869"}, ] [package.dependencies] @@ -2997,4 +2997,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "fc3b60b593210233e2733901b279e422c67b6d3052e07bcdabdd60576ecc51d4" +content-hash = "34a5819cef02b33b6ffe4ecf0a410e3649606c78aec298dd8ae75249fbc8ed41" diff --git a/pyproject.toml b/pyproject.toml index 445f807..ce58047 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ python = "^3.8" prefect = "^2.16.0" jkit = "^3.0.0a16" sspeedup = "^0.25.0" -sshared = "^0.2.0" +sshared = "^0.3.0" [tool.poetry.group.dev.dependencies] ruff = "^0.3.0" diff --git a/requirements-dev.txt b/requirements-dev.txt index 56bd714..ab9943c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -95,7 +95,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 0a62b0f..b4a63d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -92,7 +92,7 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" diff --git a/utils/async_retry.py b/utils/async_retry.py deleted file mode 100644 index 2744cbd..0000000 --- a/utils/async_retry.py +++ /dev/null @@ -1,19 +0,0 @@ -from asyncio import sleep -from typing import Any, Callable - - -def async_retry(*, attempts: int = 3, delay: float = 5.0) -> Callable: - def outer(func: Callable) -> Callable: - async def inner(*args: Any, **kwargs: Any) -> Any: # noqa: ANN401 - for i in range(attempts): - try: - return await func(*args, **kwargs) - except Exception: # noqa: PERF203, BLE001 - if i == attempts - 1: - raise - await sleep(delay) - return None - - return inner - - return outer From 2d7d367c719a9e9474044d274d430775dc31dc19 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:21:06 +0800 Subject: [PATCH 82/93] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 333 +++++++++++++++++++++---------------------- requirements-dev.txt | 26 ++-- requirements.txt | 22 +-- 3 files changed, 190 insertions(+), 191 deletions(-) diff --git a/poetry.lock b/poetry.lock index d70da7f..daf048b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -76,13 +76,13 @@ trio = ["trio (<0.22)"] [[package]] name = "apprise" -version = "1.7.5" +version = "1.7.6" description = "Push Notifications that work with just about every platform!" optional = false python-versions = ">=3.6" files = [ - {file = "apprise-1.7.5-py3-none-any.whl", hash = "sha256:4e5bba4ba763b237f80a8e386266a5538e6be262c3da4d4578e877c556d7070c"}, - {file = "apprise-1.7.5.tar.gz", hash = "sha256:0ac34b27009d5c625e87d33ec85fa577062b57f3bced6d7223e17c5afbb40e68"}, + {file = "apprise-1.7.6-py3-none-any.whl", hash = "sha256:a98d815dbf950c92b5d8e7c2a4ec30e86257cece26a38ae62ec8fd8f7c551cb0"}, + {file = "apprise-1.7.6.tar.gz", hash = "sha256:077f09309cc8a6c9063dbd614b343807d527d546693b7fe8fc5a4433502fea6c"}, ] [package.dependencies] @@ -873,6 +873,20 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "humanize" +version = "4.9.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + [[package]] name = "hyperframe" version = "6.0.1" @@ -886,13 +900,13 @@ files = [ [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -960,6 +974,21 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jinja2-humanize-extension" +version = "0.4.0" +description = "a jinja2 extension to use humanize library inside jinja2 templates" +optional = false +python-versions = ">=3.0" +files = [ + {file = "jinja2_humanize_extension-0.4.0-py3-none-any.whl", hash = "sha256:b6326e2da0f7d425338bebf58848e830421defbce785f12ae812e65128518156"}, + {file = "jinja2_humanize_extension-0.4.0.tar.gz", hash = "sha256:e7d69b1c20f32815bbec722330ee8af14b1287bb1c2b0afa590dbf031cadeaa0"}, +] + +[package.dependencies] +humanize = ">=3.14.0" +jinja2 = "*" + [[package]] name = "jkit" version = "3.0.0a16" @@ -1067,13 +1096,13 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "mako" -version = "1.3.2" +version = "1.3.3" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.2-py3-none-any.whl", hash = "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c"}, - {file = "Mako-1.3.2.tar.gz", hash = "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e"}, + {file = "Mako-1.3.3-py3-none-any.whl", hash = "sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40"}, + {file = "Mako-1.3.3.tar.gz", hash = "sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73"}, ] [package.dependencies] @@ -1540,13 +1569,13 @@ files = [ [[package]] name = "prefect" -version = "2.16.8" +version = "2.17.1" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.16.8-py3-none-any.whl", hash = "sha256:f570f3be390a641169c1407bbf5eae34e28481a57764e87e68defdf59e47d0ee"}, - {file = "prefect-2.16.8.tar.gz", hash = "sha256:c75eb1feac78c888f20d917e4a73dfbcfaafb4cb2db7a71ccebaaf5b6285794c"}, + {file = "prefect-2.17.1-py3-none-any.whl", hash = "sha256:ab563d357d10b9c3d5e9d5c1e884b6a0e959c791d1d6c59244518ce44d509a39"}, + {file = "prefect-2.17.1.tar.gz", hash = "sha256:16a399d2dd41cab6d209ce899cc9bea234169a689c9596f79fc124e7aab1d522"}, ] [package.dependencies] @@ -1567,14 +1596,16 @@ docker = ">=4.0,<7.0" fsspec = ">=2022.5.0" graphviz = ">=0.20.1" griffe = ">=0.20.0" -httpcore = ">=0.15.0,<2.0.0" +httpcore = ">=1.0.5,<2.0.0" httpx = {version = ">=0.23,<0.23.2 || >0.23.2", extras = ["http2"]} +humanize = ">=4.9.0" importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} importlib-resources = ">=6.1.3,<6.2.0" itsdangerous = "*" jinja2 = ">=3.0.0,<4.0.0" +jinja2-humanize-extension = ">=0.4.0" jsonpatch = ">=1.32,<2.0" -jsonschema = ">=3.2.0,<5.0.0" +jsonschema = ">=4.0.0,<5.0.0" kubernetes = ">=24.2.0,<30.0.0" orjson = ">=3.7,<4.0" packaging = ">=21.3,<24.3" @@ -1584,6 +1615,7 @@ pendulum = [ {version = ">=3.0.0,<4", markers = "python_version >= \"3.12\""}, ] pydantic = {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0", extras = ["email"]} +pydantic-core = ">=2.12.0,<3.0.0" python-dateutil = ">=2.8.2,<3.0.0" python-multipart = ">=0.0.7" python-slugify = ">=5.0,<9.0" @@ -1596,7 +1628,7 @@ rich = ">=11.0,<14.0" sniffio = ">=1.3.0,<2.0.0" sqlalchemy = {version = ">=1.4.22,<1.4.33 || >1.4.33,<3.0.0", extras = ["asyncio"]} toml = ">=0.10.0" -typer = ">=0.4.2" +typer = ">=0.12.0,<0.12.2 || >0.12.2,<0.13.0" typing-extensions = ">=4.5.0,<5.0.0" ujson = ">=5.8.0,<6.0.0" uvicorn = ">=0.14.0,<0.29.0" @@ -1643,19 +1675,19 @@ files = [ [[package]] name = "pydantic" -version = "2.6.4" +version = "2.7.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, - {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, + {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, + {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, ] [package.dependencies] annotated-types = ">=0.4.0" email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} -pydantic-core = "2.16.3" +pydantic-core = "2.18.1" typing-extensions = ">=4.6.1" [package.extras] @@ -1663,90 +1695,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.3" -description = "" +version = "2.18.1" +description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, - {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, - {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, - {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, - {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, - {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, - {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, - {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, - {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, - {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, - {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, - {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, - {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, - {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, + {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, + {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, + {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, + {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, + {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, + {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, + {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, + {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, + {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, + {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, + {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, ] [package.dependencies] @@ -1872,13 +1904,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.356" +version = "1.1.358" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.356-py3-none-any.whl", hash = "sha256:a101b0f375f93d7082f9046cfaa7ba15b7cf8e1939ace45e984c351f6e8feb99"}, - {file = "pyright-1.1.356.tar.gz", hash = "sha256:f05b8b29d06b96ed4a0885dad5a31d9dff691ca12b2f658249f583d5f2754021"}, + {file = "pyright-1.1.358-py3-none-any.whl", hash = "sha256:0995b6a95eb11bd26f093cd5dee3d5e7258441b1b94d4a171b5dc5b79a1d4f4e"}, + {file = "pyright-1.1.358.tar.gz", hash = "sha256:185524a8d52f6f14bbd3b290b92ad905f25b964dddc9e7148aad760bd35c9f60"}, ] [package.dependencies] @@ -2442,44 +2474,44 @@ files = [ [[package]] name = "ruff" -version = "0.3.4" +version = "0.3.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, - {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, - {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, - {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, - {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, - {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, - {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, - {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, + {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, + {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, + {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, + {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, ] [[package]] name = "setuptools" -version = "69.2.0" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, - {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2670,63 +2702,30 @@ files = [ [[package]] name = "typer" -version = "0.12.0" +version = "0.12.3" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false python-versions = ">=3.7" files = [ - {file = "typer-0.12.0-py3-none-any.whl", hash = "sha256:0441a0bb8962fb4383b8537ada9f7eb2d0deda0caa2cfe7387cc221290f617e4"}, - {file = "typer-0.12.0.tar.gz", hash = "sha256:900fe786ce2d0ea44653d3c8ee4594a22a496a3104370ded770c992c5e3c542d"}, -] - -[package.dependencies] -typer-cli = "0.12.0" -typer-slim = {version = "0.12.0", extras = ["standard"]} - -[[package]] -name = "typer-cli" -version = "0.12.0" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -files = [ - {file = "typer_cli-0.12.0-py3-none-any.whl", hash = "sha256:7b7e2dd49f59974bb5a869747045d5444b17bffb851e006cd424f602d3578104"}, - {file = "typer_cli-0.12.0.tar.gz", hash = "sha256:603ed3d5a278827bd497e4dc73a39bb714b230371c8724090b0de2abdcdd9f6e"}, -] - -[package.dependencies] -typer-slim = {version = "0.12.0", extras = ["standard"]} - -[[package]] -name = "typer-slim" -version = "0.12.0" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -files = [ - {file = "typer_slim-0.12.0-py3-none-any.whl", hash = "sha256:ddd7042b29a32140528caa415750bcae54113ba0c32270ca11a6f64069ddadf9"}, - {file = "typer_slim-0.12.0.tar.gz", hash = "sha256:3e8a3f17286b173d76dca0fd4e02651c9a2ce1467b3754876b1ac4bd72572beb"}, + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, ] [package.dependencies] click = ">=8.0.0" -rich = {version = ">=10.11.0", optional = true, markers = "extra == \"standard\""} -shellingham = {version = ">=1.3.0", optional = true, markers = "extra == \"standard\""} +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["rich (>=10.11.0)", "shellingham (>=1.3.0)"] -standard = ["rich (>=10.11.0)", "shellingham (>=1.3.0)"] - [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] diff --git a/requirements-dev.txt b/requirements-dev.txt index ab9943c..9c1244e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.5 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.6 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -34,11 +34,13 @@ h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" httpcore==1.0.5 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" +humanize==4.9.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -idna==3.6 ; python_version >= "3.8" and python_version < "4.0" +idna==3.7 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" @@ -46,7 +48,7 @@ jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.3 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" @@ -61,15 +63,15 @@ pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.8 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.17.1 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.0 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.356 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.358 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -88,8 +90,8 @@ rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.3.4 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" @@ -99,10 +101,8 @@ sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" -typer-cli==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typer-slim[standard]==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typer==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" +typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index b4a63d3..320a8f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.5 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.7.6 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -34,11 +34,13 @@ h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" httpcore==1.0.5 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" +humanize==4.9.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -idna==3.6 ; python_version >= "3.8" and python_version < "4.0" +idna==3.7 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" @@ -46,7 +48,7 @@ jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -mako==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.3 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" @@ -60,12 +62,12 @@ pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.16.8 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.17.1 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.16.3 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.6.4 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.0 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" @@ -86,7 +88,7 @@ rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.2.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" @@ -96,10 +98,8 @@ sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" -typer-cli==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typer-slim[standard]==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typer==0.12.0 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.10.0 ; python_version >= "3.8" and python_version < "4.0" +typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" From 78bca9045ba7fba4583ea7da32ab74c9f86752f8 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:22:57 +0800 Subject: [PATCH 83/93] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=AE=B0=E5=BD=95=E6=96=B0=E5=A2=9E=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jpep/ftn_trade.py | 12 +++++------- models/jianshu/user.py | 20 +++++++++----------- models/jpep/user.py | 33 +++++++++++++++------------------ 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/jobs/jpep/ftn_trade.py b/jobs/jpep/ftn_trade.py index 9336399..65fddd3 100644 --- a/jobs/jpep/ftn_trade.py +++ b/jobs/jpep/ftn_trade.py @@ -52,13 +52,11 @@ async def process_item( item.publisher_info.id ) if not latest_credit_value or latest_credit_value != item.publisher_info.credit: - await CreditHistoryDocument.insert_one( - CreditHistoryDocument( - time=fetch_time, - user_id=item.publisher_info.id, - value=item.publisher_info.credit, - ) - ) + await CreditHistoryDocument( + time=fetch_time, + user_id=item.publisher_info.id, + value=item.publisher_info.credit, + ).save() return FTNTradeOrderDocument( fetch_time=fetch_time, diff --git a/models/jianshu/user.py b/models/jianshu/user.py index 294c1ac..a9342b9 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -47,17 +47,15 @@ async def insert_or_update_one( updated_at = datetime.now() if not await cls.is_record_exist(slug): - await cls.insert_one( - UserDocument( - slug=slug, - status=JianshuUserStatus.NORMAL, - updated_at=updated_at, - id=id, - name=name, - history_names=[], - avatar_url=avatar_url, - ) - ) + await UserDocument( + slug=slug, + status=JianshuUserStatus.NORMAL, + updated_at=updated_at, + id=id, + name=name, + history_names=[], + avatar_url=avatar_url, + ).save() return db_data = await cls.find_one({"slug": slug}) diff --git a/models/jpep/user.py b/models/jpep/user.py index 3f750a2..b19c48b 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -44,15 +44,14 @@ async def insert_or_update_one( updated_at = datetime.now() if not await cls.is_record_exist(id): - await cls.insert_one( - UserDocument( - updated_at=updated_at, - id=id, - name=name, - hashed_name=hashed_name, - avatar_url=avatar_url, - ) - ) + await UserDocument( + updated_at=updated_at, + id=id, + name=name, + hashed_name=hashed_name, + avatar_url=avatar_url, + ).save() + return db_data = await cls.find_one({"id": id}) if not db_data: @@ -88,12 +87,10 @@ async def insert_one_if_not_exist( hashed_name: Optional[str], ) -> None: if not await cls.is_record_exist(id): - await cls.insert_one( - UserDocument( - updated_at=updated_at, - id=id, - name=name, - hashed_name=hashed_name, - avatar_url=None, - ) - ) + await UserDocument( + updated_at=updated_at, + id=id, + name=name, + hashed_name=hashed_name, + avatar_url=None, + ).save() From 4239a1970d669985719474a15b287a12ed64730e Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:23:44 +0800 Subject: [PATCH 84/93] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrate_01_article_fp_rank.py | 118 -------------------------------- migrate_02_assets_rank.py | 111 ------------------------------ migrate_03_daily_update_rank.py | 105 ---------------------------- migrate_04_lp_collections.py | 117 ------------------------------- migrate_05_lottery_data.py | 86 ----------------------- migrate_06_jpep.py | 93 ------------------------- utils/migrate_helper.py | 17 ----- 7 files changed, 647 deletions(-) delete mode 100644 migrate_01_article_fp_rank.py delete mode 100644 migrate_02_assets_rank.py delete mode 100644 migrate_03_daily_update_rank.py delete mode 100644 migrate_04_lp_collections.py delete mode 100644 migrate_05_lottery_data.py delete mode 100644 migrate_06_jpep.py delete mode 100644 utils/migrate_helper.py diff --git a/migrate_01_article_fp_rank.py b/migrate_01_article_fp_rank.py deleted file mode 100644 index 8fec53b..0000000 --- a/migrate_01_article_fp_rank.py +++ /dev/null @@ -1,118 +0,0 @@ -import asyncio -from datetime import datetime -from typing import List - -from jkit.identifier_convert import article_url_to_slug, user_url_to_slug -from sspeedup.logging.run_logger import RunLogger - -from models.jianshu.article_earning_ranking_record import ( - ArticleEarningRankingRecordDocument, - ArticleField, - EarningField, -) -from models.jianshu.user import UserDocument -from old_models.article_fp_rank import OldArticleFPRank -from utils.migrate_helper import ( - get_collection_data_count, - get_collection_data_time_range, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldArticleFPRank.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await UserDocument.ensure_indexes() - await ArticleEarningRankingRecordDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldArticleFPRank) -> None: - if item.author.url: - await UserDocument.insert_or_update_one( - slug=user_url_to_slug(item.author.url), - updated_at=datetime.fromisoformat(item.date.isoformat()), - id=item.author.id, - name=item.author.name, - ) - - -async def convert_item(item: OldArticleFPRank) -> ArticleEarningRankingRecordDocument: - return ArticleEarningRankingRecordDocument( - date=item.date, - ranking=item.ranking, - article=ArticleField( - slug=article_url_to_slug(item.article.url) if item.article.url else None, - title=item.article.title, - ), - author_slug=user_url_to_slug(item.author.url) if item.author.url else None, - earning=EarningField( - to_author=item.reward.to_author, to_voter=item.reward.to_voter - ), - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await get_collection_data_count(OldArticleFPRank) - old_start_time, old_end_time = await get_collection_data_time_range( - OldArticleFPRank, "date" - ) - logger.info( - f"旧集合数据量:{old_data_count}," - f"数据时间范围:{old_start_time} - {old_end_time}" - ) - - data_to_save: List[ArticleEarningRankingRecordDocument] = [] - async for item in OldArticleFPRank.find_many( - sort={"date": "ASC", "ranking": "ASC"} - ): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 1000: - await ArticleEarningRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - if len(data_to_save): - await ArticleEarningRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count( - ArticleEarningRankingRecordDocument - ) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - new_start_time, new_end_time = await get_collection_data_time_range( - ArticleEarningRankingRecordDocument, "date" - ) - if old_start_time != new_start_time or old_end_time != new_end_time: - logger.critical( - "数据时间范围不匹配" - f"(迁移前 {old_start_time} - {old_end_time}," - f"迁移后 {new_start_time} - {new_end_time})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/migrate_02_assets_rank.py b/migrate_02_assets_rank.py deleted file mode 100644 index ef6c4f2..0000000 --- a/migrate_02_assets_rank.py +++ /dev/null @@ -1,111 +0,0 @@ -import asyncio -from datetime import datetime -from typing import List - -from jkit.identifier_convert import user_url_to_slug -from sspeedup.logging.run_logger import RunLogger - -from models.jianshu.assets_ranking_record import ( - AmountField, - AssetsRankingRecordDocument, -) -from models.jianshu.user import UserDocument -from old_models.assets_rank import OldAssetsRank -from utils.migrate_helper import ( - get_collection_data_count, - get_collection_data_time_range, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldAssetsRank.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await UserDocument.ensure_indexes() - await AssetsRankingRecordDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldAssetsRank) -> None: - if item.user.url: - await UserDocument.insert_or_update_one( - slug=user_url_to_slug(item.user.url), - updated_at=datetime.fromisoformat(item.date.isoformat()), - id=item.user.id, - name=item.user.name, - ) - - -async def convert_item(item: OldAssetsRank) -> AssetsRankingRecordDocument: - return AssetsRankingRecordDocument( - date=item.date, - ranking=item.ranking, - amount=AmountField( - fp=item.assets.fp, - ftn=item.assets.ftn, - assets=item.assets.total, - ), - user_slug=user_url_to_slug(item.user.url) if item.user.url else None, - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await get_collection_data_count(OldAssetsRank) - old_start_time, old_end_time = await get_collection_data_time_range( - OldAssetsRank, "date" - ) - logger.info( - f"旧集合数据量:{old_data_count}," - f"数据时间范围:{old_start_time} - {old_end_time}" - ) - - data_to_save: List[AssetsRankingRecordDocument] = [] - async for item in OldAssetsRank.find_many(sort={"date": "ASC", "ranking": "ASC"}): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 1000: - await AssetsRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - if len(data_to_save): - await AssetsRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count(AssetsRankingRecordDocument) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - new_start_time, new_end_time = await get_collection_data_time_range( - AssetsRankingRecordDocument, "date" - ) - if old_start_time != new_start_time or old_end_time != new_end_time: - logger.critical( - "数据时间范围不匹配" - f"(迁移前 {old_start_time} - {old_end_time}," - f"迁移后 {new_start_time} - {new_end_time})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/migrate_03_daily_update_rank.py b/migrate_03_daily_update_rank.py deleted file mode 100644 index f95f7c4..0000000 --- a/migrate_03_daily_update_rank.py +++ /dev/null @@ -1,105 +0,0 @@ -import asyncio -from datetime import datetime -from typing import List - -from jkit.identifier_convert import user_url_to_slug -from sspeedup.logging.run_logger import RunLogger - -from models.jianshu.daily_update_ranking_record import DailyUpdateRankingRecordDocument -from models.jianshu.user import UserDocument -from old_models.daily_update_rank import OldDailyUpdateRank -from utils.migrate_helper import ( - get_collection_data_count, - get_collection_data_time_range, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldDailyUpdateRank.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await UserDocument.ensure_indexes() - await DailyUpdateRankingRecordDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldDailyUpdateRank) -> None: - if item.user.url: - await UserDocument.insert_or_update_one( - slug=user_url_to_slug(item.user.url), - updated_at=datetime.fromisoformat(item.date.isoformat()), - name=item.user.name, - ) - - -async def convert_item(item: OldDailyUpdateRank) -> DailyUpdateRankingRecordDocument: - return DailyUpdateRankingRecordDocument( - date=item.date, - ranking=item.ranking, - days=item.days, - user_slug=user_url_to_slug(item.user.url), - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await get_collection_data_count(OldDailyUpdateRank) - old_start_time, old_end_time = await get_collection_data_time_range( - OldDailyUpdateRank, "date" - ) - logger.info( - f"旧集合数据量:{old_data_count}," - f"数据时间范围:{old_start_time} - {old_end_time}" - ) - - data_to_save: List[DailyUpdateRankingRecordDocument] = [] - async for item in OldDailyUpdateRank.find_many( - sort={"date": "ASC", "ranking": "ASC"} - ): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 1000: - await DailyUpdateRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - if len(data_to_save): - await DailyUpdateRankingRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count(DailyUpdateRankingRecordDocument) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - new_start_time, new_end_time = await get_collection_data_time_range( - DailyUpdateRankingRecordDocument, "date" - ) - if old_start_time != new_start_time or old_end_time != new_end_time: - logger.critical( - "数据时间范围不匹配" - f"(迁移前 {old_start_time} - {old_end_time}," - f"迁移后 {new_start_time} - {new_end_time})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/migrate_04_lp_collections.py b/migrate_04_lp_collections.py deleted file mode 100644 index f433f63..0000000 --- a/migrate_04_lp_collections.py +++ /dev/null @@ -1,117 +0,0 @@ -import asyncio -from datetime import datetime -from typing import List - -from jkit.identifier_convert import article_url_to_slug, user_url_to_slug -from sspeedup.logging.run_logger import RunLogger - -from models.jianshu.lp_recommend_article_record import ( - LPRecommendedArticleRecordDocument, -) -from models.jianshu.user import UserDocument -from old_models.lp_collections import OldLPCollections -from utils.migrate_helper import ( - get_collection_data_count, - get_collection_data_time_range, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldLPCollections.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await UserDocument.ensure_indexes() - await LPRecommendedArticleRecordDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldLPCollections) -> None: - await UserDocument.insert_or_update_one( - slug=user_url_to_slug(item.author.url), - updated_at=datetime.fromisoformat(item.fetch_date.isoformat()), - id=item.author.id, - name=item.author.name, - ) - - -async def convert_item(item: OldLPCollections) -> LPRecommendedArticleRecordDocument: - return LPRecommendedArticleRecordDocument( - date=item.fetch_date, - id=item.article.id, - slug=article_url_to_slug(item.article.url), - title=item.article.title, - published_at=item.article.release_time, - views_count=item.article.views_count, - likes_count=item.article.likes_count, - comments_count=item.article.comments_count, - tips_count=item.article.rewards_count, - earned_fp_amount=item.article.total_fp_amount, - is_paid=item.article.is_paid, - can_comment=item.article.is_commentable, - description=item.article.summary, - author_slug=user_url_to_slug(item.author.url), - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await get_collection_data_count(OldLPCollections) - old_start_time, old_end_time = await get_collection_data_time_range( - OldLPCollections, "fetch_date" - ) - logger.info( - f"旧集合数据量:{old_data_count}," - f"数据时间范围:{old_start_time} - {old_end_time}" - ) - - data_to_save: List[LPRecommendedArticleRecordDocument] = [] - async for item in OldLPCollections.find_many( - sort={"date": "ASC", "ranking": "ASC"} - ): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 1000: - await LPRecommendedArticleRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - if len(data_to_save): - await LPRecommendedArticleRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的日期为 {data_to_save[-1].date}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count(LPRecommendedArticleRecordDocument) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - new_start_time, new_end_time = await get_collection_data_time_range( - LPRecommendedArticleRecordDocument, "date" - ) - if old_start_time != new_start_time or old_end_time != new_end_time: - logger.critical( - "数据时间范围不匹配" - f"(迁移前 {old_start_time} - {old_end_time}," - f"迁移后 {new_start_time} - {new_end_time})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/migrate_05_lottery_data.py b/migrate_05_lottery_data.py deleted file mode 100644 index 85de6f0..0000000 --- a/migrate_05_lottery_data.py +++ /dev/null @@ -1,86 +0,0 @@ -import asyncio -from typing import List - -from jkit.identifier_convert import user_url_to_slug -from sspeedup.logging.run_logger import RunLogger - -from models.jianshu.lottery_win_record import LotteryWinRecordDocument -from models.jianshu.user import UserDocument -from old_models.lottery_data import OldLotteryData -from utils.migrate_helper import ( - get_collection_data_count, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldLotteryData.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await UserDocument.ensure_indexes() - await LotteryWinRecordDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldLotteryData) -> None: - if item.user.url: - await UserDocument.insert_or_update_one( - slug=user_url_to_slug(item.user.url), - updated_at=item.time, - id=item.user.id, - name=item.user.name, - ) - - -async def convert_item(item: OldLotteryData) -> LotteryWinRecordDocument: - return LotteryWinRecordDocument( - id=item._id, - time=item.time, - award_name=item.reward_name, - user_slug=user_url_to_slug(item.user.url), - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await get_collection_data_count(OldLotteryData) - logger.info(f"旧集合数据量:{old_data_count}") - - data_to_save: List[LotteryWinRecordDocument] = [] - async for item in OldLotteryData.find_many(sort={"date": "ASC", "ranking": "ASC"}): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 1000: - await LotteryWinRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的 ID 为 {data_to_save[-1].id}" - ) - data_to_save.clear() - - if len(data_to_save): - await LotteryWinRecordDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的 ID 为 {data_to_save[-1].id}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count(LotteryWinRecordDocument) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/migrate_06_jpep.py b/migrate_06_jpep.py deleted file mode 100644 index 03ffc87..0000000 --- a/migrate_06_jpep.py +++ /dev/null @@ -1,93 +0,0 @@ -import asyncio -from typing import List - -from sspeedup.logging.run_logger import RunLogger - -from models.jpep.ftn_trade_order import AmountField, FTNTradeOrderDocument -from models.jpep.user import UserDocument -from old_models.jpep_ftn_macket import OldJPEPFTNMacket -from utils.migrate_helper import ( - get_collection_data_count, -) - -logger = RunLogger() - - -async def ensure_all_old_collection_indexes() -> None: - await OldJPEPFTNMacket.ensure_indexes() - - -async def ensure_all_new_collection_indexes() -> None: - await FTNTradeOrderDocument.ensure_indexes() - await UserDocument.ensure_indexes() - - -async def insert_or_update_user(item: OldJPEPFTNMacket) -> None: - await UserDocument.insert_one_if_not_exist( - updated_at=item.fetch_time, - id=item.user.id, - name=item.user.name, - hashed_name=item.user.name_md5, - ) - - -async def convert_item(item: OldJPEPFTNMacket) -> FTNTradeOrderDocument: - return FTNTradeOrderDocument( - fetch_time=item.fetch_time, - id=item.order_id, - published_at=item.publish_time, - type=item.trade_type, - price=item.price, - traded_count=item.transactions_count, - amount=AmountField( - total=item.amount.total, - traded=item.amount.traded, - tradable=item.amount.tradable, - minimum_trade=item.minimum_trade_count, - ), - publisher_id=item.user.id, - ) - - -async def main() -> None: - await ensure_all_old_collection_indexes() - logger.info("已为旧版数据构建索引") - await ensure_all_new_collection_indexes() - logger.info("已为新版数据构建索引") - - old_data_count = await OldJPEPFTNMacket.get_collection().estimated_document_count() - logger.info(f"旧集合数据量:{old_data_count}") - - data_to_save: List[FTNTradeOrderDocument] = [] - async for item in OldJPEPFTNMacket.find_many(sort={"fetch_time": "ASC"}): - await insert_or_update_user(item) - data_to_save.append(await convert_item(item)) - - if len(data_to_save) == 5000: - await FTNTradeOrderDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的时间为 {data_to_save[-1].fetch_time}" - ) - data_to_save.clear() - - if len(data_to_save): - await FTNTradeOrderDocument.insert_many(data_to_save) - logger.debug( - f"已转换 {len(data_to_save)} 条数据," - f"最新数据的时间为 {data_to_save[-1].fetch_time}" - ) - data_to_save.clear() - - logger.info("数据转换完成,开始校验") - new_data_count = await get_collection_data_count(FTNTradeOrderDocument) - if old_data_count != new_data_count: - logger.critical( - f"数据量不匹配(迁移前 {old_data_count}," f"迁移后 {new_data_count})" - ) - exit() - - logger.info("校验成功,迁移流程结束") - - -asyncio.run(main()) diff --git a/utils/migrate_helper.py b/utils/migrate_helper.py deleted file mode 100644 index df57dbf..0000000 --- a/utils/migrate_helper.py +++ /dev/null @@ -1,17 +0,0 @@ -from datetime import datetime -from typing import Tuple, Type - -from sshared.mongo import Document - - -async def get_collection_data_count(document: Type[Document]) -> int: - return await document.count() - - -async def get_collection_data_time_range( - document: Type[Document], key: str -) -> Tuple[datetime, datetime]: - start_time = (await document.find_one(sort={key: "ASC"})).__getattribute__(key) - end_time = (await document.find_one(sort={key: "DESC"})).__getattribute__(key) - - return (start_time, end_time) From 1762d91b9d106122321227e93e226e4c4f52dab0 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:24:01 +0800 Subject: [PATCH 85/93] =?UTF-8?q?chore:=20=E6=9B=B4=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 343f758..2445c4d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,7 @@ networks: services: main: image: jfetcher:3.0.0 + container_name: jfetcher build: . volumes: - ./config.yaml:/app/config.yaml:ro From fa4eaa7f55b12eea76b6757eb1622eddb09d3b3d Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 14 Apr 2024 09:24:39 +0800 Subject: [PATCH 86/93] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E7=89=88=E6=95=B0=E6=8D=AE=E5=BA=93=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- old_models/__init__.py | 3 --- old_models/article_fp_rank.py | 37 ----------------------------- old_models/assets_rank.py | 31 ------------------------- old_models/daily_update_rank.py | 22 ------------------ old_models/jpep_ftn_macket.py | 39 ------------------------------- old_models/lottery_data.py | 24 ------------------- old_models/lp_collections.py | 41 --------------------------------- 7 files changed, 197 deletions(-) delete mode 100644 old_models/__init__.py delete mode 100644 old_models/article_fp_rank.py delete mode 100644 old_models/assets_rank.py delete mode 100644 old_models/daily_update_rank.py delete mode 100644 old_models/jpep_ftn_macket.py delete mode 100644 old_models/lottery_data.py delete mode 100644 old_models/lp_collections.py diff --git a/old_models/__init__.py b/old_models/__init__.py deleted file mode 100644 index 228da90..0000000 --- a/old_models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from utils.db import _CLIENT - -OLD_DB = _CLIENT.JFetcherData diff --git a/old_models/article_fp_rank.py b/old_models/article_fp_rank.py deleted file mode 100644 index f6dc15a..0000000 --- a/old_models/article_fp_rank.py +++ /dev/null @@ -1,37 +0,0 @@ -from datetime import datetime -from typing import Optional - -from msgspec import field -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldArticleField(Field, **MODEL_META): - title: Optional[str] - url: Optional[str] - - -class OldAuthorField(Field, **MODEL_META): - name: Optional[str] = None - id: Optional[int] = None - url: Optional[str] = None - - -class OldRewardField(Field, **MODEL_META): - to_author: float = field(name="to_author") - to_voter: float = field(name="to_voter") - total: float - - -class OldArticleFPRank(Document, **MODEL_META): - date: datetime - ranking: int - - article: OldArticleField - author: OldAuthorField - reward: OldRewardField - - class Meta: # type: ignore - collection = OLD_DB.article_FP_rank - indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/old_models/assets_rank.py b/old_models/assets_rank.py deleted file mode 100644 index 6c76580..0000000 --- a/old_models/assets_rank.py +++ /dev/null @@ -1,31 +0,0 @@ -from datetime import datetime -from typing import Optional - -from msgspec import field -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldUserField(Field, **MODEL_META): - id: Optional[int] - url: Optional[str] - name: Optional[str] - - -class OldAssetsField(Field, **MODEL_META): - fp: Optional[float] = field(name="FP") - ftn: Optional[float] = field(name="FTN") - total: Optional[float] - - -class OldAssetsRank(Document, **MODEL_META): - date: datetime - ranking: int - - user: OldUserField - assets: OldAssetsField - - class Meta: # type: ignore - collection = OLD_DB.assets_rank - indexes = (Index(keys=("date", "ranking"), unique=True),) diff --git a/old_models/daily_update_rank.py b/old_models/daily_update_rank.py deleted file mode 100644 index 287eaeb..0000000 --- a/old_models/daily_update_rank.py +++ /dev/null @@ -1,22 +0,0 @@ -from datetime import datetime - -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldUserField(Field, **MODEL_META): - url: str - name: str - - -class OldDailyUpdateRank(Document, **MODEL_META): - date: datetime - ranking: int - - user: OldUserField - days: int - - class Meta: # type: ignore - collection = OLD_DB.daily_update_rank - indexes = (Index(keys=("date", "ranking")),) diff --git a/old_models/jpep_ftn_macket.py b/old_models/jpep_ftn_macket.py deleted file mode 100644 index 26c5b69..0000000 --- a/old_models/jpep_ftn_macket.py +++ /dev/null @@ -1,39 +0,0 @@ -from datetime import datetime -from typing import Literal, Optional - -from msgspec import field -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldAmountField(Field, **MODEL_META): - total: int - traded: int - remaining: int - tradable: int - - -class OldUserField(Field, **MODEL_META): - id: int - name: str - name_md5: Optional[str] = field(name="name_md5") - - -class OldJPEPFTNMacket(Document, **MODEL_META): - fetch_time: datetime = field(name="fetch_time") - order_id: int = field(name="order_id") - trade_type: Literal["buy", "sell"] = field(name="trade_type") - publish_time: datetime = field(name="publish_time") - is_anonymous: bool = field(name="is_anonymous") - price: float - - amount: OldAmountField - traded_percentage: float = field(name="traded_percentage") - minimum_trade_count: int = field(name="minimum_trade_count") - transactions_count: int = field(name="transactions_count") - user: OldUserField - - class Meta: # type: ignore - collection = OLD_DB.JPEP_FTN_macket - indexes = (Index(keys=("fetch_time",)),) diff --git a/old_models/lottery_data.py b/old_models/lottery_data.py deleted file mode 100644 index 44dda68..0000000 --- a/old_models/lottery_data.py +++ /dev/null @@ -1,24 +0,0 @@ -from datetime import datetime - -from msgspec import field -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldUserField(Field, **MODEL_META): - id: int - url: str - name: str - - -class OldLotteryData(Document, **MODEL_META): - _id: int - time: datetime - reward_name: str = field(name="reward_name") - - user: OldUserField - - class Meta: # type: ignore - collection = OLD_DB.lottery_data - indexes = (Index(keys=("time",)),) diff --git a/old_models/lp_collections.py b/old_models/lp_collections.py deleted file mode 100644 index f27e06b..0000000 --- a/old_models/lp_collections.py +++ /dev/null @@ -1,41 +0,0 @@ -from datetime import datetime - -from msgspec import field -from sshared.mongo import MODEL_META, Document, Field, Index - -from old_models import OLD_DB - - -class OldArticleField(Field, **MODEL_META): - id: int - url: str - title: str - release_time: datetime = field(name="release_time") - - views_count: int = field(name="views_count") - likes_count: int = field(name="likes_count") - comments_count: int = field(name="comments_count") - rewards_count: int = field(name="rewards_count") - total_fp_amount: float = field(name="total_FP_amount") - - is_paid: bool = field(name="is_paid") - is_commentable: bool = field(name="is_commentable") - summary: str - - -class OldAuthorField(Field, **MODEL_META): - id: int - url: str - name: str - - -class OldLPCollections(Document, **MODEL_META): - fetch_date: datetime = field(name="fetch_date") - from_collection: str = field(name="from_collection") - - article: OldArticleField - author: OldAuthorField - - class Meta: # type: ignore - collection = OLD_DB.LP_collections - indexes = (Index(keys=("fetch_date",)),) From 4c83e429adc9ef340ebeec55b12b88723c850663 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 16 May 2024 17:40:40 +0800 Subject: [PATCH 87/93] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 11 ++++++++--- docker-compose.yml | 3 +-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index df09dd7..4900a2e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,8 @@ -**/__pycache__ -poetry.lock -config.yaml \ No newline at end of file +**/.git/ +**/.github/ +**/.ruff_cache/ +**/__pycache__/ +**/pyproject.toml +**/poetry.lock +**/requirements-dev.txt +**/config.yaml \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2445c4d..bfdc092 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ networks: services: main: image: jfetcher:3.0.0 - container_name: jfetcher + container_name: jfetcher-v3 build: . volumes: - ./config.yaml:/app/config.yaml:ro @@ -25,4 +25,3 @@ services: condition: on-failure delay: 5s max_attempts: 3 - stop_grace_period: 5s From 737d0ddb9a243237f95881ca63a27cfbe8790a5a Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 16 May 2024 17:41:49 +0800 Subject: [PATCH 88/93] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=95=9C=E5=83=8F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ab26482..8e1495f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,10 @@ -FROM python:3.10.8-slim +FROM python:3.10-slim ENV TZ Asia/Shanghai WORKDIR /app COPY requirements.txt . - RUN pip install \ -r requirements.txt \ --no-cache-dir \ From d3c1f5fd687fe15e90a6cfd59b9f612876421e06 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 16 May 2024 17:47:22 +0800 Subject: [PATCH 89/93] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=20`pyproject.t?= =?UTF-8?q?oml`=20=E4=B8=AD=E7=9A=84=E5=A4=9A=E4=BD=99=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ce58047..96379f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,4 @@ [tool.poetry] -name = "jfetcher" -version = "3.0.0" -description = "简书数据采集服务" -authors = ["yezi "] -license = "MIT" -readme = "README.md" package-mode = false [tool.poetry.dependencies] @@ -29,9 +23,8 @@ target-version = "py38" lint.select = [ "A", "ANN", "ARG", "ASYNC", "B", "BLE", "C4", "E", "F", "I", - "ICN", "ISC", "N", "PERF", "PIE", - "PT", "Q", "RET", "RSE", "RUF", - "S", "SIM", "SLOT", "TCH", "UP", - "W" + "ICN", "ISC", "N", "PIE", "PT", + "Q", "RET", "RSE", "RUF", "S", + "SIM", "SLOT", "TCH", "UP", "W" ] lint.ignore = ["ANN101", "ANN102", "ISC001", "RUF001", "RUF002", "RUF003"] \ No newline at end of file From af73d41483b4762bafa937b19342c374a7cb6e62 Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 16 May 2024 17:53:01 +0800 Subject: [PATCH 90/93] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 1272 +++++++++++++++++++++--------------------- pyproject.toml | 6 +- requirements-dev.txt | 54 +- requirements.txt | 50 +- 4 files changed, 687 insertions(+), 695 deletions(-) diff --git a/poetry.lock b/poetry.lock index daf048b..b4c2c68 100644 --- a/poetry.lock +++ b/poetry.lock @@ -76,13 +76,13 @@ trio = ["trio (<0.22)"] [[package]] name = "apprise" -version = "1.7.6" +version = "1.8.0" description = "Push Notifications that work with just about every platform!" optional = false python-versions = ">=3.6" files = [ - {file = "apprise-1.7.6-py3-none-any.whl", hash = "sha256:a98d815dbf950c92b5d8e7c2a4ec30e86257cece26a38ae62ec8fd8f7c551cb0"}, - {file = "apprise-1.7.6.tar.gz", hash = "sha256:077f09309cc8a6c9063dbd614b343807d527d546693b7fe8fc5a4433502fea6c"}, + {file = "apprise-1.8.0-py3-none-any.whl", hash = "sha256:29307f9b7eeb5db70de13bd19f7f98700ad75369d14d1dcc49a6fcc06ed8a546"}, + {file = "apprise-1.8.0.tar.gz", hash = "sha256:e8f58cebfea1a34f569cb4c68809a3175be80ec06f0a2ec473522b92023212c5"}, ] [package.dependencies] @@ -471,13 +471,13 @@ files = [ [[package]] name = "croniter" -version = "2.0.3" +version = "2.0.5" description = "croniter provides iteration for datetime object with cron like format" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6" files = [ - {file = "croniter-2.0.3-py2.py3-none-any.whl", hash = "sha256:84dc95b2eb6760144cc01eca65a6b9cc1619c93b2dc37d8a27f4319b3eb740de"}, - {file = "croniter-2.0.3.tar.gz", hash = "sha256:28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1"}, + {file = "croniter-2.0.5-py2.py3-none-any.whl", hash = "sha256:fdbb44920944045cc323db54599b321325141d82d14fa7453bc0699826bbe9ed"}, + {file = "croniter-2.0.5.tar.gz", hash = "sha256:f1f8ca0af64212fbe99b1bee125ee5a1b53a9c1b433968d8bca8817b79d237f3"}, ] [package.dependencies] @@ -486,43 +486,43 @@ pytz = ">2021.1" [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -618,13 +618,13 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -632,13 +632,13 @@ test = ["pytest (>=6)"] [[package]] name = "fsspec" -version = "2024.3.1" +version = "2024.5.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, - {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.extras] @@ -646,7 +646,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -663,6 +663,9 @@ s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] [[package]] @@ -777,13 +780,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.42.1" +version = "0.45.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, - {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, + {file = "griffe-0.45.0-py3-none-any.whl", hash = "sha256:90fe5c90e1b0ca7dd6fee78f9009f4e01b37dbc9ab484a9b2c1578915db1e571"}, + {file = "griffe-0.45.0.tar.gz", hash = "sha256:85cb2868d026ea51c89bdd589ad3ccc94abc5bd8d5d948e3d4450778a2a05b4a"}, ] [package.dependencies] @@ -948,24 +951,24 @@ testing = ["jaraco.collections", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "py [[package]] name = "itsdangerous" -version = "2.1.2" +version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, ] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -1032,13 +1035,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.22.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] [package.dependencies] @@ -1096,13 +1099,13 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "mako" -version = "1.3.3" +version = "1.3.5" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.3-py3-none-any.whl", hash = "sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40"}, - {file = "Mako-1.3.3.tar.gz", hash = "sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73"}, + {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, + {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, ] [package.dependencies] @@ -1343,62 +1346,57 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "orjson" -version = "3.10.0" +version = "3.10.3" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47af5d4b850a2d1328660661f0881b67fdbe712aea905dadd413bdea6f792c33"}, - {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c90681333619d78360d13840c7235fdaf01b2b129cb3a4f1647783b1971542b6"}, - {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:400c5b7c4222cb27b5059adf1fb12302eebcabf1978f33d0824aa5277ca899bd"}, - {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dcb32e949eae80fb335e63b90e5808b4b0f64e31476b3777707416b41682db5"}, - {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7d507c7493252c0a0264b5cc7e20fa2f8622b8a83b04d819b5ce32c97cf57b"}, - {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e286a51def6626f1e0cc134ba2067dcf14f7f4b9550f6dd4535fd9d79000040b"}, - {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8acd4b82a5f3a3ec8b1dc83452941d22b4711964c34727eb1e65449eead353ca"}, - {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30707e646080dd3c791f22ce7e4a2fc2438765408547c10510f1f690bd336217"}, - {file = "orjson-3.10.0-cp310-none-win32.whl", hash = "sha256:115498c4ad34188dcb73464e8dc80e490a3e5e88a925907b6fedcf20e545001a"}, - {file = "orjson-3.10.0-cp310-none-win_amd64.whl", hash = "sha256:6735dd4a5a7b6df00a87d1d7a02b84b54d215fb7adac50dd24da5997ffb4798d"}, - {file = "orjson-3.10.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9587053e0cefc284e4d1cd113c34468b7d3f17666d22b185ea654f0775316a26"}, - {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bef1050b1bdc9ea6c0d08468e3e61c9386723633b397e50b82fda37b3563d72"}, - {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d16c6963ddf3b28c0d461641517cd312ad6b3cf303d8b87d5ef3fa59d6844337"}, - {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4251964db47ef090c462a2d909f16c7c7d5fe68e341dabce6702879ec26d1134"}, - {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73bbbdc43d520204d9ef0817ac03fa49c103c7f9ea94f410d2950755be2c349c"}, - {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:414e5293b82373606acf0d66313aecb52d9c8c2404b1900683eb32c3d042dbd7"}, - {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed5bb09877dc27ed0d37f037ddef6cb76d19aa34b108db270d27d3d2ef747"}, - {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5127478260db640323cea131ee88541cb1a9fbce051f0b22fa2f0892f44da302"}, - {file = "orjson-3.10.0-cp311-none-win32.whl", hash = "sha256:b98345529bafe3c06c09996b303fc0a21961820d634409b8639bc16bd4f21b63"}, - {file = "orjson-3.10.0-cp311-none-win_amd64.whl", hash = "sha256:658ca5cee3379dd3d37dbacd43d42c1b4feee99a29d847ef27a1cb18abdfb23f"}, - {file = "orjson-3.10.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4329c1d24fd130ee377e32a72dc54a3c251e6706fccd9a2ecb91b3606fddd998"}, - {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef0f19fdfb6553342b1882f438afd53c7cb7aea57894c4490c43e4431739c700"}, - {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4f60db24161534764277f798ef53b9d3063092f6d23f8f962b4a97edfa997a0"}, - {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1de3fd5c7b208d836f8ecb4526995f0d5877153a4f6f12f3e9bf11e49357de98"}, - {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f93e33f67729d460a177ba285002035d3f11425ed3cebac5f6ded4ef36b28344"}, - {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:237ba922aef472761acd697eef77fef4831ab769a42e83c04ac91e9f9e08fa0e"}, - {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98c1bfc6a9bec52bc8f0ab9b86cc0874b0299fccef3562b793c1576cf3abb570"}, - {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30d795a24be16c03dca0c35ca8f9c8eaaa51e3342f2c162d327bd0225118794a"}, - {file = "orjson-3.10.0-cp312-none-win32.whl", hash = "sha256:6a3f53dc650bc860eb26ec293dfb489b2f6ae1cbfc409a127b01229980e372f7"}, - {file = "orjson-3.10.0-cp312-none-win_amd64.whl", hash = "sha256:983db1f87c371dc6ffc52931eb75f9fe17dc621273e43ce67bee407d3e5476e9"}, - {file = "orjson-3.10.0-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a667769a96a72ca67237224a36faf57db0c82ab07d09c3aafc6f956196cfa1b"}, - {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade1e21dfde1d37feee8cf6464c20a2f41fa46c8bcd5251e761903e46102dc6b"}, - {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23c12bb4ced1c3308eff7ba5c63ef8f0edb3e4c43c026440247dd6c1c61cea4b"}, - {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2d014cf8d4dc9f03fc9f870de191a49a03b1bcda51f2a957943fb9fafe55aac"}, - {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eadecaa16d9783affca33597781328e4981b048615c2ddc31c47a51b833d6319"}, - {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd583341218826f48bd7c6ebf3310b4126216920853cbc471e8dbeaf07b0b80e"}, - {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90bfc137c75c31d32308fd61951d424424426ddc39a40e367704661a9ee97095"}, - {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13b5d3c795b09a466ec9fcf0bd3ad7b85467d91a60113885df7b8d639a9d374b"}, - {file = "orjson-3.10.0-cp38-none-win32.whl", hash = "sha256:5d42768db6f2ce0162544845facb7c081e9364a5eb6d2ef06cd17f6050b048d8"}, - {file = "orjson-3.10.0-cp38-none-win_amd64.whl", hash = "sha256:33e6655a2542195d6fd9f850b428926559dee382f7a862dae92ca97fea03a5ad"}, - {file = "orjson-3.10.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4050920e831a49d8782a1720d3ca2f1c49b150953667eed6e5d63a62e80f46a2"}, - {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1897aa25a944cec774ce4a0e1c8e98fb50523e97366c637b7d0cddabc42e6643"}, - {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9bf565a69e0082ea348c5657401acec3cbbb31564d89afebaee884614fba36b4"}, - {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6ebc17cfbbf741f5c1a888d1854354536f63d84bee537c9a7c0335791bb9009"}, - {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2817877d0b69f78f146ab305c5975d0618df41acf8811249ee64231f5953fee"}, - {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57d017863ec8aa4589be30a328dacd13c2dc49de1c170bc8d8c8a98ece0f2925"}, - {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:22c2f7e377ac757bd3476ecb7480c8ed79d98ef89648f0176deb1da5cd014eb7"}, - {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e62ba42bfe64c60c1bc84799944f80704e996592c6b9e14789c8e2a303279912"}, - {file = "orjson-3.10.0-cp39-none-win32.whl", hash = "sha256:60c0b1bdbccd959ebd1575bd0147bd5e10fc76f26216188be4a36b691c937077"}, - {file = "orjson-3.10.0-cp39-none-win_amd64.whl", hash = "sha256:175a41500ebb2fdf320bf78e8b9a75a1279525b62ba400b2b2444e274c2c8bee"}, - {file = "orjson-3.10.0.tar.gz", hash = "sha256:ba4d8cac5f2e2cff36bea6b6481cdb92b38c202bcec603d6f5ff91960595a1ed"}, + {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, + {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, + {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, + {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, + {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, + {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, + {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, + {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, + {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, + {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, + {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, + {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, + {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, + {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, + {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, + {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, ] [[package]] @@ -1569,13 +1567,13 @@ files = [ [[package]] name = "prefect" -version = "2.17.1" +version = "2.19.0" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.17.1-py3-none-any.whl", hash = "sha256:ab563d357d10b9c3d5e9d5c1e884b6a0e959c791d1d6c59244518ce44d509a39"}, - {file = "prefect-2.17.1.tar.gz", hash = "sha256:16a399d2dd41cab6d209ce899cc9bea234169a689c9596f79fc124e7aab1d522"}, + {file = "prefect-2.19.0-py3-none-any.whl", hash = "sha256:6c64603d3f06dc0047093372ad954dd2098caed342a51fd560d76dfb1f733755"}, + {file = "prefect-2.19.0.tar.gz", hash = "sha256:d46b3c609e60835d7a750d3fec65c2fbb3292585abcdfe316cc01626a582b1cb"}, ] [package.dependencies] @@ -1635,7 +1633,24 @@ uvicorn = ">=0.14.0,<0.29.0" websockets = ">=10.4,<13.0" [package.extras] -dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "vermin", "virtualenv", "watchfiles"] +aws = ["prefect-aws"] +azure = ["prefect-azure"] +bitbucket = ["prefect-bitbucket"] +dask = ["prefect-dask"] +databricks = ["prefect-databricks"] +dbt = ["prefect-dbt"] +dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy (>=1.9.0)", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "types-PyYAML", "types-cachetools", "vermin", "virtualenv", "watchfiles"] +docker = ["prefect-docker"] +email = ["prefect-email"] +gcp = ["prefect-gcp"] +github = ["prefect-github"] +gitlab = ["prefect-gitlab"] +kubernetes = ["prefect-kubernetes"] +ray = ["prefect-ray"] +shell = ["prefect-shell"] +slack = ["prefect-slack"] +snowflake = ["prefect-snowflake"] +sqlalchemy = ["prefect-sqlalchemy"] [[package]] name = "pyasn1" @@ -1675,19 +1690,19 @@ files = [ [[package]] name = "pydantic" -version = "2.7.0" +version = "2.7.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, - {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, + {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, + {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, ] [package.dependencies] annotated-types = ">=0.4.0" email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} -pydantic-core = "2.18.1" +pydantic-core = "2.18.2" typing-extensions = ">=4.6.1" [package.extras] @@ -1695,90 +1710,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.1" +version = "2.18.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, - {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, - {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, - {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, - {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, - {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, - {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, - {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, - {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, - {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, - {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, - {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, - {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, - {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, - {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, - {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, - {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, - {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, - {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, - {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, - {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, - {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, - {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, - {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, - {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, - {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, - {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, - {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, - {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, - {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, - {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, - {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, - {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, + {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, + {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, + {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, + {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, + {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, + {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, + {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, + {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, + {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, + {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, + {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, + {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, + {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, ] [package.dependencies] @@ -1786,116 +1801,93 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.6.3" +version = "4.7.2" description = "Python driver for MongoDB " optional = false python-versions = ">=3.7" files = [ - {file = "pymongo-4.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e344d0afdd7c06c1f1e66a4736593293f432defc2191e6b411fc9c82fa8c5adc"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:731a92dfc4022db763bfa835c6bd160f2d2cba6ada75749c2ed500e13983414b"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c4726e36a2f7e92f09f5b8e92ba4db7525daffe31a0dcbcf0533edc0ade8c7d8"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:00e6cfce111883ca63a3c12878286e0b89871f4b840290e61fb6f88ee0e687be"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:cc7a26edf79015c58eea46feb5b262cece55bc1d4929a8a9e0cbe7e6d6a9b0eb"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:4955be64d943b30f2a7ff98d818ca530f7cb37450bc6b32c37e0e74821907ef8"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:af039afc6d787502c02089759778b550cb2f25dbe2780f5b050a2e37031c3fbf"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc15a7c7a99aed7d0831eaf78a607f1db0c7a255f96e3d18984231acd72f70c"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e97c138d811e9367723fcd07c4402a9211caae20479fdd6301d57762778a69f"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebcc145c74d06296ce0cad35992185064e5cb2aadef719586778c144f0cd4d37"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:664c64b6bdb31aceb80f0556951e5e2bf50d359270732268b4e7af00a1cf5d6c"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4056bc421d4df2c61db4e584415f2b0f1eebb92cbf9222f7f38303467c37117"}, - {file = "pymongo-4.6.3-cp310-cp310-win32.whl", hash = "sha256:cdbea2aac1a4caa66ee912af3601557d2bda2f9f69feec83601c78c7e53ece64"}, - {file = "pymongo-4.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:6cec7279e5a1b74b257d0270a8c97943d745811066630a6bc6beb413c68c6a33"}, - {file = "pymongo-4.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:138b9fa18d40401c217bc038a48bcde4160b02d36d8632015b1804971a2eaa2f"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60931b0e07448afe8866ffff764cd5bf4b1a855dc84c7dcb3974c6aa6a377a59"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b35f8bded43ff91475305445fedf0613f880ff7e25c75ae1028e1260a9b7a86"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:872bad5c83f7eec9da11e1fef5f858c6a4c79fe4a83c7780e7b0fe95d560ae3f"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ad3e5bfcd345c0bfe9af69a82d720860b5b043c1657ffb513c18a0dee19c19"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e208f2ab7b495eff8fd175022abfb0abce6307ac5aee3f4de51fc1a459b71c9"}, - {file = "pymongo-4.6.3-cp311-cp311-win32.whl", hash = "sha256:4670edbb5ddd71a4d555668ef99b032a5f81b59e4145d66123aa0d831eac7883"}, - {file = "pymongo-4.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1c2761302b6cbfd12e239ce1b8061d4cf424a361d199dcb32da534985cae9350"}, - {file = "pymongo-4.6.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:722f2b709b63311c0efda4fa4c603661faa4bec6bad24a6cc41a3bc6d841bf09"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:994386a4d6ad39e18bcede6dc8d1d693ec3ed897b88f86b1841fbc37227406da"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:391aea047bba928006114282f175bc8d09c53fe1b7d8920bf888325e229302fe"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4330c022024e7994b630199cdae909123e4b0e9cf15335de71b146c0f6a2435"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01277a7e183c59081368e4efbde2b8f577014431b257959ca98d3a4e8682dd51"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d30d5d7963453b478016bf7b0d87d7089ca24d93dbdecfbc9aa32f1b4772160a"}, - {file = "pymongo-4.6.3-cp312-cp312-win32.whl", hash = "sha256:a023804a3ac0f85d4510265b60978522368b5815772262e61e3a2222a8b315c9"}, - {file = "pymongo-4.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2a6ae9a600bbc2dbff719c98bf5da584fb8a4f2bb23729a09be2e9c3dbc61c8a"}, - {file = "pymongo-4.6.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:3b909e5b1864de01510079b39bbdc480720c37747be5552b354bc73f02c24a3c"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:48c60bd32ec141c0d45d8471179430003d9fb4490da181b8165fb1dce9cc255c"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36d7049fc183fe4edda3eae7f66ea14c660921429e082fe90b4b7f4dc6664a70"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e5c161b18660f1c9d1f78236de45520a436be65e42b7bb51f25f74ad22bdde"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:e458e6fc2b7dd40d15cda04898bd2d8c9ff7ae086c516bc261628d54eb4e3158"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:e420e74c6db4594a6d09f39b58c0772679006cb0b4fc40901ba608794d87dad2"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9c9340c7161e112e36ebb97fbba1cdbe7db3dfacb694d2918b1f155a01f3d859"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:26d036e0f5de09d0b21d0fc30314fcf2ae6359e4d43ae109aa6cf27b4ce02d30"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cf28d9c90e40d4e385b858e4095739829f466f23e08674085161d86bb4bb10"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9066dff9dc0a182478ca5885d0b8a2b820b462e19459ada109df7a3ced31b272"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1e1586ebdebe0447a24842480defac17c496430a218486c96e2da3f164c0f05"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3853fb66bf34ce1b6e573e1bbb3cb28763be9d1f57758535757faf1ab2f24a"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:462684a6f5ce6f2661c30eab4d1d459231e0eed280f338e716e31a24fc09ccb3"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a4ea44e5a913bdb7c9abd34c69e9fcfac10dfaf49765463e0dc1ea922dd2a9d"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:098d420a8214ad25f872de7e8b309441995d12ece0376218a04d9ed5d2222cf3"}, - {file = "pymongo-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:7330245253fbe2e09845069d2f4d35dd27f63e377034c94cb0ddac18bc8b0d82"}, - {file = "pymongo-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:151361c101600a85cb1c1e0db4e4b28318b521fcafa9b62d389f7342faaaee80"}, - {file = "pymongo-4.6.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4d167d546352869125dc86f6fda6dffc627d8a9c8963eaee665825f2520d542b"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eaf3d594ebfd5e1f3503d81e06a5d78e33cda27418b36c2491c3d4ad4fca5972"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ee79e02a7c5ed34706ecb5dad19e6c7d267cf86d28c075ef3127c58f3081279"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af5c5112db04cf62a5d9d224a24f289aaecb47d152c08a457cca81cee061d5bd"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6b5aec78aa4840e8d6c3881900259892ab5733a366696ca10d99d68c3d73eaaf"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:9757602fb45c8ecc1883fe6db7c59c19d87eb3c645ec9342d28a6026837da931"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:dde9fb6e105ce054339256a8b7a9775212ebb29596ef4e402d7bbc63b354d202"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:7df8b166d3db6cfead4cf55b481408d8f0935d8bd8d6dbf64507c49ef82c7200"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53451190b8628e1ce7d1fe105dc376c3f10705127bd3b51fe3e107b9ff1851e6"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75107a386d4ccf5291e75cce8ca3898430e7907f4cc1208a17c9efad33a1ea84"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a0660ce32d8459b7f12dc3ca0141528fead62d3cce31b548f96f30902074cc0"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa310096450e9c461b7dfd66cbc1c41771fe36c06200440bb3e062b1d4a06b6e"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f465cca9b178e7bb782f952dd58e9e92f8ba056e585959465f2bb50feddef5f"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c67c19f653053ef2ebd7f1837c2978400058d6d7f66ec5760373a21eaf660158"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c701de8e483fb5e53874aab642235361aac6de698146b02c644389eaa8c137b6"}, - {file = "pymongo-4.6.3-cp38-cp38-win32.whl", hash = "sha256:90525454546536544307e6da9c81f331a71a1b144e2d038fec587cc9f9250285"}, - {file = "pymongo-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:3e1ba5a037c526a3f4060c28f8d45d71ed9626e2bf954b0cd9a8dcc3b45172ee"}, - {file = "pymongo-4.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14a82593528cddc93cfea5ee78fac95ae763a3a4e124ca79ee0b24fbbc6da1c9"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cd6c15242d9306ff1748681c3235284cbe9f807aeaa86cd17d85e72af626e9a7"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6de33f1b2eed91b802ec7abeb92ffb981d052f3604b45588309aae9e0f6e3c02"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0182899aafe830f25cf96c5976d724efeaaf7b6646c15424ad8dd25422b2efe1"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:8d0ea740a2faa56f930dc82c5976d96c017ece26b29a1cddafb58721c7aab960"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:5c8a4982f5eb767c6fbfb8fb378683d09bcab7c3251ba64357eef600d43f6c23"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:becfa816545a48c8e740ac2fd624c1c121e1362072d68ffcf37a6b1be8ea187e"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ff7d1f449fcad23d9bc8e8dc2b9972be38bcd76d99ea5f7d29b2efa929c2a7ff"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e097f877de4d6af13a33ef938bf2a2350f424be5deabf8b857da95f5b080487a"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:705a9bfd619301ee7e985d6f91f68b15dfcb2f6f36b8cc225cc82d4260d2bce5"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ef1b4992ee1cb8bb16745e70afa0c02c5360220a7a8bb4775888721f052d0a6"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d10bdd46cbc35a2109737d36ffbef32e7420569a87904738ad444ccb7ac2c5"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17c1c143ba77d6e21fc8b48e93f0a5ed982a23447434e9ee4fbb6d633402506b"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e51e30d67b468a2a634ade928b30cb3e420127f148a9aec60de33f39087bdc4"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bec8e4e88984be157408f1923d25869e1b575c07711cdbdde596f66931800934"}, - {file = "pymongo-4.6.3-cp39-cp39-win32.whl", hash = "sha256:98877a9c4ad42df8253a12d8d17a3265781d1feb5c91c767bd153f88feb0b670"}, - {file = "pymongo-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:6d5b35da9e16cda630baed790ffc3d0d01029d269523a7cec34d2ec7e6823e75"}, - {file = "pymongo-4.6.3.tar.gz", hash = "sha256:400074090b9a631f120b42c61b222fd743490c133a5d2f99c0208cefcccc964e"}, + {file = "pymongo-4.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca"}, + {file = "pymongo-4.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155"}, + {file = "pymongo-4.7.2-cp310-cp310-win32.whl", hash = "sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95"}, + {file = "pymongo-4.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e"}, + {file = "pymongo-4.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9"}, + {file = "pymongo-4.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a"}, + {file = "pymongo-4.7.2-cp311-cp311-win32.whl", hash = "sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f"}, + {file = "pymongo-4.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a"}, + {file = "pymongo-4.7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6"}, + {file = "pymongo-4.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95"}, + {file = "pymongo-4.7.2-cp312-cp312-win32.whl", hash = "sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29"}, + {file = "pymongo-4.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4"}, + {file = "pymongo-4.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd"}, + {file = "pymongo-4.7.2-cp37-cp37m-win32.whl", hash = "sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e"}, + {file = "pymongo-4.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062"}, + {file = "pymongo-4.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71"}, + {file = "pymongo-4.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054"}, + {file = "pymongo-4.7.2-cp38-cp38-win32.whl", hash = "sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb"}, + {file = "pymongo-4.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f"}, + {file = "pymongo-4.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621"}, + {file = "pymongo-4.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002"}, + {file = "pymongo-4.7.2-cp39-cp39-win32.whl", hash = "sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803"}, + {file = "pymongo-4.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86"}, + {file = "pymongo-4.7.2.tar.gz", hash = "sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7"}, ] [package.dependencies] dnspython = ">=1.16.0,<3.0.0" [package.extras] -aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] @@ -1904,13 +1896,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.358" +version = "1.1.363" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.358-py3-none-any.whl", hash = "sha256:0995b6a95eb11bd26f093cd5dee3d5e7258441b1b94d4a171b5dc5b79a1d4f4e"}, - {file = "pyright-1.1.358.tar.gz", hash = "sha256:185524a8d52f6f14bbd3b290b92ad905f25b964dddc9e7148aad760bd35c9f60"}, + {file = "pyright-1.1.363-py3-none-any.whl", hash = "sha256:d3b8d73c8d230e26cc3523862f3398032a0c39a00d7bb69dc0f595f8e888fd01"}, + {file = "pyright-1.1.363.tar.gz", hash = "sha256:00a8f0ae0e339473bb0488f8a2a2dcdf574e94a16cd7b4390d49d144714d8db2"}, ] [package.dependencies] @@ -2086,13 +2078,13 @@ setuptools = ">=41.0" [[package]] name = "referencing" -version = "0.34.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, - {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -2101,104 +2093,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] @@ -2275,110 +2253,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] [[package]] @@ -2474,28 +2452,28 @@ files = [ [[package]] name = "ruff" -version = "0.3.7" +version = "0.4.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, - {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, - {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, - {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, - {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, + {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, + {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, + {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, + {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, + {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, + {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, ] [[package]] @@ -2549,60 +2527,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.29" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, - {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, - {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -2636,13 +2614,13 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sshared" -version = "0.3.0" +version = "0.4.0" description = "后端共享组件" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "sshared-0.3.0-py3-none-any.whl", hash = "sha256:f04b0e4319155ed9bcfb35607966b78956725b5b8a85fbe93d83497060cc1cbe"}, - {file = "sshared-0.3.0.tar.gz", hash = "sha256:cc1892ce57886c5c926f91a1d126a5eadd06dff36facb69d63bb220ccc23f869"}, + {file = "sshared-0.4.0-py3-none-any.whl", hash = "sha256:1d03b4dba7c6b0721cdea67f164e4c8492e0e58eba87fb6c2ef3c2db41f0e391"}, + {file = "sshared-0.4.0.tar.gz", hash = "sha256:b61184a9679de3238cc016d3ea20f2975f59a2a2e3aba181edf1a5cc9bb89a7c"}, ] [package.dependencies] @@ -2650,6 +2628,7 @@ msgspec = ">=0.18.0,<0.19.0" typing-extensions = ">=4.10.0,<5.0.0" [package.extras] +api = ["litestar (>=2.8.0,<3.0.0)"] mongo = ["motor (>=3.3.0,<4.0.0)"] [[package]] @@ -2759,76 +2738,89 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "ujson" -version = "5.9.0" +version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" files = [ - {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, - {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, - {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, - {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, - {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, - {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, - {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, - {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, - {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, - {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, - {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, - {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, - {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] [[package]] @@ -2869,17 +2861,17 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "websocket-client" -version = "1.7.0" +version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" files = [ - {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, - {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -2980,20 +2972,20 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "zipp" -version = "3.18.1" +version = "3.18.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, + {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "34a5819cef02b33b6ffe4ecf0a410e3649606c78aec298dd8ae75249fbc8ed41" +content-hash = "07ae375d0d863f66563ffbd2156c66b13a41c8d09d4b3b82723fc0c8b07d1490" diff --git a/pyproject.toml b/pyproject.toml index 96379f0..4e2647c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,13 +3,13 @@ package-mode = false [tool.poetry.dependencies] python = "^3.8" -prefect = "^2.16.0" +prefect = "^2.19.0" jkit = "^3.0.0a16" sspeedup = "^0.25.0" -sshared = "^0.3.0" +sshared = "^0.4.0" [tool.poetry.group.dev.dependencies] -ruff = "^0.3.0" +ruff = "^0.4.0" pyright = "^1.1.0" [build-system] diff --git a/requirements-dev.txt b/requirements-dev.txt index 9c1244e..274a177 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.6 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.8.0 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -17,18 +17,18 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.3 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.5 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.7 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" -exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" +fsspec==2024.5.0 ; python_version >= "3.8" and python_version < "4.0" google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.42.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.45.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -39,16 +39,16 @@ hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.7 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.8" and python_version < "4.0" jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" -jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" +jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" -jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.22.0 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -mako==1.3.3 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.5 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" @@ -57,21 +57,21 @@ motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.10.0 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.3 ; python_version >= "3.8" and python_version < "4.0" packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.17.1 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.19.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.18.1 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.7.0 ; python_version >= "3.8" and python_version < "4.0" -pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.358 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.1 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.2 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.363 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -80,24 +80,24 @@ pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" -referencing==0.34.0 ; python_version >= "3.8" and python_version < "4.0" -regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.35.1 ; python_version >= "3.8" and python_version < "4.0" +regex==2024.5.15 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" -rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.18.1 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.4.4 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.30 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.30 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.4.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" @@ -105,10 +105,10 @@ typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" -ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" +ujson==5.10.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" -websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +websocket-client==1.8.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" +zipp==3.18.2 ; python_version >= "3.8" and python_version < "3.10" diff --git a/requirements.txt b/requirements.txt index 320a8f2..e2bd446 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" -apprise==1.7.6 ; python_version >= "3.8" and python_version < "4.0" +apprise==1.8.0 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.12.0" @@ -17,18 +17,18 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -croniter==2.0.3 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.5 ; python_version >= "3.8" and python_version < "4.0" +croniter==2.0.5 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.7 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" -exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.3.1 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" +fsspec==2024.5.0 ; python_version >= "3.8" and python_version < "4.0" google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.42.1 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.45.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -39,16 +39,16 @@ hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.7 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -itsdangerous==2.1.2 ; python_version >= "3.8" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.8" and python_version < "4.0" jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" -jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0" +jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" -jsonschema==4.21.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.22.0 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" -mako==1.3.3 ; python_version >= "3.8" and python_version < "4.0" +mako==1.3.5 ; python_version >= "3.8" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" markdown==3.6 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" @@ -56,20 +56,20 @@ mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.10.0 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.3 ; python_version >= "3.8" and python_version < "4.0" packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.17.1 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.19.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.18.1 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.7.0 ; python_version >= "3.8" and python_version < "4.0" -pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.2 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.1 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.2 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -78,13 +78,13 @@ pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" -referencing==0.34.0 ; python_version >= "3.8" and python_version < "4.0" -regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.35.1 ; python_version >= "3.8" and python_version < "4.0" +regex==2024.5.15 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" -rpds-py==0.18.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.18.1 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" @@ -92,9 +92,9 @@ setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.29 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.30 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.30 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.4.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" @@ -102,10 +102,10 @@ typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" -ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0" +ujson==5.10.0 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" -websocket-client==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +websocket-client==1.8.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" +zipp==3.18.2 ; python_version >= "3.8" and python_version < "3.10" From 3c970bf0ad406694deefbfe78173805aae71b3dc Mon Sep 17 00:00:00 2001 From: yezi Date: Thu, 16 May 2024 17:56:35 +0800 Subject: [PATCH 91/93] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/jianshu/article_earning_ranking.py | 2 +- jobs/jianshu/assets_ranking.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jobs/jianshu/article_earning_ranking.py b/jobs/jianshu/article_earning_ranking.py index bcfb51c..ba5022d 100644 --- a/jobs/jianshu/article_earning_ranking.py +++ b/jobs/jianshu/article_earning_ranking.py @@ -22,7 +22,7 @@ ) -@retry(delay=5) +@retry(attempts=5, delay=10) async def get_author_slug_and_info( item: RecordField, / ) -> Tuple[Optional[str], Optional[UserInfo]]: diff --git a/jobs/jianshu/assets_ranking.py b/jobs/jianshu/assets_ranking.py index 0f1b858..6a1046e 100644 --- a/jobs/jianshu/assets_ranking.py +++ b/jobs/jianshu/assets_ranking.py @@ -21,7 +21,7 @@ ) -@retry(delay=5) +@retry(attempts=5, delay=10) async def get_fp_ftn_amount( item: AssetsRankingRecord, / ) -> Tuple[Optional[float], Optional[float]]: From e32b85b33ba8be5c1c4f2235c20008b17552f128 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 23 Jun 2024 22:21:11 +0800 Subject: [PATCH 92/93] =?UTF-8?q?feat:=20=E4=B8=8D=E5=86=8D=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=96=87=E7=AB=A0=E6=94=B6=E7=9B=8A=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E5=92=8C=E5=A4=A7=E8=BD=AC=E7=9B=98=E4=B8=AD=E5=A5=96?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobs/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/jobs/__init__.py b/jobs/__init__.py index 746ec63..83f9fa7 100644 --- a/jobs/__init__.py +++ b/jobs/__init__.py @@ -14,10 +14,8 @@ def import_deployment(path: str) -> DeploymentType: DEPLOYMENT_PATHS: Set[str] = { - "jobs.jianshu.article_earning_ranking:deployment", "jobs.jianshu.assets_ranking:deployment", "jobs.jianshu.daily_update_ranking:deployment", - "jobs.jianshu.lottery:deployment", "jobs.jianshu.lp_recommend:deployment", "jobs.jpep.ftn_trade:buy_deployment", "jobs.jpep.ftn_trade:sell_deployment", From de783b856e02d26d1c2ef63b4b6d5bf2affd57e5 Mon Sep 17 00:00:00 2001 From: yezi Date: Sun, 23 Jun 2024 23:10:41 +0800 Subject: [PATCH 93/93] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7=E5=88=B0=20ssh?= =?UTF-8?q?ared=20v0.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jianshu/article_earning_ranking_record.py | 8 +- models/jianshu/assets_ranking_record.py | 6 +- models/jianshu/daily_update_ranking_record.py | 4 +- models/jianshu/lottery_win_record.py | 4 +- models/jianshu/lp_recommend_article_record.py | 4 +- models/jianshu/user.py | 4 +- models/jpep/credit_history.py | 4 +- models/jpep/ftn_trade_order.py | 6 +- models/jpep/user.py | 6 +- poetry.lock | 745 +++++++++--------- pyproject.toml | 2 +- requirements-dev.txt | 53 +- requirements.txt | 47 +- 13 files changed, 435 insertions(+), 458 deletions(-) diff --git a/models/jianshu/article_earning_ranking_record.py b/models/jianshu/article_earning_ranking_record.py index 90f5102..2709d53 100644 --- a/models/jianshu/article_earning_ranking_record.py +++ b/models/jianshu/article_earning_ranking_record.py @@ -8,22 +8,22 @@ PositiveInt, UserSlug, ) -from sshared.mongo import MODEL_META, Document, Field, Index +from sshared.mongo import Document, Field, Index from utils.db import JIANSHU_DB -class ArticleField(Field, **MODEL_META): +class ArticleField(Field, frozen=True): slug: Optional[ArticleSlug] title: Optional[NonEmptyStr] -class EarningField(Field, **MODEL_META): +class EarningField(Field, frozen=True): to_author: PositiveFloat to_voter: PositiveFloat -class ArticleEarningRankingRecordDocument(Document, **MODEL_META): +class ArticleEarningRankingRecordDocument(Document, frozen=True): date: datetime ranking: PositiveInt diff --git a/models/jianshu/assets_ranking_record.py b/models/jianshu/assets_ranking_record.py index 2b8f9b1..603e592 100644 --- a/models/jianshu/assets_ranking_record.py +++ b/models/jianshu/assets_ranking_record.py @@ -7,18 +7,18 @@ PositiveInt, UserSlug, ) -from sshared.mongo import MODEL_META, Document, Field, Index +from sshared.mongo import Document, Field, Index from utils.db import JIANSHU_DB -class AmountField(Field, **MODEL_META): +class AmountField(Field, frozen=True): fp: Optional[NonNegativeFloat] ftn: Optional[NonNegativeFloat] assets: Optional[PositiveFloat] -class AssetsRankingRecordDocument(Document, **MODEL_META): +class AssetsRankingRecordDocument(Document, frozen=True): date: datetime ranking: PositiveInt diff --git a/models/jianshu/daily_update_ranking_record.py b/models/jianshu/daily_update_ranking_record.py index 85e36f2..4d417a5 100644 --- a/models/jianshu/daily_update_ranking_record.py +++ b/models/jianshu/daily_update_ranking_record.py @@ -4,12 +4,12 @@ PositiveInt, UserSlug, ) -from sshared.mongo import MODEL_META, Document, Index +from sshared.mongo import Document, Index from utils.db import JIANSHU_DB -class DailyUpdateRankingRecordDocument(Document, **MODEL_META): +class DailyUpdateRankingRecordDocument(Document, frozen=True): date: datetime ranking: PositiveInt days: PositiveInt diff --git a/models/jianshu/lottery_win_record.py b/models/jianshu/lottery_win_record.py index cdfeba5..e265e09 100644 --- a/models/jianshu/lottery_win_record.py +++ b/models/jianshu/lottery_win_record.py @@ -5,12 +5,12 @@ PositiveInt, UserSlug, ) -from sshared.mongo import MODEL_META, Document, Index +from sshared.mongo import Document, Index from utils.db import JIANSHU_DB -class LotteryWinRecordDocument(Document, **MODEL_META): +class LotteryWinRecordDocument(Document, frozen=True): id: PositiveInt time: datetime award_name: NonEmptyStr diff --git a/models/jianshu/lp_recommend_article_record.py b/models/jianshu/lp_recommend_article_record.py index 00fa89a..f968523 100644 --- a/models/jianshu/lp_recommend_article_record.py +++ b/models/jianshu/lp_recommend_article_record.py @@ -9,12 +9,12 @@ UserSlug, ) from msgspec import field -from sshared.mongo import MODEL_META, Document, Index +from sshared.mongo import Document, Index from utils.db import JIANSHU_DB -class LPRecommendedArticleRecordDocument(Document, **MODEL_META): +class LPRecommendedArticleRecordDocument(Document, frozen=True): date: datetime id: PositiveInt slug: ArticleSlug diff --git a/models/jianshu/user.py b/models/jianshu/user.py index a9342b9..0772bc1 100644 --- a/models/jianshu/user.py +++ b/models/jianshu/user.py @@ -3,7 +3,7 @@ from typing import Any, Dict, List, Optional from jkit.msgspec_constraints import PositiveInt, UserName, UserSlug, UserUploadedUrl -from sshared.mongo import MODEL_META, Document, Index +from sshared.mongo import Document, Index from utils.db import JIANSHU_DB @@ -13,7 +13,7 @@ class JianshuUserStatus(Enum): INACCESSABLE = "INACCESSIBLE" -class UserDocument(Document, **MODEL_META): +class UserDocument(Document, frozen=True): slug: UserSlug status: JianshuUserStatus updated_at: datetime diff --git a/models/jpep/credit_history.py b/models/jpep/credit_history.py index 80076af..369d737 100644 --- a/models/jpep/credit_history.py +++ b/models/jpep/credit_history.py @@ -2,12 +2,12 @@ from typing import Optional from jkit.msgspec_constraints import NonNegativeInt, PositiveInt -from sshared.mongo import MODEL_META, Document, Index +from sshared.mongo import Document, Index from utils.db import JPEP_DB -class CreditHistoryDocument(Document, **MODEL_META): +class CreditHistoryDocument(Document, frozen=True): time: datetime user_id: PositiveInt value: NonNegativeInt diff --git a/models/jpep/ftn_trade_order.py b/models/jpep/ftn_trade_order.py index 06be6b7..d7fd5ed 100644 --- a/models/jpep/ftn_trade_order.py +++ b/models/jpep/ftn_trade_order.py @@ -6,19 +6,19 @@ PositiveFloat, PositiveInt, ) -from sshared.mongo import MODEL_META, Document, Field, Index +from sshared.mongo import Document, Field, Index from utils.db import JPEP_DB -class AmountField(Field, **MODEL_META): +class AmountField(Field, frozen=True): total: PositiveInt traded: NonNegativeInt tradable: NonNegativeInt minimum_trade: PositiveInt -class FTNTradeOrderDocument(Document, **MODEL_META): +class FTNTradeOrderDocument(Document, frozen=True): fetch_time: datetime id: PositiveInt published_at: datetime diff --git a/models/jpep/user.py b/models/jpep/user.py index b19c48b..099fcd9 100644 --- a/models/jpep/user.py +++ b/models/jpep/user.py @@ -2,17 +2,17 @@ from typing import Any, Dict, Optional from jkit.msgspec_constraints import NonNegativeInt, PositiveInt -from sshared.mongo import MODEL_META, Document, Field, Index +from sshared.mongo import Document, Field, Index from utils.db import JPEP_DB -class CreditHistoryFieldItem(Field, **MODEL_META): +class CreditHistoryFieldItem(Field, frozen=True): time: datetime value: NonNegativeInt -class UserDocument(Document): +class UserDocument(Document, frozen=True): updated_at: datetime id: PositiveInt name: str diff --git a/poetry.lock b/poetry.lock index b4c2c68..df8d28f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiosqlite" @@ -41,13 +41,13 @@ tz = ["backports.zoneinfo"] [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [package.dependencies] @@ -250,13 +250,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -486,43 +486,43 @@ pytz = ">2021.1" [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -603,13 +603,13 @@ ssh = ["paramiko (>=2.4.3)"] [[package]] name = "email-validator" -version = "2.1.1" +version = "2.2.0" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, ] [package.dependencies] @@ -632,13 +632,13 @@ test = ["pytest (>=6)"] [[package]] name = "fsspec" -version = "2024.5.0" +version = "2024.6.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, - {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, + {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, + {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, ] [package.extras] @@ -647,6 +647,7 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -670,13 +671,13 @@ tqdm = ["tqdm"] [[package]] name = "google-auth" -version = "2.29.0" +version = "2.30.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -780,13 +781,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.45.0" +version = "0.47.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.45.0-py3-none-any.whl", hash = "sha256:90fe5c90e1b0ca7dd6fee78f9009f4e01b37dbc9ab484a9b2c1578915db1e571"}, - {file = "griffe-0.45.0.tar.gz", hash = "sha256:85cb2868d026ea51c89bdd589ad3ccc94abc5bd8d5d948e3d4450778a2a05b4a"}, + {file = "griffe-0.47.0-py3-none-any.whl", hash = "sha256:07a2fd6a8c3d21d0bbb0decf701d62042ccc8a576645c7f8799fe1f10de2b2de"}, + {file = "griffe-0.47.0.tar.gz", hash = "sha256:95119a440a3c932b13293538bdbc405bee4c36428547553dc6b327e7e7d35e5a"}, ] [package.dependencies] @@ -914,22 +915,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "7.2.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-7.2.0-py3-none-any.whl", hash = "sha256:04e4aad329b8b948a5711d394fa8759cb80f009225441b4f2a02bd4d8e5f426c"}, + {file = "importlib_metadata-7.2.0.tar.gz", hash = "sha256:3ff4519071ed42740522d494d04819b666541b9752c43012f85afb2cc220fcc6"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" @@ -1024,13 +1025,13 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] @@ -1316,18 +1317,15 @@ yaml = ["pyyaml"] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "oauthlib" version = "3.2.2" @@ -1346,68 +1344,68 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1567,13 +1565,13 @@ files = [ [[package]] name = "prefect" -version = "2.19.0" +version = "2.19.5" description = "Workflow orchestration and management." optional = false python-versions = ">=3.8" files = [ - {file = "prefect-2.19.0-py3-none-any.whl", hash = "sha256:6c64603d3f06dc0047093372ad954dd2098caed342a51fd560d76dfb1f733755"}, - {file = "prefect-2.19.0.tar.gz", hash = "sha256:d46b3c609e60835d7a750d3fec65c2fbb3292585abcdfe316cc01626a582b1cb"}, + {file = "prefect-2.19.5-py3-none-any.whl", hash = "sha256:d2a172d5ac23aa024146b168b3b88ec20f49a2774382a5c6e8b2a719c25205d3"}, + {file = "prefect-2.19.5.tar.gz", hash = "sha256:046805853015272432507f2078fee5f2520b7a9699c86c149c5e03153a0f4626"}, ] [package.dependencies] @@ -1639,7 +1637,7 @@ bitbucket = ["prefect-bitbucket"] dask = ["prefect-dask"] databricks = ["prefect-databricks"] dbt = ["prefect-dbt"] -dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy (>=1.9.0)", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests", "respx", "ruff", "setuptools (!=60.9.0)", "types-PyYAML", "types-cachetools", "vermin", "virtualenv", "watchfiles"] +dev = ["cairosvg", "codespell (>=2.2.6)", "ddtrace", "ipython", "ipython (==8.12.*)", "jinja2", "mike", "mkdocs", "mkdocs-gen-files", "mkdocs-material", "mkdocstrings-python", "mock", "moto (>=5)", "mypy (>=1.9.0)", "numpy", "pillow", "pluggy (>=1.4.0)", "pre-commit", "pytest (>7,<8)", "pytest-asyncio (>=0.18.2,!=0.22.0,<0.23.0)", "pytest-benchmark", "pytest-cov", "pytest-env", "pytest-flakefinder", "pytest-timeout", "pytest-xdist (<3.4.0)", "pytkdocs (>=0.14.2)", "pyyaml", "requests (<2.32.0)", "respx", "ruff", "setuptools (!=60.9.0)", "types-PyYAML", "types-cachetools", "vermin", "virtualenv", "watchfiles"] docker = ["prefect-docker"] email = ["prefect-email"] gcp = ["prefect-gcp"] @@ -1690,19 +1688,19 @@ files = [ [[package]] name = "pydantic" -version = "2.7.1" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} -pydantic-core = "2.18.2" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -1710,90 +1708,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, - {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, - {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, - {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, - {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, - {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, - {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, - {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, - {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, - {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] @@ -1815,71 +1813,71 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.7.2" +version = "4.7.3" description = "Python driver for MongoDB " optional = false python-versions = ">=3.7" files = [ - {file = "pymongo-4.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca"}, - {file = "pymongo-4.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155"}, - {file = "pymongo-4.7.2-cp310-cp310-win32.whl", hash = "sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95"}, - {file = "pymongo-4.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e"}, - {file = "pymongo-4.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9"}, - {file = "pymongo-4.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a"}, - {file = "pymongo-4.7.2-cp311-cp311-win32.whl", hash = "sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f"}, - {file = "pymongo-4.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a"}, - {file = "pymongo-4.7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6"}, - {file = "pymongo-4.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95"}, - {file = "pymongo-4.7.2-cp312-cp312-win32.whl", hash = "sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29"}, - {file = "pymongo-4.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4"}, - {file = "pymongo-4.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd"}, - {file = "pymongo-4.7.2-cp37-cp37m-win32.whl", hash = "sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e"}, - {file = "pymongo-4.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062"}, - {file = "pymongo-4.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71"}, - {file = "pymongo-4.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054"}, - {file = "pymongo-4.7.2-cp38-cp38-win32.whl", hash = "sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb"}, - {file = "pymongo-4.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f"}, - {file = "pymongo-4.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621"}, - {file = "pymongo-4.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002"}, - {file = "pymongo-4.7.2-cp39-cp39-win32.whl", hash = "sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803"}, - {file = "pymongo-4.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86"}, - {file = "pymongo-4.7.2.tar.gz", hash = "sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7"}, + {file = "pymongo-4.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e9580b4537b3cc5d412070caabd1dabdf73fdce249793598792bac5782ecf2eb"}, + {file = "pymongo-4.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:517243b2b189c98004570dd8fc0e89b1a48363d5578b3b99212fa2098b2ea4b8"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23b1e9dabd61da1c7deb54d888f952f030e9e35046cebe89309b28223345b3d9"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03e0f9901ad66c6fb7da0d303461377524d61dab93a4e4e5af44164c5bb4db76"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a870824aa54453aee030bac08c77ebcf2fe8999400f0c2a065bebcbcd46b7f8"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd7b3d3f4261bddbb74a332d87581bc523353e62bb9da4027cc7340f6fcbebc"}, + {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d719a643ea6da46d215a3ba51dac805a773b611c641319558d8576cbe31cef8"}, + {file = "pymongo-4.7.3-cp310-cp310-win32.whl", hash = "sha256:d8b1e06f361f3c66ee694cb44326e1a2e4f93bc9c3a4849ae8547889fca71154"}, + {file = "pymongo-4.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:c450ab2f9397e2d5caa7fddeb4feb30bf719c47c13ae02c0bbb3b71bf4099c1c"}, + {file = "pymongo-4.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cc6459209e885ba097779eaa0fe7f2fa049db39ab43b1731cf8d065a4650e8"}, + {file = "pymongo-4.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e2287f1e2cc35e73cd74a4867e398a97962c5578a3991c730ef78d276ca8e46"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413506bd48d8c31ee100645192171e4773550d7cb940b594d5175ac29e329ea1"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cc1febf17646d52b7561caa762f60bdfe2cbdf3f3e70772f62eb624269f9c05"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dfcf18a49955d50a16c92b39230bd0668ffc9c164ccdfe9d28805182b48fa72"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89872041196c008caddf905eb59d3dc2d292ae6b0282f1138418e76f3abd3ad6"}, + {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3ed97b89de62ea927b672ad524de0d23f3a6b4a01c8d10e3d224abec973fbc3"}, + {file = "pymongo-4.7.3-cp311-cp311-win32.whl", hash = "sha256:d2f52b38151e946011d888a8441d3d75715c663fc5b41a7ade595e924e12a90a"}, + {file = "pymongo-4.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:4a4cc91c28e81c0ce03d3c278e399311b0af44665668a91828aec16527082676"}, + {file = "pymongo-4.7.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cb30c8a78f5ebaca98640943447b6a0afcb146f40b415757c9047bf4a40d07b4"}, + {file = "pymongo-4.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9cf2069f5d37c398186453589486ea98bb0312214c439f7d320593b61880dc05"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3564f423958fced8a8c90940fd2f543c27adbcd6c7c6ed6715d847053f6200a0"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a8af8a38fa6951fff73e6ff955a6188f829b29fed7c5a1b739a306b4aa56fe8"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a0e81c8dba6d825272867d487f18764cfed3c736d71d7d4ff5b79642acbed42"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88fc1d146feabac4385ea8ddb1323e584922922641303c8bf392fe1c36803463"}, + {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4225100b2c5d1f7393d7c5d256ceb8b20766830eecf869f8ae232776347625a6"}, + {file = "pymongo-4.7.3-cp312-cp312-win32.whl", hash = "sha256:5f3569ed119bf99c0f39ac9962fb5591eff02ca210fe80bb5178d7a1171c1b1e"}, + {file = "pymongo-4.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:eb383c54c0c8ba27e7712b954fcf2a0905fee82a929d277e2e94ad3a5ba3c7db"}, + {file = "pymongo-4.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a46cffe91912570151617d866a25d07b9539433a32231ca7e7cf809b6ba1745f"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c3cba427dac50944c050c96d958c5e643c33a457acee03bae27c8990c5b9c16"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a5fd893edbeb7fa982f8d44b6dd0186b6cd86c89e23f6ef95049ff72bffe46"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c168a2fadc8b19071d0a9a4f85fe38f3029fe22163db04b4d5c046041c0b14bd"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c59c2c9e70f63a7f18a31e367898248c39c068c639b0579623776f637e8f482"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08165fd82c89d372e82904c3268bd8fe5de44f92a00e97bb1db1785154397d9"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:397fed21afec4fdaecf72f9c4344b692e489756030a9c6d864393e00c7e80491"}, + {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f903075f8625e2d228f1b9b9a0cf1385f1c41e93c03fd7536c91780a0fb2e98f"}, + {file = "pymongo-4.7.3-cp37-cp37m-win32.whl", hash = "sha256:8ed1132f58c38add6b6138b771d0477a3833023c015c455d9a6e26f367f9eb5c"}, + {file = "pymongo-4.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8d00a5d8fc1043a4f641cbb321da766699393f1b6f87c70fae8089d61c9c9c54"}, + {file = "pymongo-4.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9377b868c38700c7557aac1bc4baae29f47f1d279cc76b60436e547fd643318c"}, + {file = "pymongo-4.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da4a6a7b4f45329bb135aa5096823637bd5f760b44d6224f98190ee367b6b5dd"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e2f9277f8a63ac89335ec4f1699ae0d96ebd06d239480d69ed25473a71b2c"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db3d608d541a444c84f0bfc7bad80b0b897e0f4afa580a53f9a944065d9b633"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e90af2ad3a8a7c295f4d09a2fbcb9a350c76d6865f787c07fe843b79c6e821d1"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e28feb18dc559d50ededba27f9054c79f80c4edd70a826cecfe68f3266807b3"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f21ecddcba2d9132d5aebd8e959de8d318c29892d0718420447baf2b9bccbb19"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:26140fbb3f6a9a74bd73ed46d0b1f43d5702e87a6e453a31b24fad9c19df9358"}, + {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94baa5fc7f7d22c3ce2ac7bd92f7e03ba7a6875f2480e3b97a400163d6eaafc9"}, + {file = "pymongo-4.7.3-cp38-cp38-win32.whl", hash = "sha256:92dd247727dd83d1903e495acc743ebd757f030177df289e3ba4ef8a8c561fad"}, + {file = "pymongo-4.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c90c848a5e45475731c35097f43026b88ef14a771dfd08f20b67adc160a3f79"}, + {file = "pymongo-4.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f598be401b416319a535c386ac84f51df38663f7a9d1071922bda4d491564422"}, + {file = "pymongo-4.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35ba90477fae61c65def6e7d09e8040edfdd3b7fd47c3c258b4edded60c4d625"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aa8735955c70892634d7e61b0ede9b1eefffd3cd09ccabee0ffcf1bdfe62254"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82a97d8f7f138586d9d0a0cff804a045cdbbfcfc1cd6bba542b151e284fbbec5"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de3b9db558930efab5eaef4db46dcad8bf61ac3ddfd5751b3e5ac6084a25e366"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0e149217ef62812d3c2401cf0e2852b0c57fd155297ecc4dcd67172c4eca402"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3a8a1ef4a824f5feb793b3231526d0045eadb5eb01080e38435dfc40a26c3e5"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d14e5e89a4be1f10efc3d9dcb13eb7a3b2334599cb6bb5d06c6a9281b79c8e22"}, + {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6bfa29f032fd4fd7b129520f8cdb51ab71d88c2ba0567cccd05d325f963acb5"}, + {file = "pymongo-4.7.3-cp39-cp39-win32.whl", hash = "sha256:1421d0bd2ce629405f5157bd1aaa9b83f12d53a207cf68a43334f4e4ee312b66"}, + {file = "pymongo-4.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:f7ee974f8b9370a998919c55b1050889f43815ab588890212023fecbc0402a6d"}, + {file = "pymongo-4.7.3.tar.gz", hash = "sha256:6354a66b228f2cd399be7429685fb68e07f19110a3679782ecb4fdb68da03831"}, ] [package.dependencies] @@ -1896,13 +1894,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.363" +version = "1.1.368" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.363-py3-none-any.whl", hash = "sha256:d3b8d73c8d230e26cc3523862f3398032a0c39a00d7bb69dc0f595f8e888fd01"}, - {file = "pyright-1.1.363.tar.gz", hash = "sha256:00a8f0ae0e339473bb0488f8a2a2dcdf574e94a16cd7b4390d49d144714d8db2"}, + {file = "pyright-1.1.368-py3-none-any.whl", hash = "sha256:4a86e34b61c755b43b367af7fbf927fc6466fff6b81a9dcea07d42416c640af3"}, + {file = "pyright-1.1.368.tar.gz", hash = "sha256:9b2aa48142d9d9fc9a6aedff743c76873cc4e615f3297cdbf893d5793f75b306"}, ] [package.dependencies] @@ -2064,18 +2062,15 @@ files = [ [[package]] name = "readchar" -version = "4.0.6" +version = "4.1.0" description = "Library to easily read single chars and key strokes" optional = false python-versions = ">=3.8" files = [ - {file = "readchar-4.0.6-py3-none-any.whl", hash = "sha256:b4b31dd35de4897be738f27e8f9f62426b5fedb54b648364987e30ae534b71bc"}, - {file = "readchar-4.0.6.tar.gz", hash = "sha256:e0dae942d3a746f8d5423f83dbad67efe704004baafe31b626477929faaee472"}, + {file = "readchar-4.1.0-py3-none-any.whl", hash = "sha256:d163680656b34f263fb5074023db44b999c68ff31ab394445ebfd1a2a41fe9a2"}, + {file = "readchar-4.1.0.tar.gz", hash = "sha256:6f44d1b5f0fd93bd93236eac7da39609f15df647ab9cea39f5bc7478b3344b99"}, ] -[package.dependencies] -setuptools = ">=41.0" - [[package]] name = "referencing" version = "0.35.1" @@ -2181,13 +2176,13 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -2452,46 +2447,30 @@ files = [ [[package]] name = "ruff" -version = "0.4.4" +version = "0.4.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, - {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, - {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, - {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, - {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, - {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, -] - -[[package]] -name = "setuptools" -version = "69.5.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, ] -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "shellingham" version = "1.5.4" @@ -2527,64 +2506,64 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.30" +version = "2.0.31" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"asyncio\""} +greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"asyncio\""} typing-extensions = ">=4.6.0" [package.extras] @@ -2614,21 +2593,21 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sshared" -version = "0.4.0" +version = "0.8.0" description = "后端共享组件" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "sshared-0.4.0-py3-none-any.whl", hash = "sha256:1d03b4dba7c6b0721cdea67f164e4c8492e0e58eba87fb6c2ef3c2db41f0e391"}, - {file = "sshared-0.4.0.tar.gz", hash = "sha256:b61184a9679de3238cc016d3ea20f2975f59a2a2e3aba181edf1a5cc9bb89a7c"}, + {file = "sshared-0.8.0-py3-none-any.whl", hash = "sha256:cfd4d25a5a327242124ada9f22dc31cd20b3a7674ea843de5417ea1f5928ad55"}, + {file = "sshared-0.8.0.tar.gz", hash = "sha256:bae6bfe9b38170e52e9dfc817330d0292ad51ca60defe74354e4145808dd6b85"}, ] [package.dependencies] msgspec = ">=0.18.0,<0.19.0" -typing-extensions = ">=4.10.0,<5.0.0" +typing-extensions = ">=4.12.0,<5.0.0" [package.extras] -api = ["litestar (>=2.8.0,<3.0.0)"] +api = ["litestar (>=2.9.0,<3.0.0)"] mongo = ["motor (>=3.3.0,<4.0.0)"] [[package]] @@ -2698,13 +2677,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -2825,13 +2804,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -2972,20 +2951,20 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "07ae375d0d863f66563ffbd2156c66b13a41c8d09d4b3b82723fc0c8b07d1490" +content-hash = "d4f9e9bab5140a0cb27a58d21d873947b30436adcdb97dcf034a6acf4430dd3c" diff --git a/pyproject.toml b/pyproject.toml index 4e2647c..d941901 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ python = "^3.8" prefect = "^2.19.0" jkit = "^3.0.0a16" sspeedup = "^0.25.0" -sshared = "^0.4.0" +sshared = "^0.8.0" [tool.poetry.group.dev.dependencies] ruff = "^0.4.0" diff --git a/requirements-dev.txt b/requirements-dev.txt index 274a177..aec793e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,6 +1,6 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" -annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +annotated-types==0.7.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" apprise==1.8.0 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" @@ -10,7 +10,7 @@ asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" cachetools==5.3.3 ; python_version >= "3.8" and python_version < "4.0" -certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" +certifi==2024.6.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" @@ -18,17 +18,17 @@ cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" croniter==2.0.5 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.7 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.8 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.2.0 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.5.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" +fsspec==2024.6.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.30.0 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.45.0 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.47.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -37,14 +37,14 @@ httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" humanize==4.9.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.7 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" +importlib-metadata==7.2.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.2.0 ; python_version >= "3.8" and python_version < "4.0" jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" -jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" +jsonpointer==3.0.0 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.22.0 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -55,23 +55,23 @@ markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" +nodeenv==1.9.1 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.10.3 ; python_version >= "3.8" and python_version < "4.0" -packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.5 ; python_version >= "3.8" and python_version < "4.0" +packaging==24.1 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.19.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.19.5 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.18.2 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.7.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.4 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.7.2 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.363 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.3 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.368 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -79,36 +79,35 @@ pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.1.0 ; python_version >= "3.8" and python_version < "4.0" referencing==0.35.1 ; python_version >= "3.8" and python_version < "4.0" regex==2024.5.15 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +requests==2.32.3 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.1 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.4.4 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.4.10 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.30 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.30 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.4.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.31 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.31 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.8.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.10.0 ; python_version >= "3.8" and python_version < "4.0" -urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" +urllib3==2.2.2 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.8.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.18.2 ; python_version >= "3.8" and python_version < "3.10" +zipp==3.19.2 ; python_version >= "3.8" and python_version < "3.10" diff --git a/requirements.txt b/requirements.txt index e2bd446..2b3ef83 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ aiosqlite==0.20.0 ; python_version >= "3.8" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.8" and python_version < "4.0" -annotated-types==0.6.0 ; python_version >= "3.8" and python_version < "4.0" +annotated-types==0.7.0 ; python_version >= "3.8" and python_version < "4.0" anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0" apprise==1.8.0 ; python_version >= "3.8" and python_version < "4.0" asgi-lifespan==2.1.0 ; python_version >= "3.8" and python_version < "4.0" @@ -10,7 +10,7 @@ asyncpg==0.29.0 ; python_version >= "3.8" and python_version < "4.0" attrs==23.2.0 ; python_version >= "3.8" and python_version < "4.0" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" cachetools==5.3.3 ; python_version >= "3.8" and python_version < "4.0" -certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" +certifi==2024.6.2 ; python_version >= "3.8" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" @@ -18,17 +18,17 @@ cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" coolname==2.2.0 ; python_version >= "3.8" and python_version < "4.0" croniter==2.0.5 ; python_version >= "3.8" and python_version < "4.0" -cryptography==42.0.7 ; python_version >= "3.8" and python_version < "4.0" +cryptography==42.0.8 ; python_version >= "3.8" and python_version < "4.0" dateparser==1.2.0 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" docker==6.1.3 ; python_version >= "3.8" and python_version < "4.0" -email-validator==2.1.1 ; python_version >= "3.8" and python_version < "4.0" +email-validator==2.2.0 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" -fsspec==2024.5.0 ; python_version >= "3.8" and python_version < "4.0" -google-auth==2.29.0 ; python_version >= "3.8" and python_version < "4.0" +fsspec==2024.6.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.30.0 ; python_version >= "3.8" and python_version < "4.0" graphviz==0.20.3 ; python_version >= "3.8" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0" -griffe==0.45.0 ; python_version >= "3.8" and python_version < "4.0" +griffe==0.47.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -37,14 +37,14 @@ httpx[http2]==0.27.0 ; python_version >= "3.8" and python_version < "4.0" humanize==4.9.0 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" idna==3.7 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==7.1.0 ; python_version >= "3.8" and python_version < "3.10" +importlib-metadata==7.2.0 ; python_version >= "3.8" and python_version < "3.10" importlib-resources==6.1.3 ; python_version >= "3.8" and python_version < "4.0" itsdangerous==2.2.0 ; python_version >= "3.8" and python_version < "4.0" jinja2-humanize-extension==0.4.0 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" jkit==3.0.0a16 ; python_version >= "3.8" and python_version < "4.0" jsonpatch==1.33 ; python_version >= "3.8" and python_version < "4.0" -jsonpointer==2.4 ; python_version >= "3.8" and python_version < "4.0" +jsonpointer==3.0.0 ; python_version >= "3.8" and python_version < "4.0" jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "4.0" jsonschema==4.22.0 ; python_version >= "3.8" and python_version < "4.0" kubernetes==29.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -56,20 +56,20 @@ mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" motor==3.4.0 ; python_version >= "3.8" and python_version < "4.0" msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" -orjson==3.10.3 ; python_version >= "3.8" and python_version < "4.0" -packaging==24.0 ; python_version >= "3.8" and python_version < "4.0" +orjson==3.10.5 ; python_version >= "3.8" and python_version < "4.0" +packaging==24.1 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" pendulum==2.1.2 ; python_version >= "3.8" and python_version < "3.12" pendulum==3.0.0 ; python_version >= "3.12" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" -prefect==2.19.0 ; python_version >= "3.8" and python_version < "4.0" +prefect==2.19.5 ; python_version >= "3.8" and python_version < "4.0" pyasn1-modules==0.4.0 ; python_version >= "3.8" and python_version < "4.0" pyasn1==0.6.0 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.8" and python_version < "4.0" and platform_python_implementation != "PyPy" -pydantic-core==2.18.2 ; python_version >= "3.8" and python_version < "4.0" -pydantic[email]==2.7.1 ; python_version >= "3.8" and python_version < "4.0" +pydantic-core==2.18.4 ; python_version >= "3.8" and python_version < "4.0" +pydantic[email]==2.7.4 ; python_version >= "3.8" and python_version < "4.0" pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.7.2 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.3 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-multipart==0.0.9 ; python_version >= "3.8" and python_version < "4.0" python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "4.0" @@ -77,35 +77,34 @@ pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" pytzdata==2020.1 ; python_version >= "3.8" and python_version < "3.12" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -readchar==4.0.6 ; python_version >= "3.8" and python_version < "4.0" +readchar==4.1.0 ; python_version >= "3.8" and python_version < "4.0" referencing==0.35.1 ; python_version >= "3.8" and python_version < "4.0" regex==2024.5.15 ; python_version >= "3.8" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +requests==2.32.3 ; python_version >= "3.8" and python_version < "4.0" rfc3339-validator==0.1.4 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" rpds-py==0.18.1 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8" ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "4.0" -setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy==2.0.30 ; python_version >= "3.8" and python_version < "4.0" -sqlalchemy[asyncio]==2.0.30 ; python_version >= "3.8" and python_version < "4.0" -sshared==0.4.0 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy==2.0.31 ; python_version >= "3.8" and python_version < "4.0" +sqlalchemy[asyncio]==2.0.31 ; python_version >= "3.8" and python_version < "4.0" +sshared==0.8.0 ; python_version >= "3.8" and python_version < "4.0" sspeedup==0.25.1 ; python_version >= "3.8" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.8" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.8" and python_version < "4.0" typer==0.12.3 ; python_version >= "3.8" and python_version < "4.0" -typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.8" and (python_version >= "3.12" or platform_system == "Windows") and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0" ujson==5.10.0 ; python_version >= "3.8" and python_version < "4.0" -urllib3==2.2.1 ; python_version >= "3.8" and python_version < "4.0" +urllib3==2.2.2 ; python_version >= "3.8" and python_version < "4.0" uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" websocket-client==1.8.0 ; python_version >= "3.8" and python_version < "4.0" websockets==12.0 ; python_version >= "3.8" and python_version < "4.0" wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" -zipp==3.18.2 ; python_version >= "3.8" and python_version < "3.10" +zipp==3.19.2 ; python_version >= "3.8" and python_version < "3.10"