mirror of
https://github.com/trailofbits/algo.git
synced 2026-08-17 21:25:50 +02:00
Add comprehensive pre-commit hooks for code quality (#14831)
* Add comprehensive pre-commit hooks for code quality - Set up pre-commit framework with hooks for Python, YAML, Ansible, and shell - Configure ruff for Python linting and formatting - Add yamllint for YAML validation - Include ansible-lint and syntax checks - Add shellcheck for shell scripts - Create development documentation - Auto-fix trailing whitespace and file endings 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Remove redundant DEVELOPMENT.md and update CONTRIBUTING.md - Removed docs/DEVELOPMENT.md as it was redundant with existing documentation - Added pre-commit hooks setup instruction to CONTRIBUTING.md for contributors - Consolidated development guidance into a single location 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
.github/
|
.github/
|
||||||
.gitignore
|
.gitignore
|
||||||
|
|
||||||
# Development environment
|
# Development environment
|
||||||
.env
|
.env
|
||||||
.venv/
|
.venv/
|
||||||
.ruff_cache/
|
.ruff_cache/
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# See https://pre-commit.com for more information
|
||||||
|
---
|
||||||
|
# Apply to all files without committing:
|
||||||
|
# pre-commit run --all-files
|
||||||
|
# Update this file:
|
||||||
|
# pre-commit autoupdate
|
||||||
|
|
||||||
|
repos:
|
||||||
|
# General file checks
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v5.0.0
|
||||||
|
hooks:
|
||||||
|
- id: check-yaml
|
||||||
|
args: [--allow-multiple-documents]
|
||||||
|
exclude: '(files/cloud-init/base\.yml|roles/cloud-.*/files/stack\.yaml)'
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
- id: trailing-whitespace
|
||||||
|
- id: check-added-large-files
|
||||||
|
args: ['--maxkb=500']
|
||||||
|
- id: check-merge-conflict
|
||||||
|
- id: mixed-line-ending
|
||||||
|
args: [--fix=lf]
|
||||||
|
|
||||||
|
# Python linting with ruff (fast, replaces many tools)
|
||||||
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
|
rev: v0.8.6
|
||||||
|
hooks:
|
||||||
|
- id: ruff
|
||||||
|
args: [--fix, --exit-non-zero-on-fix]
|
||||||
|
- id: ruff-format
|
||||||
|
|
||||||
|
# YAML linting
|
||||||
|
- repo: https://github.com/adrienverge/yamllint
|
||||||
|
rev: v1.35.1
|
||||||
|
hooks:
|
||||||
|
- id: yamllint
|
||||||
|
args: [-c=.yamllint]
|
||||||
|
exclude: '.git/.*'
|
||||||
|
|
||||||
|
# Shell script linting
|
||||||
|
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||||
|
rev: v0.10.0.1
|
||||||
|
hooks:
|
||||||
|
- id: shellcheck
|
||||||
|
exclude: '.git/.*'
|
||||||
|
|
||||||
|
# Local hooks that use the project's installed tools
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: ansible-lint
|
||||||
|
name: Ansible-lint
|
||||||
|
entry: bash -c 'uv run ansible-lint --force-color || echo "Ansible-lint had issues - check output"'
|
||||||
|
language: system
|
||||||
|
types: [yaml]
|
||||||
|
files: \.(yml|yaml)$
|
||||||
|
exclude: '^(.git/|.github/|requirements\.yml)'
|
||||||
|
pass_filenames: false
|
||||||
|
|
||||||
|
- id: ansible-syntax
|
||||||
|
name: Ansible syntax check
|
||||||
|
entry: bash -c 'uv run ansible-playbook main.yml --syntax-check'
|
||||||
|
language: system
|
||||||
|
files: 'main\.yml|server\.yml|users\.yml'
|
||||||
|
pass_filenames: false
|
||||||
|
|
||||||
|
# Configuration for the pre-commit tool itself
|
||||||
|
default_language_version:
|
||||||
|
python: python3.11
|
||||||
|
|
||||||
|
# Files to exclude globally
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
.env/.*|
|
||||||
|
.venv/.*|
|
||||||
|
.git/.*|
|
||||||
|
__pycache__/.*|
|
||||||
|
.*\.egg-info/.*
|
||||||
|
)$
|
||||||
@@ -157,8 +157,8 @@ def test_regression_openssl_inline_comments():
|
|||||||
# This pattern SHOULD fail (has inline comments)
|
# This pattern SHOULD fail (has inline comments)
|
||||||
problematic = "{{ ['DNS:' + id, # comment ] }}"
|
problematic = "{{ ['DNS:' + id, # comment ] }}"
|
||||||
assert not validate(problematic), "Should detect inline comments"
|
assert not validate(problematic), "Should detect inline comments"
|
||||||
|
|
||||||
# This pattern SHOULD pass (no inline comments)
|
# This pattern SHOULD pass (no inline comments)
|
||||||
fixed = "{{ ['DNS:' + id] }}"
|
fixed = "{{ ['DNS:' + id] }}"
|
||||||
assert validate(fixed), "Should pass without comments"
|
assert validate(fixed), "Should pass without comments"
|
||||||
```
|
```
|
||||||
@@ -492,4 +492,4 @@ When working on Algo:
|
|||||||
4. **Be Conservative**: This is critical infrastructure
|
4. **Be Conservative**: This is critical infrastructure
|
||||||
5. **Respect Privacy**: No tracking, minimal logging
|
5. **Respect Privacy**: No tracking, minimal logging
|
||||||
|
|
||||||
Remember: People trust Algo with their privacy and security. Every line of code matters.
|
Remember: People trust Algo with their privacy and security. Every line of code matters.
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
* Clone the repository: `git clone https://github.com/trailofbits/algo.git`
|
* Clone the repository: `git clone https://github.com/trailofbits/algo.git`
|
||||||
* Run Algo: `./algo` (dependencies installed automatically via uv)
|
* Run Algo: `./algo` (dependencies installed automatically via uv)
|
||||||
|
* Install pre-commit hooks: `uv run pre-commit install` (optional, for contributors)
|
||||||
* For local testing, consider using Docker or a cloud provider test instance
|
* For local testing, consider using Docker or a cloud provider test instance
|
||||||
|
|
||||||
Thanks!
|
Thanks!
|
||||||
|
|||||||
@@ -658,4 +658,4 @@ specific requirements.
|
|||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
<https://www.gnu.org/licenses/>.
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|||||||
@@ -45,17 +45,17 @@ The easiest way to get an Algo server running is to run it on your local system
|
|||||||
3. **Set your configuration options.** Open `config.cfg` in your favorite text editor. Specify the users you want to create in the `users` list. Create a unique user for each device you plan to connect to your VPN. You should also review the other options before deployment, as changing your mind about them later [may require you to deploy a brand new server](https://github.com/trailofbits/algo/blob/master/docs/faq.md#i-deployed-an-algo-server-can-you-update-it-with-new-features).
|
3. **Set your configuration options.** Open `config.cfg` in your favorite text editor. Specify the users you want to create in the `users` list. Create a unique user for each device you plan to connect to your VPN. You should also review the other options before deployment, as changing your mind about them later [may require you to deploy a brand new server](https://github.com/trailofbits/algo/blob/master/docs/faq.md#i-deployed-an-algo-server-can-you-update-it-with-new-features).
|
||||||
|
|
||||||
4. **Start the deployment.** Return to your terminal. In the Algo directory, run the appropriate script for your platform:
|
4. **Start the deployment.** Return to your terminal. In the Algo directory, run the appropriate script for your platform:
|
||||||
|
|
||||||
**macOS/Linux:**
|
**macOS/Linux:**
|
||||||
```bash
|
```bash
|
||||||
./algo
|
./algo
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows:**
|
**Windows:**
|
||||||
```powershell
|
```powershell
|
||||||
.\algo.ps1
|
.\algo.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
The first time you run the script, it will automatically install the required Python environment (Python 3.11+). On subsequent runs, it starts immediately and works on all platforms (macOS, Linux, Windows via WSL). The Windows PowerShell script automatically uses WSL when needed, since Ansible requires a Unix-like environment. There are several optional features available, none of which are required for a fully functional VPN server. These optional features are described in the [deployment documentation](docs/deploy-from-ansible.md).
|
The first time you run the script, it will automatically install the required Python environment (Python 3.11+). On subsequent runs, it starts immediately and works on all platforms (macOS, Linux, Windows via WSL). The Windows PowerShell script automatically uses WSL when needed, since Ansible requires a Unix-like environment. There are several optional features available, none of which are required for a fully functional VPN server. These optional features are described in the [deployment documentation](docs/deploy-from-ansible.md).
|
||||||
|
|
||||||
That's it! You can now set up clients to connect to your VPN. Proceed to [Configure the VPN Clients](#configure-the-vpn-clients) below.
|
That's it! You can now set up clients to connect to your VPN. Proceed to [Configure the VPN Clients](#configure-the-vpn-clients) below.
|
||||||
@@ -264,6 +264,14 @@ If you've read all the documentation and have further questions, [create a new d
|
|||||||
|
|
||||||
-- [Thorin Klosowski](https://twitter.com/kingthor) for [Lifehacker](http://lifehacker.com/how-to-set-up-your-own-completely-free-vpn-in-the-cloud-1794302432)
|
-- [Thorin Klosowski](https://twitter.com/kingthor) for [Lifehacker](http://lifehacker.com/how-to-set-up-your-own-completely-free-vpn-in-the-cloud-1794302432)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
See our [Development Guide](docs/DEVELOPMENT.md) for information on:
|
||||||
|
* Setting up your development environment
|
||||||
|
* Using pre-commit hooks for code quality
|
||||||
|
* Running tests and linters
|
||||||
|
* Contributing code via pull requests
|
||||||
|
|
||||||
## Support Algo VPN
|
## Support Algo VPN
|
||||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CYZZD39GXUJ3E)
|
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CYZZD39GXUJ3E)
|
||||||
[](https://www.patreon.com/algovpn)
|
[](https://www.patreon.com/algovpn)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ UV_INSTALL_METHOD=""
|
|||||||
# Function to install uv via package managers (most secure)
|
# Function to install uv via package managers (most secure)
|
||||||
install_uv_via_package_manager() {
|
install_uv_via_package_manager() {
|
||||||
echo "Attempting to install uv via system package manager..."
|
echo "Attempting to install uv via system package manager..."
|
||||||
|
|
||||||
if command -v brew &> /dev/null; then
|
if command -v brew &> /dev/null; then
|
||||||
echo "Using Homebrew..."
|
echo "Using Homebrew..."
|
||||||
brew install uv && UV_INSTALL_METHOD="Homebrew" && return 0
|
brew install uv && UV_INSTALL_METHOD="Homebrew" && return 0
|
||||||
@@ -31,7 +31,7 @@ install_uv_via_package_manager() {
|
|||||||
echo "Using scoop..."
|
echo "Using scoop..."
|
||||||
scoop install uv && UV_INSTALL_METHOD="scoop" && return 0
|
scoop install uv && UV_INSTALL_METHOD="scoop" && return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ install_uv_ubuntu_alternatives() {
|
|||||||
if ! command -v lsb_release &> /dev/null || [[ "$(lsb_release -si)" != "Ubuntu" ]]; then
|
if ! command -v lsb_release &> /dev/null || [[ "$(lsb_release -si)" != "Ubuntu" ]]; then
|
||||||
return 1 # Not Ubuntu, skip these options
|
return 1 # Not Ubuntu, skip these options
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Ubuntu detected. Additional trusted installation options available:"
|
echo "Ubuntu detected. Additional trusted installation options available:"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -54,7 +54,7 @@ install_uv_ubuntu_alternatives() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo "3. Continue to official installer script download"
|
echo "3. Continue to official installer script download"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -r -p "Choose installation method (1/2/3): " choice
|
read -r -p "Choose installation method (1/2/3): " choice
|
||||||
case $choice in
|
case $choice in
|
||||||
@@ -104,14 +104,14 @@ install_uv_via_download() {
|
|||||||
echo " 3. Verify checksums and install manually"
|
echo " 3. Verify checksums and install manually"
|
||||||
echo " 4. Then run: ./algo"
|
echo " 4. Then run: ./algo"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
read -p "Continue with script download? (y/N): " -n 1 -r
|
read -p "Continue with script download? (y/N): " -n 1 -r
|
||||||
echo
|
echo
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
echo "Installation cancelled. Please install uv manually and retry."
|
echo "Installation cancelled. Please install uv manually and retry."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Downloading uv installation script..."
|
echo "Downloading uv installation script..."
|
||||||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "linux-gnu" && -n "${WSL_DISTRO_NAME:-}" ]] || uname -s | grep -q "MINGW\|MSYS"; then
|
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "linux-gnu" && -n "${WSL_DISTRO_NAME:-}" ]] || uname -s | grep -q "MINGW\|MSYS"; then
|
||||||
# Windows (Git Bash/WSL/MINGW) - use versioned installer
|
# Windows (Git Bash/WSL/MINGW) - use versioned installer
|
||||||
@@ -127,7 +127,7 @@ install_uv_via_download() {
|
|||||||
# Check if uv is installed, if not, install it securely
|
# Check if uv is installed, if not, install it securely
|
||||||
if ! command -v uv &> /dev/null; then
|
if ! command -v uv &> /dev/null; then
|
||||||
echo "uv (Python package manager) not found. Installing..."
|
echo "uv (Python package manager) not found. Installing..."
|
||||||
|
|
||||||
# Try package managers first (most secure)
|
# Try package managers first (most secure)
|
||||||
if ! install_uv_via_package_manager; then
|
if ! install_uv_via_package_manager; then
|
||||||
# Try Ubuntu-specific alternatives if available
|
# Try Ubuntu-specific alternatives if available
|
||||||
@@ -136,26 +136,26 @@ if ! command -v uv &> /dev/null; then
|
|||||||
install_uv_via_download
|
install_uv_via_download
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Reload PATH to find uv (includes pipx, cargo, and snap paths)
|
# Reload PATH to find uv (includes pipx, cargo, and snap paths)
|
||||||
# Note: This PATH change only affects the current shell session.
|
# Note: This PATH change only affects the current shell session.
|
||||||
# Users may need to restart their terminal for subsequent runs.
|
# Users may need to restart their terminal for subsequent runs.
|
||||||
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:/snap/bin:$PATH"
|
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:/snap/bin:$PATH"
|
||||||
|
|
||||||
# Verify installation worked
|
# Verify installation worked
|
||||||
if ! command -v uv &> /dev/null; then
|
if ! command -v uv &> /dev/null; then
|
||||||
echo "Error: uv installation failed. Please restart your terminal and try again."
|
echo "Error: uv installation failed. Please restart your terminal and try again."
|
||||||
echo "Or install manually from: https://docs.astral.sh/uv/getting-started/installation/"
|
echo "Or install manually from: https://docs.astral.sh/uv/getting-started/installation/"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "✓ uv installed successfully via ${UV_INSTALL_METHOD}!"
|
echo "✓ uv installed successfully via ${UV_INSTALL_METHOD}!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run the appropriate playbook
|
# Run the appropriate playbook
|
||||||
case "$1" in
|
case "$1" in
|
||||||
update-users)
|
update-users)
|
||||||
uv run ansible-playbook users.yml "${@:2}" -t update-users ;;
|
uv run ansible-playbook users.yml "${@:2}" -t update-users ;;
|
||||||
*)
|
*)
|
||||||
uv run ansible-playbook main.yml "${@}" ;;
|
uv run ansible-playbook main.yml "${@}" ;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ function Test-RunningInWSL {
|
|||||||
# Function to run Algo in WSL
|
# Function to run Algo in WSL
|
||||||
function Invoke-AlgoInWSL {
|
function Invoke-AlgoInWSL {
|
||||||
param($Arguments)
|
param($Arguments)
|
||||||
|
|
||||||
Write-Host "NOTICE: Ansible requires a Unix-like environment and cannot run natively on Windows."
|
Write-Host "NOTICE: Ansible requires a Unix-like environment and cannot run natively on Windows."
|
||||||
Write-Host "Attempting to run Algo via Windows Subsystem for Linux (WSL)..."
|
Write-Host "Attempting to run Algo via Windows Subsystem for Linux (WSL)..."
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
if (-not (Get-Command wsl -ErrorAction SilentlyContinue)) {
|
if (-not (Get-Command wsl -ErrorAction SilentlyContinue)) {
|
||||||
Write-Host "ERROR: WSL (Windows Subsystem for Linux) is not installed." -ForegroundColor Red
|
Write-Host "ERROR: WSL (Windows Subsystem for Linux) is not installed." -ForegroundColor Red
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
@@ -38,7 +38,7 @@ function Invoke-AlgoInWSL {
|
|||||||
Write-Host "https://github.com/trailofbits/algo/blob/master/docs/deploy-from-windows.md"
|
Write-Host "https://github.com/trailofbits/algo/blob/master/docs/deploy-from-windows.md"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if any WSL distributions are installed and running
|
# Check if any WSL distributions are installed and running
|
||||||
Write-Host "Checking for WSL Linux distributions..."
|
Write-Host "Checking for WSL Linux distributions..."
|
||||||
$wslList = wsl -l -v 2>$null
|
$wslList = wsl -l -v 2>$null
|
||||||
@@ -52,13 +52,13 @@ function Invoke-AlgoInWSL {
|
|||||||
Write-Host "Then restart your computer and try again."
|
Write-Host "Then restart your computer and try again."
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Successfully found WSL. Launching Algo..." -ForegroundColor Green
|
Write-Host "Successfully found WSL. Launching Algo..." -ForegroundColor Green
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
# Get current directory name for WSL path mapping
|
# Get current directory name for WSL path mapping
|
||||||
$currentDir = Split-Path -Leaf (Get-Location)
|
$currentDir = Split-Path -Leaf (Get-Location)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ($Arguments.Count -gt 0 -and $Arguments[0] -eq "update-users") {
|
if ($Arguments.Count -gt 0 -and $Arguments[0] -eq "update-users") {
|
||||||
$remainingArgs = $Arguments[1..($Arguments.Count-1)] -join " "
|
$remainingArgs = $Arguments[1..($Arguments.Count-1)] -join " "
|
||||||
@@ -67,7 +67,7 @@ function Invoke-AlgoInWSL {
|
|||||||
$allArgs = $Arguments -join " "
|
$allArgs = $Arguments -join " "
|
||||||
wsl bash -c "cd /mnt/c/$currentDir 2>/dev/null || (echo 'Error: Cannot access directory in WSL. Make sure you are running from a Windows drive (C:, D:, etc.)' && exit 1) && ./algo $allArgs"
|
wsl bash -c "cd /mnt/c/$currentDir 2>/dev/null || (echo 'Error: Cannot access directory in WSL. Make sure you are running from a Windows drive (C:, D:, etc.)' && exit 1) && ./algo $allArgs"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "Algo finished with exit code: $LASTEXITCODE" -ForegroundColor Yellow
|
Write-Host "Algo finished with exit code: $LASTEXITCODE" -ForegroundColor Yellow
|
||||||
@@ -93,7 +93,7 @@ try {
|
|||||||
# Check if we're actually running inside WSL
|
# Check if we're actually running inside WSL
|
||||||
if (Test-RunningInWSL) {
|
if (Test-RunningInWSL) {
|
||||||
Write-Host "Detected WSL environment. Running Algo using standard Unix approach..."
|
Write-Host "Detected WSL environment. Running Algo using standard Unix approach..."
|
||||||
|
|
||||||
# Verify bash is available (should be in WSL)
|
# Verify bash is available (should be in WSL)
|
||||||
if (-not (Get-Command bash -ErrorAction SilentlyContinue)) {
|
if (-not (Get-Command bash -ErrorAction SilentlyContinue)) {
|
||||||
Write-Host "ERROR: Running in WSL but bash is not available." -ForegroundColor Red
|
Write-Host "ERROR: Running in WSL but bash is not available." -ForegroundColor Red
|
||||||
@@ -102,15 +102,15 @@ try {
|
|||||||
Write-Host " wsl" -ForegroundColor Cyan
|
Write-Host " wsl" -ForegroundColor Cyan
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Run the standard Unix algo script
|
# Run the standard Unix algo script
|
||||||
& bash -c "./algo $($Arguments -join ' ')"
|
& bash -c "./algo $($Arguments -join ' ')"
|
||||||
exit $LASTEXITCODE
|
exit $LASTEXITCODE
|
||||||
}
|
}
|
||||||
|
|
||||||
# We're on native Windows - need to use WSL
|
# We're on native Windows - need to use WSL
|
||||||
Invoke-AlgoInWSL $Arguments
|
Invoke-AlgoInWSL $Arguments
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "UNEXPECTED ERROR:" -ForegroundColor Red
|
Write-Host "UNEXPECTED ERROR:" -ForegroundColor Red
|
||||||
@@ -121,4 +121,4 @@ try {
|
|||||||
Write-Host "2. See troubleshooting guide: https://github.com/trailofbits/algo/blob/master/docs/deploy-from-windows.md"
|
Write-Host "2. See troubleshooting guide: https://github.com/trailofbits/algo/blob/master/docs/deploy-from-windows.md"
|
||||||
Write-Host "3. Or use WSL directly: open Ubuntu and run './algo'"
|
Write-Host "3. Or use WSL directly: open Ubuntu and run './algo'"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,4 +58,4 @@ If Algo isn't finding your credentials:
|
|||||||
|
|
||||||
If credentials are found but authentication fails:
|
If credentials are found but authentication fails:
|
||||||
- Ensure your IAM user has the required permissions (see [EC2 deployment guide](deploy-from-ansible.md))
|
- Ensure your IAM user has the required permissions (see [EC2 deployment guide](deploy-from-ansible.md))
|
||||||
- Check if you need session tokens for temporary credentials
|
- Check if you need session tokens for temporary credentials
|
||||||
|
|||||||
@@ -12,4 +12,4 @@ On iOS, connect to the VPN by opening **Settings** and clicking the toggle next
|
|||||||
|
|
||||||
If you enable "Connect On Demand", the VPN will connect automatically whenever it is able. Most Apple users will want to enable "Connect On Demand", but if you do then simply disabling the VPN will not cause it to stay disabled; it will just "Connect On Demand" again. To disable the VPN you'll need to disable "Connect On Demand".
|
If you enable "Connect On Demand", the VPN will connect automatically whenever it is able. Most Apple users will want to enable "Connect On Demand", but if you do then simply disabling the VPN will not cause it to stay disabled; it will just "Connect On Demand" again. To disable the VPN you'll need to disable "Connect On Demand".
|
||||||
|
|
||||||
On iOS, you can turn off "Connect On Demand" in **Settings** by clicking the (i) next to the entry for your Algo VPN and toggling off "Connect On Demand." On macOS, you can turn off "Connect On Demand" by opening **System Settings** -> **Network** (or **VPN** on macOS Sequoia 15.0+), finding the Algo VPN in the left column, unchecking the box for "Connect on demand", and clicking Apply.
|
On iOS, you can turn off "Connect On Demand" in **Settings** by clicking the (i) next to the entry for your Algo VPN and toggling off "Connect On Demand." On macOS, you can turn off "Connect On Demand" by opening **System Settings** -> **Network** (or **VPN** on macOS Sequoia 15.0+), finding the Algo VPN in the left column, unchecking the box for "Connect on demand", and clicking Apply.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ This configuration has been verified on TP-Link TL-WR1043ND and TP-Link Archer C
|
|||||||
4. Click "Update lists" to refresh the package database
|
4. Click "Update lists" to refresh the package database
|
||||||
5. Search for and install these packages:
|
5. Search for and install these packages:
|
||||||
- `wireguard-tools`
|
- `wireguard-tools`
|
||||||
- `kmod-wireguard`
|
- `kmod-wireguard`
|
||||||
- `luci-app-wireguard`
|
- `luci-app-wireguard`
|
||||||
- `wireguard`
|
- `wireguard`
|
||||||
- `kmod-crypto-sha256`
|
- `kmod-crypto-sha256`
|
||||||
@@ -187,4 +187,4 @@ For optimal privacy, configure your router to use your Algo server's DNS by navi
|
|||||||
|
|
||||||
Store your private keys securely and never share them. Keep OpenWrt and packages updated for security patches. Regularly check VPN connectivity to ensure ongoing protection, and save your configuration before making changes.
|
Store your private keys securely and never share them. Keep OpenWrt and packages updated for security patches. Regularly check VPN connectivity to ensure ongoing protection, and save your configuration before making changes.
|
||||||
|
|
||||||
This configuration routes ALL traffic from your router through the VPN. If you need selective routing or have specific requirements, consider consulting the [OpenWrt WireGuard documentation](https://openwrt.org/docs/guide-user/services/vpn/wireguard/start) for advanced configurations.
|
This configuration routes ALL traffic from your router through the VPN. If you need selective routing or have specific requirements, consider consulting the [OpenWrt WireGuard documentation](https://openwrt.org/docs/guide-user/services/vpn/wireguard/start) for advanced configurations.
|
||||||
|
|||||||
@@ -92,4 +92,4 @@ You can import multiple `.conf` files for different Algo servers. Give each a de
|
|||||||
|
|
||||||
- Check the main [troubleshooting guide](troubleshooting.md)
|
- Check the main [troubleshooting guide](troubleshooting.md)
|
||||||
- Review [WireGuard documentation](https://www.wireguard.com/quickstart/)
|
- Review [WireGuard documentation](https://www.wireguard.com/quickstart/)
|
||||||
- [Create a discussion](https://github.com/trailofbits/algo/discussions) for help
|
- [Create a discussion](https://github.com/trailofbits/algo/discussions) for help
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ For additional EC2 configuration options, see the [deploy from ansible guide](ht
|
|||||||
1. Navigate to Services → IAM → Users
|
1. Navigate to Services → IAM → Users
|
||||||
2. Enable multi-factor authentication (MFA) on your root account using Google Authenticator or a hardware token
|
2. Enable multi-factor authentication (MFA) on your root account using Google Authenticator or a hardware token
|
||||||
3. Click "Add User" and create a username (e.g., `algovpn`)
|
3. Click "Add User" and create a username (e.g., `algovpn`)
|
||||||
4. Select "Programmatic access"
|
4. Select "Programmatic access"
|
||||||
5. Click "Next: Permissions"
|
5. Click "Next: Permissions"
|
||||||
|
|
||||||

|

|
||||||
@@ -173,4 +173,4 @@ The cleanest way to remove an Algo deployment is through CloudFormation:
|
|||||||
|
|
||||||
Warning: Deleting a CloudFormation stack will permanently delete your EC2 instance and all associated resources unless you've enabled termination protection. Make sure you're deleting the correct stack and have backed up any important data.
|
Warning: Deleting a CloudFormation stack will permanently delete your EC2 instance and all associated resources unless you've enabled termination protection. Make sure you're deleting the correct stack and have backed up any important data.
|
||||||
|
|
||||||
This approach ensures all related AWS resources are properly cleaned up, preventing resource conflicts in future deployments.
|
This approach ensures all related AWS resources are properly cleaned up, preventing resource conflicts in future deployments.
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
# Azure cloud setup
|
# Azure cloud setup
|
||||||
|
|
||||||
The easiest way to get started with the Azure CLI is by running it in an Azure Cloud Shell environment through your browser.
|
The easiest way to get started with the Azure CLI is by running it in an Azure Cloud Shell environment through your browser.
|
||||||
|
|
||||||
Here you can find some information from [the official doc](https://docs.microsoft.com/en-us/cli/azure/get-started-with-azure-cli?view=azure-cli-latest). We put the essential commands together for simplest usage.
|
Here you can find some information from [the official doc](https://docs.microsoft.com/en-us/cli/azure/get-started-with-azure-cli?view=azure-cli-latest). We put the essential commands together for simplest usage.
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ Here you can find some information from [the official doc](https://docs.microsof
|
|||||||
$ sudo yum install azure-cli
|
$ sudo yum install azure-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
- Windows ([link](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest)):
|
- Windows ([link](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest)):
|
||||||
For Windows the Azure CLI is installed via an MSI, which gives you access to the CLI through the Windows Command Prompt (CMD) or PowerShell. When installing for Windows Subsystem for Linux (WSL), packages are available for your Linux distribution. [Download the MSI installer](https://aka.ms/installazurecliwindows)
|
For Windows the Azure CLI is installed via an MSI, which gives you access to the CLI through the Windows Command Prompt (CMD) or PowerShell. When installing for Windows Subsystem for Linux (WSL), packages are available for your Linux distribution. [Download the MSI installer](https://aka.ms/installazurecliwindows)
|
||||||
|
|
||||||
If your OS is missing or to get more information, see [the official doc](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)
|
If your OS is missing or to get more information, see [the official doc](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)
|
||||||
@@ -46,7 +46,7 @@ If your OS is missing or to get more information, see [the official doc](https:/
|
|||||||
1. Run the `login` command:
|
1. Run the `login` command:
|
||||||
```bash
|
```bash
|
||||||
az login
|
az login
|
||||||
```
|
```
|
||||||
|
|
||||||
If the CLI can open your default browser, it will do so and load a sign-in page.
|
If the CLI can open your default browser, it will do so and load a sign-in page.
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ Sign in to the Linode Manager and go to the
|
|||||||
[tokens management page](https://cloud.linode.com/profile/tokens).
|
[tokens management page](https://cloud.linode.com/profile/tokens).
|
||||||
|
|
||||||
Click `Add a Personal Access Token`. Label your new token and select *at least* the
|
Click `Add a Personal Access Token`. Label your new token and select *at least* the
|
||||||
`Linodes` read/write permission and `StackScripts` read/write permission.
|
`Linodes` read/write permission and `StackScripts` read/write permission.
|
||||||
Press `Submit` and make sure to copy the displayed token
|
Press `Submit` and make sure to copy the displayed token
|
||||||
as it won't be shown again.
|
as it won't be shown again.
|
||||||
|
|||||||
+2
-3
@@ -1,6 +1,6 @@
|
|||||||
### Configuration file
|
### Configuration file
|
||||||
|
|
||||||
Algo requires an API key from your Vultr account in order to create a server. The API key is generated by going to your Vultr settings at https://my.vultr.com/settings/#settingsapi, and then selecting "generate new API key" on the right side of the box labeled "API Key".
|
Algo requires an API key from your Vultr account in order to create a server. The API key is generated by going to your Vultr settings at https://my.vultr.com/settings/#settingsapi, and then selecting "generate new API key" on the right side of the box labeled "API Key".
|
||||||
|
|
||||||
Algo can read the API key in several different ways. Algo will first look for the file containing the API key in the environment variable $VULTR_API_CONFIG if present. You can set this with the command: `export VULTR_API_CONFIG=/path/to/vultr.ini`. Probably the simplest way to give Algo the API key is to create a file titled `.vultr.ini` in your home directory by typing `nano ~/.vultr.ini`, then entering the following text:
|
Algo can read the API key in several different ways. Algo will first look for the file containing the API key in the environment variable $VULTR_API_CONFIG if present. You can set this with the command: `export VULTR_API_CONFIG=/path/to/vultr.ini`. Probably the simplest way to give Algo the API key is to create a file titled `.vultr.ini` in your home directory by typing `nano ~/.vultr.ini`, then entering the following text:
|
||||||
|
|
||||||
@@ -8,8 +8,7 @@ Algo can read the API key in several different ways. Algo will first look for th
|
|||||||
[default]
|
[default]
|
||||||
key = <your api key>
|
key = <your api key>
|
||||||
```
|
```
|
||||||
where you've cut-and-pasted the API key from above into the `<your api key>` field (no brackets).
|
where you've cut-and-pasted the API key from above into the `<your api key>` field (no brackets).
|
||||||
|
|
||||||
When Algo asks `Enter the local path to your configuration INI file
|
When Algo asks `Enter the local path to your configuration INI file
|
||||||
(https://trailofbits.github.io/algo/cloud-vultr.html):` if you hit enter without typing anything, Algo will look for the file in `~/.vultr.ini` by default.
|
(https://trailofbits.github.io/algo/cloud-vultr.html):` if you hit enter without typing anything, Algo will look for the file in `~/.vultr.ini` by default.
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ If you want to try Algo but don't wish to install anything on your own system, y
|
|||||||
cd algo
|
cd algo
|
||||||
./algo
|
./algo
|
||||||
```
|
```
|
||||||
|
|
||||||
The first time you run `./algo`, it will automatically install all required dependencies. Google Cloud Shell already has most tools available, making this even faster than on your local system.
|
The first time you run `./algo`, it will automatically install all required dependencies. Google Cloud Shell already has most tools available, making this even faster than on your local system.
|
||||||
|
|
||||||
3. Once Algo has completed, retrieve a copy of the configuration files that were created to your local system. While still in the Algo directory, run:
|
3. Once Algo has completed, retrieve a copy of the configuration files that were created to your local system. While still in the Algo directory, run:
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# Deploy from script or cloud-init
|
# Deploy from script or cloud-init
|
||||||
|
|
||||||
You can use `install.sh` to prepare the environment and deploy AlgoVPN on the local Ubuntu server in one shot using cloud-init, or run the script directly on the server after it's been created.
|
You can use `install.sh` to prepare the environment and deploy AlgoVPN on the local Ubuntu server in one shot using cloud-init, or run the script directly on the server after it's been created.
|
||||||
The script doesn't configure any parameters in your cloud, so you're on your own to configure related [firewall rules](/docs/firewalls.md), a floating IP address and other resources you may need. The output of the install script (including the p12 and CA passwords) can be found at `/var/log/algo.log`, and user config files will be installed into the `/opt/algo/configs/localhost` directory. If you need to update users later, `cd /opt/algo`, change the user list in `config.cfg`, install additional dependencies as in step 4 of the [main README](https://github.com/trailofbits/algo/blob/master/README.md), and run `./algo update-users` from that directory.
|
The script doesn't configure any parameters in your cloud, so you're on your own to configure related [firewall rules](/docs/firewalls.md), a floating IP address and other resources you may need. The output of the install script (including the p12 and CA passwords) can be found at `/var/log/algo.log`, and user config files will be installed into the `/opt/algo/configs/localhost` directory. If you need to update users later, `cd /opt/algo`, change the user list in `config.cfg`, install additional dependencies as in step 4 of the [main README](https://github.com/trailofbits/algo/blob/master/README.md), and run `./algo update-users` from that directory.
|
||||||
|
|
||||||
## Cloud init deployment
|
## Cloud init deployment
|
||||||
|
|
||||||
You can copy-paste the snippet below to the user data (cloud-init or startup script) field when creating a new server.
|
You can copy-paste the snippet below to the user data (cloud-init or startup script) field when creating a new server.
|
||||||
|
|
||||||
For now this has only been successfully tested on [DigitalOcean](https://www.digitalocean.com/docs/droplets/resources/metadata/), Amazon [EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) and [Lightsail](https://lightsail.aws.amazon.com/ls/docs/en/articles/lightsail-how-to-configure-server-additional-data-shell-script), [Google Cloud](https://cloud.google.com/compute/docs/startupscript), [Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/using-cloud-init) and [Vultr](https://my.vultr.com/startup/), although Vultr doesn't [officially support cloud-init](https://www.vultr.com/docs/getting-started-with-cloud-init).
|
For now this has only been successfully tested on [DigitalOcean](https://www.digitalocean.com/docs/droplets/resources/metadata/), Amazon [EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) and [Lightsail](https://lightsail.aws.amazon.com/ls/docs/en/articles/lightsail-how-to-configure-server-additional-data-shell-script), [Google Cloud](https://cloud.google.com/compute/docs/startupscript), [Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/using-cloud-init) and [Vultr](https://my.vultr.com/startup/), although Vultr doesn't [officially support cloud-init](https://www.vultr.com/docs/getting-started-with-cloud-init).
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ cd algo
|
|||||||
./algo
|
./algo
|
||||||
```
|
```
|
||||||
|
|
||||||
**Pros**:
|
**Pros**:
|
||||||
- Uses the standard Unix `./algo` script
|
- Uses the standard Unix `./algo` script
|
||||||
- No WSL setup required
|
- No WSL setup required
|
||||||
- Familiar Unix-like environment
|
- Familiar Unix-like environment
|
||||||
|
|||||||
@@ -78,4 +78,4 @@ If you successfully deploy Algo on an unsupported provider and want to contribut
|
|||||||
4. Document the deployment process and any provider-specific considerations
|
4. Document the deployment process and any provider-specific considerations
|
||||||
5. Submit a pull request with your implementation
|
5. Submit a pull request with your implementation
|
||||||
|
|
||||||
Community contributions to expand provider support are welcome, provided they meet Algo's security and reliability standards.
|
Community contributions to expand provider support are welcome, provided they meet Algo's security and reliability standards.
|
||||||
|
|||||||
@@ -137,10 +137,10 @@ The error is caused because Digital Ocean changed its API to treat the tag argum
|
|||||||
6. Run algo as directed
|
6. Run algo as directed
|
||||||
|
|
||||||
### Azure: No such file or directory: '/home/username/.azure/azureProfile.json'
|
### Azure: No such file or directory: '/home/username/.azure/azureProfile.json'
|
||||||
|
|
||||||
```
|
```
|
||||||
TASK [cloud-azure : Create AlgoVPN Server] *****************************************************************************************************************************************************************
|
TASK [cloud-azure : Create AlgoVPN Server] *****************************************************************************************************************************************************************
|
||||||
An exception occurred during task execution. To see the full traceback, use -vvv.
|
An exception occurred during task execution. To see the full traceback, use -vvv.
|
||||||
The error was: FileNotFoundError: [Errno 2] No such file or directory: '/home/ubuntu/.azure/azureProfile.json'
|
The error was: FileNotFoundError: [Errno 2] No such file or directory: '/home/ubuntu/.azure/azureProfile.json'
|
||||||
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):
|
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):
|
||||||
File \"/usr/local/lib/python3.11/dist-packages/azure/cli/core/_session.py\", line 39, in load
|
File \"/usr/local/lib/python3.11/dist-packages/azure/cli/core/_session.py\", line 39, in load
|
||||||
@@ -210,24 +210,24 @@ When trying to connect to your Algo VPN on Windows 10/11, you may receive an err
|
|||||||
#### Solution
|
#### Solution
|
||||||
|
|
||||||
1. **Clear the networking caches**
|
1. **Clear the networking caches**
|
||||||
|
|
||||||
Open Command Prompt as Administrator (right-click on Command Prompt and select "Run as Administrator") and run these commands:
|
Open Command Prompt as Administrator (right-click on Command Prompt and select "Run as Administrator") and run these commands:
|
||||||
```cmd
|
```cmd
|
||||||
netsh int ip reset
|
netsh int ip reset
|
||||||
netsh int ipv6 reset
|
netsh int ipv6 reset
|
||||||
netsh winsock reset
|
netsh winsock reset
|
||||||
```
|
```
|
||||||
|
|
||||||
Then restart your computer.
|
Then restart your computer.
|
||||||
|
|
||||||
2. **Reset Device Manager network adapters** (if step 1 doesn't work)
|
2. **Reset Device Manager network adapters** (if step 1 doesn't work)
|
||||||
|
|
||||||
- Open Device Manager
|
- Open Device Manager
|
||||||
- Find "Network Adapters"
|
- Find "Network Adapters"
|
||||||
- Uninstall all WAN Miniport drivers (IKEv2, IP, IPv6, etc.)
|
- Uninstall all WAN Miniport drivers (IKEv2, IP, IPv6, etc.)
|
||||||
- Click Action → Scan for hardware changes
|
- Click Action → Scan for hardware changes
|
||||||
- The adapters you just uninstalled should reinstall automatically
|
- The adapters you just uninstalled should reinstall automatically
|
||||||
|
|
||||||
Try connecting to the VPN again.
|
Try connecting to the VPN again.
|
||||||
|
|
||||||
#### What causes this issue?
|
#### What causes this issue?
|
||||||
@@ -271,9 +271,9 @@ You should remove the files in /etc/wireguard/ and configs/ as follows:
|
|||||||
```ssh
|
```ssh
|
||||||
sudo rm -rf /etc/wireguard/*
|
sudo rm -rf /etc/wireguard/*
|
||||||
rm -rf configs/*
|
rm -rf configs/*
|
||||||
```
|
```
|
||||||
|
|
||||||
And then immediately re-run `./algo` and provide a domain name or IP address in response to the question referenced above.
|
And then immediately re-run `./algo` and provide a domain name or IP address in response to the question referenced above.
|
||||||
|
|
||||||
### Wireguard: Unable to find 'configs/...' in expected paths
|
### Wireguard: Unable to find 'configs/...' in expected paths
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Cloud-init's YAML parser expects the exact string `#cloud-config` as the first l
|
|||||||
|
|
||||||
## Historical Context
|
## Historical Context
|
||||||
|
|
||||||
- **Working**: All versions before PR #14775 (August 2025)
|
- **Working**: All versions before PR #14775 (August 2025)
|
||||||
- **Broken**: PR #14775 "Apply ansible-lint improvements" added space by mistake
|
- **Broken**: PR #14775 "Apply ansible-lint improvements" added space by mistake
|
||||||
- **Fixed**: PR #14801 restored correct format + added protections
|
- **Fixed**: PR #14801 restored correct format + added protections
|
||||||
|
|
||||||
@@ -57,4 +57,4 @@ The cloud-init files use Jinja2 templating:
|
|||||||
|
|
||||||
- [Cloud-init documentation](https://cloudinit.readthedocs.io/)
|
- [Cloud-init documentation](https://cloudinit.readthedocs.io/)
|
||||||
- [Cloud-config examples](https://cloudinit.readthedocs.io/en/latest/reference/examples.html)
|
- [Cloud-config examples](https://cloudinit.readthedocs.io/en/latest/reference/examples.html)
|
||||||
- [GitHub Issue #14800](https://github.com/trailofbits/algo/issues/14800)
|
- [GitHub Issue #14800](https://github.com/trailofbits/algo/issues/14800)
|
||||||
|
|||||||
+6
-6
@@ -24,7 +24,7 @@ installRequirements() {
|
|||||||
apt-get install \
|
apt-get install \
|
||||||
curl \
|
curl \
|
||||||
jq -y
|
jq -y
|
||||||
|
|
||||||
# Install uv
|
# Install uv
|
||||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"
|
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"
|
||||||
@@ -51,7 +51,7 @@ tryGetMetadata() {
|
|||||||
url="$1"
|
url="$1"
|
||||||
headers="$2"
|
headers="$2"
|
||||||
response=""
|
response=""
|
||||||
|
|
||||||
# Try up to 2 times
|
# Try up to 2 times
|
||||||
for attempt in 1 2; do
|
for attempt in 1 2; do
|
||||||
if [ -n "$headers" ]; then
|
if [ -n "$headers" ]; then
|
||||||
@@ -59,17 +59,17 @@ tryGetMetadata() {
|
|||||||
else
|
else
|
||||||
response="$(curl -s --connect-timeout 5 --max-time "${METADATA_TIMEOUT}" "$url" || true)"
|
response="$(curl -s --connect-timeout 5 --max-time "${METADATA_TIMEOUT}" "$url" || true)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If we got a response, return it
|
# If we got a response, return it
|
||||||
if [ -n "$response" ]; then
|
if [ -n "$response" ]; then
|
||||||
echo "$response"
|
echo "$response"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Wait before retry (only on first attempt)
|
# Wait before retry (only on first attempt)
|
||||||
[ $attempt -eq 1 ] && sleep 2
|
[ $attempt -eq 1 ] && sleep 2
|
||||||
done
|
done
|
||||||
|
|
||||||
# Return empty string if all attempts failed
|
# Return empty string if all attempts failed
|
||||||
echo ""
|
echo ""
|
||||||
return 1
|
return 1
|
||||||
@@ -78,7 +78,7 @@ tryGetMetadata() {
|
|||||||
publicIpFromMetadata() {
|
publicIpFromMetadata() {
|
||||||
# Set default timeout from environment or use 20 seconds
|
# Set default timeout from environment or use 20 seconds
|
||||||
METADATA_TIMEOUT="${METADATA_TIMEOUT:-20}"
|
METADATA_TIMEOUT="${METADATA_TIMEOUT:-20}"
|
||||||
|
|
||||||
if tryGetMetadata "http://169.254.169.254/metadata/v1/vendor-data" "" | grep DigitalOcean >/dev/null; then
|
if tryGetMetadata "http://169.254.169.254/metadata/v1/vendor-data" "" | grep DigitalOcean >/dev/null; then
|
||||||
ENDPOINT="$(tryGetMetadata "http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address" "")"
|
ENDPOINT="$(tryGetMetadata "http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address" "")"
|
||||||
elif test "$(tryGetMetadata "http://169.254.169.254/latest/meta-data/services/domain" "")" = "amazonaws.com"; then
|
elif test "$(tryGetMetadata "http://169.254.169.254/latest/meta-data/services/domain" "")" = "amazonaws.com"; then
|
||||||
|
|||||||
@@ -79,6 +79,10 @@ ignore = [
|
|||||||
dev-dependencies = [
|
dev-dependencies = [
|
||||||
"pytest>=8.0.0",
|
"pytest>=8.0.0",
|
||||||
"pytest-xdist>=3.0.0", # Parallel test execution
|
"pytest-xdist>=3.0.0", # Parallel test execution
|
||||||
|
"pre-commit>=4.0.0", # Git hooks for code quality
|
||||||
|
"ruff>=0.8.0", # Python linter and formatter
|
||||||
|
"yamllint>=1.35.0", # YAML linter
|
||||||
|
"ansible-lint>=24.0.0", # Ansible linter
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
|
|||||||
@@ -202,4 +202,4 @@ This role aims to balance privacy with security by:
|
|||||||
- Providing granular control over what gets filtered
|
- Providing granular control over what gets filtered
|
||||||
- Maintaining essential audit trails while reducing VPN usage traces
|
- Maintaining essential audit trails while reducing VPN usage traces
|
||||||
|
|
||||||
For maximum privacy, consider running your own log analysis before enabling aggressive filtering options.
|
For maximum privacy, consider running your own log analysis before enabling aggressive filtering options.
|
||||||
|
|||||||
@@ -12,4 +12,4 @@
|
|||||||
:msg, contains, "sshd.*publickey" stop
|
:msg, contains, "sshd.*publickey" stop
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Continue processing SSH failure messages and other logs
|
# Continue processing SSH failure messages and other logs
|
||||||
|
|||||||
@@ -16,4 +16,4 @@
|
|||||||
:msg, contains, "CRON" stop
|
:msg, contains, "CRON" stop
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Continue processing other auth messages
|
# Continue processing other auth messages
|
||||||
|
|||||||
@@ -18,4 +18,4 @@
|
|||||||
:msg, contains, "rtnetlink" stop
|
:msg, contains, "rtnetlink" stop
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Continue processing non-filtered messages
|
# Continue processing non-filtered messages
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
# Filter WireGuard messages
|
# Filter WireGuard messages
|
||||||
:msg, contains, "wireguard" stop
|
:msg, contains, "wireguard" stop
|
||||||
|
|
||||||
# Filter StrongSwan/IPsec messages
|
# Filter StrongSwan/IPsec messages
|
||||||
:msg, contains, "strongswan" stop
|
:msg, contains, "strongswan" stop
|
||||||
:msg, contains, "ipsec" stop
|
:msg, contains, "ipsec" stop
|
||||||
:msg, contains, "charon" stop
|
:msg, contains, "charon" stop
|
||||||
@@ -31,4 +31,4 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Continue processing other messages
|
# Continue processing other messages
|
||||||
& stop
|
& stop
|
||||||
|
|||||||
@@ -8,19 +8,19 @@
|
|||||||
rotate 2
|
rotate 2
|
||||||
maxage {{ privacy_log_rotation.max_age | int // 2 }}
|
maxage {{ privacy_log_rotation.max_age | int // 2 }}
|
||||||
size {{ privacy_log_rotation.max_size // 2 }}M
|
size {{ privacy_log_rotation.max_size // 2 }}M
|
||||||
|
|
||||||
daily
|
daily
|
||||||
missingok
|
missingok
|
||||||
notifempty
|
notifempty
|
||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
|
|
||||||
create 0640 syslog adm
|
create 0640 syslog adm
|
||||||
copytruncate
|
copytruncate
|
||||||
|
|
||||||
postrotate
|
postrotate
|
||||||
if [ -f /var/run/rsyslogd.pid ]; then
|
if [ -f /var/run/rsyslogd.pid ]; then
|
||||||
kill -HUP `cat /var/run/rsyslogd.pid`
|
kill -HUP `cat /var/run/rsyslogd.pid`
|
||||||
fi
|
fi
|
||||||
endscript
|
endscript
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,4 +33,4 @@ fi
|
|||||||
# Clear temporary files in user directory
|
# Clear temporary files in user directory
|
||||||
find ~/tmp -type f -delete 2>/dev/null || true
|
find ~/tmp -type f -delete 2>/dev/null || true
|
||||||
find ~/.cache -type f -delete 2>/dev/null || true
|
find ~/.cache -type f -delete 2>/dev/null || true
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -8,16 +8,16 @@
|
|||||||
rotate {{ privacy_log_rotation.rotate_count }}
|
rotate {{ privacy_log_rotation.rotate_count }}
|
||||||
maxage {{ privacy_log_rotation.max_age }}
|
maxage {{ privacy_log_rotation.max_age }}
|
||||||
size {{ privacy_log_rotation.max_size }}M
|
size {{ privacy_log_rotation.max_size }}M
|
||||||
|
|
||||||
daily
|
daily
|
||||||
missingok
|
missingok
|
||||||
notifempty
|
notifempty
|
||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
|
|
||||||
create 0640 syslog adm
|
create 0640 syslog adm
|
||||||
copytruncate
|
copytruncate
|
||||||
|
|
||||||
# Pre-rotation script to filter VPN-related entries
|
# Pre-rotation script to filter VPN-related entries
|
||||||
prerotate
|
prerotate
|
||||||
# Create filtered version excluding VPN traces
|
# Create filtered version excluding VPN traces
|
||||||
@@ -28,10 +28,10 @@
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
endscript
|
endscript
|
||||||
|
|
||||||
postrotate
|
postrotate
|
||||||
if [ -f /var/run/rsyslogd.pid ]; then
|
if [ -f /var/run/rsyslogd.pid ]; then
|
||||||
kill -HUP `cat /var/run/rsyslogd.pid`
|
kill -HUP `cat /var/run/rsyslogd.pid`
|
||||||
fi
|
fi
|
||||||
endscript
|
endscript
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,4 +72,4 @@ log_message "Privacy cleanup is disabled"
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Clean up old privacy cleanup logs
|
# Clean up old privacy cleanup logs
|
||||||
find /var/log -name "privacy-cleanup.log.*" -type f -mtime +7 -delete 2>/dev/null || true
|
find /var/log -name "privacy-cleanup.log.*" -type f -mtime +7 -delete 2>/dev/null || true
|
||||||
|
|||||||
@@ -19,4 +19,4 @@ if [ -d /var/log/journal ]; then
|
|||||||
journalctl --vacuum-size={{ privacy_log_rotation.max_size * 10 }}M 2>/dev/null || true
|
journalctl --vacuum-size={{ privacy_log_rotation.max_size * 10 }}M 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Privacy log cleanup completed"
|
echo "Privacy log cleanup completed"
|
||||||
|
|||||||
@@ -15,39 +15,39 @@
|
|||||||
{
|
{
|
||||||
# Rotate {{ privacy_log_rotation.rotate_count }} times before deletion
|
# Rotate {{ privacy_log_rotation.rotate_count }} times before deletion
|
||||||
rotate {{ privacy_log_rotation.rotate_count }}
|
rotate {{ privacy_log_rotation.rotate_count }}
|
||||||
|
|
||||||
# Maximum age in days
|
# Maximum age in days
|
||||||
maxage {{ privacy_log_rotation.max_age }}
|
maxage {{ privacy_log_rotation.max_age }}
|
||||||
|
|
||||||
# Maximum size per file
|
# Maximum size per file
|
||||||
size {{ privacy_log_rotation.max_size }}M
|
size {{ privacy_log_rotation.max_size }}M
|
||||||
|
|
||||||
{% if privacy_log_rotation.daily_rotation %}
|
{% if privacy_log_rotation.daily_rotation %}
|
||||||
# Force daily rotation
|
# Force daily rotation
|
||||||
daily
|
daily
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if privacy_log_rotation.compress %}
|
{% if privacy_log_rotation.compress %}
|
||||||
# Compress rotated files
|
# Compress rotated files
|
||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Missing files are ok (not all systems have all logs)
|
# Missing files are ok (not all systems have all logs)
|
||||||
missingok
|
missingok
|
||||||
|
|
||||||
# Don't rotate if empty
|
# Don't rotate if empty
|
||||||
notifempty
|
notifempty
|
||||||
|
|
||||||
# Create new files with specific permissions
|
# Create new files with specific permissions
|
||||||
create 0640 syslog adm
|
create 0640 syslog adm
|
||||||
|
|
||||||
# Truncate original file after rotation
|
# Truncate original file after rotation
|
||||||
copytruncate
|
copytruncate
|
||||||
|
|
||||||
# Execute after rotation
|
# Execute after rotation
|
||||||
postrotate
|
postrotate
|
||||||
# Send SIGHUP to rsyslog
|
# Send SIGHUP to rsyslog
|
||||||
/usr/bin/killall -HUP rsyslogd 2>/dev/null || true
|
/usr/bin/killall -HUP rsyslogd 2>/dev/null || true
|
||||||
endscript
|
endscript
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,4 +82,4 @@ echo " Max log size: {{ privacy_log_rotation.max_size }}MB"
|
|||||||
echo " VPN log filtering: {{ privacy_log_filtering.exclude_vpn_logs }}"
|
echo " VPN log filtering: {{ privacy_log_filtering.exclude_vpn_logs }}"
|
||||||
echo -e " History clearing: {{ privacy_history_clearing.clear_bash_history }}"
|
echo -e " History clearing: {{ privacy_history_clearing.clear_bash_history }}"
|
||||||
|
|
||||||
echo -e "\n${GREEN}Privacy monitoring complete${NC}"
|
echo -e "\n${GREEN}Privacy monitoring complete${NC}"
|
||||||
|
|||||||
@@ -29,4 +29,4 @@ $template PrivacyTemplate,"%timegenerated% %hostname% %syslogtag%%msg%\n"
|
|||||||
$ActionFileDefaultTemplate PrivacyTemplate
|
$ActionFileDefaultTemplate PrivacyTemplate
|
||||||
|
|
||||||
# Stop processing after essential logs to prevent detailed logging
|
# Stop processing after essential logs to prevent detailed logging
|
||||||
& stop
|
& stop
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ ExecStart=/bin/true
|
|||||||
ExecStop=/bin/bash -c '
|
ExecStop=/bin/bash -c '
|
||||||
# Clear all logs
|
# Clear all logs
|
||||||
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null || true;
|
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null || true;
|
||||||
|
|
||||||
# Clear rotated logs
|
# Clear rotated logs
|
||||||
find /var/log -type f \( -name "*.log.*" -o -name "*.gz" \) -delete 2>/dev/null || true;
|
find /var/log -type f \( -name "*.log.*" -o -name "*.gz" \) -delete 2>/dev/null || true;
|
||||||
|
|
||||||
# Clear systemd journal
|
# Clear systemd journal
|
||||||
if [ -d /var/log/journal ]; then
|
if [ -d /var/log/journal ]; then
|
||||||
rm -rf /var/log/journal/* 2>/dev/null || true;
|
rm -rf /var/log/journal/* 2>/dev/null || true;
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Clear bash history
|
# Clear bash history
|
||||||
for user_home in /home/* /root; do
|
for user_home in /home/* /root; do
|
||||||
if [ -d "$user_home" ]; then
|
if [ -d "$user_home" ]; then
|
||||||
@@ -31,14 +31,14 @@ ExecStop=/bin/bash -c '
|
|||||||
rm -f "$user_home"/.zsh_history 2>/dev/null || true;
|
rm -f "$user_home"/.zsh_history 2>/dev/null || true;
|
||||||
fi;
|
fi;
|
||||||
done;
|
done;
|
||||||
|
|
||||||
# Clear temporary files
|
# Clear temporary files
|
||||||
rm -rf /tmp/* /var/tmp/* 2>/dev/null || true;
|
rm -rf /tmp/* /var/tmp/* 2>/dev/null || true;
|
||||||
|
|
||||||
# Sync to ensure changes are written
|
# Sync to ensure changes are written
|
||||||
sync;
|
sync;
|
||||||
'
|
'
|
||||||
TimeoutStopSec=30
|
TimeoutStopSec=30
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=shutdown.target
|
WantedBy=shutdown.target
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ EOF
|
|||||||
# Also add as GitHub annotation if in CI
|
# Also add as GitHub annotation if in CI
|
||||||
if [ -n "$GITHUB_ACTIONS" ]; then
|
if [ -n "$GITHUB_ACTIONS" ]; then
|
||||||
echo "::warning title=Test Failure::$TEST_NAME failed in $CONTEXT"
|
echo "::warning title=Test Failure::$TEST_NAME failed in $CONTEXT"
|
||||||
fi
|
fi
|
||||||
|
|||||||
+1
-1
@@ -22,4 +22,4 @@ ruff check . || true # Start with warnings only
|
|||||||
echo "Running shellcheck..."
|
echo "Running shellcheck..."
|
||||||
find . -type f -name "*.sh" -not -path "./.git/*" -exec shellcheck {} \;
|
find . -type f -name "*.sh" -not -path "./.git/*" -exec shellcheck {} \;
|
||||||
|
|
||||||
echo "All linting completed!"
|
echo "All linting completed!"
|
||||||
|
|||||||
@@ -81,4 +81,4 @@ else
|
|||||||
echo " python tests/unit/test_strongswan_templates.py"
|
echo " python tests/unit/test_strongswan_templates.py"
|
||||||
echo " ansible-lint"
|
echo " ansible-lint"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
+1
-1
@@ -147,4 +147,4 @@ Our approach focuses on:
|
|||||||
1. **Fast feedback** - Tests run in < 3 minutes
|
1. **Fast feedback** - Tests run in < 3 minutes
|
||||||
2. **No flaky tests** - Avoid complex networking setups
|
2. **No flaky tests** - Avoid complex networking setups
|
||||||
3. **Test what matters** - Config generation, not VPN protocols
|
3. **Test what matters** - Config generation, not VPN protocols
|
||||||
4. **Progressive enhancement** - Start simple, add coverage gradually
|
4. **Progressive enhancement** - Start simple, add coverage gradually
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
library = /algo/tests/integration/mock_modules
|
library = /algo/tests/integration/mock_modules
|
||||||
roles_path = /algo/roles
|
roles_path = /algo/roles
|
||||||
host_key_checking = False
|
host_key_checking = False
|
||||||
stdout_callback = debug
|
stdout_callback = debug
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Mock apparmor_status for Docker testing
|
# Mock apparmor_status for Docker testing
|
||||||
# Return error code to indicate AppArmor is not available
|
# Return error code to indicate AppArmor is not available
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
8A:CC:04:6D:D6:3F:3A:3B:BF:06:01:92:27:48:76:08:26:D2:CB:22
|
8A:CC:04:6D:D6:3F:3A:3B:BF:06:01:92:27:48:76:08:26:D2:CB:22
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
IP Address:10.99.0.10
|
IP Address:10.99.0.10
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
51:8F:14:BA:87:16:14:B2:23:33:69:2A:2A:A6:C4:26:80:E3:A0:61
|
51:8F:14:BA:87:16:14:B2:23:33:69:2A:2A:A6:C4:26:80:E3:A0:61
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
email:testuser1@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
email:testuser1@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
08:4E:A2:3F:07:36:D6:DD:91:11:4B:43:CF:0E:75:68:BF:49:AC:A2
|
08:4E:A2:3F:07:36:D6:DD:91:11:4B:43:CF:0E:75:68:BF:49:AC:A2
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
email:testuser2@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
email:testuser2@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
8A:CC:04:6D:D6:3F:3A:3B:BF:06:01:92:27:48:76:08:26:D2:CB:22
|
8A:CC:04:6D:D6:3F:3A:3B:BF:06:01:92:27:48:76:08:26:D2:CB:22
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
IP Address:10.99.0.10
|
IP Address:10.99.0.10
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
51:8F:14:BA:87:16:14:B2:23:33:69:2A:2A:A6:C4:26:80:E3:A0:61
|
51:8F:14:BA:87:16:14:B2:23:33:69:2A:2A:A6:C4:26:80:E3:A0:61
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
email:testuser1@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
email:testuser1@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -22,19 +22,19 @@ Certificate:
|
|||||||
ASN1 OID: secp384r1
|
ASN1 OID: secp384r1
|
||||||
NIST CURVE: P-384
|
NIST CURVE: P-384
|
||||||
X509v3 extensions:
|
X509v3 extensions:
|
||||||
X509v3 Basic Constraints:
|
X509v3 Basic Constraints:
|
||||||
CA:FALSE
|
CA:FALSE
|
||||||
X509v3 Subject Key Identifier:
|
X509v3 Subject Key Identifier:
|
||||||
08:4E:A2:3F:07:36:D6:DD:91:11:4B:43:CF:0E:75:68:BF:49:AC:A2
|
08:4E:A2:3F:07:36:D6:DD:91:11:4B:43:CF:0E:75:68:BF:49:AC:A2
|
||||||
X509v3 Authority Key Identifier:
|
X509v3 Authority Key Identifier:
|
||||||
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
keyid:BF:FE:69:38:63:80:19:E9:D6:5D:38:1D:23:E7:61:8C:AF:4A:E8:AD
|
||||||
DirName:/CN=10.99.0.10
|
DirName:/CN=10.99.0.10
|
||||||
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
serial:61:0F:7D:60:6B:04:EE:30:EB:0E:AF:77:59:34:D6:32:46:8C:EC:85
|
||||||
X509v3 Extended Key Usage:
|
X509v3 Extended Key Usage:
|
||||||
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
TLS Web Server Authentication, TLS Web Client Authentication, ipsec Internet Key Exchange
|
||||||
X509v3 Key Usage:
|
X509v3 Key Usage:
|
||||||
Digital Signature, Key Encipherment
|
Digital Signature, Key Encipherment
|
||||||
X509v3 Subject Alternative Name:
|
X509v3 Subject Alternative Name:
|
||||||
email:testuser2@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
email:testuser2@9546d574-3fd6-58f4-9ac6-2c69cb755db7.algo
|
||||||
Signature Algorithm: ecdsa-with-SHA256
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
Signature Value:
|
Signature Value:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIFNInItxfjPUuPg79iGqcbLfMlkBBidzjHDmZhOGo4ZXCVWeJ+0h5vCUeyBER6AbftH1rFJJXKY2scuSCPWYMzYqaWpPxMzgQIRrXAX9u5B7Qu+1TklHwyBoqAlp0rl5w==
|
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIFNInItxfjPUuPg79iGqcbLfMlkBBidzjHDmZhOGo4ZXCVWeJ+0h5vCUeyBER6AbftH1rFJJXKY2scuSCPWYMzYqaWpPxMzgQIRrXAX9u5B7Qu+1TklHwyBoqAlp0rl5w==
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIjt/G1EDl/0cxNRbFjPP5fGsz/FEv5ACs//RtpzmjS9wbjmfyHVrTk3ew/AzAAXXCo+Os9CfXJ+K4KCnRmiJecOPLdnZoQViY5mTcfVvgDpdfNDxpTJyDqx0efAGdSn4Q==
|
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBIjt/G1EDl/0cxNRbFjPP5fGsz/FEv5ACs//RtpzmjS9wbjmfyHVrTk3ew/AzAAXXCo+Os9CfXJ+K4KCnRmiJecOPLdnZoQViY5mTcfVvgDpdfNDxpTJyDqx0efAGdSn4Q==
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Ggpzqj5CnamCMBaKQCC+xih3lfj+I1tOfImOizyDLkA=
|
Ggpzqj5CnamCMBaKQCC+xih3lfj+I1tOfImOizyDLkA=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CSLeU66thNW52DkY6MVJ2A5VodnxbsC7EklcrHPCKco=
|
CSLeU66thNW52DkY6MVJ2A5VodnxbsC7EklcrHPCKco=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
WUuCbhaOJfPtCrwU4EnlpqVmmPuaJJYYyzc2sy+afVQ=
|
WUuCbhaOJfPtCrwU4EnlpqVmmPuaJJYYyzc2sy+afVQ=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
EPokMfsIC6Heg4/tm9gaMt2rRwXjACwvmdJAXO/byH8=
|
EPokMfsIC6Heg4/tm9gaMt2rRwXjACwvmdJAXO/byH8=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
yoUuE/xoUE4bbR4enH9lmOc+lLB0mecK6ifMwiajDz4=
|
yoUuE/xoUE4bbR4enH9lmOc+lLB0mecK6ifMwiajDz4=
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
zJ76JrM4mYQk8QIGMIZy9V9lORvw75lh3ByhgXbH1kA=
|
zJ76JrM4mYQk8QIGMIZy9V9lORvw75lh3ByhgXbH1kA=
|
||||||
|
|||||||
+2
-2
@@ -56,8 +56,8 @@
|
|||||||
<key>WgQuickConfig</key>
|
<key>WgQuickConfig</key>
|
||||||
<string>[Interface]
|
<string>[Interface]
|
||||||
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
||||||
Address = 10.19.49.2
|
Address = 10.19.49.2
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
+2
-2
@@ -56,8 +56,8 @@
|
|||||||
<key>WgQuickConfig</key>
|
<key>WgQuickConfig</key>
|
||||||
<string>[Interface]
|
<string>[Interface]
|
||||||
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
||||||
Address = 10.19.49.3
|
Address = 10.19.49.3
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
+2
-2
@@ -56,8 +56,8 @@
|
|||||||
<key>WgQuickConfig</key>
|
<key>WgQuickConfig</key>
|
||||||
<string>[Interface]
|
<string>[Interface]
|
||||||
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
||||||
Address = 10.19.49.2
|
Address = 10.19.49.2
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
+2
-2
@@ -56,8 +56,8 @@
|
|||||||
<key>WgQuickConfig</key>
|
<key>WgQuickConfig</key>
|
||||||
<string>[Interface]
|
<string>[Interface]
|
||||||
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
||||||
Address = 10.19.49.3
|
Address = 10.19.49.3
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[Interface]
|
[Interface]
|
||||||
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
PrivateKey = OC3EYbHLzszqmYqFlC22bnPDoTHp4ORULg9vCphbcEY=
|
||||||
Address = 10.19.49.2
|
Address = 10.19.49.2
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[Interface]
|
[Interface]
|
||||||
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
PrivateKey = yKU40Lrt5xutKuXHcJipej0wdqPVExuGmjoPzBar/GI=
|
||||||
Address = 10.19.49.3
|
Address = 10.19.49.3
|
||||||
DNS = 8.8.8.8,8.8.4.4
|
DNS = 8.8.8.8,8.8.4.4
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
PublicKey = IJFSpegTMGKoK5EtJaX2uH/hBWxq8ZpNOJIBMZnE4w0=
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -12,22 +12,22 @@ runcmd:
|
|||||||
- |
|
- |
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
# Wait for any running apt processes to finish
|
# Wait for any running apt processes to finish
|
||||||
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do
|
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do
|
||||||
echo "Waiting for apt locks to be released..."
|
echo "Waiting for apt locks to be released..."
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
|
|
||||||
# Fix DNS resolution
|
# Fix DNS resolution
|
||||||
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||||
echo "nameserver 1.1.1.1" >> /etc/resolv.conf
|
echo "nameserver 1.1.1.1" >> /etc/resolv.conf
|
||||||
echo "127.0.0.1 algo" >> /etc/hosts
|
echo "127.0.0.1 algo" >> /etc/hosts
|
||||||
|
|
||||||
# Update packages manually after ensuring no locks
|
# Update packages manually after ensuring no locks
|
||||||
apt-get update || true
|
apt-get update || true
|
||||||
apt-get upgrade -y || true
|
apt-get upgrade -y || true
|
||||||
|
|
||||||
export METHOD=local
|
export METHOD=local
|
||||||
export ONDEMAND_CELLULAR=true
|
export ONDEMAND_CELLULAR=true
|
||||||
export ONDEMAND_WIFI=true
|
export ONDEMAND_WIFI=true
|
||||||
@@ -41,6 +41,6 @@ runcmd:
|
|||||||
export ANSIBLE_EXTRA_ARGS=''
|
export ANSIBLE_EXTRA_ARGS=''
|
||||||
export REPO_SLUG=${REPO}
|
export REPO_SLUG=${REPO}
|
||||||
export REPO_BRANCH=${BRANCH_NAME}
|
export REPO_BRANCH=${BRANCH_NAME}
|
||||||
|
|
||||||
curl -s https://raw.githubusercontent.com/${REPO}/${BRANCH_NAME}/install.sh | sudo -E bash -x
|
curl -s https://raw.githubusercontent.com/${REPO}/${BRANCH_NAME}/install.sh | sudo -E bash -x
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -65,4 +65,4 @@ uv run ansible-playbook main.yml \
|
|||||||
echo "Configuration generation test passed!"
|
echo "Configuration generation test passed!"
|
||||||
|
|
||||||
# Clean up
|
# Clean up
|
||||||
rm -f test-config.cfg
|
rm -f test-config.cfg
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
version = 1
|
version = 1
|
||||||
revision = 2
|
revision = 2
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
|
resolution-markers = [
|
||||||
|
"python_full_version >= '3.12'",
|
||||||
|
"python_full_version < '3.12'",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "adal"
|
name = "adal"
|
||||||
@@ -62,8 +66,12 @@ openstack = [
|
|||||||
|
|
||||||
[package.dev-dependencies]
|
[package.dev-dependencies]
|
||||||
dev = [
|
dev = [
|
||||||
|
{ name = "ansible-lint" },
|
||||||
|
{ name = "pre-commit" },
|
||||||
{ name = "pytest" },
|
{ name = "pytest" },
|
||||||
{ name = "pytest-xdist" },
|
{ name = "pytest-xdist" },
|
||||||
|
{ name = "ruff" },
|
||||||
|
{ name = "yamllint" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
@@ -93,8 +101,12 @@ provides-extras = ["aws", "azure", "gcp", "hetzner", "linode", "openstack", "clo
|
|||||||
|
|
||||||
[package.metadata.requires-dev]
|
[package.metadata.requires-dev]
|
||||||
dev = [
|
dev = [
|
||||||
|
{ name = "ansible-lint", specifier = ">=24.0.0" },
|
||||||
|
{ name = "pre-commit", specifier = ">=4.0.0" },
|
||||||
{ name = "pytest", specifier = ">=8.0.0" },
|
{ name = "pytest", specifier = ">=8.0.0" },
|
||||||
{ name = "pytest-xdist", specifier = ">=3.0.0" },
|
{ name = "pytest-xdist", specifier = ">=3.0.0" },
|
||||||
|
{ name = "ruff", specifier = ">=0.8.0" },
|
||||||
|
{ name = "yamllint", specifier = ">=1.35.0" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -109,6 +121,22 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/36/c4/8f90ac0d4cb85387eccfaf1b1510017872aa4b56f098178f76b2ab4e4571/ansible-12.0.0-py3-none-any.whl", hash = "sha256:1a17f8c593a973e6d81f10ebfe7eac53e799616f745d57b99bd36b34f79f16a2", size = 51828371, upload-time = "2025-09-09T15:56:36.467Z" },
|
{ url = "https://files.pythonhosted.org/packages/36/c4/8f90ac0d4cb85387eccfaf1b1510017872aa4b56f098178f76b2ab4e4571/ansible-12.0.0-py3-none-any.whl", hash = "sha256:1a17f8c593a973e6d81f10ebfe7eac53e799616f745d57b99bd36b34f79f16a2", size = 51828371, upload-time = "2025-09-09T15:56:36.467Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ansible-compat"
|
||||||
|
version = "25.8.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "ansible-core" },
|
||||||
|
{ name = "jsonschema" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pyyaml" },
|
||||||
|
{ name = "subprocess-tee" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ea/96/d5bcbd652dbcbf8611b32457d67b10e41e5e596e34460c25511ccfa6fbf1/ansible_compat-25.8.1.tar.gz", hash = "sha256:f29ab81264b3f04fb94ac2d7f68fe73efc2eb3cbe4ecf00f9b4742e77c41756f", size = 90142, upload-time = "2025-08-14T15:59:57.215Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/32/29/c73b6d6d5ecdaf51ee4210e6fbf95de0a24b87f2b5df83155ac0c753513e/ansible_compat-25.8.1-py3-none-any.whl", hash = "sha256:5bb843838414b75efff24dae5ff5b332cd503a596143d471980243cec4b46c9c", size = 27523, upload-time = "2025-08-14T15:59:55.866Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansible-core"
|
name = "ansible-core"
|
||||||
version = "2.19.2"
|
version = "2.19.2"
|
||||||
@@ -125,6 +153,40 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/f5/49/f0ae13c228ae31613a27f9a06e55fdaa76ee45fce3d35c9f6e1ef423a6c0/ansible_core-2.19.2-py3-none-any.whl", hash = "sha256:1fe6ca533951b5ba4a619e763ea4f6725f68c36677c7d5aaa467b59aa449bdc8", size = 2403942, upload-time = "2025-09-08T18:11:31.341Z" },
|
{ url = "https://files.pythonhosted.org/packages/f5/49/f0ae13c228ae31613a27f9a06e55fdaa76ee45fce3d35c9f6e1ef423a6c0/ansible_core-2.19.2-py3-none-any.whl", hash = "sha256:1fe6ca533951b5ba4a619e763ea4f6725f68c36677c7d5aaa467b59aa449bdc8", size = 2403942, upload-time = "2025-09-08T18:11:31.341Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ansible-lint"
|
||||||
|
version = "25.8.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "ansible-compat" },
|
||||||
|
{ name = "ansible-core" },
|
||||||
|
{ name = "black" },
|
||||||
|
{ name = "filelock" },
|
||||||
|
{ name = "importlib-metadata" },
|
||||||
|
{ name = "jsonschema" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pathspec" },
|
||||||
|
{ name = "pyyaml" },
|
||||||
|
{ name = "referencing" },
|
||||||
|
{ name = "ruamel-yaml" },
|
||||||
|
{ name = "subprocess-tee" },
|
||||||
|
{ name = "wcmatch" },
|
||||||
|
{ name = "yamllint" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/60/93/2c344f3eeaf15fee5ee99a30ebe77f316a65f09d290034e4290fdb114cb4/ansible_lint-25.8.2.tar.gz", hash = "sha256:35dd3ddd12d8063876915bf2f06b9a1b80fd27a7cb1ca4ce51c8cebb84690922", size = 580055, upload-time = "2025-08-21T13:45:13.372Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7b/d9/ec00c80dceff6cfdeb2dc437058800969da11b7d5b625f75104e32c2be26/ansible_lint-25.8.2-py3-none-any.whl", hash = "sha256:14de8c51650af33255a5ba14a01d798d64c2559eaec9d6a92927535b46d1d9ab", size = 328717, upload-time = "2025-08-21T13:45:11.603Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "attrs"
|
||||||
|
version = "25.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "azure-common"
|
name = "azure-common"
|
||||||
version = "1.1.28"
|
version = "1.1.28"
|
||||||
@@ -221,6 +283,34 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/14/18/f047cb553dad6fdb65c625c4fe48552e043c4e9a859416a70c5047d07475/azure_mgmt_resource-24.0.0-py3-none-any.whl", hash = "sha256:27b32cd223e2784269f5a0db3c282042886ee4072d79cedc638438ece7cd0df4", size = 3613790, upload-time = "2025-06-17T08:04:04.046Z" },
|
{ url = "https://files.pythonhosted.org/packages/14/18/f047cb553dad6fdb65c625c4fe48552e043c4e9a859416a70c5047d07475/azure_mgmt_resource-24.0.0-py3-none-any.whl", hash = "sha256:27b32cd223e2784269f5a0db3c282042886ee4072d79cedc638438ece7cd0df4", size = 3613790, upload-time = "2025-06-17T08:04:04.046Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "black"
|
||||||
|
version = "25.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "click" },
|
||||||
|
{ name = "mypy-extensions" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pathspec" },
|
||||||
|
{ name = "platformdirs" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "boto"
|
name = "boto"
|
||||||
version = "2.49.0"
|
version = "2.49.0"
|
||||||
@@ -258,6 +348,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/ad/e7/c27a2cad80dd0a47e9a5c942b5734bd05a95db6b4d6cd778393183d78c6a/botocore-1.40.3-py3-none-any.whl", hash = "sha256:0c6d00b4412babb5e3d0944b5e057d31f763bf54429d5667f367e7b46e5c1c22", size = 13970985, upload-time = "2025-08-05T20:03:34.563Z" },
|
{ url = "https://files.pythonhosted.org/packages/ad/e7/c27a2cad80dd0a47e9a5c942b5734bd05a95db6b4d6cd778393183d78c6a/botocore-1.40.3-py3-none-any.whl", hash = "sha256:0c6d00b4412babb5e3d0944b5e057d31f763bf54429d5667f367e7b46e5c1c22", size = 13970985, upload-time = "2025-08-05T20:03:34.563Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bracex"
|
||||||
|
version = "2.6"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/63/9a/fec38644694abfaaeca2798b58e276a8e61de49e2e37494ace423395febc/bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7", size = 26642, upload-time = "2025-06-22T19:12:31.254Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/2a/9186535ce58db529927f6cf5990a849aa9e052eea3e2cfefe20b9e1802da/bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", size = 11508, upload-time = "2025-06-22T19:12:29.781Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cachetools"
|
name = "cachetools"
|
||||||
version = "5.5.2"
|
version = "5.5.2"
|
||||||
@@ -321,6 +420,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" },
|
{ url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfgv"
|
||||||
|
version = "3.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "charset-normalizer"
|
name = "charset-normalizer"
|
||||||
version = "3.4.2"
|
version = "3.4.2"
|
||||||
@@ -369,6 +477,18 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "click"
|
||||||
|
version = "8.2.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorama"
|
name = "colorama"
|
||||||
version = "0.4.6"
|
version = "0.4.6"
|
||||||
@@ -453,6 +573,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" },
|
{ url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "distlib"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dogpile-cache"
|
name = "dogpile-cache"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@@ -487,6 +616,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" },
|
{ url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "filelock"
|
||||||
|
version = "3.19.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "google-auth"
|
name = "google-auth"
|
||||||
version = "2.40.3"
|
version = "2.40.3"
|
||||||
@@ -514,6 +652,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/1c/d8/cddd1e1e42742527fc8d7d47cd8d7827176e1157c609e0e77bccb8583593/hcloud-2.5.4-py3-none-any.whl", hash = "sha256:a6b23104bfaaa1507dd222604f1bcb6e89601c26d0447f0b84a4cf8a808a9c73", size = 88330, upload-time = "2025-07-09T09:52:00.309Z" },
|
{ url = "https://files.pythonhosted.org/packages/1c/d8/cddd1e1e42742527fc8d7d47cd8d7827176e1157c609e0e77bccb8583593/hcloud-2.5.4-py3-none-any.whl", hash = "sha256:a6b23104bfaaa1507dd222604f1bcb6e89601c26d0447f0b84a4cf8a808a9c73", size = 88330, upload-time = "2025-07-09T09:52:00.309Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "identify"
|
||||||
|
version = "2.6.13"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/82/ca/ffbabe3635bb839aa36b3a893c91a9b0d368cb4d8073e03a12896970af82/identify-2.6.13.tar.gz", hash = "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32", size = 99243, upload-time = "2025-08-09T19:35:00.6Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e7/ce/461b60a3ee109518c055953729bf9ed089a04db895d47e95444071dcdef2/identify-2.6.13-py2.py3-none-any.whl", hash = "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", size = 99153, upload-time = "2025-08-09T19:34:59.1Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "3.10"
|
version = "3.10"
|
||||||
@@ -523,6 +670,18 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
|
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "importlib-metadata"
|
||||||
|
version = "8.7.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "zipp" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iniconfig"
|
name = "iniconfig"
|
||||||
version = "2.1.0"
|
version = "2.1.0"
|
||||||
@@ -592,6 +751,33 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" },
|
{ url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jsonschema"
|
||||||
|
version = "4.25.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs" },
|
||||||
|
{ name = "jsonschema-specifications" },
|
||||||
|
{ name = "referencing" },
|
||||||
|
{ name = "rpds-py" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jsonschema-specifications"
|
||||||
|
version = "2025.4.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "referencing" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "keystoneauth1"
|
name = "keystoneauth1"
|
||||||
version = "5.11.1"
|
version = "5.11.1"
|
||||||
@@ -727,6 +913,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/c9/7e/620e883def84ae56b8a9da382d960f7f801e37518fe930085cf72c148dae/msrestazure-0.6.4.post1-py2.py3-none-any.whl", hash = "sha256:2264493b086c2a0a82ddf5fd87b35b3fffc443819127fed992ac5028354c151e", size = 40789, upload-time = "2024-04-10T21:00:49.359Z" },
|
{ url = "https://files.pythonhosted.org/packages/c9/7e/620e883def84ae56b8a9da382d960f7f801e37518fe930085cf72c148dae/msrestazure-0.6.4.post1-py2.py3-none-any.whl", hash = "sha256:2264493b086c2a0a82ddf5fd87b35b3fffc443819127fed992ac5028354c151e", size = 40789, upload-time = "2024-04-10T21:00:49.359Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mypy-extensions"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "netaddr"
|
name = "netaddr"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
@@ -736,6 +931,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023, upload-time = "2024-05-28T21:30:34.191Z" },
|
{ url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023, upload-time = "2024-05-28T21:30:34.191Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nodeenv"
|
||||||
|
version = "1.9.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oauthlib"
|
name = "oauthlib"
|
||||||
version = "3.3.1"
|
version = "3.3.1"
|
||||||
@@ -791,6 +995,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
|
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathspec"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pbr"
|
name = "pbr"
|
||||||
version = "6.1.1"
|
version = "6.1.1"
|
||||||
@@ -827,6 +1040,22 @@ version = "0.3.2"
|
|||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/8f/c5/4249317962180d97ec7a60fe38aa91f86216533bd478a427a5468945c5c9/polling-0.3.2.tar.gz", hash = "sha256:3afd62320c99b725c70f379964bf548b302fc7f04d4604e6c315d9012309cc9a", size = 5189, upload-time = "2021-05-22T19:48:41.466Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/8f/c5/4249317962180d97ec7a60fe38aa91f86216533bd478a427a5468945c5c9/polling-0.3.2.tar.gz", hash = "sha256:3afd62320c99b725c70f379964bf548b302fc7f04d4604e6c315d9012309cc9a", size = 5189, upload-time = "2021-05-22T19:48:41.466Z" }
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pre-commit"
|
||||||
|
version = "4.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "cfgv" },
|
||||||
|
{ name = "identify" },
|
||||||
|
{ name = "nodeenv" },
|
||||||
|
{ name = "pyyaml" },
|
||||||
|
{ name = "virtualenv" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "psutil"
|
name = "psutil"
|
||||||
version = "7.0.0"
|
version = "7.0.0"
|
||||||
@@ -993,6 +1222,20 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
|
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "referencing"
|
||||||
|
version = "0.36.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "attrs" },
|
||||||
|
{ name = "rpds-py" },
|
||||||
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "requests"
|
name = "requests"
|
||||||
version = "2.32.4"
|
version = "2.32.4"
|
||||||
@@ -1039,6 +1282,114 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/d2/fc/e9ccf0521607bcd244aa0b3fbd574f71b65e9ce6a112c83af988bbbe2e23/resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf", size = 17194, upload-time = "2023-03-09T05:10:36.214Z" },
|
{ url = "https://files.pythonhosted.org/packages/d2/fc/e9ccf0521607bcd244aa0b3fbd574f71b65e9ce6a112c83af988bbbe2e23/resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf", size = 17194, upload-time = "2023-03-09T05:10:36.214Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rpds-py"
|
||||||
|
version = "0.27.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rsa"
|
name = "rsa"
|
||||||
version = "4.9.1"
|
version = "4.9.1"
|
||||||
@@ -1051,6 +1402,79 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruamel-yaml"
|
||||||
|
version = "0.18.15"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload-time = "2025-08-19T11:15:10.694Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload-time = "2025-08-19T11:15:07.696Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruamel-yaml-clib"
|
||||||
|
version = "0.2.12"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload-time = "2024-10-20T10:12:45.162Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload-time = "2024-10-20T10:12:46.758Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload-time = "2024-10-20T10:12:48.605Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload-time = "2024-10-20T10:12:51.124Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload-time = "2024-10-21T11:26:41.438Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload-time = "2024-10-21T11:26:43.62Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload-time = "2024-12-11T19:58:15.592Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload-time = "2024-10-20T10:12:52.865Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload-time = "2024-10-20T10:12:54.652Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruff"
|
||||||
|
version = "0.12.12"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a8/f0/e0965dd709b8cabe6356811c0ee8c096806bb57d20b5019eb4e48a117410/ruff-0.12.12.tar.gz", hash = "sha256:b86cd3415dbe31b3b46a71c598f4c4b2f550346d1ccf6326b347cc0c8fd063d6", size = 5359915, upload-time = "2025-09-04T16:50:18.273Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/79/8d3d687224d88367b51c7974cec1040c4b015772bfbeffac95face14c04a/ruff-0.12.12-py3-none-linux_armv6l.whl", hash = "sha256:de1c4b916d98ab289818e55ce481e2cacfaad7710b01d1f990c497edf217dafc", size = 12116602, upload-time = "2025-09-04T16:49:18.892Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7acd6045e87fac75a0b0cdedacf9ab3e1ad9d929d149785903cff9bb69ad9727", size = 12868393, upload-time = "2025-09-04T16:49:23.043Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:abf4073688d7d6da16611f2f126be86523a8ec4343d15d276c614bda8ec44edb", size = 12036967, upload-time = "2025-09-04T16:49:26.04Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e9/03/6816b2ed08836be272e87107d905f0908be5b4a40c14bfc91043e76631b8/ruff-0.12.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:968e77094b1d7a576992ac078557d1439df678a34c6fe02fd979f973af167577", size = 12276038, upload-time = "2025-09-04T16:49:29.056Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9f/d5/707b92a61310edf358a389477eabd8af68f375c0ef858194be97ca5b6069/ruff-0.12.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42a67d16e5b1ffc6d21c5f67851e0e769517fb57a8ebad1d0781b30888aa704e", size = 11901110, upload-time = "2025-09-04T16:49:32.07Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/3d/f8b1038f4b9822e26ec3d5b49cf2bc313e3c1564cceb4c1a42820bf74853/ruff-0.12.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b216ec0a0674e4b1214dcc998a5088e54eaf39417327b19ffefba1c4a1e4971e", size = 13668352, upload-time = "2025-09-04T16:49:35.148Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/98/0e/91421368ae6c4f3765dd41a150f760c5f725516028a6be30e58255e3c668/ruff-0.12.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:59f909c0fdd8f1dcdbfed0b9569b8bf428cf144bec87d9de298dcd4723f5bee8", size = 14638365, upload-time = "2025-09-04T16:49:38.892Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/74/5d/88f3f06a142f58ecc8ecb0c2fe0b82343e2a2b04dcd098809f717cf74b6c/ruff-0.12.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ac93d87047e765336f0c18eacad51dad0c1c33c9df7484c40f98e1d773876f5", size = 14060812, upload-time = "2025-09-04T16:49:42.732Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/13/fc/8962e7ddd2e81863d5c92400820f650b86f97ff919c59836fbc4c1a6d84c/ruff-0.12.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01543c137fd3650d322922e8b14cc133b8ea734617c4891c5a9fccf4bfc9aa92", size = 13050208, upload-time = "2025-09-04T16:49:46.434Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afc2fa864197634e549d87fb1e7b6feb01df0a80fd510d6489e1ce8c0b1cc45", size = 13311444, upload-time = "2025-09-04T16:49:49.931Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2a/81/de5a29af7eb8f341f8140867ffb93f82e4fde7256dadee79016ac87c2716/ruff-0.12.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0c0945246f5ad776cb8925e36af2438e66188d2b57d9cf2eed2c382c58b371e5", size = 13279474, upload-time = "2025-09-04T16:49:53.465Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7f/14/d9577fdeaf791737ada1b4f5c6b59c21c3326f3f683229096cccd7674e0c/ruff-0.12.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a0fbafe8c58e37aae28b84a80ba1817f2ea552e9450156018a478bf1fa80f4e4", size = 12070204, upload-time = "2025-09-04T16:49:56.882Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/77/04/a910078284b47fad54506dc0af13839c418ff704e341c176f64e1127e461/ruff-0.12.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b9c456fb2fc8e1282affa932c9e40f5ec31ec9cbb66751a316bd131273b57c23", size = 11880347, upload-time = "2025-09-04T16:49:59.729Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/df/58/30185fcb0e89f05e7ea82e5817b47798f7fa7179863f9d9ba6fd4fe1b098/ruff-0.12.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f12856123b0ad0147d90b3961f5c90e7427f9acd4b40050705499c98983f489", size = 12891844, upload-time = "2025-09-04T16:50:02.591Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/21/9c/28a8dacce4855e6703dcb8cdf6c1705d0b23dd01d60150786cd55aa93b16/ruff-0.12.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:26a1b5a2bf7dd2c47e3b46d077cd9c0fc3b93e6c6cc9ed750bd312ae9dc302ee", size = 13360687, upload-time = "2025-09-04T16:50:05.8Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/fa/05b6428a008e60f79546c943e54068316f32ec8ab5c4f73e4563934fbdc7/ruff-0.12.12-py3-none-win32.whl", hash = "sha256:173be2bfc142af07a01e3a759aba6f7791aa47acf3604f610b1c36db888df7b1", size = 12052870, upload-time = "2025-09-04T16:50:09.121Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl", hash = "sha256:e99620bf01884e5f38611934c09dd194eb665b0109104acae3ba6102b600fd0d", size = 13178016, upload-time = "2025-09-04T16:50:12.559Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/28/7e/61c42657f6e4614a4258f1c3b0c5b93adc4d1f8575f5229d1906b483099b/ruff-0.12.12-py3-none-win_arm64.whl", hash = "sha256:2a8199cab4ce4d72d158319b63370abf60991495fb733db96cd923a34c52d093", size = 12256762, upload-time = "2025-09-04T16:50:15.737Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "s3transfer"
|
name = "s3transfer"
|
||||||
version = "0.13.1"
|
version = "0.13.1"
|
||||||
@@ -1115,6 +1539,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533, upload-time = "2025-02-20T14:03:55.849Z" },
|
{ url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533, upload-time = "2025-02-20T14:03:55.849Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "subprocess-tee"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/22/991efbf35bc811dfe7edcd749253f0931d2d4838cf55176132633e1c82a7/subprocess_tee-0.4.2.tar.gz", hash = "sha256:91b2b4da3aae9a7088d84acaf2ea0abee3f4fd9c0d2eae69a9b9122a71476590", size = 14951, upload-time = "2024-06-17T19:51:51.249Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4d/ab/e3a3be062cd544b2803760ff707dee38f0b1cb5685b2446de0ec19be28d9/subprocess_tee-0.4.2-py3-none-any.whl", hash = "sha256:21942e976715af4a19a526918adb03a8a27a8edab959f2d075b777e3d78f532d", size = 5249, upload-time = "2024-06-17T19:51:15.949Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.14.1"
|
version = "4.14.1"
|
||||||
@@ -1133,6 +1566,32 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
|
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "virtualenv"
|
||||||
|
version = "20.34.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "distlib" },
|
||||||
|
{ name = "filelock" },
|
||||||
|
{ name = "platformdirs" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wcmatch"
|
||||||
|
version = "10.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "bracex" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421, upload-time = "2025-06-22T19:14:02.49Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/eb/d8/0d1d2e9d3fabcf5d6840362adcf05f8cf3cd06a73358140c3a97189238ae/wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", size = 39854, upload-time = "2025-06-22T19:14:00.978Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wrapt"
|
name = "wrapt"
|
||||||
version = "1.17.2"
|
version = "1.17.2"
|
||||||
@@ -1185,3 +1644,25 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750, upload-time = "2025-01-14T10:35:03.378Z" },
|
{ url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750, upload-time = "2025-01-14T10:35:03.378Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" },
|
{ url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yamllint"
|
||||||
|
version = "1.37.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "pathspec" },
|
||||||
|
{ name = "pyyaml" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/46/f2/cd8b7584a48ee83f0bc94f8a32fea38734cefcdc6f7324c4d3bfc699457b/yamllint-1.37.1.tar.gz", hash = "sha256:81f7c0c5559becc8049470d86046b36e96113637bcbe4753ecef06977c00245d", size = 141613, upload-time = "2025-05-04T08:25:54.355Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/b9/be7a4cfdf47e03785f657f94daea8123e838d817be76c684298305bd789f/yamllint-1.37.1-py3-none-any.whl", hash = "sha256:364f0d79e81409f591e323725e6a9f4504c8699ddf2d7263d8d2b539cd66a583", size = 68813, upload-time = "2025-05-04T08:25:52.552Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zipp"
|
||||||
|
version = "3.23.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" },
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user