mirror of
https://github.com/ManimCommunity/manim.git
synced 2026-06-22 10:01:47 +00:00
Fix tests to run on Cairo 1.18.0 (#3416)
* Add a script to build and install cairo * Update gui tests for cairo 1.18.0 * update script to set env vars * Make the script run with plain python * Prefer the recently built one in pkg-config * Skip the built if it's windows * CI: build and install latest cairo * CI: only run when cache is missed * Disable compiling tests while building cairo * update poetry lock file * Display the cairo version when running pytest * fixup * tests: skip graphical test when cairo is old * fix the path to find the pkgconfig files on linux * set the LD_LIBRARY_PATH too only then it'll work on linux * fixup * small fixup * Move the script inside `.github/scripts` folder * Make the minimum cairo version a constant * Seperate setting env vars to a sperate step this seem to have broken when cache is hit
This commit is contained in:
parent
8320cdde80
commit
b04869579b
227 changed files with 272 additions and 27 deletions
209
.github/scripts/ci_build_cairo.py
vendored
Normal file
209
.github/scripts/ci_build_cairo.py
vendored
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
# Logic is as follows:
|
||||
# 1. Download cairo source code: https://cairographics.org/releases/cairo-<version>.tar.xz
|
||||
# 2. Verify the downloaded file using the sha256sums file: https://cairographics.org/releases/cairo-<version>.tar.xz.sha256sum
|
||||
# 3. Extract the downloaded file.
|
||||
# 4. Create a virtual environment and install meson and ninja.
|
||||
# 5. Run meson build in the extracted directory. Also, set required prefix.
|
||||
# 6. Run meson compile -C build.
|
||||
# 7. Run meson install -C build.
|
||||
|
||||
import hashlib
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tarfile
|
||||
import tempfile
|
||||
import typing
|
||||
import urllib.request
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
from sys import stdout
|
||||
|
||||
CAIRO_VERSION = "1.18.0"
|
||||
CAIRO_URL = f"https://cairographics.org/releases/cairo-{CAIRO_VERSION}.tar.xz"
|
||||
CAIRO_SHA256_URL = f"{CAIRO_URL}.sha256sum"
|
||||
|
||||
VENV_NAME = "meson-venv"
|
||||
BUILD_DIR = "build"
|
||||
INSTALL_PREFIX = Path(__file__).parent.parent / "third_party" / "cairo"
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def is_ci():
|
||||
return os.getenv("CI", None) is not None
|
||||
|
||||
|
||||
def download_file(url, path):
|
||||
logger.info(f"Downloading {url} to {path}")
|
||||
block_size = 1024 * 1024
|
||||
with urllib.request.urlopen(url) as response, open(path, "wb") as file:
|
||||
while True:
|
||||
data = response.read(block_size)
|
||||
if not data:
|
||||
break
|
||||
file.write(data)
|
||||
|
||||
|
||||
def verify_sha256sum(path, sha256sum):
|
||||
with open(path, "rb") as file:
|
||||
file_hash = hashlib.sha256(file.read()).hexdigest()
|
||||
if file_hash != sha256sum:
|
||||
raise Exception("SHA256SUM does not match")
|
||||
|
||||
|
||||
def extract_tar_xz(path, directory):
|
||||
with tarfile.open(path) as file:
|
||||
file.extractall(directory)
|
||||
|
||||
|
||||
def run_command(command, cwd=None, env=None):
|
||||
process = subprocess.Popen(command, cwd=cwd, env=env)
|
||||
process.communicate()
|
||||
if process.returncode != 0:
|
||||
raise Exception("Command failed")
|
||||
|
||||
|
||||
@contextmanager
|
||||
def gha_group(title: str) -> typing.Generator:
|
||||
if not is_ci():
|
||||
yield
|
||||
return
|
||||
print(f"\n::group::{title}")
|
||||
stdout.flush()
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
print("::endgroup::")
|
||||
stdout.flush()
|
||||
|
||||
|
||||
def set_env_var_gha(name: str, value: str) -> None:
|
||||
if not is_ci():
|
||||
return
|
||||
env_file = os.getenv("GITHUB_ENV", None)
|
||||
if env_file is None:
|
||||
return
|
||||
with open(env_file, "a") as file:
|
||||
file.write(f"{name}={value}\n")
|
||||
stdout.flush()
|
||||
|
||||
|
||||
def get_ld_library_path(prefix: Path) -> str:
|
||||
# given a prefix, the ld library path can be found at
|
||||
# <prefix>/lib/* or sometimes just <prefix>/lib
|
||||
# this function returns the path to the ld library path
|
||||
|
||||
# first, check if the ld library path exists at <prefix>/lib/*
|
||||
ld_library_paths = list(prefix.glob("lib/*"))
|
||||
if len(ld_library_paths) == 1:
|
||||
return ld_library_paths[0].absolute().as_posix()
|
||||
|
||||
# if the ld library path does not exist at <prefix>/lib/*,
|
||||
# return <prefix>/lib
|
||||
ld_library_path = prefix / "lib"
|
||||
if ld_library_path.exists():
|
||||
return ld_library_path.absolute().as_posix()
|
||||
return ""
|
||||
|
||||
|
||||
def main():
|
||||
if sys.platform == "win32":
|
||||
logger.info("Skipping build on windows")
|
||||
return
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
with gha_group("Downloading and Extracting Cairo"):
|
||||
logger.info(f"Downloading cairo version {CAIRO_VERSION}")
|
||||
download_file(CAIRO_URL, os.path.join(tmpdir, "cairo.tar.xz"))
|
||||
|
||||
logger.info("Downloading cairo sha256sum")
|
||||
download_file(CAIRO_SHA256_URL, os.path.join(tmpdir, "cairo.sha256sum"))
|
||||
|
||||
logger.info("Verifying cairo sha256sum")
|
||||
with open(os.path.join(tmpdir, "cairo.sha256sum")) as file:
|
||||
sha256sum = file.read().split()[0]
|
||||
verify_sha256sum(os.path.join(tmpdir, "cairo.tar.xz"), sha256sum)
|
||||
|
||||
logger.info("Extracting cairo")
|
||||
extract_tar_xz(os.path.join(tmpdir, "cairo.tar.xz"), tmpdir)
|
||||
|
||||
with gha_group("Installing meson and ninja"):
|
||||
logger.info("Creating virtual environment")
|
||||
run_command([sys.executable, "-m", "venv", os.path.join(tmpdir, VENV_NAME)])
|
||||
|
||||
logger.info("Installing meson and ninja")
|
||||
run_command(
|
||||
[
|
||||
os.path.join(tmpdir, VENV_NAME, "bin", "pip"),
|
||||
"install",
|
||||
"meson",
|
||||
"ninja",
|
||||
]
|
||||
)
|
||||
|
||||
env_vars = {
|
||||
# add the venv bin directory to PATH so that meson can find ninja
|
||||
"PATH": f"{os.path.join(tmpdir, VENV_NAME, 'bin')}{os.pathsep}{os.environ['PATH']}",
|
||||
}
|
||||
|
||||
with gha_group("Building and Installing Cairo"):
|
||||
logger.info("Running meson setup")
|
||||
run_command(
|
||||
[
|
||||
os.path.join(tmpdir, VENV_NAME, "bin", "meson"),
|
||||
"setup",
|
||||
BUILD_DIR,
|
||||
f"--prefix={INSTALL_PREFIX.absolute().as_posix()}",
|
||||
"--buildtype=release",
|
||||
"-Dtests=disabled",
|
||||
],
|
||||
cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"),
|
||||
env=env_vars,
|
||||
)
|
||||
|
||||
logger.info("Running meson compile")
|
||||
run_command(
|
||||
[
|
||||
os.path.join(tmpdir, VENV_NAME, "bin", "meson"),
|
||||
"compile",
|
||||
"-C",
|
||||
BUILD_DIR,
|
||||
],
|
||||
cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"),
|
||||
env=env_vars,
|
||||
)
|
||||
|
||||
logger.info("Running meson install")
|
||||
run_command(
|
||||
[
|
||||
os.path.join(tmpdir, VENV_NAME, "bin", "meson"),
|
||||
"install",
|
||||
"-C",
|
||||
BUILD_DIR,
|
||||
],
|
||||
cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"),
|
||||
env=env_vars,
|
||||
)
|
||||
|
||||
logger.info(f"Successfully built cairo and installed it to {INSTALL_PREFIX}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if "--set-env-vars" in sys.argv:
|
||||
with gha_group("Setting environment variables"):
|
||||
# append the pkgconfig directory to PKG_CONFIG_PATH
|
||||
set_env_var_gha(
|
||||
"PKG_CONFIG_PATH",
|
||||
f"{Path(get_ld_library_path(INSTALL_PREFIX), 'pkgconfig').as_posix()}{os.pathsep}"
|
||||
f'{os.getenv("PKG_CONFIG_PATH", "")}',
|
||||
)
|
||||
set_env_var_gha(
|
||||
"LD_LIBRARY_PATH",
|
||||
f"{get_ld_library_path(INSTALL_PREFIX)}{os.pathsep}"
|
||||
f'{os.getenv("LD_LIBRARY_PATH", "")}',
|
||||
)
|
||||
sys.exit(0)
|
||||
main()
|
||||
20
.github/workflows/ci.yml
vendored
20
.github/workflows/ci.yml
vendored
|
|
@ -76,6 +76,22 @@ jobs:
|
|||
# start xvfb in background
|
||||
sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 &
|
||||
|
||||
- name: Setup Cairo Cache
|
||||
uses: actions/cache@v3
|
||||
id: cache-cairo
|
||||
if: runner.os == 'Linux' || runner.os == 'macOS'
|
||||
with:
|
||||
path: ${{ github.workspace }}/third_party
|
||||
key: ${{ runner.os }}-dependencies-cairo-${{ hashFiles('.github/scripts/ci_build_cairo.py') }}
|
||||
|
||||
- name: Build and install Cairo (Linux and macOS)
|
||||
if: (runner.os == 'Linux' || runner.os == 'macOS') && steps.cache-cairo.outputs.cache-hit != 'true'
|
||||
run: python .github/scripts/ci_build_cairo.py
|
||||
|
||||
- name: Set env vars for Cairo (Linux and macOS)
|
||||
if: runner.os == 'Linux' || runner.os == 'macOS'
|
||||
run: python .github/scripts/ci_build_cairo.py --set-env-vars
|
||||
|
||||
- name: Setup macOS cache
|
||||
uses: actions/cache@v3
|
||||
id: cache-macos
|
||||
|
|
@ -103,10 +119,6 @@ jobs:
|
|||
export PATH="$oriPath"
|
||||
echo "Completed TinyTeX"
|
||||
|
||||
- name: Install cairo (MacOS)
|
||||
if: runner.os == 'macOS'
|
||||
run: brew install cairo
|
||||
|
||||
- name: Add macOS dependencies to PATH
|
||||
if: runner.os == 'macOS'
|
||||
shell: bash
|
||||
|
|
|
|||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -131,3 +131,6 @@ dist/
|
|||
|
||||
/media_dir.txt
|
||||
# ^TODO: Remove the need for this with a proper config file
|
||||
|
||||
# Ignore the built dependencies
|
||||
third_party/*
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ try:
|
|||
except ModuleNotFoundError: # windows
|
||||
pass
|
||||
|
||||
import cairo
|
||||
import moderngl
|
||||
|
||||
# If it is running Doctest the current directory
|
||||
|
|
@ -39,6 +40,7 @@ def pytest_report_header(config):
|
|||
info = ctx.info
|
||||
ctx.release()
|
||||
return (
|
||||
f"\nCairo Version: {cairo.cairo_version()}",
|
||||
"\nOpenGL information",
|
||||
"------------------",
|
||||
f"vendor: {info['GL_VENDOR'].strip()}",
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import inspect
|
|||
from pathlib import Path
|
||||
from typing import Callable
|
||||
|
||||
import cairo
|
||||
import pytest
|
||||
from _pytest.fixtures import FixtureRequest
|
||||
|
||||
from manim import Scene
|
||||
|
|
@ -25,6 +27,7 @@ from ._test_class_makers import (
|
|||
SCENE_PARAMETER_NAME = "scene"
|
||||
_tests_root_dir_path = Path(__file__).absolute().parents[2]
|
||||
PATH_CONTROL_DATA = _tests_root_dir_path / Path("control_data", "graphical_units_data")
|
||||
MIN_CAIRO_VERSION = 11800
|
||||
|
||||
|
||||
def frames_comparison(
|
||||
|
|
@ -81,6 +84,12 @@ def frames_comparison(
|
|||
@functools.wraps(tested_scene_construct)
|
||||
# The "request" parameter is meant to be used as a fixture by pytest. See below.
|
||||
def wrapper(*args, request: FixtureRequest, tmp_path, **kwargs):
|
||||
# check for cairo version
|
||||
if (
|
||||
renderer_class is CairoRenderer
|
||||
and cairo.cairo_version() < MIN_CAIRO_VERSION
|
||||
):
|
||||
pytest.skip("Cairo version is too old. Skipping cairo graphical tests.")
|
||||
# Wraps the test_function to a construct method, to "freeze" the eventual additional arguments (parametrizations fixtures).
|
||||
construct = functools.partial(tested_scene_construct, *args, **kwargs)
|
||||
|
||||
|
|
|
|||
56
poetry.lock
generated
56
poetry.lock
generated
|
|
@ -1,4 +1,4 @@
|
|||
# This file is automatically @generated by Poetry and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "aiofiles"
|
||||
|
|
@ -273,30 +273,30 @@ lxml = ["lxml"]
|
|||
|
||||
[[package]]
|
||||
name = "black"
|
||||
version = "23.10.0"
|
||||
version = "23.10.1"
|
||||
description = "The uncompromising code formatter."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "black-23.10.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:f8dc7d50d94063cdfd13c82368afd8588bac4ce360e4224ac399e769d6704e98"},
|
||||
{file = "black-23.10.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:f20ff03f3fdd2fd4460b4f631663813e57dc277e37fb216463f3b907aa5a9bdd"},
|
||||
{file = "black-23.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3d9129ce05b0829730323bdcb00f928a448a124af5acf90aa94d9aba6969604"},
|
||||
{file = "black-23.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:960c21555be135c4b37b7018d63d6248bdae8514e5c55b71e994ad37407f45b8"},
|
||||
{file = "black-23.10.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:30b78ac9b54cf87bcb9910ee3d499d2bc893afd52495066c49d9ee6b21eee06e"},
|
||||
{file = "black-23.10.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:0e232f24a337fed7a82c1185ae46c56c4a6167fb0fe37411b43e876892c76699"},
|
||||
{file = "black-23.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31946ec6f9c54ed7ba431c38bc81d758970dd734b96b8e8c2b17a367d7908171"},
|
||||
{file = "black-23.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:c870bee76ad5f7a5ea7bd01dc646028d05568d33b0b09b7ecfc8ec0da3f3f39c"},
|
||||
{file = "black-23.10.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:6901631b937acbee93c75537e74f69463adaf34379a04eef32425b88aca88a23"},
|
||||
{file = "black-23.10.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:481167c60cd3e6b1cb8ef2aac0f76165843a374346aeeaa9d86765fe0dd0318b"},
|
||||
{file = "black-23.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74892b4b836e5162aa0452393112a574dac85e13902c57dfbaaf388e4eda37c"},
|
||||
{file = "black-23.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:47c4510f70ec2e8f9135ba490811c071419c115e46f143e4dce2ac45afdcf4c9"},
|
||||
{file = "black-23.10.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:76baba9281e5e5b230c9b7f83a96daf67a95e919c2dfc240d9e6295eab7b9204"},
|
||||
{file = "black-23.10.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:a3c2ddb35f71976a4cfeca558848c2f2f89abc86b06e8dd89b5a65c1e6c0f22a"},
|
||||
{file = "black-23.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db451a3363b1e765c172c3fd86213a4ce63fb8524c938ebd82919bf2a6e28c6a"},
|
||||
{file = "black-23.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:7fb5fc36bb65160df21498d5a3dd330af8b6401be3f25af60c6ebfe23753f747"},
|
||||
{file = "black-23.10.0-py3-none-any.whl", hash = "sha256:e223b731a0e025f8ef427dd79d8cd69c167da807f5710add30cdf131f13dd62e"},
|
||||
{file = "black-23.10.0.tar.gz", hash = "sha256:31b9f87b277a68d0e99d2905edae08807c007973eaa609da5f0c62def6b7c0bd"},
|
||||
{file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"},
|
||||
{file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"},
|
||||
{file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"},
|
||||
{file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"},
|
||||
{file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"},
|
||||
{file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"},
|
||||
{file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"},
|
||||
{file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"},
|
||||
{file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"},
|
||||
{file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"},
|
||||
{file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"},
|
||||
{file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"},
|
||||
{file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"},
|
||||
{file = "black-23.10.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:7670242e90dc129c539e9ca17665e39a146a761e681805c54fbd86015c7c84f7"},
|
||||
{file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"},
|
||||
{file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"},
|
||||
{file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"},
|
||||
{file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
|
@ -2387,6 +2387,16 @@ files = [
|
|||
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
|
||||
|
|
@ -4913,14 +4923,14 @@ zstd = ["zstandard (>=0.18.0)"]
|
|||
|
||||
[[package]]
|
||||
name = "virtualenv"
|
||||
version = "20.24.5"
|
||||
version = "20.24.6"
|
||||
description = "Virtual Python Environment builder"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"},
|
||||
{file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"},
|
||||
{file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"},
|
||||
{file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue