Compare commits
	
		
			4 Commits
		
	
	
		
			2b52d8a232
			...
			f68fad468e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f68fad468e | |||
| 3878fd841b | |||
| 7dea3863aa | |||
| 466397f04a | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | .idea | ||||||
|  | logs/*jsonl | ||||||
|  | logs/*jsonl.* | ||||||
							
								
								
									
										57
									
								
								logging_configs/config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								logging_configs/config.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | { | ||||||
|  |     "version": 1, | ||||||
|  |     "disable_existing_loggers": false, | ||||||
|  |     "formatters": { | ||||||
|  |         "simple": { | ||||||
|  |             "format": "%(levelname)s - %(message)s" | ||||||
|  |         }, | ||||||
|  |         "rich": { | ||||||
|  |             "format": "%(message)s" | ||||||
|  |         }, | ||||||
|  |         "json": { | ||||||
|  |             "()": "logging_json_formatter.JSONFormatter", | ||||||
|  |             "fmt_keys": { | ||||||
|  |                 "level": "levelname", | ||||||
|  |                 "message": "message", | ||||||
|  |                 "timestamp": "timestamp", | ||||||
|  |                 "logger": "name", | ||||||
|  |                 "module": "module", | ||||||
|  |                 "function": "funcName", | ||||||
|  |                 "line": "lineno", | ||||||
|  |                 "thread_name": "threadName" | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     "handlers": { | ||||||
|  |         "rich": { | ||||||
|  |             "class": "rich.logging.RichHandler", | ||||||
|  |             "level": "DEBUG", | ||||||
|  |             "formatter": "rich", | ||||||
|  |             "log_time_format": "[%Y-%m-%dT%H:%M:%S]" | ||||||
|  |         }, | ||||||
|  |         "file": { | ||||||
|  |             "class": "logging.handlers.RotatingFileHandler", | ||||||
|  |             "level": "DEBUG", | ||||||
|  |             "filename": "logs/vm_management.jsonl", | ||||||
|  |             "formatter": "json", | ||||||
|  |             "maxBytes": 10000, | ||||||
|  |             "backupCount": 3 | ||||||
|  |         }, | ||||||
|  |         "queue_handler": { | ||||||
|  |             "class": "logging.handlers.QueueHandler", | ||||||
|  |             "handlers": [ | ||||||
|  |                 "rich", | ||||||
|  |                 "file" | ||||||
|  |             ], | ||||||
|  |             "respect_handler_level": true | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     "loggers": { | ||||||
|  |         "root": { | ||||||
|  |             "handlers": [ | ||||||
|  |                 "queue_handler" | ||||||
|  |             ], | ||||||
|  |             "level": "DEBUG" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										78
									
								
								logging_json_formatter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								logging_json_formatter.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | import datetime as dt | ||||||
|  | import json | ||||||
|  | import logging | ||||||
|  | from typing import override | ||||||
|  |  | ||||||
|  | LOG_RECORD_BUILTIN_ATTRS = { | ||||||
|  |     "args", | ||||||
|  |     "asctime", | ||||||
|  |     "created", | ||||||
|  |     "exc_info", | ||||||
|  |     "exc_text", | ||||||
|  |     "filename", | ||||||
|  |     "funcName", | ||||||
|  |     "levelname", | ||||||
|  |     "levelno", | ||||||
|  |     "lineno", | ||||||
|  |     "module", | ||||||
|  |     "msecs", | ||||||
|  |     "message", | ||||||
|  |     "msg", | ||||||
|  |     "name", | ||||||
|  |     "pathname", | ||||||
|  |     "process", | ||||||
|  |     "processName", | ||||||
|  |     "relativeCreated", | ||||||
|  |     "stack_info", | ||||||
|  |     "thread", | ||||||
|  |     "threadName", | ||||||
|  |     "taskName", | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class JSONFormatter(logging.Formatter): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         *, | ||||||
|  |         fmt_keys: dict[str, str] | None = None, | ||||||
|  |     ): | ||||||
|  |         super().__init__() | ||||||
|  |         self.fmt_keys = fmt_keys if fmt_keys is not None else {} | ||||||
|  |  | ||||||
|  |     @override | ||||||
|  |     def format(self, record: logging.LogRecord) -> str: | ||||||
|  |         message = self._prepare_log_dict(record) | ||||||
|  |         return json.dumps(message, default=str) | ||||||
|  |  | ||||||
|  |     def _prepare_log_dict(self, record: logging.LogRecord): | ||||||
|  |         always_fields = { | ||||||
|  |             "message": record.getMessage(), | ||||||
|  |             "timestamp": dt.datetime.fromtimestamp( | ||||||
|  |                 record.created, tz=dt.timezone.utc | ||||||
|  |             ).isoformat(), | ||||||
|  |         } | ||||||
|  |         if record.exc_info is not None: | ||||||
|  |             always_fields["exc_info"] = self.formatException(record.exc_info) | ||||||
|  |  | ||||||
|  |         if record.stack_info is not None: | ||||||
|  |             always_fields["stack_info"] = self.formatStack(record.stack_info) | ||||||
|  |  | ||||||
|  |         message = { | ||||||
|  |             key: msg_val | ||||||
|  |             if (msg_val := always_fields.pop(val, None)) is not None | ||||||
|  |             else getattr(record, val) | ||||||
|  |             for key, val in self.fmt_keys.items() | ||||||
|  |         } | ||||||
|  |         message.update(always_fields) | ||||||
|  |  | ||||||
|  |         for key, val in record.__dict__.items(): | ||||||
|  |             if key not in LOG_RECORD_BUILTIN_ATTRS: | ||||||
|  |                 message[key] = val | ||||||
|  |  | ||||||
|  |         return message | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NonErrorFilter(logging.Filter): | ||||||
|  |     @override | ||||||
|  |     def filter(self, record: logging.LogRecord) -> bool | logging.LogRecord: | ||||||
|  |         return record.levelno <= logging.INFO | ||||||
							
								
								
									
										0
									
								
								logs/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								logs/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										36
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								main.py
									
									
									
									
									
								
							| @@ -1,5 +1,39 @@ | |||||||
|  | # import gnupg | ||||||
|  | import atexit | ||||||
|  | import json | ||||||
|  | import logging.config | ||||||
|  | import os | ||||||
|  | import pathlib | ||||||
|  |  | ||||||
|  | import gnupg | ||||||
|  | from rich.traceback import install | ||||||
|  |  | ||||||
|  | install(show_locals=True) | ||||||
|  |  | ||||||
|  | logger = logging.getLogger("vm_management") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Logging is https://www.youtube.com/watch?v=9L77QExPmI0 | ||||||
|  | def setup_logging(): | ||||||
|  |     config_file = pathlib.Path("logging_configs/config.json") | ||||||
|  |     with open(config_file, "r") as config_file: | ||||||
|  |         config = json.load(config_file) | ||||||
|  |     logging.config.dictConfig(config) | ||||||
|  |     queue_handler = logging.getHandlerByName("queue_handler") | ||||||
|  |     if queue_handler is not None: | ||||||
|  |         queue_handler.listener.start() | ||||||
|  |         atexit.register(queue_handler.listener.stop) | ||||||
|  |  | ||||||
|  |  | ||||||
| def main(): | def main(): | ||||||
|     print("Hello from vm-management!") |     setup_logging() | ||||||
|  |     gnupg_home = os.path.expanduser("~/.gnupg") | ||||||
|  |     gpg = gnupg.GPG(gnupghome=gnupg_home) | ||||||
|  |     gpg.encoding = "utf-8" | ||||||
|  |     vault_secret_file = os.path.expanduser("~/Downloads/hashicorp_vault_token.gpg") | ||||||
|  |     with open(vault_secret_file, "rb") as vault_secret_file: | ||||||
|  |         vault_secret = gpg.decrypt_file(vault_secret_file, passphrase="pw") | ||||||
|  |         logger.debug("vault secret: %s", vault_secret) | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|   | |||||||
| @@ -6,4 +6,12 @@ readme = "README.md" | |||||||
| requires-python = ">=3.13" | requires-python = ">=3.13" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|     "hvac>=2.3.0", |     "hvac>=2.3.0", | ||||||
|  |     "python-gnupg>=0.5.4", | ||||||
|  |     "python-json-logger>=3.2.1", | ||||||
|  |     "rich>=13.9.4", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [dependency-groups] | ||||||
|  | dev = [ | ||||||
|  |     "ruff>=0.9.9", | ||||||
| ] | ] | ||||||
							
								
								
									
										104
									
								
								uv.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										104
									
								
								uv.lock
									
									
									
										generated
									
									
									
								
							| @@ -54,6 +54,54 @@ wheels = [ | |||||||
|     { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, |     { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "markdown-it-py" | ||||||
|  | version = "3.0.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "mdurl" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "mdurl" | ||||||
|  | version = "0.1.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pygments" | ||||||
|  | version = "2.19.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "python-gnupg" | ||||||
|  | version = "0.5.4" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f1/3e/ba0dc69c9f4e0aeb24d93175230ef057c151790a7516012f61014918992d/python-gnupg-0.5.4.tar.gz", hash = "sha256:f2fdb5fb29615c77c2743e1cb3d9314353a6e87b10c37d238d91ae1c6feae086", size = 65705 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/7b/5b/6666ed5a0d3ce4d5444af62e373d5ba8ab253a03487c86f2f9f1078e7c31/python_gnupg-0.5.4-py2.py3-none-any.whl", hash = "sha256:40ce25cde9df29af91fe931ce9df3ce544e14a37f62b13ca878c897217b2de6c", size = 21730 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "python-json-logger" | ||||||
|  | version = "3.2.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "requests" | name = "requests" | ||||||
| version = "2.32.3" | version = "2.32.3" | ||||||
| @@ -69,6 +117,44 @@ wheels = [ | |||||||
|     { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, |     { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "rich" | ||||||
|  | version = "13.9.4" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "markdown-it-py" }, | ||||||
|  |     { name = "pygments" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "ruff" | ||||||
|  | version = "0.9.9" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/6f/c3/418441a8170e8d53d05c0b9dad69760dbc7b8a12c10dbe6db1e1205d2377/ruff-0.9.9.tar.gz", hash = "sha256:0062ed13f22173e85f8f7056f9a24016e692efeea8704d1a5e8011b8aa850933", size = 3717448 } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/bc/c3/2c4afa9ba467555d074b146d9aed0633a56ccdb900839fb008295d037b89/ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367", size = 10027252 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/33/d1/439e58487cf9eac26378332e25e7d5ade4b800ce1eec7dc2cfc9b0d7ca96/ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7", size = 10840721 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/50/44/fead822c38281ba0122f1b76b460488a175a9bd48b130650a6fb6dbcbcf9/ruff-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ee162652869120ad260670706f3cd36cd3f32b0c651f02b6da142652c54941d", size = 10161439 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/11/ae/d404a2ab8e61ddf6342e09cc6b7f7846cce6b243e45c2007dbe0ca928a5d/ruff-0.9.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa0f6b75082c9be1ec5a1db78c6d4b02e2375c3068438241dc19c7c306cc61a", size = 10336264 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6a/4e/7c268aa7d84cd709fb6f046b8972313142cffb40dfff1d2515c5e6288d54/ruff-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:584cc66e89fb5f80f84b05133dd677a17cdd86901d6479712c96597a3f28e7fe", size = 9908774 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/cc/26/c618a878367ef1b76270fd027ca93692657d3f6122b84ba48911ef5f2edc/ruff-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf3369325761a35aba75cd5c55ba1b5eb17d772f12ab168fbfac54be85cf18c", size = 11428127 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/d7/9a/c5588a93d9bfed29f565baf193fe802fa676a0c837938137ea6cf0576d8c/ruff-0.9.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3403a53a32a90ce929aa2f758542aca9234befa133e29f4933dcef28a24317be", size = 12133187 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/3e/ff/e7980a7704a60905ed7e156a8d73f604c846d9bd87deda9cabfa6cba073a/ruff-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18454e7fa4e4d72cffe28a37cf6a73cb2594f81ec9f4eca31a0aaa9ccdfb1590", size = 11602937 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/24/78/3690444ad9e3cab5c11abe56554c35f005b51d1d118b429765249095269f/ruff-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fadfe2c88724c9617339f62319ed40dcdadadf2888d5afb88bf3adee7b35bfb", size = 13771698 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6e/bf/e477c2faf86abe3988e0b5fd22a7f3520e820b2ee335131aca2e16120038/ruff-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df104d08c442a1aabcfd254279b8cc1e2cbf41a605aa3e26610ba1ec4acf0b0", size = 11249026 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f7/82/cdaffd59e5a8cb5b14c408c73d7a555a577cf6645faaf83e52fe99521715/ruff-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d7c62939daf5b2a15af48abbd23bea1efdd38c312d6e7c4cedf5a24e03207e17", size = 10220432 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/fe/a4/2507d0026225efa5d4412b6e294dfe54725a78652a5c7e29e6bd0fc492f3/ruff-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9494ba82a37a4b81b6a798076e4a3251c13243fc37967e998efe4cce58c8a8d1", size = 9874602 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/d5/be/f3aab1813846b476c4bcffe052d232244979c3cd99d751c17afb530ca8e4/ruff-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4efd7a96ed6d36ef011ae798bf794c5501a514be369296c672dab7921087fa57", size = 10851212 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8b/45/8e5fd559bea0d2f57c4e12bf197a2fade2fac465aa518284f157dfbca92b/ruff-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab90a7944c5a1296f3ecb08d1cbf8c2da34c7e68114b1271a431a3ad30cb660e", size = 11327490 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/42/55/e6c90f13880aeef327746052907e7e930681f26a164fe130ddac28b08269/ruff-0.9.9-py3-none-win32.whl", hash = "sha256:6b4c376d929c25ecd6d87e182a230fa4377b8e5125a4ff52d506ee8c087153c1", size = 10227912 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/35/b2/da925693cb82a1208aa34966c0f36cb222baca94e729dd22a587bc22d0f3/ruff-0.9.9-py3-none-win_amd64.whl", hash = "sha256:837982ea24091d4c1700ddb2f63b7070e5baec508e43b01de013dc7eff974ff1", size = 11355632 }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/31/d8/de873d1c1b020d668d8ec9855d390764cb90cf8f6486c0983da52be8b7b7/ruff-0.9.9-py3-none-win_arm64.whl", hash = "sha256:3ac78f127517209fe6d96ab00f3ba97cafe38718b23b1db3e96d8b2d39e37ddf", size = 10435860 }, | ||||||
|  | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "urllib3" | name = "urllib3" | ||||||
| version = "2.3.0" | version = "2.3.0" | ||||||
| @@ -84,7 +170,23 @@ version = "0.1.0" | |||||||
| source = { virtual = "." } | source = { virtual = "." } | ||||||
| dependencies = [ | dependencies = [ | ||||||
|     { name = "hvac" }, |     { name = "hvac" }, | ||||||
|  |     { name = "python-gnupg" }, | ||||||
|  |     { name = "python-json-logger" }, | ||||||
|  |     { name = "rich" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dev-dependencies] | ||||||
|  | dev = [ | ||||||
|  |     { name = "ruff" }, | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [package.metadata] | [package.metadata] | ||||||
| requires-dist = [{ name = "hvac", specifier = ">=2.3.0" }] | requires-dist = [ | ||||||
|  |     { name = "hvac", specifier = ">=2.3.0" }, | ||||||
|  |     { name = "python-gnupg", specifier = ">=0.5.4" }, | ||||||
|  |     { name = "python-json-logger", specifier = ">=3.2.1" }, | ||||||
|  |     { name = "rich", specifier = ">=13.9.4" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.metadata.requires-dev] | ||||||
|  | dev = [{ name = "ruff", specifier = ">=0.9.9" }] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user