diff --git a/.github/workflows/check-container-image-builds.yaml b/.github/workflows/check-container-image-builds.yaml
index 2f902cc5..dbe77e69 100644
--- a/.github/workflows/check-container-image-builds.yaml
+++ b/.github/workflows/check-container-image-builds.yaml
@@ -11,9 +11,8 @@ jobs:
contents: read
steps:
- - uses: docker/setup-buildx-action@v2
- -
- uses: docker/build-push-action@v4
+ - uses: docker/setup-buildx-action@v3
+ - uses: docker/build-push-action@v5
with:
push: false
cache-from: type=gha
diff --git a/.github/workflows/scripts/__init__.py b/.github/workflows/scripts/__init__.py
deleted file mode 100644
index 83faa26e..00000000
--- a/.github/workflows/scripts/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Common scripts used by workflows."""
diff --git a/.github/workflows/scripts/remove_invalid_tables.py b/.github/workflows/scripts/remove_invalid_tables.py
deleted file mode 100644
index 9805c366..00000000
--- a/.github/workflows/scripts/remove_invalid_tables.py
+++ /dev/null
@@ -1,188 +0,0 @@
-"""Removes invalid tables in MD files for correct linting."""
-
-import re
-import shutil
-from argparse import ArgumentParser, Namespace
-from collections.abc import MutableSequence, Sequence
-from pathlib import Path
-from typing import TYPE_CHECKING, Final, TextIO
-
-from git import Repo
-
-if TYPE_CHECKING:
- from os import PathLike
-
-# TODO(CarrotManMatt): Move to independent repo # noqa: FIX002, TD003, RUF100
-# TODO(CarrotManMatt): Use Marko for Markdown parsing (https://github.com/frostming/marko) # noqa: FIX002, TD003, RUF100
-
-
-def _get_project_root() -> Path:
- project_root: Path = Path(__file__).resolve()
-
- for _ in range(8):
- project_root = project_root.parent
-
- if any(path.name.startswith("README.md") for path in project_root.iterdir()):
- return project_root
-
- NO_ROOT_DIRECTORY_MESSAGE: Final[str] = "Could not locate project root directory."
- raise FileNotFoundError(NO_ROOT_DIRECTORY_MESSAGE)
-
-
-def _remove_any_invalid_tables(original_file_path: Path) -> None: # noqa: PLR0915
- table_lines: MutableSequence[int] = []
- custom_formatted_table_lines: MutableSequence[int] = []
-
- original_file: TextIO
- with original_file_path.open("r") as original_file:
- line_number: int
- line: str
- for line_number, line in enumerate(original_file, 1):
- if re.match(r"\|(?:( .+)|-+)\|", line):
- table_lines.append(line_number)
-
- if re.match(r"\| .+
\* .", line):
- custom_formatted_table_lines.append(line_number)
-
- if custom_formatted_table_lines and not table_lines:
- INCONSISTENT_TABLE_LINES_MESSAGE: Final[str] = (
- "Found custom-formatted table lines without any normal table lines."
- )
- raise RuntimeError(INCONSISTENT_TABLE_LINES_MESSAGE)
-
- if not table_lines:
- return
-
- temp_file_path: Path = shutil.copy2(
- original_file_path,
- original_file_path.parent / f"{original_file_path.name}.original",
- )
- new_file_path = original_file_path
- original_file_path = temp_file_path
- del temp_file_path
-
- new_file: TextIO
- with original_file_path.open("r") as original_file, new_file_path.open("w") as new_file:
- def write_table_if_not_custom_formatted(write_table_line_number: int, *, is_newline: bool = False) -> None: # noqa: E501
- write_table_lines: MutableSequence[str] = []
- while write_table_line_number in table_lines or is_newline:
- is_newline = False
-
- if write_table_line_number in custom_formatted_table_lines:
- return
-
- write_table_lines.append(original_file.readline())
- write_table_line_number += 1
-
- write_table_line: str
- for write_table_line in write_table_lines:
- new_file.write(write_table_line)
-
- line_number = 1
- at_end_of_original_file: bool = False
- while not at_end_of_original_file:
- current_position: int = original_file.tell()
- line = original_file.readline()
- at_end_of_original_file = not line
-
- if line:
- if line_number not in table_lines and line != "\n":
- new_file.write(line)
- elif line == "\n":
- if line_number + 1 not in table_lines:
- new_file.write(line)
- else:
- original_file.seek(current_position)
- _ = original_file.readline()
- original_file.seek(current_position)
- write_table_if_not_custom_formatted(line_number, is_newline=True)
- else:
- original_file.seek(current_position)
- _ = original_file.readline()
- original_file.seek(current_position)
- write_table_if_not_custom_formatted(line_number, is_newline=False)
-
- line_number += 1
-
-
-def remove_invalid_tables() -> None:
- """Remove all invalid tables within every markdown file in this Git repository."""
- project_root: Path = _get_project_root()
-
- file_entry: tuple[str | PathLike[str], object]
- for file_entry in Repo(project_root).index.entries:
- file_path: Path = project_root / file_entry[0]
-
- if not file_path.is_file() or not file_path.exists():
- continue
-
- original_file_path: Path = file_path.parent / f"{file_path.name}.original"
- if original_file_path.exists():
- ORIGINAL_FILE_ALREADY_EXISTS_MESSAGE: str = (
- "Cannot remove custom-formatted tables from markdown files: "
- f"{original_file_path} already exists. "
- f"Use `python {Path(__file__).name} --restore` to first restore the files "
- "to their original state"
- )
- raise FileExistsError(ORIGINAL_FILE_ALREADY_EXISTS_MESSAGE)
-
- if file_path.suffix == ".md":
- _remove_any_invalid_tables(file_path)
-
-
-def restore_invalid_tables() -> None:
- """Return all markdown files to their original state before linting."""
- project_root: Path = _get_project_root()
-
- file_path: Path
- for file_path in project_root.rglob("*.md.original"):
- if not file_path.is_file() or not file_path.exists():
- continue
-
- file_is_temporary_original: bool = (
- len(file_path.suffixes) == 2
- and ".md" in file_path.suffixes
- and ".original" in file_path.suffixes
- )
- if not file_is_temporary_original:
- continue
-
- correct_original_file_path: Path = file_path.parent / file_path.stem
- if correct_original_file_path.exists():
- correct_original_file_path.unlink()
-
- file_path.rename(file_path.parent / file_path.stem)
-
-
-def main(argv: Sequence[str] | None = None) -> int:
- """Run this script as a CLI tool with argument parsing."""
- arg_parser: ArgumentParser = ArgumentParser(
- description="Remove or restore custom formatted tables from all markdown files",
- )
- arg_parser.add_argument(
- "--restore",
- action="store_true",
- help="Restore any custom-formatted tables from the original file",
- )
- arg_parser.add_argument(
- "--remove",
- action="store_false",
- dest="restore",
- help=(
- "Override the `--restore` flag "
- "and explicitly declare to remove any custom-formatted tables"
- ),
- )
-
- parsed_args: Namespace = arg_parser.parse_args(argv)
-
- if not parsed_args.restore:
- remove_invalid_tables()
- else:
- restore_invalid_tables()
-
- return 0
-
-
-if __name__ == "__main__":
- raise SystemExit(main())
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index fad2aab5..368cd05d 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Install Python Project
- uses: CSSUoB/action-install-python-project@v1.0.2
+ uses: CSSUoB/action-install-python-project@v1.1.0
with:
python-version: 3.12
@@ -24,23 +24,23 @@ jobs:
steps:
- name: Install Python Project
- uses: CSSUoB/action-install-python-project@v1.0.2
+ uses: CSSUoB/action-install-python-project@v1.1.0
with:
python-version: 3.12
- name: Run mypy
- run: poetry run mypy .; poetry run mypy ./.github/workflows/scripts
+ run: poetry run mypy .
ruff:
runs-on: ubuntu-latest
steps:
- name: Install Python Project
- uses: CSSUoB/action-install-python-project@v1.0.2
+ uses: CSSUoB/action-install-python-project@v1.1.0
with:
python-version: 3.12
- - name: Run ruff
+ - name: Run Ruff
run: poetry run ruff check . --no-fix --extend-select TD002,TD003
poetry-check:
@@ -48,7 +48,7 @@ jobs:
steps:
- name: Install Python Project
- uses: CSSUoB/action-install-python-project@v1.0.2
+ uses: CSSUoB/action-install-python-project@v1.1.0
with:
python-version: 3.12
@@ -60,10 +60,10 @@ jobs:
steps:
- name: Check out repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
python-version: "3.x"
@@ -75,12 +75,12 @@ jobs:
steps:
- name: Install Python Project
- uses: CSSUoB/action-install-python-project@v1.0.2
+ uses: CSSUoB/action-install-python-project@v1.1.0
with:
python-version: 3.12
- name: Run PyMarkdown scan
- run: poetry run python ./.github/workflows/scripts/remove_invalid_tables.py && poetry run pymarkdown scan . ; poetry run python ./.github/workflows/scripts/remove_invalid_tables.py --restore
+ run: poetry run rcft-pymarkdown scan-all
prevent-migrations-deletion:
runs-on: ubuntu-latest
@@ -92,7 +92,7 @@ jobs:
steps:
- name: Prevent migrations files changing
- uses: CSSUoB/action-prevent-file-change@v1
+ uses: CSSUoB/action-prevent-file-change@v1.7.0
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
pattern: '.*\/db\/.+\/migrations\/\d{4}\w*\.py$'
diff --git a/.github/workflows/update-container-image.yaml b/.github/workflows/update-container-image.yaml
index 73169f01..326d732d 100644
--- a/.github/workflows/update-container-image.yaml
+++ b/.github/workflows/update-container-image.yaml
@@ -17,15 +17,15 @@ jobs:
if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push'
steps:
- - uses: docker/setup-buildx-action@v2
- -
- uses: docker/login-action@v2
+ - uses: docker/setup-buildx-action@v3
+
+ - uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- -
- uses: docker/build-push-action@v4
+
+ - uses: docker/build-push-action@v5
with:
push: true
# noinspection SpellCheckingInspection
diff --git a/Dockerfile b/Dockerfile
index 089316dd..7ce8a3d6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,7 +16,7 @@ ENV PYTHONUNBUFFERED=true \
RUN apt-get update && apt-get install --no-install-recommends -y curl build-essential
RUN python3 -m venv $POETRY_HOME
-RUN $POETRY_HOME/bin/pip install poetry==1.8.2
+RUN $POETRY_HOME/bin/pip install poetry==1.8.3
WORKDIR /app
diff --git a/messages.json b/messages.json
index 7edb41e7..812b3b74 100644
--- a/messages.json
+++ b/messages.json
@@ -1,6 +1,7 @@
{
"welcome_messages": [
- "Welcome, . We were expecting you ( ͡° ͜ʖ ͡°)",
+ " is the lisan al gaib. As it was written!",
+ "Welcome, . We've been expecting you ( ͡° ͜ʖ ͡°)",
"Welcome . Leave your weapons by the door.",
"A wild appeared.",
" just arrived. Seems OP - please nerf.",
@@ -20,14 +21,14 @@
"Their name is, their name is, their name is !",
"I asked ChatGPT how to make a better place, and it gave us .",
"SkyNet is launching an attack against ! But don't worry, will protect us!",
- "Is it a bird? Or is it a plane? Nope! It's coming down in their brand new scooter!",
+ "Is it a bird? Is it a plane? Nope! It's coming down on their brand new scooter!",
" has hacked their way into the server!",
"`if (username == ``) print('Welcome to !');`",
"@Committee welcomes ",
"My name is , you accessed invalid memory.\nPrepare to Segmentation fault (core dumped)",
- "I am become , joiner of the Discord server",
- " navigated here by cardinal directions and vibes",
- " has joined the Eternal Scrum",
+ "I am become , joiner of the Discord server.",
+ " navigated here by cardinal directions and vibes.",
+ " has joined the Eternal Scrum.",
"Their palms are sweaty, knees weak, arms are heavy. 's spaghetti.",
"What’s new -doo, we’re coming after you, you’re gonna solve that mystery.",
"What's that coming over the hill, is that a ?",
@@ -41,14 +42,14 @@
"aaAAAAAAA*AA-* oh wait, it's only ",
" entered the server. Fatal error. shutdown failure.",
"Finally, , a worthy opponent! Our battle will be legendary!",
- "I forgot the niceties, you can call me TeX. Hiya Papaya, !",
+ "I forgot the niceties, you can call me TeX-Bot. Hiya Papaya, !",
"According to all known laws of aviation, there is no way a should be able to fly. Its wings are too small to get its fat little body off the ground. The , of course, flies anyway because doesn't care what humans think is impossible.",
"No one expects the inquisition!",
- "Freeze, ! This is TeX! You're sentenced to 3 years in the Discord server for illegally searching us up on the Student Guild website!",
+ "Freeze, ! This is TeX-Bot! You're sentenced to 3 years in the Discord server for illegally searching us up on the Guild website!",
"Looks like stumbled into the not-so-secret hideout of .",
"The truth is .... the game was rigged from the start.",
"Did you ever hear the tragedy of Darth the Wise? I thought not, it's not a story the lecturers would tell you.",
- "``"
+ "``>`"
],
"roles_messages": [
"_ _\nReact to this message to get pronoun roles\n:regional_indicator_h: - He/Him\n:regional_indicator_s: - She/Her\n:regional_indicator_t: - They/Them",
diff --git a/poetry.lock b/poetry.lock
index 2453f0f4..e4bdc458 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 = "aiohttp"
@@ -465,13 +465,13 @@ files = [
[[package]]
name = "django"
-version = "5.0.4"
+version = "5.0.6"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false
python-versions = ">=3.10"
files = [
- {file = "Django-5.0.4-py3-none-any.whl", hash = "sha256:916423499d75d62da7aa038d19aef23d23498d8df229775eb0a6309ee1013775"},
- {file = "Django-5.0.4.tar.gz", hash = "sha256:4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd"},
+ {file = "Django-5.0.6-py3-none-any.whl", hash = "sha256:8363ac062bb4ef7c3f12d078f6fa5d154031d129a15170a1066412af49d30905"},
+ {file = "Django-5.0.6.tar.gz", hash = "sha256:ff1b61005004e476e0aeea47c7f79b85864c70124030e95146315396f1e7951f"},
]
[package.dependencies]
@@ -883,6 +883,22 @@ files = [
{file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"},
]
+[[package]]
+name = "marko"
+version = "2.0.3"
+description = "A markdown parser with high extensibility."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "marko-2.0.3-py3-none-any.whl", hash = "sha256:7fca1c4ab1dbc09b4b3be83c22caafd7d97c99439cb4143d025727cb3df1f4d0"},
+ {file = "marko-2.0.3.tar.gz", hash = "sha256:3b323dcd7dd48181871718ac09b3825bc8f74493cec378f2bacaaceec47577d4"},
+]
+
+[package.extras]
+codehilite = ["pygments"]
+repr = ["objprint"]
+toc = ["python-slugify"]
+
[[package]]
name = "matplotlib"
version = "3.8.4"
@@ -1301,13 +1317,13 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "pre-commit"
-version = "3.7.0"
+version = "3.7.1"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
files = [
- {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"},
- {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"},
+ {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"},
+ {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"},
]
[package.dependencies]
@@ -1491,6 +1507,23 @@ files = [
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
]
+[[package]]
+name = "rcft-pymarkdown"
+version = "1.0.4"
+description = "A Python wrapper around jackdewinter's PyMarkdown linter to remove custom tables in Markdown files"
+optional = false
+python-versions = "<4.0,>=3.12"
+files = [
+ {file = "rcft_pymarkdown-1.0.4-py3-none-any.whl", hash = "sha256:a72840d3482c025dbc258e8e8b78067c3b7375b9573d2bc109118a7d3c916d56"},
+ {file = "rcft_pymarkdown-1.0.4.tar.gz", hash = "sha256:9d08e4e7380c1f8e04c036d0faf4897fe137a24461b2b01bca3e91cb05cc5338"},
+]
+
+[package.dependencies]
+gitpython = ">=3.1,<4.0"
+marko = ">=2.0,<3.0"
+pymarkdownlnt = ">=0.9,<0.10"
+setuptools = ">=69.5,<70.0"
+
[[package]]
name = "requests"
version = "2.31.0"
@@ -1514,28 +1547,28 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "ruff"
-version = "0.4.3"
+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.4.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce"},
- {file = "ruff-0.4.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f"},
- {file = "ruff-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e"},
- {file = "ruff-0.4.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b"},
- {file = "ruff-0.4.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3"},
- {file = "ruff-0.4.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f"},
- {file = "ruff-0.4.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865"},
- {file = "ruff-0.4.3-py3-none-win32.whl", hash = "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30"},
- {file = "ruff-0.4.3-py3-none-win_amd64.whl", hash = "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725"},
- {file = "ruff-0.4.3-py3-none-win_arm64.whl", hash = "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614"},
- {file = "ruff-0.4.3.tar.gz", hash = "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07"},
+ {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]]
@@ -1626,13 +1659,13 @@ files = [
[[package]]
name = "types-beautifulsoup4"
-version = "4.12.0.20240504"
+version = "4.12.0.20240511"
description = "Typing stubs for beautifulsoup4"
optional = false
python-versions = ">=3.8"
files = [
- {file = "types-beautifulsoup4-4.12.0.20240504.tar.gz", hash = "sha256:d7b7af4ccc52fc22784d33a529695e34329a9bdd5db6a649c9b25cb2c3a148d5"},
- {file = "types_beautifulsoup4-4.12.0.20240504-py3-none-any.whl", hash = "sha256:84e04e4473b3c79da04d9d1f89d20a38e5cc92f9c080a8e1f9d36a287b350465"},
+ {file = "types-beautifulsoup4-4.12.0.20240511.tar.gz", hash = "sha256:004f6096fdd83b19cdbf6cb10e4eae57b10205eccc365d0a69d77da836012e28"},
+ {file = "types_beautifulsoup4-4.12.0.20240511-py3-none-any.whl", hash = "sha256:7ceda66a93ba28d759d5046d7fec9f4cad2f563a77b3a789efc90bcadafeefd1"},
]
[package.dependencies]
@@ -1847,4 +1880,4 @@ multidict = ">=4.0"
[metadata]
lock-version = "2.0"
python-versions = "^3.12"
-content-hash = "4c78af87d697142b416f89ab0578301605ace926cd128d493a24b7004ff82c03"
+content-hash = "5dfc847989c4cd48fe08c820deb5d73775035e3d7a0b7dee8d9185be83d51419"
diff --git a/pyproject.toml b/pyproject.toml
index 3d87a187..21ba4d9c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,5 @@
[tool.poetry]
-name = "TeX-Bot"
-version = "0.5.1"
+package-mode = false
license = "Apache-2.0"
description = "TeX-Bot, but back in Python!"
authors = [
@@ -53,6 +52,7 @@ pytest = "^8.1"
ruff = "^0.4"
gitpython = "^3.1"
pymarkdownlnt = "^0.9"
+rcft-pymarkdown = "^1.0"