cloud infra
0

Configure Feed

Select the types of activity you want to include in your feed.

Add secrets for digital ocean space

This also adds a tool for adding secrets!

nagee (May 21, 2026, 12:49 PM -0700) b5903fc7 b6da752b

+202 -42
configure/__init__.py

This is a binary file and will not be displayed.

configure/group_data/__init__.py

This is a binary file and will not be displayed.

+38
configure/group_data/all.py
··· 1 + import privy 2 + import os 3 + from pydantic import BaseModel 4 + import toml 5 + import pathlib 6 + 7 + __all__ = [ 8 + "DoSpaceBucket", 9 + "get_space_data", 10 + ] 11 + 12 + 13 + class DoSpaceBucket(BaseModel): 14 + bucket: str 15 + access_key: str 16 + secret_key: str 17 + endpoint: str 18 + location: str 19 + 20 + 21 + def load_secrets_file() -> dict: 22 + secrets_file_path = pathlib.Path("secrets/secrets.toml") 23 + return toml.load(secrets_file_path) 24 + 25 + 26 + def get_encryption_key() -> str: 27 + return os.environ["INFRA_SECRET"] 28 + 29 + 30 + def load_secret(secret_name: str, encryption_key: str): 31 + secrets = load_secrets_file() 32 + encrypted = secrets[secret_name] 33 + return privy.peek(encrypted, encryption_key) 34 + 35 + 36 + def get_space_data(encryption_key: str) -> DoSpaceBucket: 37 + json_str = load_secret("infra_do_space_json", encryption_key) 38 + return DoSpaceBucket.model_validate_json(json_str)
configure/tools/__init__.py

This is a binary file and will not be displayed.

+103
configure/tools/add_secret.py
··· 1 + #!/usr/bin/env -S uv run --script 2 + # 3 + # /// script 4 + # requires-python = ">=3.12" 5 + # dependencies = ["privy", "toml"] 6 + # /// 7 + 8 + import argparse 9 + import os 10 + import getpass 11 + import sys 12 + from pathlib import Path 13 + 14 + import toml 15 + import privy 16 + 17 + 18 + DEFAULT_SECRETS_FILE = Path("secrets/secrets.toml") 19 + 20 + 21 + def parse_args() -> argparse.Namespace: 22 + parser = argparse.ArgumentParser( 23 + description="Encrypt and store a secret in a TOML file using privy.", 24 + ) 25 + 26 + parser.add_argument( 27 + "name", 28 + help="Secret name", 29 + ) 30 + 31 + parser.add_argument( 32 + "value", 33 + nargs="?", 34 + help="Secret value (omit to prompt securely)", 35 + ) 36 + 37 + parser.add_argument( 38 + "-d", 39 + "--directory", 40 + type=Path, 41 + help="Directory containing secrets.toml (default: ./secrets)", 42 + ) 43 + 44 + parser.add_argument( 45 + "-f", 46 + "--file", 47 + type=Path, 48 + help="Explicit secrets TOML file path", 49 + ) 50 + 51 + return parser.parse_args() 52 + 53 + 54 + def resolve_secrets_file(args: argparse.Namespace) -> Path: 55 + if args.file: 56 + return args.file 57 + 58 + if args.directory: 59 + return args.directory / "secrets.toml" 60 + 61 + return DEFAULT_SECRETS_FILE 62 + 63 + 64 + def load_toml(path: Path) -> dict: 65 + if not path.exists(): 66 + return {} 67 + 68 + return toml.loads(path.read_text()) 69 + 70 + 71 + def save_toml(path: Path, data: dict) -> None: 72 + path.parent.mkdir(parents=True, exist_ok=True) 73 + path.write_text(toml.dumps(data)) 74 + 75 + 76 + def get_encryption_key() -> str: 77 + secret = os.environ.get("INFRA_SECRET") 78 + if not secret: 79 + secret = getpass.getpass("Encryption key: ") 80 + return secret 81 + 82 + 83 + def main() -> None: 84 + args = parse_args() 85 + 86 + encryption_key = get_encryption_key() 87 + 88 + secret_value = args.value or getpass.getpass("Secret value: ") 89 + 90 + encrypted = privy.hide(secret_value.encode(), encryption_key.encode()) 91 + 92 + secrets_file = resolve_secrets_file(args) 93 + 94 + data = load_toml(secrets_file) 95 + data[args.name] = encrypted 96 + 97 + save_toml(secrets_file, data) 98 + 99 + print(f"✓ Stored encrypted secret '{args.name}' in {secrets_file}") 100 + 101 + 102 + if __name__ == "__main__": 103 + main()
+2
pyproject.toml
··· 6 6 requires-python = ">=3.13" 7 7 dependencies = [ 8 8 "passlib>=1.7.4", 9 + "privy>=6.0.0", 9 10 "pydantic>=2.11.9", 10 11 "pyinfra>=3.8.0", 12 + "toml>=0.10.2", 11 13 ] 12 14 13 15 [dependency-groups]
+1
secrets/secrets.toml
··· 1 + infra_do_space_json = "1$2$4Z0tpiaJVYULnJTcqfc2wfxf83Ii-8Ps8DdSHLeHXeE=$Z0FBQUFBQnFEeWoxbGg1ZmI2Q24zbFpJbVg0MEY5ZzNxamZndzRFZEpReVZrb1RrMmVBY180ZDVZTFZTc0s3TEpoUFJhQi1Yc1lwRzVBWmpoanRzbVhNWmM4Nlg4NEd0Z3ZLZmV5X08waVc2V2V6U2hYVXFxZlZSOUNrekc4QjZiUVZhMVNRc3hRNzJfNm1PbmZkcVZQSU5mTUg0ODBtbUVmckpRLXl6QnE1V0R1emc3djQ4NlBuU0kzTXVZT0llWnpYV0o2RWNoeTZYS09sWFZYeVBBZVBiS0dzQWZZUHBhMENFQ1NqVDJUczdRSTVJV3ZOVlM0emc2QTRSd2hyTXkzQWJsNUQ1U25wbTA4QVZoOVVhY2RlSG0zaTd0ai1aUnMzRmx1NVQtWGFCNll5NTVUU3c0OVpaMEh2M3VJRERBcDhfUkpZMm5Vaks="
+58 -42
uv.lock
··· 1 1 version = 1 2 2 revision = 3 3 3 requires-python = ">=3.13" 4 + resolution-markers = [ 5 + "python_full_version >= '3.14'", 6 + "python_full_version < '3.14'", 7 + ] 4 8 5 9 [[package]] 6 10 name = "annotated-types" ··· 12 16 ] 13 17 14 18 [[package]] 15 - name = "ansible" 16 - version = "12.0.0" 19 + name = "argon2-cffi" 20 + version = "25.1.0" 17 21 source = { registry = "https://pypi.org/simple" } 18 22 dependencies = [ 19 - { name = "ansible-core" }, 23 + { name = "argon2-cffi-bindings" }, 20 24 ] 21 - sdist = { url = "https://files.pythonhosted.org/packages/40/47/e7294a50e89e1f26456703a2fc2f3ce84fde6ad92ef86582648da21cc997/ansible-12.0.0.tar.gz", hash = "sha256:1b3ad8158dd2597ce45a864a55ca09e5be1807cc97f44a00c39d7bb9e1520aa6", size = 42251465, upload-time = "2025-09-09T15:56:40.921Z" } 25 + sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } 22 26 wheels = [ 23 - { 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" }, 27 + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, 24 28 ] 25 29 26 30 [[package]] 27 - name = "ansible-core" 28 - version = "2.19.2" 31 + name = "argon2-cffi-bindings" 32 + version = "25.1.0" 29 33 source = { registry = "https://pypi.org/simple" } 30 34 dependencies = [ 31 - { name = "cryptography" }, 32 - { name = "jinja2" }, 33 - { name = "packaging" }, 34 - { name = "pyyaml" }, 35 - { name = "resolvelib" }, 35 + { name = "cffi" }, 36 36 ] 37 - sdist = { url = "https://files.pythonhosted.org/packages/16/f1/1c21d3bff03fe9a5b51515307db7a76ec8b8972c70d5702cc3027c988a99/ansible_core-2.19.2.tar.gz", hash = "sha256:87fcbbc492ed16eb6adb0379bae0adbf69f3ce88a8440e7e88e0dcefa9f8a54c", size = 3408325, upload-time = "2025-09-08T18:11:33.666Z" } 37 + sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } 38 38 wheels = [ 39 - { 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" }, 39 + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, 40 + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, 41 + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, 42 + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, 43 + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, 44 + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, 45 + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, 46 + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, 47 + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, 48 + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, 49 + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, 50 + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, 51 + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, 52 + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, 53 + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, 54 + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, 55 + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, 56 + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, 57 + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, 58 + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, 40 59 ] 41 60 42 61 [[package]] ··· 167 186 version = "0.1.0" 168 187 source = { virtual = "." } 169 188 dependencies = [ 170 - { name = "ansible" }, 171 189 { name = "passlib" }, 190 + { name = "privy" }, 172 191 { name = "pydantic" }, 173 192 { name = "pyinfra" }, 193 + { name = "toml" }, 174 194 ] 175 195 176 196 [package.dev-dependencies] ··· 181 201 182 202 [package.metadata] 183 203 requires-dist = [ 184 - { name = "ansible", specifier = ">=12.0.0" }, 185 204 { name = "passlib", specifier = ">=1.7.4" }, 205 + { name = "privy", specifier = ">=6.0.0" }, 186 206 { name = "pydantic", specifier = ">=2.11.9" }, 187 207 { name = "pyinfra", specifier = ">=3.8.0" }, 208 + { name = "toml", specifier = ">=0.10.2" }, 188 209 ] 189 210 190 211 [package.metadata.requires-dev] ··· 405 426 ] 406 427 407 428 [[package]] 429 + name = "privy" 430 + version = "6.0.0" 431 + source = { registry = "https://pypi.org/simple" } 432 + dependencies = [ 433 + { name = "argon2-cffi" }, 434 + { name = "cryptography" }, 435 + ] 436 + wheels = [ 437 + { url = "https://files.pythonhosted.org/packages/ef/ae/c3637856cdfe66518133f2cdbb820e30745cdb02b43ece41e7ccb9d7f818/privy-6.0.0-py2.py3-none-any.whl", hash = "sha256:e68679bb4006ce83206d9a7af1158cf4d56a2ed6861ee39276907be618dfb8d9", size = 14243, upload-time = "2017-07-20T02:17:57.845Z" }, 438 + ] 439 + 440 + [[package]] 408 441 name = "pycparser" 409 442 version = "2.23" 410 443 source = { registry = "https://pypi.org/simple" } ··· 538 571 ] 539 572 540 573 [[package]] 541 - name = "pyyaml" 542 - version = "6.0.2" 543 - source = { registry = "https://pypi.org/simple" } 544 - sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } 545 - wheels = [ 546 - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, 547 - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, 548 - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, 549 - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, 550 - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, 551 - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, 552 - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, 553 - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, 554 - { 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" }, 555 - ] 556 - 557 - [[package]] 558 - name = "resolvelib" 559 - version = "1.2.0" 560 - source = { registry = "https://pypi.org/simple" } 561 - sdist = { url = "https://files.pythonhosted.org/packages/05/57/c5c178e21968123cf2aa90501b5fc14a48e342612695863333f4b70510ad/resolvelib-1.2.0.tar.gz", hash = "sha256:c27fbb5098acd7dfc01fb2be3724bd0881168edc2bd3b4dc876ca3f46b8e4a3d", size = 23448, upload-time = "2025-06-26T01:41:13.936Z" } 562 - wheels = [ 563 - { url = "https://files.pythonhosted.org/packages/c7/dd/a7bd1227a77403d894ac6c71bf55f6aff39cb485b268d285a158209d5963/resolvelib-1.2.0-py3-none-any.whl", hash = "sha256:8e3e2000beaf53fdfd8772fda1a7b1df97e803ab7c8925621bbb87c4d187a94d", size = 18691, upload-time = "2025-06-26T01:41:12.411Z" }, 564 - ] 565 - 566 - [[package]] 567 574 name = "ruff" 568 575 version = "0.13.0" 569 576 source = { registry = "https://pypi.org/simple" } ··· 596 603 sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } 597 604 wheels = [ 598 605 { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, 606 + ] 607 + 608 + [[package]] 609 + name = "toml" 610 + version = "0.10.2" 611 + source = { registry = "https://pypi.org/simple" } 612 + sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } 613 + wheels = [ 614 + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, 599 615 ] 600 616 601 617 [[package]]