From f1fcdb3275ac7e9dd58edf554498d05a87d61f9f Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:23:59 -0800 Subject: [PATCH 01/29] Add first iteration of lint action --- .github/workflows/lint.yaml | 26 +++++++ .github/workflows/test.yaml | 138 ++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 .github/workflows/lint.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..884b529 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,26 @@ +name: Lint + +on: [ push, pull_request ] + +jobs: + build: + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + - name: pip cache + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: lint-pip-${{ hashFiles('**/pyproject.toml') }} + restore-keys: | + lint-pip- + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + python -m pip install --upgrade poetry + poetry install diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..c0af5ab --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,138 @@ +name: Test + +on: [ push ] + +jobs: + # This job builds the Docker image that will be used in the following test job. + # It also publishes the image to the GitHub Container Registry, so every PR can + # have an up-to-date image by the name of ghcr.io/GITHUB_USERNAME/PROJECT_NAME:BRANCH_NAME + build-image: + runs-on: ubuntu-24.04 + env: + BUILT_IMAGE_NAME: ghcr.io/urbanmachine/node_helpers + PROJECT_NAME: node_helpers + defaults: + run: + shell: bash + steps: + - name: Prepare Build + id: prep + run: | + if [[ "${GITHUB_REF}" == "refs/heads/"* ]] + then + # This is a build on a branch + TAG=${GITHUB_REF#refs/heads/} + elif [[ "${GITHUB_REF}" == "refs/pull/"* ]] + then + # This is a PR build + TAG=${GITHUB_REF#refs/pull/} + elif [[ "${GITHUB_REF}" == "refs/tags/"* ]] + then + # This is a tagged build + TAG=${GITHUB_REF#refs/tags/} + else + echo "Unexpected reference format ${GITHUB_REF}" + exit 1 + fi + + # Remove slashes, since they're not allowed in Docker tags + TAG=$(echo "${TAG}" | sed 's#/#-#g') + echo "tagged_image=${BUILT_IMAGE_NAME}:${TAG}" >> $GITHUB_OUTPUT + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Load Previous Docker Layers Cache + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + # Key is named differently to avoid collision + key: v1-${{ env.PROJECT_NAME }}-${{ runner.os }}-multi-buildx-${{ github.sha }} + restore-keys: v1-${{ env.PROJECT_NAME }}-${{ runner.os }}-multi-buildx + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + - name: Checkout + uses: actions/checkout@v4 + with: + lfs: true + - name: Get Base Image Name + id: get_base_image + run: | + source .env + echo "base_image=${BASE_IMAGE}" >> $GITHUB_OUTPUT + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ steps.prep.outputs.tagged_image }} + build-args: | + BASE_IMAGE=${{ steps.get_base_image.outputs.base_image }} + cache-from: type=local,src=/tmp/.buildx-cache + # Note the mode=max here + # More: https://github.com/moby/buildkit#--export-cache-options + # And: https://github.com/docker/buildx#--cache-tonametypetypekeyvalue + cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new + # This is done to avoid storing outdated build steps in the cache, since + # BuildKit never clears stuff out of the cache itself + - name: Move cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache + outputs: + tagged_image: ${{ steps.prep.outputs.tagged_image }} + + # This job runs the colcon tests for the project + ros-tests: + needs: build-image + # Run the build on a large runner, since limiting the CPU causes a weird persistent + # race condition which causes flaky tests in any test that uses a robot-state-publisher + # and joint-state-publisher. + runs-on: ubuntu-24.04 + defaults: + run: + shell: bash + timeout-minutes: 40 + container: + image: ${{needs.build-image.outputs.tagged_image}} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + env: + GITHUB_WORKSPACE: /repo/ + steps: + - name: Install Git LFS + run: sudo apt-get update && sudo apt-get install git-lfs + - name: Checkout + uses: actions/checkout@v4 + with: + lfs: true + - name: Fix git error in the following line + # Caused by an update to git that dislikes when users of different ID's touch + # the same git directory, which happens when using a docker runner in CI + # https://github.blog/2022-04-12-git-security-vulnerability-announced/ + # https://github.com/actions/checkout/issues/760 + run: git config --global --add safe.directory ${GITHUB_WORKSPACE} + - name: Copy Python dependencies to github workspace + run: cp -r /robot/install . + - name: Copy build artifacts to github workspace + run: cp -r /robot/build . + - name: Move configuration files to /robot/config so hard paths are correct + run: cp -r ${GITHUB_WORKSPACE}/config /robot/ + - name: Run tests + run: | + enter-workspaces colcon-test \ + --pytest-with-coverage \ + --test-result-base test-results \ + --pytest-args \ + --rootdir $(pwd) \ + --durations=50 + - name: Generate Test Report + uses: dorny/test-reporter@v1 + if: always() + with: + name: "Test report" + path: test-results/**/*.xml + reporter: java-junit + - name: Report Codecov Coverage + uses: codecov/codecov-action@v3.1.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file From 2e493a48545c1c66f6c10010958a5392f3ebc37a Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:26:30 -0800 Subject: [PATCH 02/29] Point to the dockerfile --- .github/workflows/test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c0af5ab..9afe653 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -59,9 +59,10 @@ jobs: source .env echo "base_image=${BASE_IMAGE}" >> $GITHUB_OUTPUT - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . + file: docker/Dockerfile push: true tags: ${{ steps.prep.outputs.tagged_image }} build-args: | From 7c368b93396e2e69312b2f9dd8f747740717acca Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:28:18 -0800 Subject: [PATCH 03/29] Woops. Forgot to actually run the linter --- .github/workflows/lint.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 884b529..fb6243f 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -24,3 +24,11 @@ jobs: python -m pip install --upgrade pip python -m pip install --upgrade poetry poetry install + - name: Install JS linting dependencies + run: | + cd dashboard + npm install + - name: Install Bash dependencies + run: sudo apt-get install --yes shellcheck + - name: Lint + run: poetry run lint --languages all --mode check \ No newline at end of file From 9f55b6183b02a943c57c30f299b56d5d53aea671 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:31:16 -0800 Subject: [PATCH 04/29] Remove JS linter --- .github/workflows/lint.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index fb6243f..26e940b 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -24,10 +24,6 @@ jobs: python -m pip install --upgrade pip python -m pip install --upgrade poetry poetry install - - name: Install JS linting dependencies - run: | - cd dashboard - npm install - name: Install Bash dependencies run: sudo apt-get install --yes shellcheck - name: Lint From b00b3b80d3bf020255467b196c51b0f064977606 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:46:10 -0800 Subject: [PATCH 05/29] Lint fixes --- pkgs/node_helpers/node_helpers/__init__.py | 6 ++++-- .../node_helpers/node_helpers/parameters/parameter_mixin.py | 2 +- pkgs/node_helpers/node_helpers/sensors/binary_signal.py | 6 +----- .../nodes/test_interactive_transform_publisher.py | 1 - .../integration/sensors/test_binary_signal.py | 2 +- .../node_helpers_test/unit/parameters/test_loading.py | 2 +- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pkgs/node_helpers/node_helpers/__init__.py b/pkgs/node_helpers/node_helpers/__init__.py index f033e76..4676aeb 100644 --- a/pkgs/node_helpers/node_helpers/__init__.py +++ b/pkgs/node_helpers/node_helpers/__init__.py @@ -1,4 +1,6 @@ """**node_helpers** -An opinionated ROS2 framework that minimizes boilerplate while maximizing reliability. Features intuitive APIs for parameter management, action handling, and error-resilient RPC. Designed by Urban Machine for safe and scalable robotics. -""" \ No newline at end of file +An opinionated ROS2 framework that minimizes boilerplate while maximizing reliability. +Features intuitive APIs for parameter management, action handling, and error-resilient +RPC. Designed by Urban Machine for safe and scalable robotics. +""" diff --git a/pkgs/node_helpers/node_helpers/parameters/parameter_mixin.py b/pkgs/node_helpers/node_helpers/parameters/parameter_mixin.py index ffa9a84..0a0847c 100644 --- a/pkgs/node_helpers/node_helpers/parameters/parameter_mixin.py +++ b/pkgs/node_helpers/node_helpers/parameters/parameter_mixin.py @@ -5,7 +5,7 @@ from pydantic import BaseModel from pydantic_core import PydanticUndefined -from rcl_interfaces.msg import ParameterDescriptor, SetParametersResult, ParameterValue +from rcl_interfaces.msg import ParameterDescriptor, SetParametersResult from rclpy.exceptions import ParameterAlreadyDeclaredException, ParameterException from rclpy.node import Node from rclpy.parameter import Parameter diff --git a/pkgs/node_helpers/node_helpers/sensors/binary_signal.py b/pkgs/node_helpers/node_helpers/sensors/binary_signal.py index 3c4b8bd..dc3a789 100644 --- a/pkgs/node_helpers/node_helpers/sensors/binary_signal.py +++ b/pkgs/node_helpers/node_helpers/sensors/binary_signal.py @@ -35,11 +35,7 @@ def _to_rviz_msg(msg: BinaryReading) -> list[Marker]: ] -class BinarySensor( - BaseSensorPublisher[ - BinaryReading, bool, "BinarySensorFromFieldPublisher.Parameters" - ] -): +class BinarySensor(BaseSensorPublisher[BinaryReading, bool, "BinarySensor.Parameters"]): def __init__(self, node: Node, parameters: BaseSensorPublisher.Parameters): super().__init__( node=node, diff --git a/pkgs/node_helpers/node_helpers_test/integration/nodes/test_interactive_transform_publisher.py b/pkgs/node_helpers/node_helpers_test/integration/nodes/test_interactive_transform_publisher.py index 3ed2909..d0aaea4 100644 --- a/pkgs/node_helpers/node_helpers_test/integration/nodes/test_interactive_transform_publisher.py +++ b/pkgs/node_helpers/node_helpers_test/integration/nodes/test_interactive_transform_publisher.py @@ -1,5 +1,4 @@ import contextlib -import logging from collections.abc import Generator from queue import Empty from tempfile import NamedTemporaryFile diff --git a/pkgs/node_helpers/node_helpers_test/integration/sensors/test_binary_signal.py b/pkgs/node_helpers/node_helpers_test/integration/sensors/test_binary_signal.py index d8318c1..033a01d 100644 --- a/pkgs/node_helpers/node_helpers_test/integration/sensors/test_binary_signal.py +++ b/pkgs/node_helpers/node_helpers_test/integration/sensors/test_binary_signal.py @@ -50,7 +50,7 @@ def test_binary_sensor_from_rangefinder(node: ClientNode) -> None: threshold=1.0, inverted=False, ) - binary_sensor = BinarySensorFromRangeFinder( + binary_sensor = BinarySensorFromRangeFinder( # noqa: F841 node=node, rangefinder=rangefinder_buffer, parameters=parameters, diff --git a/pkgs/node_helpers/node_helpers_test/unit/parameters/test_loading.py b/pkgs/node_helpers/node_helpers_test/unit/parameters/test_loading.py index c8990f4..b8974bc 100644 --- a/pkgs/node_helpers/node_helpers_test/unit/parameters/test_loading.py +++ b/pkgs/node_helpers/node_helpers_test/unit/parameters/test_loading.py @@ -78,7 +78,7 @@ def test_parameter_loader_file_saving() -> None: It also shouldn't include any meta parameters data.""" with _parameter_directory(_BASE_PARAMETERS_YAML) as parameter_dir: loader: ParameterLoader[BaseModel] = ParameterLoader( - parameters_directory=parameter_dir + parameters_directory=parameter_dir ) loaded_text = yaml.full_load(loader.ros_parameters_file.read_text()) From c5c36a78f6c1dcaf07ac87dbef859c82d8b52acc Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 08:48:59 -0800 Subject: [PATCH 06/29] Test fixes --- .github/workflows/test.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9afe653..744210d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -106,18 +106,12 @@ jobs: uses: actions/checkout@v4 with: lfs: true - - name: Fix git error in the following line - # Caused by an update to git that dislikes when users of different ID's touch - # the same git directory, which happens when using a docker runner in CI - # https://github.blog/2022-04-12-git-security-vulnerability-announced/ - # https://github.com/actions/checkout/issues/760 - run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install . - name: Copy build artifacts to github workspace run: cp -r /robot/build . - - name: Move configuration files to /robot/config so hard paths are correct - run: cp -r ${GITHUB_WORKSPACE}/config /robot/ + - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work + run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: Run tests run: | enter-workspaces colcon-test \ From b477f6fbdd5c5f68bd15c5c338802c78a1dc15a5 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 10:13:22 -0800 Subject: [PATCH 07/29] Remove support for javascript --- .github/lint/lint_eslint.py | 13 ------------- .github/lint/main.py | 4 ---- 2 files changed, 17 deletions(-) delete mode 100644 .github/lint/lint_eslint.py diff --git a/.github/lint/lint_eslint.py b/.github/lint/lint_eslint.py deleted file mode 100644 index e27b616..0000000 --- a/.github/lint/lint_eslint.py +++ /dev/null @@ -1,13 +0,0 @@ -from shutil import which - -from .errors import CommandError -from .paths import JS_PATH -from .run_command import run_command - - -def lint_eslint(fix: bool) -> None: - if which("npx") is None: - raise CommandError("Could not find the 'npx' command. Is Node.js installed?") - - additional_args = ["--fix"] if fix else [] - run_command(["npx", "eslint", *additional_args, "."], cwd=JS_PATH) diff --git a/.github/lint/main.py b/.github/lint/main.py index 2882acf..a007c19 100644 --- a/.github/lint/main.py +++ b/.github/lint/main.py @@ -6,7 +6,6 @@ from .errors import CommandError from .lint_clang_format import lint_clang_format from .lint_darglint import lint_darglint -from .lint_eslint import lint_eslint from .lint_mypy import lint_mypy from .lint_ruff import lint_ruff_check, lint_ruff_format from .lint_shellcheck import lint_shellcheck @@ -26,9 +25,6 @@ lint_darglint, lint_mypy, ], - JAVASCRIPT_LANGUAGE: [ - lint_eslint, - ], CPP_LANGUAGE: [ lint_clang_format, ], From 366a71736d69270778b729c36d407aa5b486f009 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 11:08:41 -0800 Subject: [PATCH 08/29] Update cruft --- .cruft.json | 3 ++- .github/lint/main.py | 1 - .github/lint/paths.py | 1 - docker/Dockerfile | 4 ++-- docker/utils/environment/restore-build-cache | 9 ++++++--- docker/utils/environment/save-build-cache | 9 ++++++--- docs/about_template.md | 2 +- 7 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.cruft.json b/.cruft.json index 914dbc2..6e70d39 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "git@github.com:UrbanMachine/create-ros-app.git", - "commit": "a4e77fcc6f6764f18d0785c030c60dda90e17ed6", + "commit": "4aaed60259a9622a4a92745866a8353a64cb12b8", "checkout": null, "context": { "cookiecutter": { @@ -8,6 +8,7 @@ "github_username_or_org": "urbanmachine", "dockerhub_username_or_org": "urbanmachine", "project_name": "node_helpers", + "__project_name_slug": "node_helpers", "project_description": "An opinionated ROS2 framework that minimizes boilerplate while maximizing reliability. Features intuitive APIs for parameter management, action handling, and error-resilient RPC. Designed by Urban Machine for safe and scalable robotics.", "version": "0.5.0", "license": "MIT", diff --git a/.github/lint/main.py b/.github/lint/main.py index a007c19..7c2636e 100644 --- a/.github/lint/main.py +++ b/.github/lint/main.py @@ -11,7 +11,6 @@ from .lint_shellcheck import lint_shellcheck PYTHON_LANGUAGE = "python" -JAVASCRIPT_LANGUAGE = "javascript" CPP_LANGUAGE = "cpp" BASH_LANGUAGE = "bash" ALL_LANGUAGES = "all" diff --git a/.github/lint/paths.py b/.github/lint/paths.py index 6a02790..2adbfac 100644 --- a/.github/lint/paths.py +++ b/.github/lint/paths.py @@ -11,7 +11,6 @@ def required_path(path_str: str) -> Path: ROS_PATH = required_path("pkgs") LINT_PATH = required_path(".github/lint") -JS_PATH = Path() FIRMWARE_PATH = Path() LAUNCH_PATH = required_path("launch-profiles") diff --git a/docker/Dockerfile b/docker/Dockerfile index 8ebc3cf..fdb9241 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,7 +20,7 @@ ENV NVIDIA_DRIVER_CAPABILITIES=all # Set variables for caches ENV APT_CACHE=/var/cache/apt ENV PIP_CACHE=/root/.cache/pip -ENV BUILD_CACHE=/cache/build +ENV BUILD_CACHE=/colcon-build-cache/node_helpers/ # TODO: was opengl necessary? @@ -116,7 +116,7 @@ RUN --mount=type=cache,target="${BUILD_CACHE}" restore-build-cache # Build all packages, copying project files under a root `/robot/` directory in the container COPY ../launch-profiles /robot/launch-profiles COPY ../pkgs /robot/pkgs -RUN enter-workspaces colcon build --symlink-install +RUN enter-workspaces colcon build RUN add-workspace /robot/install/setup.bash # Move the build cache back into the Docker cache mount so it can be reused on diff --git a/docker/utils/environment/restore-build-cache b/docker/utils/environment/restore-build-cache index d703556..1cc005c 100755 --- a/docker/utils/environment/restore-build-cache +++ b/docker/utils/environment/restore-build-cache @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copies the build cache from `/cache` into a place where the build system can +# Copies the build cache from a special dir into a place where the build system can # use it. Copying like this ensures that the build cache is present in the # final image, which is necessary for packages containing messages. @@ -8,10 +8,13 @@ set -o errexit set -o pipefail set -o nounset -if [[ ! -d "/cache/build" ]]; then +# This directory is mounted by the Dockerfile and is unique to each project. +BUILD_CACHE=/colcon-build-cache/node_helpers/ + +if [[ ! -d "${BUILD_CACHE}" ]]; then echo "Build cache directory not mounted" >&2 exit 1 fi rm -rf /robot/build -cp -r /cache/build /robot/build +cp -r ${BUILD_CACHE} /robot/build diff --git a/docker/utils/environment/save-build-cache b/docker/utils/environment/save-build-cache index e744ff5..bb4a5e8 100755 --- a/docker/utils/environment/save-build-cache +++ b/docker/utils/environment/save-build-cache @@ -10,10 +10,13 @@ set -o nounset # Makes `*` include hidden files shopt -s dotglob -if [[ ! -d "/cache/build" ]]; then +# This directory is mounted by the Dockerfile and is unique to each project. +BUILD_CACHE=/colcon-build-cache/node_helpers/ + +if [[ ! -d "${BUILD_CACHE}" ]]; then echo "Build cache directory not mounted" >&2 exit 1 fi -rm -rf /cache/build/* -cp -r /robot/build/. /cache/build/. +rm -rf ${BUILD_CACHE}* +cp -r /robot/build/. ${BUILD_CACHE}. diff --git a/docs/about_template.md b/docs/about_template.md index dfeaaff..75cb371 100644 --- a/docs/about_template.md +++ b/docs/about_template.md @@ -12,7 +12,7 @@ This documentation walks through the features of the template, and how to use th Here's a quick guide on the features of this template ### Scripts -- Linting and autoformatting for python (ruff), C++ (clangformat), bash (shellcheck), and javascript (eslint) +- Linting and autoformatting for python (ruff), C++ (clangformat), bash (shellcheck) **Relevant Scripts:** ```shell From adbea0b0dc03e92e125b3c3004e302e7d0ad1f5f Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 11:19:27 -0800 Subject: [PATCH 09/29] Remove dash from colcon test --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 744210d..dc381ce 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -114,7 +114,7 @@ jobs: run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: Run tests run: | - enter-workspaces colcon-test \ + enter-workspaces colcon test \ --pytest-with-coverage \ --test-result-base test-results \ --pytest-args \ From 33ad607f7d9d60eb554f6d0000751787ffcdb386 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 11:47:37 -0800 Subject: [PATCH 10/29] Fix bash code that is failing lint --- docker/launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/launch b/docker/launch index eff756a..32a69e8 100755 --- a/docker/launch +++ b/docker/launch @@ -27,7 +27,7 @@ set -o nounset function usage { echo "Usage: docker/launch [--no-pull] " >&2 echo "Available launch profiles are:" >&2 - ls -1 launch-profiles/ | sed 's/^/ - /' >&2 + find launch-profiles/ -maxdepth 1 -type d >&2 echo "" >&2 echo "Read more about 'launch-profiles' under 'docs/about_template.md'" >&2 exit 1 From 2ae155677c71f3a6dbfc21e3c87842cf54797f8b Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:20:58 -0800 Subject: [PATCH 11/29] Update template --- .cruft.json | 2 +- docker-compose.yaml | 3 ++- docker/_shared.sh | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.cruft.json b/.cruft.json index 6e70d39..bd44539 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "git@github.com:UrbanMachine/create-ros-app.git", - "commit": "4aaed60259a9622a4a92745866a8353a64cb12b8", + "commit": "3b888a4b97a8c8b08dad55f57c06c6e8c3007982", "checkout": null, "context": { "cookiecutter": { diff --git a/docker-compose.yaml b/docker-compose.yaml index 6e4947e..94e63de 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -23,7 +23,8 @@ services: - ${VOLUMES_DIRECTORY:- 'set in .env'}/ros-nodes:/robot/persistent # Mounts the 'launch-profiles/LAUNCH_PROFILE' directory into '/robot/launch-profile/' # This way you can save configuration files from GUI's like rviz right back to your source dir - - "./launch-profiles/${LAUNCH_PROFILE:- 'set in docker/_shared'}:/robot/launch-profile/" + # LAUNCH_PROFILE is set in docker/_shared.sh + - "./launch-profiles/${LAUNCH_PROFILE}:/robot/launch-profile/" # Necessary for display passthrough - "/tmp/.X11-unix:/tmp/.X11-unix:rw" # Necessary for PulseAudio passthrough diff --git a/docker/_shared.sh b/docker/_shared.sh index 95e03df..d4e6ad8 100644 --- a/docker/_shared.sh +++ b/docker/_shared.sh @@ -57,7 +57,8 @@ function is_stack_running() { # Then, the stack will be brought down. function deploy_and_wait { # Start the stack non-blockingly, because logs are best accessed via the web interface - LAUNCH_PROFILE="${1}" docker compose up --detach + export LAUNCH_PROFILE="${1}" + docker compose up --detach trap _catch_sigint INT From eb4aed5eb419974bbceef4730af7a86c92b80775 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:40:37 -0800 Subject: [PATCH 12/29] Run separate test with safe.directory set --- .github/workflows/test.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dc381ce..b6f6dcf 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -106,6 +106,12 @@ jobs: uses: actions/checkout@v4 with: lfs: true + - name: Fix git error in the following line + # Caused by an update to git that dislikes when users of different ID's touch + # the same git directory, which happens when using a docker runner in CI + # https://github.blog/2022-04-12-git-security-vulnerability-announced/ + # https://github.com/actions/checkout/issues/760 + run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install . - name: Copy build artifacts to github workspace From 0d94fe7bb0ab09565531a6ad289f470ce6d2ebd2 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:41:27 -0800 Subject: [PATCH 13/29] Check upstream template when linting --- .github/workflows/lint.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 26e940b..61521c5 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -1,6 +1,6 @@ name: Lint -on: [ push, pull_request ] +on: [ push ] jobs: build: @@ -27,4 +27,6 @@ jobs: - name: Install Bash dependencies run: sudo apt-get install --yes shellcheck - name: Lint - run: poetry run lint --languages all --mode check \ No newline at end of file + run: poetry run lint --languages all --mode check + - name: Check Upstream Template + run: poetry run cruft check \ No newline at end of file From 2490b00b63596886e2ac329b727b84513daec674 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:43:10 -0800 Subject: [PATCH 14/29] Add `cruft` as a dependency --- poetry.lock | 683 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 677 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8fa35db..d373047 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,241 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +optional = false +python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cookiecutter" +version = "2.6.0" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cookiecutter-2.6.0-py3-none-any.whl", hash = "sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d"}, + {file = "cookiecutter-2.6.0.tar.gz", hash = "sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c"}, +] + +[package.dependencies] +arrow = "*" +binaryornot = ">=0.4.4" +click = ">=7.0,<9.0.0" +Jinja2 = ">=2.7,<4.0.0" +python-slugify = ">=4.0.0" +pyyaml = ">=5.3.1" +requests = ">=2.23.0" +rich = "*" + +[[package]] +name = "cruft" +version = "2.15.0" +description = "Allows you to maintain all the necessary cruft for packaging and building projects separate from the code you intentionally write. Built on-top of CookieCutter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cruft-2.15.0-py3-none-any.whl", hash = "sha256:2c1c6c7c512b8bc3afc66cefa829247dc067409a78ba2609d629d413444bc153"}, + {file = "cruft-2.15.0.tar.gz", hash = "sha256:9802af66037418655e7e4b6f30b531591e0761939b3ff5dd45d27c3a3f588abe"}, +] + +[package.dependencies] +click = ">=7.1.2" +cookiecutter = ">=1.7" +gitpython = ">=3.0" +typer = ">=0.4.0" + +[package.extras] +pyproject = ["toml (>=0.10)"] + [[package]] name = "darglint" version = "1.8.1" @@ -22,6 +257,174 @@ files = [ {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, ] +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mypy" version = "1.13.0" @@ -88,13 +491,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.1" +version = "2.10.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.1-py3-none-any.whl", hash = "sha256:a8d20db84de64cf4a7d59e899c2caf0fe9d660c7cfc482528e7020d7dd189a7e"}, - {file = "pydantic-2.10.1.tar.gz", hash = "sha256:a4daca2dc0aa429555e0656d6bf94873a7dc5f54ee42b1f5873d666fb3f35560"}, + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, ] [package.dependencies] @@ -218,6 +621,153 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.9.4" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "ruff" version = "0.3.7" @@ -244,15 +794,117 @@ files = [ {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, ] +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "typer" +version = "0.15.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, + {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241003" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] @@ -288,7 +940,24 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [metadata] lock-version = "2.0" python-versions = ">=3.10.0,<4.0" -content-hash = "ce149eac139875f53d7ae274eaa162b9a35aca465d5aac6216c150c020c9b4e9" +content-hash = "eb1a26b146907f16c8f17da50358714e5bcfa63e8d9ee9a9ad7218e894776532" diff --git a/pyproject.toml b/pyproject.toml index cc8b390..ffd0c2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ python = ">=3.10.0,<4.0" [tool.poetry.dev-dependencies] mypy = "^1.9.0" ruff = "^0.3.3" +cruft = "^2.15.0" # Remove darglint once ruff adds support for the rules. # Tracking: https://github.com/astral-sh/ruff/issues/458 From 8e33cef7a5024746e7c0f669ffa9f74f7c69cfc7 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:46:23 -0800 Subject: [PATCH 15/29] Separate linting vs checking cruft into two pipelines --- .github/workflows/lint.yaml | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 61521c5..17630dd 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -3,7 +3,7 @@ name: Lint on: [ push ] jobs: - build: + check_lint: runs-on: ubuntu-24.04 steps: @@ -28,5 +28,29 @@ jobs: run: sudo apt-get install --yes shellcheck - name: Lint run: poetry run lint --languages all --mode check + - name: Check Upstream Template + run: poetry run cruft check + + check_upstream_template: + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + - name: pip cache + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: lint-pip-${{ hashFiles('**/pyproject.toml') }} + restore-keys: | + lint-pip- + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + python -m pip install --upgrade poetry + poetry install - name: Check Upstream Template run: poetry run cruft check \ No newline at end of file From 3eab7d6579ba5b1ddac7387475ef1adb6252f22e Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:54:37 -0800 Subject: [PATCH 16/29] Try to fix cloning errors --- .cruft.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cruft.json b/.cruft.json index bd44539..1be4a69 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,5 +1,5 @@ { - "template": "git@github.com:UrbanMachine/create-ros-app.git", + "template": "https://github.com/UrbanMachine/create-ros-app.git", "commit": "3b888a4b97a8c8b08dad55f57c06c6e8c3007982", "checkout": null, "context": { From a2df9c274adb21e38aaf7dacd85182ab858f4117 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 12:54:43 -0800 Subject: [PATCH 17/29] Try to fix cloning errors --- .github/workflows/lint.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 17630dd..6ccad12 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -28,8 +28,6 @@ jobs: run: sudo apt-get install --yes shellcheck - name: Lint run: poetry run lint --languages all --mode check - - name: Check Upstream Template - run: poetry run cruft check check_upstream_template: runs-on: ubuntu-24.04 From f77afa3c646555470d8c7dce077a193b023c28e5 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:12:16 -0800 Subject: [PATCH 18/29] Don't bother copying build artifacts --- .github/workflows/test.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b6f6dcf..9eb4772 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -109,13 +109,12 @@ jobs: - name: Fix git error in the following line # Caused by an update to git that dislikes when users of different ID's touch # the same git directory, which happens when using a docker runner in CI + # This fixes test reporting in the `Generate Test Report` section # https://github.blog/2022-04-12-git-security-vulnerability-announced/ # https://github.com/actions/checkout/issues/760 run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install . - - name: Copy build artifacts to github workspace - run: cp -r /robot/build . - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: Run tests From 118a79f8d850f90d634b3daa89e9311c9744933e Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:19:45 -0800 Subject: [PATCH 19/29] Run tree --- .github/workflows/test.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9eb4772..17ae23a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -115,8 +115,12 @@ jobs: run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install . + - name: Copy build artifacts to github workspace + run: cp -r /robot/build . - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ + - name: + run: sudo apt-get install tree && tree - name: Run tests run: | enter-workspaces colcon test \ From e6f9e644b06f0ecb253f7a5822e00f77791cc464 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:20:46 -0800 Subject: [PATCH 20/29] Update template --- .cruft.json | 4 ++-- docker-compose.yaml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.cruft.json b/.cruft.json index 1be4a69..d2c19fe 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "https://github.com/UrbanMachine/create-ros-app.git", - "commit": "3b888a4b97a8c8b08dad55f57c06c6e8c3007982", + "commit": "a23c422c9e9dbbaf1480534efb17b14d57453e8e", "checkout": null, "context": { "cookiecutter": { @@ -18,7 +18,7 @@ "example_launch_profile": "node_helpers_showcase", "example_package_version": "0.5.0", "__example_messages_package_name": "node_helpers_msgs", - "_template": "git@github.com:UrbanMachine/create-ros-app.git" + "_template": "https://github.com/UrbanMachine/create-ros-app.git" } }, "directory": null diff --git a/docker-compose.yaml b/docker-compose.yaml index 94e63de..f2418ed 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -76,8 +76,6 @@ services: loki: image: grafana/loki:3.2.1 user: "root" - ports: - - 3100:3100 volumes: - ${VOLUMES_DIRECTORY:- 'set in .env'}/loki:/loki <<: *common-config From 5f6b1294c2906412e3c42c81875913a089539dbb Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:24:11 -0800 Subject: [PATCH 21/29] Try not building --- .github/workflows/test.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 17ae23a..c1e8f89 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -113,10 +113,6 @@ jobs: # https://github.blog/2022-04-12-git-security-vulnerability-announced/ # https://github.com/actions/checkout/issues/760 run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - - name: Copy Python dependencies to github workspace - run: cp -r /robot/install . - - name: Copy build artifacts to github workspace - run: cp -r /robot/build . - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: From 0725644634f4f04817e0fbef3cf00f4adca2f724 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:29:17 -0800 Subject: [PATCH 22/29] Try copying the tests in too? --- .dockerignore | 3 +-- .github/workflows/test.yaml | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index 15d5985..6f27621 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,5 +2,4 @@ .github .docker_volumes .docker_cache -.mypy_cache -pkgs/*/*_test +.mypy_cache \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c1e8f89..17ae23a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -113,6 +113,10 @@ jobs: # https://github.blog/2022-04-12-git-security-vulnerability-announced/ # https://github.com/actions/checkout/issues/760 run: git config --global --add safe.directory ${GITHUB_WORKSPACE} + - name: Copy Python dependencies to github workspace + run: cp -r /robot/install . + - name: Copy build artifacts to github workspace + run: cp -r /robot/build . - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: From bd34ebe29e3aef48482751680a663765e7dd9bb2 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:34:03 -0800 Subject: [PATCH 23/29] Let's try just building each time? --- .github/workflows/test.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 17ae23a..57e13f9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -114,11 +114,7 @@ jobs: # https://github.com/actions/checkout/issues/760 run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace - run: cp -r /robot/install . - - name: Copy build artifacts to github workspace - run: cp -r /robot/build . - - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work - run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ + run: enter-workspaces colcon build - name: run: sudo apt-get install tree && tree - name: Run tests From 4af5130ccf4ab4bf83edc2cb4b57dbdb7e0d1f39 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 13:39:56 -0800 Subject: [PATCH 24/29] Try 3 --- .dockerignore | 3 ++- .github/workflows/test.yaml | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.dockerignore b/.dockerignore index 6f27621..15d5985 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,4 +2,5 @@ .github .docker_volumes .docker_cache -.mypy_cache \ No newline at end of file +.mypy_cache +pkgs/*/*_test diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 57e13f9..e74ac91 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -114,8 +114,12 @@ jobs: # https://github.com/actions/checkout/issues/760 run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace - run: enter-workspaces colcon build - - name: + run: cp -r /robot/install install + - name: Build packages + run: colcon build + - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work + run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ + - name: DELETE ME run: sudo apt-get install tree && tree - name: Run tests run: | From 5e14f409a036069b24313817344820316c080720 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 14:02:20 -0800 Subject: [PATCH 25/29] Try 4 --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e74ac91..0f198ab 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -125,9 +125,9 @@ jobs: run: | enter-workspaces colcon test \ --pytest-with-coverage \ + --base-paths pkgs \ --test-result-base test-results \ --pytest-args \ - --rootdir $(pwd) \ --durations=50 - name: Generate Test Report uses: dorny/test-reporter@v1 From 5209a01f5a5e92feb34fe68b6769f008b17e9c02 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 14:09:11 -0800 Subject: [PATCH 26/29] Remove colcon build --- .github/workflows/test.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0f198ab..e7b8f70 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -115,12 +115,8 @@ jobs: run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install install - - name: Build packages - run: colcon build - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - - name: DELETE ME - run: sudo apt-get install tree && tree - name: Run tests run: | enter-workspaces colcon test \ From ede98535a0c1feb448b324d314c1255b4bc315a1 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Wed, 4 Dec 2024 14:14:36 -0800 Subject: [PATCH 27/29] Remove base packages --- .github/workflows/test.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e7b8f70..6b7e0b4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -121,7 +121,6 @@ jobs: run: | enter-workspaces colcon test \ --pytest-with-coverage \ - --base-paths pkgs \ --test-result-base test-results \ --pytest-args \ --durations=50 From 30cdc4cebe7974bc11590e36a75db40014e58262 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Thu, 5 Dec 2024 07:59:05 -0800 Subject: [PATCH 28/29] Try copying build in again... --- .github/workflows/test.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 6b7e0b4..8320698 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -115,11 +115,14 @@ jobs: run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Copy Python dependencies to github workspace run: cp -r /robot/install install + - name: Copy Build output to github workspace + run: cp -r /robot/install build - name: Move launch-profile files to /robot/launch-profiles so hardcoded paths work run: cp -r ${GITHUB_WORKSPACE}/launch-profiles /robot/ - name: Run tests run: | enter-workspaces colcon test \ + --base-paths pkgs \ --pytest-with-coverage \ --test-result-base test-results \ --pytest-args \ From e2841fbdb00bba65e849a8d631bdfe2365c448d5 Mon Sep 17 00:00:00 2001 From: Alex Thiele Date: Thu, 5 Dec 2024 08:38:52 -0800 Subject: [PATCH 29/29] Update Template --- .cruft.json | 2 +- .github/workflows/lint.yaml | 3 ++- .github/workflows/test.yaml | 8 +++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.cruft.json b/.cruft.json index d2c19fe..de59006 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "https://github.com/UrbanMachine/create-ros-app.git", - "commit": "a23c422c9e9dbbaf1480534efb17b14d57453e8e", + "commit": "8c8e34317b3cf0db5459958d7a50accfd0cc93cd", "checkout": null, "context": { "cookiecutter": { diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 6ccad12..22b04a0 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -1,3 +1,4 @@ + name: Lint on: [ push ] @@ -51,4 +52,4 @@ jobs: python -m pip install --upgrade poetry poetry install - name: Check Upstream Template - run: poetry run cruft check \ No newline at end of file + run: poetry run cruft check diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8320698..387a4f3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,11 +11,12 @@ jobs: env: BUILT_IMAGE_NAME: ghcr.io/urbanmachine/node_helpers PROJECT_NAME: node_helpers + defaults: run: shell: bash steps: - - name: Prepare Build + - name: Create A Unique Tag For This Image Based On Branch Name id: prep run: | if [[ "${GITHUB_REF}" == "refs/heads/"* ]] @@ -84,9 +85,6 @@ jobs: # This job runs the colcon tests for the project ros-tests: needs: build-image - # Run the build on a large runner, since limiting the CPU causes a weird persistent - # race condition which causes flaky tests in any test that uses a robot-state-publisher - # and joint-state-publisher. runs-on: ubuntu-24.04 defaults: run: @@ -137,4 +135,4 @@ jobs: - name: Report Codecov Coverage uses: codecov/codecov-action@v3.1.0 with: - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + token: ${{ secrets.CODECOV_TOKEN }}