add celery
continuous-integration/drone/push Build is failing

This commit is contained in:
jianxin committed 2024-01-19 00:37:31 +08:00
1 parent 14e1f91658
commit 4d92f700ad
14 files changed
+493 -132

No files matched your search

+4
View File
@@ -13,3 +13,7 @@ VERIFICATION_TOKEN=35LaoAPYTXRyBmjeaBvzRbRUsJSL1KBx
# BITABLE
BITABLE_TOKEN=XDmHbhbZcaY4gZsOvBJcLcHonKh
TABLE_ID=tblwgGCDCE74Ugv6
# REDIS
BROKER_URL=redis://office-xbot-redis
RESULT_BACKEND=redis://office-xbot-redis
+1 -1
View File
@@ -30,4 +30,4 @@ COPY ./app /code/app
#
CMD ["python", "/code/app/demo.py"]
# CMD ["python", "/code/app/demo.py"]
+107
View File
@@ -0,0 +1,107 @@
import os
import json
import time
import lark_oapi as lark
from celery import Celery
from celery import Task
from flask import Flask
from dotenv import load_dotenv
from itertools import chain
from lark_oapi.adapter.flask import *
from lark_oapi.api.im.v1 import *
from lark_oapi.api.bitable.v1 import *
from app.task import *
from app.utils import *
from app.task import *
load_dotenv()
app_id = os.environ["APP_ID"]
app_secret = os.environ["APP_SECRET"]
encrypt_key = os.environ["ENCRYPT_KEY"]
verification_token = os.environ["VERIFICATION_TOKEN"]
bitable_token = os.environ["BITABLE_TOKEN"]
table_id = os.environ["TABLE_ID"]
bitable_token = "IRggb4I0MaRffTsJ7qkcw1wxnBg"
table_id = "tbl5J3sXBNIyNvJ8"
broker_url = os.environ["BROKER_URL"]
result_backend = os.environ["RESULT_BACKEND"]
# 创建client
client = lark.Client.builder().app_id(app_id).app_secret(app_secret).build()
current_dir = os.path.dirname(os.path.abspath(__file__))
cache_dir = os.path.join(current_dir, "cache")
if not os.path.exists(cache_dir):
os.makedirs(cache_dir)
def do_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) -> None:
process_message_callback.delay(client, bitable_token, table_id, cache_dir, data)
print(lark.JSON.marshal(data))
def do_customized_event(data: lark.CustomizedEvent) -> None:
print(lark.JSON.marshal(data))
handler = (
lark.EventDispatcherHandler.builder(
encrypt_key, verification_token, lark.LogLevel.DEBUG
)
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1)
.register_p1_customized_event("message", do_customized_event)
.build()
)
def create_app() -> Flask:
app = Flask(__name__)
app.config.from_mapping(
CELERY=dict(
broker_url=broker_url,
result_backend=result_backend,
task_ignore_result=True,
broker_connection_retry_on_startup=True,
),
)
app.config.from_prefixed_env()
celery_init_app(app)
@app.route("/event", methods=["POST"])
def event():
print("receive event: ", time.time())
resp = handler.do(parse_req())
return parse_resp(resp)
@app.route("/test", methods=["GET"])
def test():
add.delay(1, 2)
return {"test": "ok"}
return app
def celery_init_app(app: Flask) -> Celery:
class FlaskTask(Task):
def __call__(self, *args: object, **kwargs: object) -> object:
with app.app_context():
return self.run(*args, **kwargs)
celery_app = Celery(app.name, task_cls=FlaskTask)
celery_app.config_from_object(app.config["CELERY"])
celery_app.set_default()
app.extensions["celery"] = celery_app
return celery_app
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-117
View File
@@ -1,117 +0,0 @@
import os
import json
import time
import lark_oapi as lark
from flask import Flask
from dotenv import load_dotenv
from itertools import chain
from lark_oapi.adapter.flask import *
from lark_oapi.api.im.v1 import *
from lark_oapi.api.bitable.v1 import *
from utils import *
load_dotenv()
app_id = os.environ["APP_ID"]
app_secret = os.environ["APP_SECRET"]
encrypt_key = os.environ["ENCRYPT_KEY"]
verification_token = os.environ["VERIFICATION_TOKEN"]
bitable_token = os.environ["BITABLE_TOKEN"]
table_id = os.environ["TABLE_ID"]
app = Flask(__name__)
# 创建client
client = lark.Client.builder().app_id(app_id).app_secret(app_secret).build()
current_dir = os.path.dirname(os.path.abspath(__file__))
cache_dir = os.path.join(current_dir, "cache")
if not os.path.exists(cache_dir):
os.makedirs(cache_dir)
def do_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) -> None:
print(lark.JSON.marshal(data))
# record = {}
# images = []
# images_token = []
# message_content = ""
# message_type = data.event.message.message_type
# content = json.loads(data.event.message.content)
# if message_type == "post":
# content = content["content"]
# for item in chain.from_iterable(content):
# if item.get("tag") == "text":
# message_content += item["text"]
# if item.get("tag") == "img":
# images.append(item["image_key"])
# if message_type == "text":
# message_content = content["text"].replace("@_user_1", "").strip()
# sender_id = data.event.sender.sender_id.open_id
# record["问题概述"] = message_content
# record["创建人"] = sender_id
# message_id = data.event.message.message_id
# # 对 image_key 处理并并上传至多维表格
# for image in images:
# image_path = get_message_resource(client, message_id, image, "image", cache_dir)
# print("下载文件成功:", image, image_path)
# file_token = upload_media(client, image_path, "bitable_image", bitable_token)
# print("上传文件成功:", file_token)
# images_token.append(file_token)
# if images:
# record["附件"] = [{"file_token": image} for image in images_token]
# record_id = add_record(client, bitable_token, table_id, record)
# time.sleep(1)
# update_data = {"创建人": {"id": sender_id}}
# update_record(client, bitable_token, table_id, record_id, update_data)
# # content = {"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"}
# # send_message(receive_id, content)
# # 回复群组的消息
# content = f'{{"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"}}'
# send_group_message(client, message_id, content)
def do_customized_event(data: lark.CustomizedEvent) -> None:
print(lark.JSON.marshal(data))
handler = (
lark.EventDispatcherHandler.builder(
encrypt_key, verification_token, lark.LogLevel.DEBUG
)
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1)
.register_p1_customized_event("message", do_customized_event)
.build()
)
@app.route("/event", methods=["POST"])
def event():
print("receive event: ", time.time())
resp = handler.do(parse_req())
return parse_resp(resp)
if __name__ == "__main__":
app.run(port=8080, debug=True, host="0.0.0.0")
+4
View File
@@ -0,0 +1,4 @@
from app import create_app
flask_app = create_app()
celery_app = flask_app.extensions["celery"]
+81
View File
@@ -0,0 +1,81 @@
import time
import json
from itertools import chain
from celery import shared_task
from celery import Task
from app.utils import *
@shared_task(ignore_result=False)
def add(a: int, b: int) -> int:
return a + b
@shared_task()
def block() -> None:
time.sleep(5)
@shared_task(bind=True, ignore_result=False)
def process(self: Task, total: int) -> object:
for i in range(total):
self.update_state(state="PROGRESS", meta={"current": i + 1, "total": total})
time.sleep(1)
return {"current": total, "total": total}
@shared_task(include_result=False)
def process_message_callback(client, bitable_token, table_id, cache_dir, data) -> None:
record = {}
images = []
images_token = []
message_content = ""
message_type = data.event.message.message_type
content = json.loads(data.event.message.content)
if message_type == "post":
content = content["content"]
for item in chain.from_iterable(content):
if item.get("tag") == "text":
message_content += item["text"]
if item.get("tag") == "img":
images.append(item["image_key"])
if message_type == "text":
message_content = content["text"].replace("@_user_1", "").strip()
sender_id = data.event.sender.sender_id.open_id
record["问题概述"] = message_content
record["创建人"] = sender_id
message_id = data.event.message.message_id
# 对 image_key 处理并并上传至多维表格
for image in images:
image_path = get_message_resource(client, message_id, image, "image", cache_dir)
print("下载文件成功:", image, image_path)
file_token = upload_media(client, image_path, "bitable_image", bitable_token)
print("上传文件成功:", file_token)
images_token.append(file_token)
if images:
record["附件"] = [{"file_token": image} for image in images_token]
record_id = add_record(client, bitable_token, table_id, record)
time.sleep(1)
update_data = {"创建人": {"id": sender_id}}
update_record(client, bitable_token, table_id, record_id, update_data)
# content = {"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"}
# send_message(receive_id, content)
# 回复群组的消息
content = f'{{"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"}}'
send_group_message(client, message_id, content)
+1
View File
@@ -0,0 +1 @@
+29 -2
View File
@@ -1,8 +1,9 @@
version: '3'
services:
office-xbot-feishu:
container_name: office-xbot-feishu-0
office-xbot-app:
container_name: office-xbot-app
image: "${APP_IMAGE}"
command: "flask --app app:create_app run --debug --port 8080 --host 0.0.0.0"
ports:
- "0.0.0.0:8080:8080"
environment:
@@ -12,3 +13,29 @@ services:
- VERIFICATION_TOKEN=${VERIFICATION_TOKEN}
- BITABLE_TOKEN=${BITABLE_TOKEN}
- TABLE_ID=${TABLE_ID}
- BROKER_URL=${BROKER_URL}
- RESULT_BACKEND=${RESULT_BACKEND}
office-xbot-celery:
container_name: office-xbot-celery
image: "${APP_IMAGE}"
command: "celery -A app.make_celery worker --loglevel INFO"
environment:
- APP_ID=${APP_ID}
- APP_SECRET=${APP_SECRET}
- ENCRYPT_KEY=${ENCRYPT_KEY}
- VERIFICATION_TOKEN=${VERIFICATION_TOKEN}
- BITABLE_TOKEN=${BITABLE_TOKEN}
- TABLE_ID=${TABLE_ID}
- BROKER_URL=${BROKER_URL}
- RESULT_BACKEND=${RESULT_BACKEND}
office-xbot-redis:
container_name: office-xbot-redis
image: redis:latest
ports:
- "6379:6379"
networks:
office-xbot-network:
external: true
Generated
+264 -12
View File
@@ -1,4 +1,40 @@
# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand.
# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
[[package]]
name = "amqp"
version = "5.2.0"
description = "Low-level AMQP client for Python (fork of amqplib)."
optional = false
python-versions = ">=3.6"
files = [
{file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"},
{file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"},
]
[package.dependencies]
vine = ">=5.0.0,<6.0.0"
[[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 = "billiard"
version = "4.2.0"
description = "Python multiprocessing fork with improvements and bugfixes"
optional = false
python-versions = ">=3.7"
files = [
{file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"},
{file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"},
]
[[package]]
name = "blinker"
@@ -11,6 +47,61 @@ files = [
{file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"},
]
[[package]]
name = "celery"
version = "5.3.6"
description = "Distributed Task Queue."
optional = false
python-versions = ">=3.8"
files = [
{file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"},
{file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"},
]
[package.dependencies]
billiard = ">=4.2.0,<5.0"
click = ">=8.1.2,<9.0"
click-didyoumean = ">=0.3.0"
click-plugins = ">=1.1.1"
click-repl = ">=0.2.0"
kombu = ">=5.3.4,<6.0"
python-dateutil = ">=2.8.2"
tzdata = ">=2022.7"
vine = ">=5.1.0,<6.0"
[package.extras]
arangodb = ["pyArango (>=2.0.2)"]
auth = ["cryptography (==41.0.5)"]
azureblockblob = ["azure-storage-blob (>=12.15.0)"]
brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"]
cassandra = ["cassandra-driver (>=3.25.0,<4)"]
consul = ["python-consul2 (==0.1.5)"]
cosmosdbsql = ["pydocumentdb (==2.3.5)"]
couchbase = ["couchbase (>=3.0.0)"]
couchdb = ["pycouchdb (==1.14.2)"]
django = ["Django (>=2.2.28)"]
dynamodb = ["boto3 (>=1.26.143)"]
elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"]
eventlet = ["eventlet (>=0.32.0)"]
gevent = ["gevent (>=1.5.0)"]
librabbitmq = ["librabbitmq (>=2.0.0)"]
memcache = ["pylibmc (==1.6.3)"]
mongodb = ["pymongo[srv] (>=4.0.2)"]
msgpack = ["msgpack (==1.0.7)"]
pymemcache = ["python-memcached (==1.59)"]
pyro = ["pyro4 (==4.82)"]
pytest = ["pytest-celery (==0.0.0)"]
redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"]
s3 = ["boto3 (>=1.26.143)"]
slmq = ["softlayer-messaging (>=1.0.3)"]
solar = ["ephem (==4.1.5)"]
sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"]
sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.0)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"]
tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"]
yaml = ["PyYAML (>=3.10)"]
zookeeper = ["kazoo (>=1.3.1)"]
zstd = ["zstandard (==0.22.0)"]
[[package]]
name = "certifi"
version = "2023.11.17"
@@ -135,6 +226,55 @@ files = [
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "click-didyoumean"
version = "0.3.0"
description = "Enables git-like *did-you-mean* feature in click"
optional = false
python-versions = ">=3.6.2,<4.0.0"
files = [
{file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"},
{file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"},
]
[package.dependencies]
click = ">=7"
[[package]]
name = "click-plugins"
version = "1.1.1"
description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
optional = false
python-versions = "*"
files = [
{file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
{file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
]
[package.dependencies]
click = ">=4.0"
[package.extras]
dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"]
[[package]]
name = "click-repl"
version = "0.3.0"
description = "REPL plugin for Click"
optional = false
python-versions = ">=3.6"
files = [
{file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"},
{file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"},
]
[package.dependencies]
click = ">=7.0"
prompt-toolkit = ">=3.0.36"
[package.extras]
testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"]
[[package]]
name = "colorama"
version = "0.4.6"
@@ -207,6 +347,38 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
[[package]]
name = "kombu"
version = "5.3.5"
description = "Messaging library for Python."
optional = false
python-versions = ">=3.8"
files = [
{file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"},
{file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"},
]
[package.dependencies]
amqp = ">=5.1.1,<6.0.0"
vine = "*"
[package.extras]
azureservicebus = ["azure-servicebus (>=7.10.0)"]
azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"]
confluentkafka = ["confluent-kafka (>=2.2.0)"]
consul = ["python-consul2"]
librabbitmq = ["librabbitmq (>=2.0.0)"]
mongodb = ["pymongo (>=4.1.1)"]
msgpack = ["msgpack"]
pyro = ["pyro4"]
qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"]
redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"]
slmq = ["softlayer-messaging (>=1.0.3)"]
sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"]
sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"]
yaml = ["PyYAML (>=3.10)"]
zookeeper = ["kazoo (>=2.8.0)"]
[[package]]
name = "lark-oapi"
version = "1.0.28"
@@ -253,16 +425,6 @@ files = [
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
{file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
{file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
@@ -295,6 +457,20 @@ files = [
{file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
]
[[package]]
name = "prompt-toolkit"
version = "3.0.43"
description = "Library for building powerful interactive command lines in Python"
optional = false
python-versions = ">=3.7.0"
files = [
{file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"},
{file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"},
]
[package.dependencies]
wcwidth = "*"
[[package]]
name = "pycryptodome"
version = "3.20.0"
@@ -336,6 +512,20 @@ files = [
{file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"},
]
[[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-dotenv"
version = "1.0.0"
@@ -350,6 +540,24 @@ files = [
[package.extras]
cli = ["click (>=5.0)"]
[[package]]
name = "redis"
version = "5.0.1"
description = "Python client for Redis database and key-value store"
optional = false
python-versions = ">=3.7"
files = [
{file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"},
{file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"},
]
[package.dependencies]
async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""}
[package.extras]
hiredis = ["hiredis (>=1.0.0)"]
ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
[[package]]
name = "requests"
version = "2.31.0"
@@ -385,6 +593,28 @@ files = [
[package.dependencies]
requests = ">=2.0.1,<3.0.0"
[[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 = "tzdata"
version = "2023.4"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
files = [
{file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"},
{file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"},
]
[[package]]
name = "urllib3"
version = "2.1.0"
@@ -401,6 +631,28 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "vine"
version = "5.1.0"
description = "Python promises."
optional = false
python-versions = ">=3.6"
files = [
{file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"},
{file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"},
]
[[package]]
name = "wcwidth"
version = "0.2.13"
description = "Measures the displayed width of unicode strings in a terminal"
optional = false
python-versions = "*"
files = [
{file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
{file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
]
[[package]]
name = "werkzeug"
version = "3.0.1"
@@ -421,4 +673,4 @@ watchdog = ["watchdog (>=2.3)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "95e9728a1492258abd1459823347f2a4775e15deea59c39ac1cc06052fe21c61"
content-hash = "52a8819fa1ada0e76b575b691fdc306fdca4671d11b3aa118a6f227a1535cf64"
+2
View File
@@ -11,6 +11,8 @@ python = "^3.10"
flask = "^3.0.0"
python-dotenv = "^1.0.0"
lark-oapi = "^1.0.28"
celery = "^5.3.6"
redis = "^5.0.1"
[build-system]