Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
e3ff9e9ec7 | |||
618cd49a02 | |||
cf066e3974 | |||
9f55f3b207 | |||
f5b13c7d14 | |||
d753053e87 | |||
33186a47c7 | |||
948d223fa4 | |||
70a92c76db | |||
b11cc26daa | |||
6cac9dc9c2 | |||
ebca87230a | |||
5efa42d35d | |||
2d4a1294cb |
@ -33,7 +33,6 @@ python-dotenv==1.0.1
|
|||||||
PyYAML==6.0.2
|
PyYAML==6.0.2
|
||||||
requests==2.32.3
|
requests==2.32.3
|
||||||
requests-toolbelt==1.0.0
|
requests-toolbelt==1.0.0
|
||||||
sentry-sdk==2.19.0
|
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
toml==0.10.2
|
toml==0.10.2
|
||||||
tomli==2.1.0
|
tomli==2.1.0
|
||||||
|
@ -6,6 +6,4 @@ APPROVED_ROOMS="abc123,def456"
|
|||||||
APPROVED_USERS="bob@example.com,john@me.com"
|
APPROVED_USERS="bob@example.com,john@me.com"
|
||||||
BOT_NAME=""
|
BOT_NAME=""
|
||||||
N8N_WEBHOOK_URL=""
|
N8N_WEBHOOK_URL=""
|
||||||
SENTRY_DSN=""
|
|
||||||
SENTRY_ENABLED="False"
|
|
||||||
WEBEX_API_KEY=""
|
WEBEX_API_KEY=""
|
||||||
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -13,6 +13,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
ci:
|
ci:
|
||||||
uses: luketainton/gha-workflows/.github/workflows/ci-python-poetry-with-docker.yml@main
|
uses: luketainton/gha-workflows/.github/workflows/ci-python-poetry-with-docker.yml@main
|
||||||
|
with:
|
||||||
|
python-version: 3.13
|
||||||
secrets:
|
secrets:
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||||
|
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@ -5,6 +5,14 @@ on:
|
|||||||
- cron: "0 9 * * 0"
|
- cron: "0 9 * * 0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test:
|
||||||
|
uses: luketainton/gha-workflows/.github/workflows/ci-python-poetry-with-docker.yml@main
|
||||||
|
with:
|
||||||
|
python-version: 3.13
|
||||||
|
secrets:
|
||||||
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
|
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||||
|
|
||||||
create_release:
|
create_release:
|
||||||
name: Create Release
|
name: Create Release
|
||||||
uses: luketainton/gha-workflows/.github/workflows/create-release.yml@main
|
uses: luketainton/gha-workflows/.github/workflows/create-release.yml@main
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM python:3.11-slim
|
FROM python:3.13-slim
|
||||||
LABEL maintainer="Luke Tainton <luke@tainton.uk>"
|
LABEL maintainer="Luke Tainton <luke@tainton.uk>"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/luketainton/roboluke-tasks"
|
LABEL org.opencontainers.image.source="https://github.com/luketainton/roboluke-tasks"
|
||||||
USER root
|
USER root
|
||||||
@ -12,7 +12,9 @@ RUN mkdir -p /.local && \
|
|||||||
|
|
||||||
COPY pyproject.toml /run/pyproject.toml
|
COPY pyproject.toml /run/pyproject.toml
|
||||||
COPY poetry.lock /run/poetry.lock
|
COPY poetry.lock /run/poetry.lock
|
||||||
RUN poetry install --without dev --no-root
|
|
||||||
|
RUN poetry config virtualenvs.create false && \
|
||||||
|
poetry install --without dev
|
||||||
|
|
||||||
ENTRYPOINT ["python3", "-B", "-m", "app.main"]
|
ENTRYPOINT ["python3", "-B", "-m", "app.main"]
|
||||||
|
|
||||||
|
@ -9,14 +9,12 @@ Add tasks to a Wekan to do list via Webex and n8n.
|
|||||||
3. Edit `.env` as required:
|
3. Edit `.env` as required:
|
||||||
- `ADMIN_EMAIL` - comma-separated list of admin (who owns the to-do list) email addresses
|
- `ADMIN_EMAIL` - comma-separated list of admin (who owns the to-do list) email addresses
|
||||||
- `ADMIN_FIRST_NAME` - admin first name
|
- `ADMIN_FIRST_NAME` - admin first name
|
||||||
- `APP_LIFECYCLE` - for use in Sentry only, set the name of the environment
|
- `APP_LIFECYCLE` - set the name of the environment
|
||||||
- `APPROVED_DOMAINS` - comma-separated list of domains that users are allowed to message the bot from
|
- `APPROVED_DOMAINS` - comma-separated list of domains that users are allowed to message the bot from
|
||||||
- `APPROVED_ROOMS` - comma-separated list of room IDs that users are allowed to message the bot from
|
- `APPROVED_ROOMS` - comma-separated list of room IDs that users are allowed to message the bot from
|
||||||
- `APPROVED_USERS` - comma-separated list of email addresses of approved users
|
- `APPROVED_USERS` - comma-separated list of email addresses of approved users
|
||||||
- `BOT_NAME` - Webex bot name
|
- `BOT_NAME` - Webex bot name
|
||||||
- `N8N_WEBHOOK_URL` - n8n webhook URL
|
- `N8N_WEBHOOK_URL` - n8n webhook URL
|
||||||
- `SENTRY_DSN` - for use in Sentry only, set the DSN of the Sentry project
|
|
||||||
- `SENTRY_ENABLED` - for use in Sentry only, enable sending data to Sentry
|
|
||||||
- `WEBEX_API_KEY` - Webex API key
|
- `WEBEX_API_KEY` - Webex API key
|
||||||
|
|
||||||
## How to use
|
## How to use
|
||||||
|
@ -2,11 +2,18 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import sentry_sdk
|
|
||||||
from webex_bot.models.command import Command
|
from webex_bot.models.command import Command
|
||||||
from webex_bot.models.response import Response, response_from_adaptive_card
|
from webex_bot.models.response import Response, response_from_adaptive_card
|
||||||
from webexteamssdk.models.cards import (AdaptiveCard, Column, ColumnSet, Date,
|
from webexteamssdk.models.cards import (
|
||||||
FontSize, FontWeight, Text, TextBlock)
|
AdaptiveCard,
|
||||||
|
Column,
|
||||||
|
ColumnSet,
|
||||||
|
Date,
|
||||||
|
FontSize,
|
||||||
|
FontWeight,
|
||||||
|
Text,
|
||||||
|
TextBlock,
|
||||||
|
)
|
||||||
from webexteamssdk.models.cards.actions import Submit
|
from webexteamssdk.models.cards.actions import Submit
|
||||||
|
|
||||||
from app.utils.config import config
|
from app.utils.config import config
|
||||||
@ -115,8 +122,8 @@ class SubmitTaskCommand(Command):
|
|||||||
Submit(title="Cancel", data={"command_keyword": "exit"}),
|
Submit(title="Cancel", data={"command_keyword": "exit"}),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
with sentry_sdk.start_transaction(name="submit_task_command"):
|
_result = response_from_adaptive_card(card)
|
||||||
return response_from_adaptive_card(card)
|
return _result
|
||||||
|
|
||||||
|
|
||||||
class SubmitTaskCallback(Command):
|
class SubmitTaskCallback(Command):
|
||||||
@ -160,7 +167,6 @@ class SubmitTaskCallback(Command):
|
|||||||
|
|
||||||
def execute(self, message, attachment_actions, activity) -> str:
|
def execute(self, message, attachment_actions, activity) -> str:
|
||||||
"""Execute method."""
|
"""Execute method."""
|
||||||
with sentry_sdk.start_transaction(name="submit_task_callback"):
|
|
||||||
return self.msg
|
return self.msg
|
||||||
|
|
||||||
|
|
||||||
@ -177,14 +183,14 @@ class MyTasksCallback(Command):
|
|||||||
|
|
||||||
def pre_execute(self, message, attachment_actions, activity) -> str:
|
def pre_execute(self, message, attachment_actions, activity) -> str:
|
||||||
"""Pre-execute method."""
|
"""Pre-execute method."""
|
||||||
with sentry_sdk.start_transaction(name="my_tasks_preexec"):
|
_msg: str = "Getting your tasks..."
|
||||||
return "Getting your tasks..."
|
return _msg
|
||||||
|
|
||||||
def execute(self, message, attachment_actions, activity) -> str | None:
|
def execute(self, message, attachment_actions, activity) -> str | None:
|
||||||
"""Execute method."""
|
"""Execute method."""
|
||||||
sender: str = attachment_actions.inputs.get("sender")
|
sender: str = attachment_actions.inputs.get("sender")
|
||||||
result: bool = get_tasks(requestor=sender)
|
result: bool = get_tasks(requestor=sender)
|
||||||
with sentry_sdk.start_transaction(name="my_tasks_exec"):
|
_msg: str = "Failed to get tasks. Please try again."
|
||||||
if not result:
|
if not result:
|
||||||
return "Failed to get tasks. Please try again."
|
return _msg
|
||||||
return None
|
return None
|
||||||
|
12
app/main.py
12
app/main.py
@ -2,24 +2,12 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import sentry_sdk
|
|
||||||
from sentry_sdk.integrations.stdlib import StdlibIntegration
|
|
||||||
from webex_bot.webex_bot import WebexBot
|
from webex_bot.webex_bot import WebexBot
|
||||||
|
|
||||||
from app.commands.exit import ExitCommand
|
from app.commands.exit import ExitCommand
|
||||||
from app.commands.submit_task import SubmitTaskCommand
|
from app.commands.submit_task import SubmitTaskCommand
|
||||||
from app.utils.config import config
|
from app.utils.config import config
|
||||||
|
|
||||||
if config.sentry_enabled:
|
|
||||||
apm = sentry_sdk.init(
|
|
||||||
dsn=config.sentry_dsn,
|
|
||||||
enable_tracing=True,
|
|
||||||
environment=config.environment,
|
|
||||||
release=config.version,
|
|
||||||
integrations=[StdlibIntegration()],
|
|
||||||
spotlight=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def create_bot() -> WebexBot:
|
def create_bot() -> WebexBot:
|
||||||
"""Create and return a Webex Bot object."""
|
"""Create and return a Webex Bot object."""
|
||||||
|
@ -11,15 +11,6 @@ class Config:
|
|||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
"""Configuration module."""
|
"""Configuration module."""
|
||||||
|
|
||||||
# Sentry config needs to be processed first for loop prevention.
|
|
||||||
|
|
||||||
self.__sentry_dsn: str = os.environ.get("SENTRY_DSN", "")
|
|
||||||
|
|
||||||
self.__sentry_enabled: bool = bool(
|
|
||||||
os.environ.get("SENTRY_ENABLED", "False").upper() == "TRUE"
|
|
||||||
and self.__sentry_dsn != ""
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def environment(self) -> str:
|
def environment(self) -> str:
|
||||||
"""Returns the current app lifecycle."""
|
"""Returns the current app lifecycle."""
|
||||||
@ -30,19 +21,6 @@ class Config:
|
|||||||
"""Returns the current app version."""
|
"""Returns the current app version."""
|
||||||
return os.environ["APP_VERSION"]
|
return os.environ["APP_VERSION"]
|
||||||
|
|
||||||
@property
|
|
||||||
def sentry_enabled(self) -> bool:
|
|
||||||
"""Returns True if Sentry SDK is enabled, else False."""
|
|
||||||
return self.__sentry_enabled
|
|
||||||
|
|
||||||
@property
|
|
||||||
def sentry_dsn(self) -> str:
|
|
||||||
"""Returns the Sentry DSN value if Sentry SDK is enabled AND
|
|
||||||
Sentry DSN is set, else blank string."""
|
|
||||||
if not self.__sentry_enabled:
|
|
||||||
return ""
|
|
||||||
return self.__sentry_dsn
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def bot_name(self) -> str:
|
def bot_name(self) -> str:
|
||||||
"""Returns the bot name."""
|
"""Returns the bot name."""
|
||||||
@ -69,31 +47,27 @@ class Config:
|
|||||||
return os.environ["N8N_WEBHOOK_URL"]
|
return os.environ["N8N_WEBHOOK_URL"]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def approved_users(self) -> list | None:
|
def approved_users(self) -> list:
|
||||||
"""Returns a list of approved users."""
|
"""Returns a list of approved users."""
|
||||||
_emails: list[str] = os.environ.get("APPROVED_USERS", "").split(",")
|
_emails: list[str] = os.environ.get("APPROVED_USERS", "").split(",")
|
||||||
_emails: list[str] = [i.strip() for i in _emails if i]
|
_emails: list[str] = [i.strip() for i in _emails if i]
|
||||||
if not _emails:
|
if not _emails:
|
||||||
return None
|
return []
|
||||||
emails = [i for i in _emails if validate_email_syntax(i)]
|
emails = [i for i in _emails if validate_email_syntax(i)]
|
||||||
return emails
|
return emails
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def approved_rooms(self) -> list | None:
|
def approved_rooms(self) -> list:
|
||||||
"""Returns a list of approved rooms."""
|
"""Returns a list of approved rooms."""
|
||||||
_rooms: list[str] = os.environ.get("APPROVED_ROOMS", "").split(",")
|
_rooms: list[str] = os.environ.get("APPROVED_ROOMS", "").split(",")
|
||||||
rooms: list[str] = [i.strip() for i in _rooms if i]
|
rooms: list[str] = [i.strip() for i in _rooms if i]
|
||||||
if not rooms:
|
|
||||||
return None
|
|
||||||
return rooms
|
return rooms
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def approved_domains(self) -> list | None:
|
def approved_domains(self) -> list:
|
||||||
"""Returns a list of approved domains."""
|
"""Returns a list of approved domains."""
|
||||||
_domains: list[str] = os.environ.get("APPROVED_DOMAINS", "").split(",")
|
_domains: list[str] = os.environ.get("APPROVED_DOMAINS", "").split(",")
|
||||||
domains: list[str] = [i.strip() for i in _domains if i]
|
domains: list[str] = [i.strip() for i in _domains if i]
|
||||||
if not domains:
|
|
||||||
return None
|
|
||||||
return domains
|
return domains
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
"""N8N utils module."""
|
"""N8N utils module."""
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
import sentry_sdk
|
|
||||||
|
|
||||||
from app.utils.config import config
|
from app.utils.config import config
|
||||||
|
|
||||||
@ -38,7 +37,6 @@ def submit_task(summary, description, completion_date, requestor) -> bool:
|
|||||||
Returns:
|
Returns:
|
||||||
bool: True if successful, else False.
|
bool: True if successful, else False.
|
||||||
"""
|
"""
|
||||||
with sentry_sdk.start_transaction(name="submit_task"):
|
|
||||||
data: dict = {
|
data: dict = {
|
||||||
"requestor": requestor,
|
"requestor": requestor,
|
||||||
"title": summary,
|
"title": summary,
|
||||||
@ -58,7 +56,6 @@ def get_tasks(requestor) -> bool:
|
|||||||
Returns:
|
Returns:
|
||||||
bool: True if successful, else False.
|
bool: True if successful, else False.
|
||||||
"""
|
"""
|
||||||
with sentry_sdk.start_transaction(name="get_tasks"):
|
|
||||||
headers: dict = {"Content-Type": "application/json"}
|
headers: dict = {"Content-Type": "application/json"}
|
||||||
resp: requests.Response = requests.get(
|
resp: requests.Response = requests.get(
|
||||||
url=config.n8n_webhook_url,
|
url=config.n8n_webhook_url,
|
||||||
|
198
poetry.lock
generated
198
poetry.lock
generated
@ -1,4 +1,4 @@
|
|||||||
# This file is automatically @generated by Poetry 1.8.4 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]]
|
[[package]]
|
||||||
name = "astroid"
|
name = "astroid"
|
||||||
@ -235,73 +235,73 @@ cron = ["capturer (>=2.4)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "coverage"
|
name = "coverage"
|
||||||
version = "7.6.7"
|
version = "7.6.9"
|
||||||
description = "Code coverage measurement for Python"
|
description = "Code coverage measurement for Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.9"
|
||||||
files = [
|
files = [
|
||||||
{file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"},
|
{file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"},
|
{file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"},
|
{file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"},
|
{file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"},
|
{file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"},
|
{file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"},
|
{file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"},
|
{file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"},
|
{file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"},
|
||||||
{file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"},
|
{file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"},
|
{file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"},
|
{file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"},
|
{file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"},
|
{file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"},
|
{file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"},
|
{file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"},
|
{file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"},
|
{file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"},
|
{file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"},
|
||||||
{file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"},
|
{file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"},
|
{file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"},
|
{file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"},
|
{file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"},
|
{file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"},
|
{file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"},
|
{file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"},
|
{file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"},
|
{file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"},
|
{file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"},
|
||||||
{file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"},
|
{file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"},
|
{file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"},
|
{file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"},
|
{file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"},
|
{file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"},
|
{file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"},
|
{file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"},
|
{file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"},
|
{file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"},
|
{file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"},
|
{file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"},
|
{file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"},
|
{file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"},
|
{file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"},
|
{file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"},
|
{file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"},
|
{file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"},
|
{file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"},
|
{file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"},
|
{file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"},
|
||||||
{file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"},
|
{file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"},
|
{file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"},
|
{file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"},
|
{file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"},
|
{file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"},
|
{file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"},
|
{file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"},
|
{file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"},
|
{file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"},
|
{file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"},
|
||||||
{file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"},
|
{file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"},
|
||||||
{file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"},
|
{file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"},
|
||||||
{file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"},
|
{file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
@ -495,17 +495,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pylint"
|
name = "pylint"
|
||||||
version = "3.3.1"
|
version = "3.3.2"
|
||||||
description = "python code static checker"
|
description = "python code static checker"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9.0"
|
python-versions = ">=3.9.0"
|
||||||
files = [
|
files = [
|
||||||
{file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"},
|
{file = "pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a"},
|
||||||
{file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"},
|
{file = "pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
astroid = ">=3.3.4,<=3.4.0-dev0"
|
astroid = ">=3.3.5,<=3.4.0-dev0"
|
||||||
colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
|
colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
|
||||||
dill = [
|
dill = [
|
||||||
{version = ">=0.3.7", markers = "python_version >= \"3.12\""},
|
{version = ">=0.3.7", markers = "python_version >= \"3.12\""},
|
||||||
@ -547,13 +547,13 @@ dev = ["build", "flake8", "mypy", "pytest", "twine"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
version = "8.3.3"
|
version = "8.3.4"
|
||||||
description = "pytest: simple powerful testing with Python"
|
description = "pytest: simple powerful testing with Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.8"
|
||||||
files = [
|
files = [
|
||||||
{file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"},
|
{file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
|
||||||
{file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"},
|
{file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -611,60 +611,6 @@ files = [
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
requests = ">=2.0.1,<3.0.0"
|
requests = ">=2.0.1,<3.0.0"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sentry-sdk"
|
|
||||||
version = "2.19.0"
|
|
||||||
description = "Python client for Sentry (https://sentry.io)"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
files = [
|
|
||||||
{file = "sentry_sdk-2.19.0-py2.py3-none-any.whl", hash = "sha256:7b0b3b709dee051337244a09a30dbf6e95afe0d34a1f8b430d45e0982a7c125b"},
|
|
||||||
{file = "sentry_sdk-2.19.0.tar.gz", hash = "sha256:ee4a4d2ae8bfe3cac012dcf3e4607975904c137e1738116549fc3dbbb6ff0e36"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
certifi = "*"
|
|
||||||
urllib3 = ">=1.26.11"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
aiohttp = ["aiohttp (>=3.5)"]
|
|
||||||
anthropic = ["anthropic (>=0.16)"]
|
|
||||||
arq = ["arq (>=0.23)"]
|
|
||||||
asyncpg = ["asyncpg (>=0.23)"]
|
|
||||||
beam = ["apache-beam (>=2.12)"]
|
|
||||||
bottle = ["bottle (>=0.12.13)"]
|
|
||||||
celery = ["celery (>=3)"]
|
|
||||||
celery-redbeat = ["celery-redbeat (>=2)"]
|
|
||||||
chalice = ["chalice (>=1.16.0)"]
|
|
||||||
clickhouse-driver = ["clickhouse-driver (>=0.2.0)"]
|
|
||||||
django = ["django (>=1.8)"]
|
|
||||||
falcon = ["falcon (>=1.4)"]
|
|
||||||
fastapi = ["fastapi (>=0.79.0)"]
|
|
||||||
flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"]
|
|
||||||
grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"]
|
|
||||||
http2 = ["httpcore[http2] (==1.*)"]
|
|
||||||
httpx = ["httpx (>=0.16.0)"]
|
|
||||||
huey = ["huey (>=2)"]
|
|
||||||
huggingface-hub = ["huggingface_hub (>=0.22)"]
|
|
||||||
langchain = ["langchain (>=0.0.210)"]
|
|
||||||
launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"]
|
|
||||||
litestar = ["litestar (>=2.0.0)"]
|
|
||||||
loguru = ["loguru (>=0.5)"]
|
|
||||||
openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"]
|
|
||||||
openfeature = ["openfeature-sdk (>=0.7.1)"]
|
|
||||||
opentelemetry = ["opentelemetry-distro (>=0.35b0)"]
|
|
||||||
opentelemetry-experimental = ["opentelemetry-distro"]
|
|
||||||
pure-eval = ["asttokens", "executing", "pure_eval"]
|
|
||||||
pymongo = ["pymongo (>=3.1)"]
|
|
||||||
pyspark = ["pyspark (>=2.4.4)"]
|
|
||||||
quart = ["blinker (>=1.1)", "quart (>=0.16.1)"]
|
|
||||||
rq = ["rq (>=0.6)"]
|
|
||||||
sanic = ["sanic (>=0.8)"]
|
|
||||||
sqlalchemy = ["sqlalchemy (>=1.2)"]
|
|
||||||
starlette = ["starlette (>=0.19.1)"]
|
|
||||||
starlite = ["starlite (>=1.48)"]
|
|
||||||
tornado = ["tornado (>=6)"]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "setuptools"
|
name = "setuptools"
|
||||||
version = "75.6.0"
|
version = "75.6.0"
|
||||||
@ -905,4 +851,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"]
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.11"
|
||||||
content-hash = "341e2cb729a0e9691470e528ed4b51908531612834963958eb5c88fb76939473"
|
content-hash = "2dabc6487de603ef529bf4ca4ef73075b1f5d6355cce3703ccea466188492f70"
|
||||||
|
@ -9,17 +9,16 @@ package-mode = false
|
|||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.11"
|
python = "^3.11"
|
||||||
webex-bot = "^0.5.2"
|
webex-bot = "^0.5.2"
|
||||||
sentry-sdk = "^2.19.0"
|
|
||||||
datetime = "^5.5"
|
datetime = "^5.5"
|
||||||
requests = "^2.32.3"
|
requests = "^2.32.3"
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
black = "^24.10.0"
|
black = "^24.10.0"
|
||||||
coverage = "^7.6.7"
|
coverage = "^7.6.9"
|
||||||
isort = "^5.13.2"
|
isort = "^5.13.2"
|
||||||
pylint = "^3.3.1"
|
pylint = "^3.3.2"
|
||||||
pylint-exit = "^1.2.0"
|
pylint-exit = "^1.2.0"
|
||||||
pytest = "^8.3.3"
|
pytest = "^8.3.4"
|
||||||
zipp = "^3.21.0"
|
zipp = "^3.21.0"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
|
2
test.sh
2
test.sh
@ -1,3 +1,3 @@
|
|||||||
export $(cat .env.test | xargs)
|
export $(cat .env.test | xargs)
|
||||||
python -B -m app.main
|
python -B -m app.main
|
||||||
unset ADMIN_EMAIL ADMIN_FIRST_NAME APP_LIFECYCLE APP_VERSION APPROVED_DOMAINS APPROVED_ROOMS APPROVED_USERS BOT_NAME N8N_WEBHOOK_URL SENTRY_DSN SENTRY_ENABLED WEBEX_API_KEY
|
unset ADMIN_EMAIL ADMIN_FIRST_NAME APP_LIFECYCLE APP_VERSION APPROVED_DOMAINS APPROVED_ROOMS APPROVED_USERS BOT_NAME N8N_WEBHOOK_URL WEBEX_API_KEY
|
||||||
|
@ -17,8 +17,6 @@ def test_config() -> None:
|
|||||||
"ADMIN_FIRST_NAME": "Test",
|
"ADMIN_FIRST_NAME": "Test",
|
||||||
"ADMIN_EMAIL": "test@test.com",
|
"ADMIN_EMAIL": "test@test.com",
|
||||||
"N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg",
|
"N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg",
|
||||||
"SENTRY_ENABLED": "false",
|
|
||||||
"SENTRY_DSN": "http://localhost",
|
|
||||||
"APPROVED_USERS": "test@test.com",
|
"APPROVED_USERS": "test@test.com",
|
||||||
"APPROVED_DOMAINS": "test.com",
|
"APPROVED_DOMAINS": "test.com",
|
||||||
"APPROVED_ROOMS": "test",
|
"APPROVED_ROOMS": "test",
|
||||||
@ -37,16 +35,8 @@ def test_config() -> None:
|
|||||||
assert config.approved_users == config_vars["APPROVED_USERS"].split(",")
|
assert config.approved_users == config_vars["APPROVED_USERS"].split(",")
|
||||||
assert config.bot_name == config_vars["BOT_NAME"]
|
assert config.bot_name == config_vars["BOT_NAME"]
|
||||||
assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"]
|
assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"]
|
||||||
assert config.sentry_enabled == bool(
|
|
||||||
config_vars["SENTRY_ENABLED"].upper() == "TRUE"
|
|
||||||
)
|
|
||||||
assert config.version == config_vars["APP_VERSION"]
|
assert config.version == config_vars["APP_VERSION"]
|
||||||
assert config.webex_token == config_vars["WEBEX_API_KEY"]
|
assert config.webex_token == config_vars["WEBEX_API_KEY"]
|
||||||
|
|
||||||
if config.sentry_enabled:
|
|
||||||
assert config.sentry_dsn == config_vars["SENTRY_DSN"]
|
|
||||||
else:
|
|
||||||
assert config.sentry_dsn == ""
|
|
||||||
|
|
||||||
for config_var in config_vars:
|
for config_var in config_vars:
|
||||||
os.environ.pop(config_var, None)
|
os.environ.pop(config_var, None)
|
||||||
|
@ -17,8 +17,6 @@ def test_config_no_admin_vars() -> None:
|
|||||||
"ADMIN_FIRST_NAME": "Test",
|
"ADMIN_FIRST_NAME": "Test",
|
||||||
"ADMIN_EMAIL": "test@test.com",
|
"ADMIN_EMAIL": "test@test.com",
|
||||||
"N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg",
|
"N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg",
|
||||||
"SENTRY_ENABLED": "false",
|
|
||||||
"SENTRY_DSN": "http://localhost",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for config_var, value in config_vars.items():
|
for config_var, value in config_vars.items():
|
||||||
@ -27,23 +25,15 @@ def test_config_no_admin_vars() -> None:
|
|||||||
# needs to be imported AFTER environment variables are set
|
# needs to be imported AFTER environment variables are set
|
||||||
from app.utils.config import config # pragma: no cover
|
from app.utils.config import config # pragma: no cover
|
||||||
|
|
||||||
assert config.approved_domains is None
|
assert config.approved_domains == []
|
||||||
assert config.approved_rooms is None
|
assert config.approved_rooms == []
|
||||||
assert config.approved_users is None
|
assert config.approved_users == []
|
||||||
assert config.admin_emails == config_vars["ADMIN_EMAIL"].split(",")
|
assert config.admin_emails == config_vars["ADMIN_EMAIL"].split(",")
|
||||||
assert config.admin_first_name == config_vars["ADMIN_FIRST_NAME"]
|
assert config.admin_first_name == config_vars["ADMIN_FIRST_NAME"]
|
||||||
assert config.bot_name == config_vars["BOT_NAME"]
|
assert config.bot_name == config_vars["BOT_NAME"]
|
||||||
assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"]
|
assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"]
|
||||||
assert config.sentry_enabled == bool(
|
|
||||||
config_vars["SENTRY_ENABLED"].upper() == "TRUE"
|
|
||||||
)
|
|
||||||
assert config.version == config_vars["APP_VERSION"]
|
assert config.version == config_vars["APP_VERSION"]
|
||||||
assert config.webex_token == config_vars["WEBEX_API_KEY"]
|
assert config.webex_token == config_vars["WEBEX_API_KEY"]
|
||||||
|
|
||||||
if config.sentry_enabled:
|
|
||||||
assert config.sentry_dsn == config_vars["SENTRY_DSN"]
|
|
||||||
else:
|
|
||||||
assert config.sentry_dsn == ""
|
|
||||||
|
|
||||||
for config_var in config_vars:
|
for config_var in config_vars:
|
||||||
os.environ.pop(config_var, None)
|
os.environ.pop(config_var, None)
|
||||||
|
Reference in New Issue
Block a user