diff --git a/poetry.lock b/poetry.lock index 941a5a40..5b0931c9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.8.4" description = "Async http client/server framework (asyncio)" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +126,6 @@ frozenlist = ">=1.1.0" name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -140,7 +137,6 @@ files = [ name = "algokit-client-generator" version = "1.0.2" description = "Algorand typed client Generator" -category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ @@ -154,7 +150,6 @@ algokit-utils = ">=1.2.0,<2.0.0" name = "algokit-utils" version = "1.3.0" description = "Utilities for Algorand development for use by AlgoKit" -category = "main" optional = false python-versions = ">=3.10,<4.0" files = [ @@ -168,7 +163,6 @@ py-algorand-sdk = ">=2.2.0,<3.0.0" name = "allpairspy" version = "2.5.0" description = "Pairwise test combinations generator" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -188,7 +182,6 @@ test = ["pytest"] name = "anyio" version = "3.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -210,7 +203,6 @@ trio = ["trio (<0.22)"] name = "approval-utilities" version = "7.4.0" description = "Utilities for your production code that work well with approvaltests" -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -222,7 +214,6 @@ files = [ name = "approvaltests" version = "7.4.0" description = "Assertion/verification library to aid testing" -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -244,7 +235,6 @@ typing-extensions = ">=3.6.2" name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -256,7 +246,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -275,7 +264,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -287,7 +275,6 @@ files = [ name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -306,7 +293,6 @@ lxml = ["lxml"] name = "black" version = "23.3.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -356,7 +342,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -375,7 +360,6 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] name = "cachecontrol" version = "0.13.1" description = "httplib2 caching for requests" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -397,7 +381,6 @@ redis = ["redis (>=2.10.5)"] name = "certifi" version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -409,7 +392,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -486,7 +468,6 @@ pycparser = "*" name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -498,7 +479,6 @@ files = [ name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -583,7 +563,6 @@ files = [ name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -598,7 +577,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-log" version = "0.4.0" description = "Logging integration for Click" -category = "dev" optional = false python-versions = "*" files = [ @@ -613,7 +591,6 @@ click = "*" name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -625,7 +602,6 @@ files = [ name = "copier" version = "7.1.0" description = "A library for rendering project templates." -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -652,7 +628,6 @@ questionary = ">=1.8.1" name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -726,31 +701,34 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.1" +version = "41.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, - {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, - {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, - {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, ] [package.dependencies] @@ -770,7 +748,6 @@ test-randomorder = ["pytest-randomly"] name = "cyclonedx-python-lib" version = "4.0.1" description = "A library for producing CycloneDX SBOM (Software Bill of Materials) files." -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -787,7 +764,6 @@ sortedcontainers = ">=2.4.0,<3.0.0" name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -799,7 +775,6 @@ files = [ name = "distlib" version = "0.3.6" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -811,7 +786,6 @@ files = [ name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -823,7 +797,6 @@ files = [ name = "dotty-dict" version = "1.3.1" description = "Dictionary wrapper for quick access to deeply nested keys." -category = "dev" optional = false python-versions = ">=3.5,<4.0" files = [ @@ -835,7 +808,6 @@ files = [ name = "dunamai" version = "1.17.0" description = "Dynamic version generation" -category = "main" optional = false python-versions = ">=3.5,<4.0" files = [ @@ -850,7 +822,6 @@ packaging = ">=20.9" name = "empty-files" version = "0.0.4" description = "Serves empty files of many types" -category = "dev" optional = false python-versions = ">=3.7.1" files = [ @@ -865,7 +836,6 @@ requests = "*" name = "exceptiongroup" version = "1.1.2" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -880,7 +850,6 @@ test = ["pytest (>=6)"] name = "filelock" version = "3.12.2" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -896,7 +865,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p name = "frozenlist" version = "1.3.3" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -980,7 +948,6 @@ files = [ name = "funcy" version = "2.0" description = "A fancy and practical functional tools" -category = "main" optional = false python-versions = "*" files = [ @@ -992,7 +959,6 @@ files = [ name = "gfm-toc" version = "0.0.7" description = "Simple and customizable way to generate TOC for Github Markdown files." -category = "dev" optional = false python-versions = "*" files = [ @@ -1004,7 +970,6 @@ files = [ name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1019,7 +984,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.31" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1034,7 +998,6 @@ gitdb = ">=4.0.1,<5" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1046,7 +1009,6 @@ files = [ name = "html2text" version = "2020.1.16" description = "Turn HTML into equivalent Markdown-structured text." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1058,7 +1020,6 @@ files = [ name = "html5lib" version = "1.1" description = "HTML parser based on the WHATWG HTML specification" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1080,7 +1041,6 @@ lxml = ["lxml"] name = "httpcore" version = "0.16.3" description = "A minimal low-level HTTP client." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1092,17 +1052,16 @@ files = [ anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" +sniffio = "==1.*" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "httpx" version = "0.23.3" description = "The next generation HTTP client." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1118,15 +1077,14 @@ sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "identify" version = "2.5.24" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1141,7 +1099,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1153,7 +1110,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1165,7 +1121,6 @@ files = [ name = "importlib-metadata" version = "6.7.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1185,7 +1140,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1197,7 +1151,6 @@ files = [ name = "invoke" version = "2.1.3" description = "Pythonic task execution" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1209,7 +1162,6 @@ files = [ name = "jaraco-classes" version = "3.2.3" description = "Utility functions for Python class constructs" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1228,7 +1180,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "jeepney" version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1244,7 +1195,6 @@ trio = ["async_generator", "trio"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1262,7 +1212,6 @@ i18n = ["Babel (>=2.7)"] name = "jinja2-ansible-filters" version = "1.3.2" description = "A port of Ansible's jinja2 filters without requiring ansible core." -category = "main" optional = false python-versions = "*" files = [ @@ -1281,7 +1230,6 @@ test = ["pytest", "pytest-cov"] name = "keyring" version = "24.2.0" description = "Store and access your passwords safely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1305,7 +1253,6 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1330,7 +1277,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1390,7 +1336,6 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1402,7 +1347,6 @@ files = [ name = "more-itertools" version = "9.1.0" description = "More routines for operating on iterables, beyond itertools" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1414,7 +1358,6 @@ files = [ name = "mrjob" version = "0.7.4" description = "Python MapReduce framework" -category = "dev" optional = false python-versions = "*" files = [ @@ -1436,7 +1379,6 @@ ujson = ["ujson"] name = "msgpack" version = "1.0.5" description = "MessagePack serializer" -category = "main" optional = false python-versions = "*" files = [ @@ -1509,7 +1451,6 @@ files = [ name = "mslex" version = "1.1.0" description = "shlex for windows" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1521,7 +1462,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1605,7 +1545,6 @@ files = [ name = "mypy" version = "1.4.1" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1652,7 +1591,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1664,7 +1602,6 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -1679,7 +1616,6 @@ setuptools = "*" name = "packageurl-python" version = "0.11.1" description = "A purl aka. Package URL parser and builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1696,7 +1632,6 @@ test = ["pytest"] name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1708,7 +1643,6 @@ files = [ name = "pasteboard" version = "0.3.3" description = "Pasteboard - Python interface for reading from NSPasteboard (macOS clipboard)" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -1723,7 +1657,6 @@ files = [ name = "pastel" version = "0.2.1" description = "Bring colors to your terminal." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1735,7 +1668,6 @@ files = [ name = "pathspec" version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1747,7 +1679,6 @@ files = [ name = "pip" version = "23.1.2" description = "The PyPA recommended tool for installing Python packages." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1759,7 +1690,6 @@ files = [ name = "pip-api" version = "0.0.30" description = "An unofficial, importable pip API" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1774,7 +1704,6 @@ pip = "*" name = "pip-audit" version = "2.6.0" description = "A tool for scanning Python environments for known vulnerabilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1803,7 +1732,6 @@ test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] name = "pip-requirements-parser" version = "32.0.1" description = "pip requirements parser - a mostly correct pip requirements parsing library because it uses pip's own code." -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -1823,7 +1751,6 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte name = "pkginfo" version = "1.9.6" description = "Query metadata from sdists / bdists / installed packages." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1838,7 +1765,6 @@ testing = ["pytest", "pytest-cov"] name = "platformdirs" version = "3.8.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1854,7 +1780,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest- name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1870,7 +1795,6 @@ testing = ["pytest", "pytest-benchmark"] name = "plumbum" version = "1.8.2" description = "Plumbum: shell combinators library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1890,7 +1814,6 @@ ssh = ["paramiko"] name = "poethepoet" version = "0.17.1" description = "A task runner that works well with poetry." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1909,7 +1832,6 @@ poetry-plugin = ["poetry (>=1.0,<2.0)"] name = "pre-commit" version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1928,7 +1850,6 @@ virtualenv = ">=20.10.0" name = "prompt-toolkit" version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -1943,7 +1864,6 @@ wcwidth = "*" name = "py-algorand-sdk" version = "2.3.0" description = "Algorand SDK in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1960,7 +1880,6 @@ pynacl = ">=1.4.0,<2" name = "py-serializable" version = "0.11.1" description = "Library for serializing and deserializing Python Objects to and from JSON and XML." -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1975,7 +1894,6 @@ defusedxml = ">=0.7.1,<0.8.0" name = "pyclip" version = "0.7.0" description = "Cross-platform clipboard utilities supporting both binary and text data." -category = "main" optional = false python-versions = "*" files = [ @@ -1994,7 +1912,6 @@ test = ["pytest"] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2006,7 +1923,6 @@ files = [ name = "pycryptodomex" version = "3.18.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2048,7 +1964,6 @@ files = [ name = "pydantic" version = "1.10.8" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2101,7 +2016,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydash" version = "7.0.4" description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2119,7 +2033,6 @@ dev = ["Sphinx", "black", "build", "coverage", "docformatter", "flake8", "flake8 name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2134,7 +2047,6 @@ plugins = ["importlib-metadata"] name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2154,14 +2066,13 @@ files = [ cffi = ">=1.4.1" [package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx_rtd_theme"] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyparsing" version = "3.1.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" optional = false python-versions = ">=3.6.8" files = [ @@ -2176,7 +2087,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyperclip" version = "1.8.2" description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -category = "dev" optional = false python-versions = "*" files = [ @@ -2187,7 +2097,6 @@ files = [ name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2210,7 +2119,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2229,7 +2137,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-httpx" version = "0.21.3" description = "Send responses to httpx." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2238,17 +2145,16 @@ files = [ ] [package.dependencies] -httpx = ">=0.23.0,<0.24.0" +httpx = "==0.23.*" pytest = ">=6.0,<8.0" [package.extras] -testing = ["pytest-asyncio (>=0.20.0,<0.21.0)", "pytest-cov (>=4.0.0,<5.0.0)"] +testing = ["pytest-asyncio (==0.20.*)", "pytest-cov (==4.*)"] [[package]] name = "pytest-mock" version = "3.11.1" description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2266,7 +2172,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "python-dotenv" version = "1.0.0" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2281,7 +2186,6 @@ cli = ["click (>=5.0)"] name = "python-gitlab" version = "3.15.0" description = "Interact with GitLab API" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2301,7 +2205,6 @@ yaml = ["PyYaml (>=5.2)"] name = "python-semantic-release" version = "7.34.6" description = "Automatic Semantic Versioning for Python projects" -category = "dev" optional = false python-versions = "*" files = [ @@ -2333,7 +2236,6 @@ test = ["coverage (>=5,<6)", "mock (==1.3.0)", "pytest (>=7,<8)", "pytest-mock ( name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -2357,7 +2259,6 @@ files = [ name = "pywin32-ctypes" version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2369,7 +2270,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2419,7 +2319,6 @@ files = [ name = "pyyaml-include" version = "1.3.1" description = "Extending PyYAML with a custom constructor for including YAML files within YAML files" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2437,7 +2336,6 @@ toml = ["toml"] name = "questionary" version = "1.10.0" description = "Python library to build pretty command line user prompts ⭐️" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -2455,7 +2353,6 @@ docs = ["Sphinx (>=3.3,<4.0)", "sphinx-autobuild (>=2020.9.1,<2021.0.0)", "sphin name = "readme-renderer" version = "40.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2475,7 +2372,6 @@ md = ["cmarkgfm (>=0.8.0)"] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2497,7 +2393,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2512,7 +2407,6 @@ requests = ">=2.0.1,<3.0.0" name = "rfc3986" version = "1.5.0" description = "Validating URI References per RFC 3986" -category = "main" optional = false python-versions = "*" files = [ @@ -2530,7 +2424,6 @@ idna2008 = ["idna"] name = "rich" version = "13.4.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2549,7 +2442,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "ruff" version = "0.0.275" description = "An extremely fast Python linter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2576,7 +2468,6 @@ files = [ name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2592,7 +2483,6 @@ jeepney = ">=0.6" name = "semver" version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2604,7 +2494,6 @@ files = [ name = "setuptools" version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2621,7 +2510,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "shellingham" version = "1.5.0.post1" description = "Tool to Detect Surrounding Shell" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2633,7 +2521,6 @@ files = [ name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2645,7 +2532,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2657,7 +2543,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2669,7 +2554,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -2681,7 +2565,6 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "dev" optional = false python-versions = "*" files = [ @@ -2693,7 +2576,6 @@ files = [ name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2705,7 +2587,6 @@ files = [ name = "sphinx" version = "6.2.1" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2740,7 +2621,6 @@ test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] name = "sphinx-click" version = "4.4.0" description = "Sphinx extension that automatically documents click applications" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2757,7 +2637,6 @@ sphinx = ">=2.0" name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2773,7 +2652,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2789,7 +2667,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2805,7 +2682,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2820,7 +2696,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2836,7 +2711,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2852,7 +2726,6 @@ test = ["pytest"] name = "sphinxnotes-markdown-builder" version = "0.5.6" description = "sphinx builder that outputs markdown files, an active fork of clayrisser/sphinx-markdown-builder" -category = "dev" optional = false python-versions = "*" files = [ @@ -2871,7 +2744,6 @@ yapf = "*" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2883,7 +2755,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2895,7 +2766,6 @@ files = [ name = "tomlkit" version = "0.11.8" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2907,7 +2777,6 @@ files = [ name = "tqdm" version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2928,7 +2797,6 @@ telegram = ["requests"] name = "twine" version = "3.8.0" description = "Collection of utilities for publishing packages on PyPI" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2952,7 +2820,6 @@ urllib3 = ">=1.26.0" name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2964,7 +2831,6 @@ files = [ name = "unify" version = "0.5" description = "Modifies strings to all use the same (single/double) quote where possible." -category = "dev" optional = false python-versions = "*" files = [ @@ -2978,7 +2844,6 @@ untokenize = "*" name = "untokenize" version = "0.1.1" description = "Transforms tokens into original source code (while preserving whitespace)." -category = "dev" optional = false python-versions = "*" files = [ @@ -2989,7 +2854,6 @@ files = [ name = "urllib3" version = "2.0.3" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3007,7 +2871,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "virtualenv" version = "20.23.1" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3028,10 +2891,10 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, ] @@ -3039,7 +2902,6 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -3051,7 +2913,6 @@ files = [ name = "wheel" version = "0.40.0" description = "A built-package format for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3066,7 +2927,6 @@ test = ["pytest (>=6.0.0)"] name = "yapf" version = "0.40.1" description = "A formatter for Python code." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3083,7 +2943,6 @@ tomli = ">=2.0.1" name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3171,7 +3030,6 @@ multidict = ">=4.0" name = "zipp" version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" optional = false python-versions = ">=3.7" files = [ diff --git a/src/algokit/cli/deploy.py b/src/algokit/cli/deploy.py index 4da4a8e6..f1bc2653 100644 --- a/src/algokit/cli/deploy.py +++ b/src/algokit/cli/deploy.py @@ -7,7 +7,7 @@ from algokit.core import proc from algokit.core.conf import ALGOKIT_CONFIG -from algokit.core.deploy import load_deploy_config, load_env_files, parse_command +from algokit.core.deploy import load_deploy_config, load_env_files, parse_command, resolve_command logger = logging.getLogger(__name__) @@ -31,7 +31,7 @@ def convert( str_value = super().convert(value=value, param=param, ctx=ctx) try: return parse_command(str_value) - except Exception as ex: + except ValueError as ex: logger.debug(f"Failed to parse command string: {str_value}", exc_info=True) raise click.BadParameter(str(ex), param=param, ctx=ctx) from ex @@ -80,7 +80,8 @@ def deploy_command( "and no generic command." ) raise click.ClickException(msg) - logger.info(f"Using deploy command: {' '.join(config.command)}") + resolved_command = resolve_command(config.command) + logger.info(f"Using deploy command: {' '.join(resolved_command)}") # TODO: [future-note] do we want to walk up for env/config? logger.info("Loading deployment environment variables...") config_dotenv = load_env_files(environment_name, path) @@ -90,11 +91,13 @@ def deploy_command( _ensure_environment_secrets(config_env, config.environment_secrets, skip_mnemonics_prompts=not interactive) logger.info("Deploying smart contracts from AlgoKit compliant repository 🚀") try: - result = proc.run(config.command, cwd=path, env=config_env, stdout_log_level=logging.INFO) + result = proc.run(resolved_command, cwd=path, env=config_env, stdout_log_level=logging.INFO) except FileNotFoundError as ex: - raise click.ClickException(f"Failed to execute deploy command, '{config.command[0]}' wasn't found") from ex + raise click.ClickException(f"Failed to execute deploy command, '{resolved_command[0]}' wasn't found") from ex except PermissionError as ex: - raise click.ClickException(f"Failed to execute deploy command '{config.command[0]}', permission denied") from ex + raise click.ClickException( + f"Failed to execute deploy command '{resolved_command[0]}', permission denied" + ) from ex else: if result.exit_code != 0: raise click.ClickException(f"Deployment command exited with error code = {result.exit_code}") diff --git a/src/algokit/core/deploy.py b/src/algokit/core/deploy.py index 871386e7..605de2c8 100644 --- a/src/algokit/core/deploy.py +++ b/src/algokit/core/deploy.py @@ -1,6 +1,7 @@ import dataclasses import logging import platform +import shutil from pathlib import Path import click @@ -69,7 +70,8 @@ def load_deploy_config(name: str | None, project_dir: Path) -> DeployConfig: case {"command": str(command)}: try: deploy_config.command = parse_command(command) - except Exception as ex: + except ValueError as ex: + logger.debug(f"Failed to parse command string: {command}", exc_info=True) raise click.ClickException(f"Failed to parse command '{command}': {ex}") from ex case {"command": list(command_parts)}: deploy_config.command = [str(x) for x in command_parts] @@ -93,3 +95,14 @@ def parse_command(command: str) -> list[str]: import shlex return shlex.split(command) + + +def resolve_command(command: list[str]) -> list[str]: + cmd, *args = command + # if the command has any path separators or such, don't try and resolve + if Path(cmd).name != cmd: + return command + resolved_cmd = shutil.which(cmd) + if not resolved_cmd: + raise click.ClickException(f"Failed to resolve deploy command, '{cmd}' wasn't found") + return [resolved_cmd, *args] diff --git a/tests/deploy/test_deploy.py b/tests/deploy/test_deploy.py index 564a1743..1835202d 100644 --- a/tests/deploy/test_deploy.py +++ b/tests/deploy/test_deploy.py @@ -9,6 +9,7 @@ from tests.utils.approvals import verify from tests.utils.click_invoker import invoke from tests.utils.proc_mock import ProcMock +from tests.utils.which_mock import WhichMock PYTHON_EXECUTABLE = sys.executable # need to use an escaped python executable path in config files for windows @@ -19,6 +20,13 @@ TEST_PYTHON_COMMAND = "print(' test_command_invocation ')" +@pytest.fixture(autouse=True) +def which_mock(mocker: MockerFixture) -> WhichMock: + which_mock = WhichMock() + mocker.patch("algokit.core.deploy.shutil.which").side_effect = which_mock.which + return which_mock + + def test_algokit_config_empty_array(tmp_path_factory: TempPathFactory) -> None: empty_array_config = """ [deploy] @@ -48,7 +56,9 @@ def test_algokit_config_invalid_syntax(tmp_path_factory: TempPathFactory) -> Non verify(result.output) -def test_algokit_config_name_overrides(tmp_path_factory: TempPathFactory, proc_mock: ProcMock) -> None: +def test_algokit_config_name_overrides( + tmp_path_factory: TempPathFactory, proc_mock: ProcMock, which_mock: WhichMock +) -> None: config_with_override = """ [deploy] command = "command_a" @@ -65,7 +75,8 @@ def test_algokit_config_name_overrides(tmp_path_factory: TempPathFactory, proc_m (cwd / ".env.localnet").touch() (cwd / ".env.testnet").touch() - proc_mock.set_output(["command_c"], ["picked testnet"]) + resolved_cmd = which_mock.add("command_c") + proc_mock.set_output([resolved_cmd], ["picked testnet"]) result = invoke(["deploy", "testnet"], cwd=cwd) @@ -73,7 +84,9 @@ def test_algokit_config_name_overrides(tmp_path_factory: TempPathFactory, proc_m verify(result.output) -def test_algokit_config_name_no_base(tmp_path_factory: TempPathFactory, proc_mock: ProcMock) -> None: +def test_algokit_config_name_no_base( + tmp_path_factory: TempPathFactory, proc_mock: ProcMock, which_mock: WhichMock +) -> None: config_with_override = """ [deploy.localnet] command = "command_a" @@ -86,7 +99,8 @@ def test_algokit_config_name_no_base(tmp_path_factory: TempPathFactory, proc_moc (cwd / ".env.localnet").touch() (cwd / ".env.testnet").touch() - proc_mock.set_output(["command_a"], ["picked localnet"]) + cmd = which_mock.add("command_a") + proc_mock.set_output([cmd], ["picked localnet"]) result = invoke(["deploy", "localnet"], cwd=cwd) @@ -113,9 +127,6 @@ def test_command_invocation_and_command_splitting(tmp_path: Path) -> None: def test_command_splitting_from_config(tmp_path: Path) -> None: - # note: spaces around the string inside print are important, - # we need to test the usage of shlex.split vs str.split, to handle - # splitting inside quotes properly config_data = rf""" [deploy] command = "{PYTHON_EXECUTABLE_ESCAPED} -c \"{TEST_PYTHON_COMMAND}\"" @@ -127,9 +138,6 @@ def test_command_splitting_from_config(tmp_path: Path) -> None: def test_command_without_splitting_from_config(tmp_path: Path) -> None: - # note: spaces around the string inside print are important, - # we need to test the usage of shlex.split vs str.split, to handle - # splitting inside quotes properly config_data = rf""" [deploy] command = ["{PYTHON_EXECUTABLE_ESCAPED}", "-c", "{TEST_PYTHON_COMMAND}"] @@ -140,31 +148,33 @@ def test_command_without_splitting_from_config(tmp_path: Path) -> None: verify(result.output.replace(PYTHON_EXECUTABLE, "")) -def test_command_not_found_and_no_config(proc_mock: ProcMock) -> None: +@pytest.mark.usefixtures("proc_mock") +def test_command_not_found_and_no_config(tmp_path: Path) -> None: cmd = "gm" - proc_mock.should_fail_on([cmd]) - result = invoke(["deploy", "--command", cmd]) + result = invoke(["deploy", "--command", cmd], cwd=tmp_path) assert result.exit_code != 0 verify(result.output) -def test_command_not_executable(proc_mock: ProcMock) -> None: +def test_command_not_executable(proc_mock: ProcMock, tmp_path: Path, which_mock: WhichMock) -> None: cmd = "gm" - proc_mock.should_deny_on([cmd]) - result = invoke(["deploy", "--command", cmd]) + cmd_resolved = which_mock.add(cmd) + proc_mock.should_deny_on([cmd_resolved]) + result = invoke(["deploy", "--command", cmd], cwd=tmp_path) assert result.exit_code != 0 verify(result.output) -def test_command_bad_exit_code(proc_mock: ProcMock) -> None: +def test_command_bad_exit_code(proc_mock: ProcMock, tmp_path: Path, which_mock: WhichMock) -> None: cmd = "gm" - proc_mock.should_bad_exit_on([cmd], output=["it is not morning"]) - result = invoke(["deploy", "--command", cmd]) + cmd_resolved = which_mock.add(cmd) + proc_mock.should_bad_exit_on([cmd_resolved], output=["it is not morning"]) + result = invoke(["deploy", "--command", cmd], cwd=tmp_path) assert result.exit_code != 0 verify(result.output) -def test_algokit_env_name_missing(tmp_path_factory: TempPathFactory) -> None: +def test_algokit_env_name_missing(tmp_path_factory: TempPathFactory, which_mock: WhichMock) -> None: config_with_override = """ [deploy.localnet] command = "command_a" @@ -173,6 +183,7 @@ def test_algokit_env_name_missing(tmp_path_factory: TempPathFactory) -> None: (cwd / ALGOKIT_CONFIG).write_text(config_with_override, encoding="utf-8") (cwd / ".env").touch() + which_mock.add("command_a") result = invoke(["deploy", "localnet"], cwd=cwd) assert result.exit_code == 1 @@ -180,7 +191,7 @@ def test_algokit_env_name_missing(tmp_path_factory: TempPathFactory) -> None: def test_algokit_env_and_name_correct_set( - tmp_path_factory: TempPathFactory, proc_mock: ProcMock, monkeypatch: pytest.MonkeyPatch + tmp_path_factory: TempPathFactory, proc_mock: ProcMock, monkeypatch: pytest.MonkeyPatch, which_mock: WhichMock ) -> None: env_config = """ ENV_A=GENERIC_ENV_A @@ -208,7 +219,8 @@ def test_algokit_env_and_name_correct_set( (cwd / ".env").write_text(env_config, encoding="utf-8") (cwd / ".env.localnet").write_text(env_name_config, encoding="utf-8") - proc_mock.set_output(["command_b"], ["picked localnet"]) + cmd_resolved = which_mock.add("command_b") + proc_mock.set_output([cmd_resolved], ["picked localnet"]) result = invoke(["deploy", "localnet"], cwd=cwd) @@ -222,7 +234,9 @@ def test_algokit_env_and_name_correct_set( verify(result.output) -def test_algokit_deploy_only_base_deploy_config(tmp_path_factory: TempPathFactory, proc_mock: ProcMock) -> None: +def test_algokit_deploy_only_base_deploy_config( + tmp_path_factory: TempPathFactory, proc_mock: ProcMock, which_mock: WhichMock +) -> None: config_with_only_base_deploy = """ [deploy] command = "command_a" @@ -236,7 +250,8 @@ def test_algokit_deploy_only_base_deploy_config(tmp_path_factory: TempPathFactor (cwd / ALGOKIT_CONFIG).write_text(config_with_only_base_deploy, encoding="utf-8") (cwd / ".env").write_text(env_config, encoding="utf-8") - proc_mock.set_output(["command_a"], ["picked base deploy command"]) + cmd_resolved = which_mock.add("command_a") + proc_mock.set_output([cmd_resolved], ["picked base deploy command"]) result = invoke(["deploy"], cwd=cwd) @@ -250,10 +265,13 @@ def test_algokit_deploy_only_base_deploy_config(tmp_path_factory: TempPathFactor def test_ci_flag_interactivity_mode_via_env( - tmp_path_factory: TempPathFactory, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch, proc_mock: ProcMock + tmp_path_factory: TempPathFactory, + mocker: MockerFixture, + monkeypatch: pytest.MonkeyPatch, + proc_mock: ProcMock, + which_mock: WhichMock, ) -> None: monkeypatch.setenv("CI", "true") - cwd = tmp_path_factory.mktemp("cwd") mock_prompt = mocker.patch("click.prompt") @@ -269,7 +287,8 @@ def test_ci_flag_interactivity_mode_via_env( (cwd / ALGOKIT_CONFIG).write_text(config_with_only_base_deploy, encoding="utf-8") (cwd / ".env").touch() - proc_mock.set_output(["command_a"], ["picked base deploy command"]) + cmd_resolved = which_mock.add("command_a") + proc_mock.set_output([cmd_resolved], ["picked base deploy command"]) result = invoke(["deploy"], cwd=cwd) @@ -280,10 +299,11 @@ def test_ci_flag_interactivity_mode_via_env( def test_ci_flag_interactivity_mode_via_cli( - tmp_path_factory: TempPathFactory, mocker: MockerFixture, proc_mock: ProcMock + tmp_path_factory: TempPathFactory, + mocker: MockerFixture, + proc_mock: ProcMock, + which_mock: WhichMock, ) -> None: - cwd = tmp_path_factory.mktemp("cwd") - mock_prompt = mocker.patch("click.prompt") config_with_only_base_deploy = """ @@ -298,7 +318,8 @@ def test_ci_flag_interactivity_mode_via_cli( (cwd / ALGOKIT_CONFIG).write_text(config_with_only_base_deploy, encoding="utf-8") (cwd / ".env").touch() - proc_mock.set_output(["command_a"], ["picked base deploy command"]) + cmd_resolved = which_mock.add("command_a") + proc_mock.set_output([cmd_resolved], ["picked base deploy command"]) result = invoke(["deploy", "--ci"], cwd=cwd) @@ -310,14 +331,16 @@ def test_ci_flag_interactivity_mode_via_cli( # environment_secrets set def test_secrets_prompting_via_stdin( - tmp_path_factory: TempPathFactory, mocker: MockerFixture, proc_mock: ProcMock, monkeypatch: pytest.MonkeyPatch + tmp_path_factory: TempPathFactory, + mocker: MockerFixture, + proc_mock: ProcMock, + monkeypatch: pytest.MonkeyPatch, + which_mock: WhichMock, ) -> None: # ensure Github Actions CI env var is not overriding behavior monkeypatch.delenv("CI", raising=False) # mock click.prompt - cwd = tmp_path_factory.mktemp("cwd") - mock_prompt = mocker.patch("click.prompt", return_value="secret_value") config_with_only_base_deploy = """ [deploy] @@ -330,7 +353,8 @@ def test_secrets_prompting_via_stdin( cwd = tmp_path_factory.mktemp("cwd") (cwd / ALGOKIT_CONFIG).write_text(config_with_only_base_deploy, encoding="utf-8") (cwd / ".env").touch() - proc_mock.set_output(["command_a"], ["picked base deploy command"]) + cmd_resolved = which_mock.add("command_a") + proc_mock.set_output([cmd_resolved], ["picked base deploy command"]) result = invoke(["deploy"], cwd=cwd) mock_prompt.assert_called_once() # ensure called @@ -346,8 +370,7 @@ def test_secrets_prompting_via_stdin( def test_deploy_custom_project_dir( - tmp_path_factory: TempPathFactory, - proc_mock: ProcMock, + tmp_path_factory: TempPathFactory, proc_mock: ProcMock, which_mock: WhichMock ) -> None: cwd = tmp_path_factory.mktemp("cwd") custom_folder = cwd / "custom_folder" @@ -361,7 +384,8 @@ def test_deploy_custom_project_dir( encoding="utf-8", ) (custom_folder / ".env.testnet").touch() - proc_mock.set_output(["command_a"], ["picked base deploy command"]) + cmd_resolved = which_mock.add("command_a") + proc_mock.set_output([cmd_resolved], ["picked base deploy command"]) input_answers = ["N"] @@ -372,3 +396,21 @@ def test_deploy_custom_project_dir( assert result.exit_code == 0 verify(result.output) + + +def test_deploy_shutil_command_not_found(tmp_path_factory: TempPathFactory) -> None: + cwd = tmp_path_factory.mktemp("cwd") + + (cwd / ALGOKIT_CONFIG).write_text( + """ +[deploy] +command = "command_a" + """.strip(), + encoding="utf-8", + ) + (cwd / ".env").touch() + + result = invoke("deploy", cwd=cwd) + + assert result.exit_code == 1 + verify(result.output) diff --git a/tests/deploy/test_deploy.test_algokit_config_name_no_base.approved.txt b/tests/deploy/test_deploy.test_algokit_config_name_no_base.approved.txt index b9b24489..7c601a17 100644 --- a/tests/deploy/test_deploy.test_algokit_config_name_no_base.approved.txt +++ b/tests/deploy/test_deploy.test_algokit_config_name_no_base.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_a' in '{current_working_directory}' -command_a: picked localnet +DEBUG: Running '/bin/command_a' in '{current_working_directory}' +/bin/command_a: picked localnet diff --git a/tests/deploy/test_deploy.test_algokit_config_name_overrides.approved.txt b/tests/deploy/test_deploy.test_algokit_config_name_overrides.approved.txt index 1cfaa68c..1b15fee8 100644 --- a/tests/deploy/test_deploy.test_algokit_config_name_overrides.approved.txt +++ b/tests/deploy/test_deploy.test_algokit_config_name_overrides.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_c +Using deploy command: /bin/command_c Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_c' in '{current_working_directory}' -command_c: picked testnet +DEBUG: Running '/bin/command_c' in '{current_working_directory}' +/bin/command_c: picked testnet diff --git a/tests/deploy/test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt b/tests/deploy/test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt index 459f1c32..4f5c01c9 100644 --- a/tests/deploy/test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt +++ b/tests/deploy/test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_a' in '{current_working_directory}' -command_a: picked base deploy command +DEBUG: Running '/bin/command_a' in '{current_working_directory}' +/bin/command_a: picked base deploy command diff --git a/tests/deploy/test_deploy.test_algokit_env_and_name_correct_set.approved.txt b/tests/deploy/test_deploy.test_algokit_env_and_name_correct_set.approved.txt index 775ab5bd..63c3a358 100644 --- a/tests/deploy/test_deploy.test_algokit_env_and_name_correct_set.approved.txt +++ b/tests/deploy/test_deploy.test_algokit_env_and_name_correct_set.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_b +Using deploy command: /bin/command_b Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_b' in '{current_working_directory}' -command_b: picked localnet +DEBUG: Running '/bin/command_b' in '{current_working_directory}' +/bin/command_b: picked localnet diff --git a/tests/deploy/test_deploy.test_algokit_env_name_missing.approved.txt b/tests/deploy/test_deploy.test_algokit_env_name_missing.approved.txt index 8c93d863..dc1d777d 100644 --- a/tests/deploy/test_deploy.test_algokit_env_name_missing.approved.txt +++ b/tests/deploy/test_deploy.test_algokit_env_name_missing.approved.txt @@ -1,6 +1,6 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Error: No such file: {current_working_directory}/.env.localnet diff --git a/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt b/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt index 3a9704fb..6c537d26 100644 --- a/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt +++ b/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt @@ -1,6 +1,6 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Error: Error: missing DEPLOYER_MNEMONIC environment variable diff --git a/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt b/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt index 3a9704fb..6c537d26 100644 --- a/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt +++ b/tests/deploy/test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt @@ -1,6 +1,6 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Error: Error: missing DEPLOYER_MNEMONIC environment variable diff --git a/tests/deploy/test_deploy.test_command_bad_exit_code.approved.txt b/tests/deploy/test_deploy.test_command_bad_exit_code.approved.txt index bb9dfbfb..de50b39c 100644 --- a/tests/deploy/test_deploy.test_command_bad_exit_code.approved.txt +++ b/tests/deploy/test_deploy.test_command_bad_exit_code.approved.txt @@ -2,9 +2,9 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml DEBUG: No .algokit.toml file found in the project directory. -Using deploy command: gm +Using deploy command: /bin/gm Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'gm' in '{current_working_directory}' -gm: it is not morning +DEBUG: Running '/bin/gm' in '{current_working_directory}' +/bin/gm: it is not morning Error: Deployment command exited with error code = -1 diff --git a/tests/deploy/test_deploy.test_command_not_executable.approved.txt b/tests/deploy/test_deploy.test_command_not_executable.approved.txt index 001625e8..78ad523c 100644 --- a/tests/deploy/test_deploy.test_command_not_executable.approved.txt +++ b/tests/deploy/test_deploy.test_command_not_executable.approved.txt @@ -2,8 +2,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml DEBUG: No .algokit.toml file found in the project directory. -Using deploy command: gm +Using deploy command: /bin/gm Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'gm' in '{current_working_directory}' -Error: Failed to execute deploy command 'gm', permission denied +DEBUG: Running '/bin/gm' in '{current_working_directory}' +Error: Failed to execute deploy command '/bin/gm', permission denied diff --git a/tests/deploy/test_deploy.test_command_not_found_and_no_config.approved.txt b/tests/deploy/test_deploy.test_command_not_found_and_no_config.approved.txt index 69c57c0c..f584bbb0 100644 --- a/tests/deploy/test_deploy.test_command_not_found_and_no_config.approved.txt +++ b/tests/deploy/test_deploy.test_command_not_found_and_no_config.approved.txt @@ -2,8 +2,4 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml DEBUG: No .algokit.toml file found in the project directory. -Using deploy command: gm -Loading deployment environment variables... -Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'gm' in '{current_working_directory}' -Error: Failed to execute deploy command, 'gm' wasn't found +Error: Failed to resolve deploy command, 'gm' wasn't found diff --git a/tests/deploy/test_deploy.test_deploy_custom_project_dir.approved.txt b/tests/deploy/test_deploy.test_deploy_custom_project_dir.approved.txt index 9ed94852..737d30d3 100644 --- a/tests/deploy/test_deploy.test_deploy_custom_project_dir.approved.txt +++ b/tests/deploy/test_deploy.test_deploy_custom_project_dir.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory}/custom_folder DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/custom_folder/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_a' in '{current_working_directory}/custom_folder' -command_a: picked base deploy command +DEBUG: Running '/bin/command_a' in '{current_working_directory}/custom_folder' +/bin/command_a: picked base deploy command diff --git a/tests/deploy/test_deploy.test_deploy_shutil_command_not_found.approved.txt b/tests/deploy/test_deploy.test_deploy_shutil_command_not_found.approved.txt new file mode 100644 index 00000000..402ba633 --- /dev/null +++ b/tests/deploy/test_deploy.test_deploy_shutil_command_not_found.approved.txt @@ -0,0 +1,4 @@ +DEBUG: Deploying from project directory: {current_working_directory} +DEBUG: Loading deploy command from project config +DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml +Error: Failed to resolve deploy command, 'command_a' wasn't found diff --git a/tests/deploy/test_deploy.test_deploy_windows_command_not_found.approved.txt b/tests/deploy/test_deploy.test_deploy_windows_command_not_found.approved.txt new file mode 100644 index 00000000..a00be4fe --- /dev/null +++ b/tests/deploy/test_deploy.test_deploy_windows_command_not_found.approved.txt @@ -0,0 +1,4 @@ +DEBUG: Deploying from project directory: {current_working_directory} +DEBUG: Loading deploy command from project config +DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml +Error: Failed to parse command 'command_a': Command not found: command_a diff --git a/tests/deploy/test_deploy.test_secrets_prompting_via_stdin.approved.txt b/tests/deploy/test_deploy.test_secrets_prompting_via_stdin.approved.txt index 459f1c32..4f5c01c9 100644 --- a/tests/deploy/test_deploy.test_secrets_prompting_via_stdin.approved.txt +++ b/tests/deploy/test_deploy.test_secrets_prompting_via_stdin.approved.txt @@ -1,8 +1,8 @@ DEBUG: Deploying from project directory: {current_working_directory} DEBUG: Loading deploy command from project config DEBUG: Attempting to load project config from {current_working_directory}/.algokit.toml -Using deploy command: command_a +Using deploy command: /bin/command_a Loading deployment environment variables... Deploying smart contracts from AlgoKit compliant repository 🚀 -DEBUG: Running 'command_a' in '{current_working_directory}' -command_a: picked base deploy command +DEBUG: Running '/bin/command_a' in '{current_working_directory}' +/bin/command_a: picked base deploy command