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"