diff --git a/Jenkinsfile b/Jenkinsfile index bc15629..74ec909 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -104,6 +104,167 @@ def createChocolateyConfigFile(configJsonFile, installerPackage, url){ writeJSON( json: deployJsonMetadata, file: configJsonFile, pretty: 2) } +def testPackages(params){ + customMatrix( + axes: [ + [ + name: 'PYTHON_VERSION', + values: ['3.11', '3.12','3.13','3.14'] + ], + [ + name: 'OS', + values: ['linux','macos','windows'] + ], + [ + name: 'ARCHITECTURE', + values: ['x86_64', 'arm64'] + ], + [ + name: 'PACKAGE_TYPE', + values: ['wheel', 'sdist'], + ] + ], + excludes: [ + [ + [ + name: 'OS', + values: 'windows' + ], + [ + name: 'ARCHITECTURE', + values: 'arm64', + ] + ], + [ + [ + name: 'OS', + values: 'linux' + ], + [ + name: 'ARCHITECTURE', + values: 'arm64', + ] + ] + ], + when: {entry -> "INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase() && params["INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()]}, + stages: [ + { entry -> + stage('Test Package') { + node("${entry.OS} && ${entry.ARCHITECTURE} ${['linux', 'windows'].contains(entry.OS) ? '&& docker': ''}"){ + try{ + checkout scm + unstash 'PYTHON_PACKAGES' + if(['linux', 'windows'].contains(entry.OS) && params.containsKey("INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()) && params["INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()]){ + docker.image(isUnix() ? 'ghcr.io/astral-sh/uv:debian' :'python') + .inside("--label=purpose=ci --label \"JOB_NAME=\$JOB_NAME\" --label \"absoluteUrl=${currentBuild.absoluteUrl}\" --label \"BUILD_NUMBER=${currentBuild.number}\" " + + ( + isUnix() ? + '--mount source=tripwire_cache,target=/tmp --tmpfs /.local/share:exec --tmpfs /.local/bin:exec' + : + "--mount type=volume,source=uv_python_cache_dir,target=C:\\Users\\ContainerUser\\Documents\\cache\\uvpython \ + --mount type=volume,source=pipcache,target=C:\\Users\\ContainerUser\\Documents\\cache\\pipcache \ + --mount type=volume,source=uv_cache_dir,target=C:\\Users\\ContainerUser\\Documents\\cache\\uvcache") + ){ + if(isUnix()){ + withEnv([ + 'PIP_CACHE_DIR=/tmp/pipcache', + 'UV_TOOL_DIR=/tmp/uvtools', + 'UV_PYTHON_CACHE_DIR=/tmp/uvpython', + 'UV_CACHE_DIR=/tmp/uvcache', + "TRIPWIRE_SAMPLE_FILES=${WORKSPACE}/samples", + ]){ + sh "uv python install cpython-${entry.PYTHON_VERSION}" + unstash 'SAMPLE_FILES' + def attempt = 0 + retry(2){ + attempt += 1 + withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ + sh( + label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", + script: "uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" + ) + } + } + } + } else { + withEnv([ + 'PIP_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\pipcache', + 'UV_TOOL_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvtools', + 'UV_PYTHON_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvpython', + 'UV_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvcache', + "TOX_UV_PATH=${env.WORKSPACE}\\venv\\Scripts\\uv.exe", + "TRIPWIRE_SAMPLE_FILES=${WORKSPACE}\\samples" + ]){ + bat """python -m venv venv + .\\venv\\Scripts\\pip install --disable-pip-version-check uv + .\\venv\\Scripts\\uv python install cpython-${entry.PYTHON_VERSION} + """ + unstash 'SAMPLE_FILES' + def attempt = 0 + retry(2){ + attempt += 1 + withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ + powershell( + label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", + script: ".\\venv\\Scripts\\uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" + ) + } + } + } + } + } + } else { + if(isUnix()){ + sh """python3 -m venv venv + ./venv/bin/pip install --disable-pip-version-check uv + ./venv/bin/uv python install cpython-${entry.PYTHON_VERSION} + """ + withEnv(["TOX_UV_PATH=${env.WORKSPACE}/venv/bin/uv", "TRIPWIRE_SAMPLE_FILES=${WORKSPACE}/samples"]){ + unstash 'SAMPLE_FILES' + def attempt = 0 + retry(2){ + attempt += 1 + withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ + sh( + label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", + script: "./venv/bin/uv run --python=${entry.PYTHON_VERSION} --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" + ) + } + } + } + } else { + bat """python -m venv venv + .\\venv\\Scripts\\pip install --disable-pip-version-check uv + .\\venv\\Scripts\\uv python install cpython-${entry.PYTHON_VERSION} + """ + withEnv(["TOX_UV_PATH=${env.WORKSPACE}\\venv\\Scripts\\uv.exe", "TRIPWIRE_SAMPLE_FILES=${WORKSPACE}/samples"]){ + unstash 'SAMPLE_FILES' + def attempt = 0 + retry(2){ + attempt += 1 + withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ + bat( + label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", + script: ".\\venv\\Scripts\\uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" + ) + } + } + } + } + } + } finally{ + if(isUnix()){ + sh "${tool(name: 'Default', type: 'git')} clean -dfx" + } else { + bat "${tool(name: 'Default', type: 'git')} clean -dfx" + } + } + } + } + } + ] + ) +} pipeline { agent none @@ -128,6 +289,28 @@ pipeline { } stages { + stage('Generate sample files'){ + agent{ + label "docker && linux" + } + when{ + anyOf{ + equals expected: true, actual: params.RUN_CHECKS + equals expected: true, actual: params.TEST_PACKAGES + } + beforeAgent true + } + steps{ + script{ + docker.image('lscr.io/linuxserver/ffmpeg:latest').inside("--entrypoint=''"){ + sh '''mkdir -p samples + ffmpeg -f lavfi -i smptebars=duration=5:size=640x360:rate=30 -y samples/bars.mp4 + ''' + } + stash includes: 'samples/*.mp4', name: 'SAMPLE_FILES' + } + } + } stage('Building and Testing'){ stages{ stage('Build and Test'){ @@ -178,7 +361,11 @@ pipeline { } parallel { stage('PyTest'){ + environment { + TRIPWIRE_SAMPLE_FILES="${WORKSPACE}/samples" + } steps{ + unstash 'SAMPLE_FILES' catchError(buildResult: 'UNSTABLE', message: 'Did not pass all pytest tests', stageResult: 'UNSTABLE') { sh( script: 'PYTHONFAULTHANDLER=1 uv run coverage run --parallel-mode --source=uiucprescon.tripwire -m pytest --junitxml=./reports/tests/pytest/pytest-junit.xml --capture=no' @@ -402,159 +589,7 @@ pipeline { equals expected: true, actual: params.TEST_PACKAGES } steps{ - customMatrix( - axes: [ - [ - name: 'PYTHON_VERSION', - values: ['3.11', '3.12','3.13'] - ], - [ - name: 'OS', - values: ['linux','macos','windows'] - ], - [ - name: 'ARCHITECTURE', - values: ['x86_64', 'arm64'] - ], - [ - name: 'PACKAGE_TYPE', - values: ['wheel', 'sdist'], - ] - ], - excludes: [ - [ - [ - name: 'OS', - values: 'windows' - ], - [ - name: 'ARCHITECTURE', - values: 'arm64', - ] - ], - [ - [ - name: 'OS', - values: 'linux' - ], - [ - name: 'ARCHITECTURE', - values: 'arm64', - ] - ] - ], - when: {entry -> "INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase() && params["INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()]}, - stages: [ - { entry -> - stage('Test Package') { - node("${entry.OS} && ${entry.ARCHITECTURE} ${['linux', 'windows'].contains(entry.OS) ? '&& docker': ''}"){ - try{ - checkout scm - unstash 'PYTHON_PACKAGES' - if(['linux', 'windows'].contains(entry.OS) && params.containsKey("INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()) && params["INCLUDE_${entry.OS}-${entry.ARCHITECTURE}".toUpperCase()]){ - docker.image(isUnix() ? 'ghcr.io/astral-sh/uv:debian' :'python') - .inside("--label=purpose=ci --label \"JOB_NAME=\$JOB_NAME\" --label \"absoluteUrl=${currentBuild.absoluteUrl}\" --label \"BUILD_NUMBER=${currentBuild.number}\" " + - ( - isUnix() ? - '--mount source=tripwire_cache,target=/tmp --tmpfs /.local/share:exec --tmpfs /.local/bin:exec' - : - "--mount type=volume,source=uv_python_cache_dir,target=C:\\Users\\ContainerUser\\Documents\\cache\\uvpython \ - --mount type=volume,source=pipcache,target=C:\\Users\\ContainerUser\\Documents\\cache\\pipcache \ - --mount type=volume,source=uv_cache_dir,target=C:\\Users\\ContainerUser\\Documents\\cache\\uvcache") - ){ - if(isUnix()){ - withEnv([ - 'PIP_CACHE_DIR=/tmp/pipcache', - 'UV_TOOL_DIR=/tmp/uvtools', - 'UV_PYTHON_CACHE_DIR=/tmp/uvpython', - 'UV_CACHE_DIR=/tmp/uvcache', - ]){ - sh "uv python install cpython-${entry.PYTHON_VERSION}" - def attempt = 0 - retry(2){ - attempt += 1 - withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ - sh( - label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", - script: "uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" - ) - } - } - } - } else { - withEnv([ - 'PIP_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\pipcache', - 'UV_TOOL_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvtools', - 'UV_PYTHON_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvpython', - 'UV_CACHE_DIR=C:\\Users\\ContainerUser\\Documents\\cache\\uvcache', - "TOX_UV_PATH=${env.WORKSPACE}\\venv\\Scripts\\uv.exe", - ]){ - bat """python -m venv venv - .\\venv\\Scripts\\pip install --disable-pip-version-check uv - .\\venv\\Scripts\\uv python install cpython-${entry.PYTHON_VERSION} - """ - def attempt = 0 - retry(2){ - attempt += 1 - withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ - powershell( - label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", - script: ".\\venv\\Scripts\\uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" - ) - } - } - } - } - } - } else { - if(isUnix()){ - sh """python3 -m venv venv - ./venv/bin/pip install --disable-pip-version-check uv - ./venv/bin/uv python install cpython-${entry.PYTHON_VERSION} - """ - withEnv(["TOX_UV_PATH=${env.WORKSPACE}/venv/bin/uv"]){ - def attempt = 0 - retry(2){ - attempt += 1 - withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ - sh( - label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", - script: "./venv/bin/uv run --python=${entry.PYTHON_VERSION} --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" - ) - } - } - } - } else { - bat """python -m venv venv - .\\venv\\Scripts\\pip install --disable-pip-version-check uv - .\\venv\\Scripts\\uv python install cpython-${entry.PYTHON_VERSION} - """ - withEnv(["TOX_UV_PATH=${env.WORKSPACE}\\venv\\Scripts\\uv.exe"]){ - def attempt = 0 - retry(2){ - attempt += 1 - withEnv([(attempt == 1) ? 'UV_OFFLINE=1' : 'UV_OFFLINE=0']){ - bat( - label: "Testing with tox: ${(attempt == 1) ? 'Offline' : 'Online'}", - script: ".\\venv\\Scripts\\uv run --only-group=tox-uv --frozen tox --installpkg ${findFiles(glob: entry.PACKAGE_TYPE == 'wheel' ? 'dist/*.whl' : 'dist/*.tar.gz')[0].path} -e py${entry.PYTHON_VERSION.replace('.', '')}" - ) - } - } - } - } - } - } finally{ - if(isUnix()){ - sh "${tool(name: 'Default', type: 'git')} clean -dfx" - } else { - bat "${tool(name: 'Default', type: 'git')} clean -dfx" - } - } - } - } - } - ] - ) + testPackages(params) } } } diff --git a/pyproject.toml b/pyproject.toml index 1451513..e4c7fbb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "argcomplete", "pymediainfo", "tqdm", - "uiucprescon.pymediaconch", + "uiucprescon.pymediaconch>=0.1.2", ] [project.urls] project = "https://github.com/UIUCLibrary/tripwire" @@ -89,12 +89,13 @@ extend-select = [ convention = "google" [tool.tox] -envlist = ["3.11", "3.12", "3.13"] +envlist = ["3.11", "3.12", "3.13", "3.14"] [tool.tox.env_run_base] description = "Run test under {base_python}" commands = [["{env_bin_dir}{/}pytest"]] dependency_groups = ['test'] +pass_env = ["TRIPWIRE_SAMPLE_FILES"] [tool.tox.env.type-checking] description = "Run mypy type checking" diff --git a/tests/sample_media_files.py b/tests/sample_media_files.py new file mode 100644 index 0000000..42cad38 --- /dev/null +++ b/tests/sample_media_files.py @@ -0,0 +1,60 @@ +import os.path +import shutil +import subprocess +import argparse +import sys + +GENERATED_FILES = { + "bars_and_tone_file": 'bars.mp4', +} + + +def create_sample_files(samples_dir): + ffmpeg = shutil.which('ffmpeg') + if not ffmpeg: + raise FileNotFoundError("ffmpeg not found, cannot create sample files") + + subprocess.check_call([ffmpeg, '-version']) + subprocess.check_call( + [ffmpeg, '-f', 'lavfi', '-i', 'smptebars=duration=5:size=640x360:rate=30', '-y', os.path.join(samples_dir, GENERATED_FILES['bars_and_tone_file'])]) + return categorize_sample_files(samples_dir) + + +def categorize_sample_files(sample_files_path:str): + sample_files = {} + for key, value in GENERATED_FILES.items(): + full_path = os.path.join(sample_files_path, value) + if not os.path.exists(os.path.exists(full_path)): + raise FileNotFoundError(f"Expected sample file {full_path} not found") + sample_files[key] = full_path + return sample_files + + +def get_sample_files(samples_dir): + return categorize_sample_files(samples_dir) + +def main(): + parser = argparse.ArgumentParser(description="Manage sample media files for testing") + subparsers = parser.add_subparsers(title="subcommands", required=True, dest="subcommand", help='subcommand help') + + parser_create = subparsers.add_parser('create', help='create sample media files') + parser_create.add_argument('output', help='output directory') + args = parser.parse_args() + match args.subcommand: + case "create": + print("creating sample media files") + if not os.path.exists(args.output): + print(f"Output directory {args.output} does not exist, creating it", flush=True) + os.makedirs(args.output) + create_sample_files(args.output) + return 0 + + case _: + # This should never happen because argparse should enforce valid subcommands, but we include it for + # completeness. + print(f"Unknown subcommand: {args.subcommand}") + return 1 + + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file diff --git a/tests/test_integration.py b/tests/test_integration.py new file mode 100644 index 0000000..1823429 --- /dev/null +++ b/tests/test_integration.py @@ -0,0 +1,48 @@ +import argparse +import os +from unittest import mock + +import pytest +import shutil +import sample_media_files + +from uiucprescon.tripwire import main + +SAMPLE_FILES_ENV_VARIABLE = 'TRIPWIRE_SAMPLE_FILES' + +@pytest.fixture(scope="session") +def sample_files(tmp_path_factory): + if not any(condition for condition in [ + os.getenv(SAMPLE_FILES_ENV_VARIABLE), + shutil.which('ffmpeg') + ]): + pytest.skip( + f"neither environment variable " + f"{SAMPLE_FILES_ENV_VARIABLE} nor ffmpeg was found, " + f"skipping integration test" + ) + if sample_file_path := os.getenv(SAMPLE_FILES_ENV_VARIABLE): + return sample_media_files.get_sample_files(sample_file_path) + + return sample_media_files.create_sample_files(tmp_path_factory.mktemp('samples')) + +def test_integration_metadata_validate_command(sample_files, tmpdir, monkeypatch, caplog): + test_path = tmpdir.mkdir('testing_area') + + policy_file = test_path / 'policy_file.xml' + policy_file.write_text(""" + + + """.strip(), + encoding="utf-8" + ) + sample_files_path = test_path.mkdir('samples') + bar_and_tone = sample_files_path / 'bars.mp4' + shutil.copy(str(sample_files['bars_and_tone_file']), str(bar_and_tone)) + glob= test_path / '**/*.mp4' + monkeypatch.chdir(test_path) + cmd = argparse.Namespace(glob=f"{glob}", policy_file=policy_file, verbosity=1) + mocked_exit = mock.Mock() + monkeypatch.setattr(main.sys, "exit", mocked_exit) + main.metadata_validate_command(cmd) + assert "No issues found." in caplog.text and "Inspected 1 files" in caplog.text diff --git a/uv.lock b/uv.lock index 8d50e69..cfa1a24 100644 --- a/uv.lock +++ b/uv.lock @@ -274,44 +274,44 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.7" +version = "49.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, - { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, - { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, - { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, - { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, - { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, - { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" }, - { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" }, - { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" }, - { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" }, - { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" }, - { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, - { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, - { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, - { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, - { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, - { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, - { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15", size = 4219700, upload-time = "2026-04-08T01:57:40.625Z" }, - { url = "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455", size = 4385982, upload-time = "2026-04-08T01:57:42.725Z" }, - { url = "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65", size = 4219115, upload-time = "2026-04-08T01:57:44.939Z" }, - { url = "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968", size = 4385479, upload-time = "2026-04-08T01:57:46.86Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" }, + { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" }, + { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", size = 4676239, upload-time = "2026-06-12T20:02:28.793Z" }, + { url = "https://files.pythonhosted.org/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", size = 4715584, upload-time = "2026-06-12T20:01:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", size = 4675885, upload-time = "2026-06-12T20:01:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", size = 4715449, upload-time = "2026-06-12T20:02:05.469Z" }, ] [[package]] @@ -1395,25 +1395,15 @@ wheels = [ [[package]] name = "uiucprescon-pymediaconch" -version = "0.1.1" +version = "0.1.2" source = { registry = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/simple" } -sdist = { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1.tar.gz", hash = "sha256:c7b3217e59aab7d772352baa230f1628dccaf66ab8f4806840e11feab4ca55fd" } -wheels = [ - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:945958c5d60bf8e089561b0cc6f12d9b1b2136da9e1b9816d419ee5e7571c44a" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c3641f6106248c2040bc87a56ec877b5c321cf1378e59ae8b60fa85239feca5" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ad08d5d39f704d054c6298a40aa8f87f41f50bd6c5d42c135f854396abd4b7d" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e30a7e78ac53127fcd45165b6757b1429cdb4e5186dfa3db68e8d0b9e7957209" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:431d0c25c619f3b24173e28d8998174dc0fb9ad5d473481c4e0e69fd464bdbf8" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d0a4910da374eb77a349190de9bff86373ecd68055cee766a1de1c584416791e" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6050fad42e63ab515f02de48f2b836f4df3684749749ceac2e61310c1085495e" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:170dbce961580c41c21d33feb37e29d2c03f751f23378fe3857cd5be17272c20" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:23d13d7d3e6c3f8a6222271a4ad4a396fa6f8c90161a1fd129825abb0bf00f2f" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:40c8ed258bd216bbdccbab0fece26a65f46f2b57552ce14a313e593a457e3afb" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:869bdc161f0723ad0a30fabb830a71c0e9e824fc63e686cb708cc6033b95417e" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:747c5864c31c7fc95750a7c3ef9cc20abc1a361ece62cc25e496a799d0b1a7a5" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:00a9f1fd23655270700896e9750b5decf3a8afc4399537f10655d16a99f1358a" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:77e79a1c36be05b411163eee511dd1e1b9fcf63deb465768b6f680011c8a03e6" }, - { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.1/uiucprescon_pymediaconch-0.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:30781e0872eaf3718c01c94371cce2a0e17aea3e389b7b8cf540cae421c8e90a" }, +sdist = { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2.tar.gz", hash = "sha256:97cd9b95d521b6541359b34c9097a796cbeb69e4a0aec80786ffaa34722c4390" } +wheels = [ + { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2-cp311-cp311-macosx_10_13_universal2.whl", hash = "sha256:859eec2159b8e11cda738a6a6b2cc620eb0d8627025a79e482d9fa18062d90af" }, + { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b4bee9f2c9446d002572ef10cea9d0d8378278d8749866381283f6874a994df5" }, + { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:748c668eb9ea98f645b5279a7407ab1e9c45d8dd664b35e748868b1ea80aacc3" }, + { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2-cp312-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0f57e0cca63aff6149178e13623ecc431cf5a6b624f6b1145cda290301b94d00" }, + { url = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/packages/uiucprescon-pymediaconch/0.1.2/uiucprescon_pymediaconch-0.1.2-cp312-abi3-win_amd64.whl", hash = "sha256:0ad657639790f61fa45b7f45f90c77f9a2fb41578536e9d7f565161541098ae0" }, ] [[package]] @@ -1484,7 +1474,7 @@ requires-dist = [ { name = "argcomplete" }, { name = "pymediainfo" }, { name = "tqdm" }, - { name = "uiucprescon-pymediaconch", index = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/simple" }, + { name = "uiucprescon-pymediaconch", specifier = ">=0.1.2", index = "https://nexus.library.illinois.edu/repository/uiuc_prescon_python/simple" }, ] [package.metadata.requires-dev]