diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e341643b58..314ca5414f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,7 +82,9 @@ jobs: python-version: 3.11 - run: make init - run: | - diff <( cat schema/samcli.json ) <( python schema/make_schema.py; cat schema/samcli.json ) && exit 0 # exit if schema is unchanged + diff <( cat schema/samcli.json ) <( python -m schema.make_schema && cat schema/samcli.json ) && \ + echo "No changes found." && \ + exit 0 # exit if schema is unchanged echo "The generated schema differs from that in the PR. Please run 'make schema'." exit 1 name: Generate and compare the schema @@ -143,7 +145,7 @@ jobs: 3.11 3.12 ${{ matrix.python }} - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: '1.19' - uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 2f3b24755ed..8e0507afc63 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -46,7 +46,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -60,7 +60,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -73,6 +73,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/validate_pyinstaller.yml b/.github/workflows/validate_pyinstaller.yml index 912b0b73dda..4eefae4cb36 100644 --- a/.github/workflows/validate_pyinstaller.yml +++ b/.github/workflows/validate_pyinstaller.yml @@ -53,7 +53,7 @@ jobs: with: python-version: "3.8" - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: "1.20" - name: Build PyInstaller @@ -66,7 +66,7 @@ jobs: sudo ./sam-installation/install sam-beta --version ./tests/sanity-check.sh - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: pyinstaller-macos-zip path: .build/output/aws-sam-cli-macos-x86_64.zip diff --git a/appveyor-linux-binary.yml b/appveyor-linux-binary.yml index 6dc5dde8d78..b4a77fb9f0b 100644 --- a/appveyor-linux-binary.yml +++ b/appveyor-linux-binary.yml @@ -67,6 +67,10 @@ install: - sh: "PATH=/opt/gradle/gradle-8.4/bin:$PATH" - sh: "gradle --version" + # Install dotnet8 SDK + - sh: "sudo apt-get update" + - sh: "sudo apt-get install -y dotnet-sdk-8.0" + # Install AWS CLI - sh: "virtualenv aws_cli" - sh: "./aws_cli/bin/python -m pip install awscli" diff --git a/appveyor-ubuntu.yml b/appveyor-ubuntu.yml index a5966267217..9a16892b339 100644 --- a/appveyor-ubuntu.yml +++ b/appveyor-ubuntu.yml @@ -68,6 +68,10 @@ install: - sh: "PATH=/opt/gradle/gradle-8.4/bin:$PATH" - sh: "gradle --version" + # Install dotnet8 SDK + - sh: "sudo apt-get update" + - sh: "sudo apt-get install -y dotnet-sdk-8.0" + # Install AWS CLI - sh: "virtualenv aws_cli" - sh: "./aws_cli/bin/python -m pip install awscli" diff --git a/requirements/base.txt b/requirements/base.txt index 4df06a73493..8ff9bdc57db 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,23 +1,23 @@ chevron~=0.12 click~=8.1 Flask<3.1 -boto3>=1.26.109,<2 +boto3>=1.29.2,<2 jmespath~=1.0.1 ruamel_yaml~=0.18.5 PyYAML~=6.0,>=6.0.1 cookiecutter~=2.5.0 -aws-sam-translator==1.82.0 +aws-sam-translator==1.84.0 #docker minor version updates can include breaking changes. Auto update micro version only. -docker~=6.1.0 +docker~=7.0.0 dateparser~=1.2 requests~=2.31.0 -aws_lambda_builders==1.43.0 +aws_lambda_builders==1.45.0 tomlkit==0.12.3 watchdog==3.0.0 rich~=13.7.0 -pyopenssl~=23.3.0 +pyopenssl~=24.0.0 # Pin to <4.18 to until SAM-T no longer uses RefResolver -jsonschema<4.21 +jsonschema<4.22 # Needed for supporting Protocol in Python 3.7, Protocol class became public with python3.8 typing_extensions>=4.4.0,<5 @@ -28,7 +28,7 @@ regex!=2021.10.8 tzlocal==5.2 #Adding cfn-lint dependency for SAM validate -cfn-lint~=0.83.5 +cfn-lint~=0.85.0 # Type checking boto3 objects -boto3-stubs[apigateway,cloudformation,ecr,iam,lambda,s3,schemas,secretsmanager,signer,stepfunctions,sts,xray,sqs,kinesis]==1.34.0 +boto3-stubs[apigateway,cloudformation,ecr,iam,lambda,s3,schemas,secretsmanager,signer,stepfunctions,sts,xray,sqs,kinesis]==1.34.32 diff --git a/requirements/dev.txt b/requirements/dev.txt index 87c0c956c20..05585cb879d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,30 +1,30 @@ -r pre-dev.txt -coverage==7.3.2 +coverage==7.4.1 pytest-cov==4.1.0 # type checking and related stubs # mypy adds new rules in new minor versions, which could cause our PR check to fail # here we fix its version and upgrade it manually in the future -mypy==1.7.1 -types-pywin32==306.0.0.6 +mypy==1.8.0 +types-pywin32==306.0.0.20240130 types-PyYAML==6.0.12.12 -types-chevron==0.14.2.5 -types-psutil==5.9.5.17 -types-setuptools==68.2.0.2 -types-Pygments==2.17.0.0 -types-colorama==0.4.15.12 -types-dateparser==1.1.4.10 -types-docutils==0.20.0.3 -types-jsonschema==4.20.0.0 -types-pyOpenSSL==23.3.0.0 +types-chevron==0.14.2.20240106 +types-psutil==5.9.5.20240205 +types-setuptools==69.0.0.20240125 +types-Pygments==2.17.0.20240106 +types-colorama==0.4.15.20240205 +types-dateparser==1.1.4.20240106 +types-docutils==0.20.0.20240201 +types-jsonschema==4.21.0.20240118 +types-pyOpenSSL==24.0.0.20240130 # as of types-requests>=2.31.0.7, this now requires `urllib3>2`, pin we are able to upgrade types-requests==2.31.0.6 types-urllib3==1.26.25.14 # Test requirements -pytest~=7.4.3 +pytest~=7.4.4 parameterized==0.9.0 pytest-xdist==3.5.0 pytest-forked==1.6.0 @@ -36,5 +36,5 @@ pytest-json-report==1.5.0 filelock==3.13.1 # formatter -black==23.11.0 -psutil==5.9.6 +black==24.1.1 +psutil==5.9.8 diff --git a/requirements/pre-dev.txt b/requirements/pre-dev.txt index e89c4992b0a..2446b4802fa 100644 --- a/requirements/pre-dev.txt +++ b/requirements/pre-dev.txt @@ -1 +1 @@ -ruff==0.1.8 +ruff==0.2.0 diff --git a/requirements/pyinstaller-build.txt b/requirements/pyinstaller-build.txt index bcb0e32bb64..02a5aeda3e1 100644 --- a/requirements/pyinstaller-build.txt +++ b/requirements/pyinstaller-build.txt @@ -1,3 +1,3 @@ # Executable binary builder requirements -setuptools==69.0.2 -pyinstaller==6.2.0 +setuptools==69.0.3 +pyinstaller==6.3.0 diff --git a/requirements/reproducible-linux.txt b/requirements/reproducible-linux.txt index 23ee4974c23..b9416facb57 100644 --- a/requirements/reproducible-linux.txt +++ b/requirements/reproducible-linux.txt @@ -12,21 +12,21 @@ arrow==1.3.0 \ --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 # via cookiecutter -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # jschema-to-python # jsonschema # referencing # sarif-om -aws-lambda-builders==1.43.0 \ - --hash=sha256:15c4b497824a296690e9497dba93186544fbe8cf6af9afb1da2d3834ab84ab20 \ - --hash=sha256:9a2bc476f6fd86fe32584f083436e862b124fd71ae307a8a1a85fae458589d09 +aws-lambda-builders==1.45.0 \ + --hash=sha256:5c19a6628eecf21578cd9c521e747f4a2163c62c527cd840b11b62a10b661348 \ + --hash=sha256:a4db7766198c052900905bd7ee3b1a8b486511394cdabffed054204d43b29943 # via aws-sam-cli (setup.py) -aws-sam-translator==1.82.0 \ - --hash=sha256:29ba61f2a70b2b1cf0c76b92b78a23c7cdd19ea1b0a5992753180b56d040d20b \ - --hash=sha256:f78e58194461635aef6255d04e82a9b690e331ca9fd669d1401bf7f9a93ae49f +aws-sam-translator==1.84.0 \ + --hash=sha256:a24f43e80095c79258a1f1c7a0b8169f55daf0b2bc237d5b9010b02ba86fa3bb \ + --hash=sha256:dbfd5669b5ef4bd7bc7af4775eec2ce4db61a2c2a17d721e67b51cf6a6dd63f9 # via # aws-sam-cli (setup.py) # cfn-lint @@ -38,31 +38,31 @@ blinker==1.7.0 \ --hash=sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 \ --hash=sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182 # via flask -boto3==1.34.0 \ - --hash=sha256:8b3c4d4e720c0ad706590c284b8f30c76de3472c1ce1bac610425f99bf6ab53b \ - --hash=sha256:c9b400529932ed4652304756528ab235c6730aa5d00cb4d9e4848ce460c82c16 +boto3==1.34.32 \ + --hash=sha256:7bf924c942426839efd7fa5c2c4fe85dba208258393e8017a5ad327c30e5948d \ + --hash=sha256:9e62f42de2873baab96eb822386d6a3b1d77f6715cb9033d7b4e6e9ebb0cdbe7 # via # aws-sam-cli (setup.py) # aws-sam-translator -boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.0 \ - --hash=sha256:39ad9a9ab399c012713a719d90feb1dee819d310f136a0c7d7fddc477d7f251e \ - --hash=sha256:477b7da7432ab26123324249411111f2350e0b5ef0418e7bc1124600c810ac41 +boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.32 \ + --hash=sha256:077f13b0856862bedafb92b8499b960624d06f684595be701fade51a8e9615ed \ + --hash=sha256:27fc3b5b69379f0557d881d3f27c201c257eabff535d343ed5fd4a162a5fb389 # via # aws-sam-cli (setup.py) # boto3-stubs -botocore==1.34.0 \ - --hash=sha256:6ec19f6c9f61c3df22fb3e083940ac7946a3d96128db1f370f10aea702bb157f \ - --hash=sha256:711b406de910585395466ca649bceeea87a04300ddf74d9a2e20727c7f27f2f1 +botocore==1.34.32 \ + --hash=sha256:466aee158bd0429dbd567c4e2bdf7be9a0a5a74409f8b295c30f34d84c497f9c \ + --hash=sha256:aa26a74df83eed3db9542c1cf9108138794c344918b36a506c0723717f1acaab # via # boto3 # s3transfer -botocore-stubs==1.34.0 \ - --hash=sha256:13698a763521622f89808ac618eafdb79df49614b4a80bb5ecf894adfb45ac37 \ - --hash=sha256:5e3a4e2d0bc65657e4205745478847df78b4d485f5c5c5af9764f01685cf0536 +botocore-stubs==1.34.32 \ + --hash=sha256:978c97b8c02b5ffa3726a5052e5715aecc52c640a75a8088b3a58453c2b054b2 \ + --hash=sha256:e5b04b8ab81e736088470b7be244de072ac2f986caf0f51b7e2087400778dc9f # via boto3-stubs -certifi==2023.11.17 \ - --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ - --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 +certifi==2024.2.2 \ + --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ + --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -118,9 +118,9 @@ cffi==1.16.0 \ --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 # via cryptography -cfn-lint==0.83.5 \ - --hash=sha256:91145a94968f0f3c0095fcc4366602efb3b9f5eee413171845f298fa1227e0fa \ - --hash=sha256:97ed0b36f77defba9fe843d2401160c7bb2a81dd4478dd17859bac9f027da311 +cfn-lint==0.85.0 \ + --hash=sha256:64d6e8d85cdc573b61add78f9ff95a142a1834edb4793d1291551f6d953f73fe \ + --hash=sha256:e4849e1779bd1a9f4543617372708a20519b6d7cad5f980e20c6deaa227361a2 # via aws-sam-cli (setup.py) chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ @@ -233,42 +233,51 @@ cookiecutter==2.5.0 \ --hash=sha256:8aa2f12ed11bc05628651e9dc4353a10571dd9908aaaaeec959a2b9ea465a5d2 \ --hash=sha256:e61e9034748e3f41b8bd2c11f00d030784b48711c4d5c42363c50989a65331ec # via aws-sam-cli (setup.py) -cryptography==41.0.7 \ - --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ - --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ - --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ - --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ - --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ - --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ - --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ - --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ - --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ - --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ - --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ - --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ - --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ - --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ - --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ - --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ - --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ - --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ - --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ - --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ - --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ - --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ - --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d +cryptography==42.0.2 \ + --hash=sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380 \ + --hash=sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589 \ + --hash=sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea \ + --hash=sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65 \ + --hash=sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a \ + --hash=sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3 \ + --hash=sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008 \ + --hash=sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1 \ + --hash=sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2 \ + --hash=sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635 \ + --hash=sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2 \ + --hash=sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90 \ + --hash=sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee \ + --hash=sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a \ + --hash=sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242 \ + --hash=sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12 \ + --hash=sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2 \ + --hash=sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d \ + --hash=sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be \ + --hash=sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee \ + --hash=sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6 \ + --hash=sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529 \ + --hash=sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929 \ + --hash=sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1 \ + --hash=sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6 \ + --hash=sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a \ + --hash=sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446 \ + --hash=sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9 \ + --hash=sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888 \ + --hash=sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4 \ + --hash=sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33 \ + --hash=sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f # via pyopenssl dateparser==1.2.0 \ --hash=sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830 \ --hash=sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30 # via aws-sam-cli (setup.py) -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via aws-sam-cli (setup.py) -flask==3.0.0 \ - --hash=sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638 \ - --hash=sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58 +flask==3.0.1 \ + --hash=sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403 \ + --hash=sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 # via aws-sam-cli (setup.py) idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -278,9 +287,9 @@ itsdangerous==2.1.2 \ --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a # via flask -jinja2==3.1.2 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 +jinja2==3.1.3 \ + --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ + --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 # via # cookiecutter # flask @@ -307,16 +316,16 @@ jsonpointer==2.4 \ --hash=sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a \ --hash=sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88 # via jsonpatch -jsonschema==4.20.0 \ - --hash=sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa \ - --hash=sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3 +jsonschema==4.21.1 \ + --hash=sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f \ + --hash=sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5 # via # aws-sam-cli (setup.py) # aws-sam-translator # cfn-lint -jsonschema-specifications==2023.11.2 \ - --hash=sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8 \ - --hash=sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93 +jsonschema-specifications==2023.12.1 \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c # via jsonschema junit-xml==1.9 \ --hash=sha256:de16a051990d4e25a3982b2dd9e89d671067548718866416faec14d9de56db9f \ @@ -326,57 +335,67 @@ markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 +markupsafe==2.1.4 \ + --hash=sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69 \ + --hash=sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0 \ + --hash=sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d \ + --hash=sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec \ + --hash=sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5 \ + --hash=sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 \ + --hash=sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3 \ + --hash=sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74 \ + --hash=sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0 \ + --hash=sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949 \ + --hash=sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d \ + --hash=sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279 \ + --hash=sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f \ + --hash=sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6 \ + --hash=sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc \ + --hash=sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e \ + --hash=sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954 \ + --hash=sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656 \ + --hash=sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc \ + --hash=sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518 \ + --hash=sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56 \ + --hash=sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc \ + --hash=sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa \ + --hash=sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565 \ + --hash=sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 \ + --hash=sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb \ + --hash=sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250 \ + --hash=sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4 \ + --hash=sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 \ + --hash=sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc \ + --hash=sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474 \ + --hash=sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863 \ + --hash=sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8 \ + --hash=sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f \ + --hash=sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 \ + --hash=sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e \ + --hash=sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e \ + --hash=sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb \ + --hash=sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f \ + --hash=sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a \ + --hash=sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26 \ + --hash=sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d \ + --hash=sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2 \ + --hash=sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131 \ + --hash=sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789 \ + --hash=sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6 \ + --hash=sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a \ + --hash=sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858 \ + --hash=sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e \ + --hash=sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb \ + --hash=sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e \ + --hash=sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 \ + --hash=sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7 \ + --hash=sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea \ + --hash=sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b \ + --hash=sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6 \ + --hash=sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475 \ + --hash=sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74 \ + --hash=sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a \ + --hash=sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00 # via # jinja2 # werkzeug @@ -392,17 +411,17 @@ mypy-boto3-apigateway==1.34.0 \ --hash=sha256:372ca74ede1442cb7d171a7cc0b64d92900cda258790f07b9cd9b92886ef92ef \ --hash=sha256:3c724120971c74fb65a94eb7e4b92a3a4b28df6c70ca04a007072e6c73f6eda7 # via boto3-stubs -mypy-boto3-cloudformation==1.34.0 \ - --hash=sha256:4e63a2bca1882971881d65983acd774c2fc636bbc5dc8c3e1f4a41c539cf3c90 \ - --hash=sha256:9b25df9ef15d9dc8e4e892cc07aa9343f15f2ed5eb7d33eb5eb65adfa63f538f +mypy-boto3-cloudformation==1.34.32 \ + --hash=sha256:49d04c090dae3fd8289738ae592cac9d6faa5169684de40c2730b425bba2a32d \ + --hash=sha256:bfe5ec405eae6dae31dc9874729eef5e668e634eae8972032f00400d17bd2c7d # via boto3-stubs mypy-boto3-ecr==1.34.0 \ --hash=sha256:3346c02c22b16068c9acc67d990e32060bf7cdaea5f3d43c50e44308fbbc3439 \ --hash=sha256:b83fb0311e968a42d4ca821b006c18d4a3e3e364b8cebee758ea4fa97c5ac345 # via boto3-stubs -mypy-boto3-iam==1.34.0 \ - --hash=sha256:2485e753cfe138ece94bab1c4983d0db4dc76e25314d3ffdb9bde5c72ad1a92c \ - --hash=sha256:7edeac8ad54fc5f669d7d4b30fd9c744ed58c3ed36a55ad44179cf450d48e605 +mypy-boto3-iam==1.34.8 \ + --hash=sha256:0d13057a2141c5633b78ed0b1aed8f2f8a11a9c58a8a17a25622d966428a41b0 \ + --hash=sha256:6faf68cf800182924687b6711b3f9afa8d940ad993f259a3b91e55e82892d641 # via boto3-stubs mypy-boto3-kinesis==1.34.0 \ --hash=sha256:1add81c53f6e36599e0c22e142024867759aaf2f4954bcb2baa21c284c852377 \ @@ -412,17 +431,17 @@ mypy-boto3-lambda==1.34.0 \ --hash=sha256:109a7e126e84d6da6cacf8ab5c7c6f2be022417fe7bfb7f9b019767d7034f73b \ --hash=sha256:e74c0ce548da747a8c6e643c39dad8aa54d67e057f57740ec780a7e565590627 # via boto3-stubs -mypy-boto3-s3==1.34.0 \ - --hash=sha256:633876d2a96dbb924f9667084316c1759bff40c19a9a38313d5a4e825c5fc641 \ - --hash=sha256:7644a00e096ebb1c3292551059f64ff8329625dacd40827ced9481b14d64c733 +mypy-boto3-s3==1.34.14 \ + --hash=sha256:71c39ab0623cdb442d225b71c1783f6a513cff4c4a13505a2efbb2e3aff2e965 \ + --hash=sha256:f9669ecd182d5bf3532f5f2dcc5e5237776afe157ad5a0b37b26d6bec5fcc432 # via boto3-stubs mypy-boto3-schemas==1.34.0 \ --hash=sha256:28c016609dcffc606bd8425ee92894c46e943ab77033e1ae46481f00c39b7f75 \ --hash=sha256:3b25a71944192b0980c3bb5132deb7c06ee9b88580ed63f257fad97cf3bf2927 # via boto3-stubs -mypy-boto3-secretsmanager==1.34.0 \ - --hash=sha256:d3b0c26f4264775a2505cbd4a73a4efd5c4a151d8fcdcf938683afb1bf717a32 \ - --hash=sha256:f7c1a99a28e650ac91834db69a8dabe6734f9ace92f1d7a2d366160a11401133 +mypy-boto3-secretsmanager==1.34.17 \ + --hash=sha256:0dbd1cdbe7992324c3414cccf0256e3905827bbf1f6a8d58c255635f6a2b4bfb \ + --hash=sha256:a547932d99c3f711b27b9ea1c38fc063050910c0bf6c8eb346abd96ace61668e # via boto3-stubs mypy-boto3-signer==1.34.0 \ --hash=sha256:c11ed943ccd38ee54fc0ca90ed347ef770d695df49535eab96dd97fb3dbdc592 \ @@ -462,124 +481,98 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.6.0 \ + --hash=sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae \ + --hash=sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf # via aws-sam-translator -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.16.1 \ + --hash=sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7 \ + --hash=sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca \ + --hash=sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51 \ + --hash=sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da \ + --hash=sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc \ + --hash=sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae \ + --hash=sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4 \ + --hash=sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b \ + --hash=sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0 \ + --hash=sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e \ + --hash=sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118 \ + --hash=sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506 \ + --hash=sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798 \ + --hash=sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f \ + --hash=sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d \ + --hash=sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948 \ + --hash=sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f \ + --hash=sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9 \ + --hash=sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137 \ + --hash=sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640 \ + --hash=sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f \ + --hash=sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff \ + --hash=sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706 \ + --hash=sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d \ + --hash=sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f \ + --hash=sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c \ + --hash=sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8 \ + --hash=sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1 \ + --hash=sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7 \ + --hash=sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95 \ + --hash=sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60 \ + --hash=sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253 \ + --hash=sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e \ + --hash=sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c \ + --hash=sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc \ + --hash=sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3 \ + --hash=sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8 \ + --hash=sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9 \ + --hash=sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c \ + --hash=sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388 \ + --hash=sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95 \ + --hash=sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91 \ + --hash=sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818 \ + --hash=sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8 \ + --hash=sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f \ + --hash=sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394 \ + --hash=sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13 \ + --hash=sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17 \ + --hash=sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7 \ + --hash=sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06 \ + --hash=sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f \ + --hash=sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196 \ + --hash=sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66 \ + --hash=sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf \ + --hash=sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c \ + --hash=sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76 \ + --hash=sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0 \ + --hash=sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212 \ + --hash=sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f \ + --hash=sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49 \ + --hash=sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206 \ + --hash=sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48 \ + --hash=sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c \ + --hash=sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2 \ + --hash=sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05 \ + --hash=sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610 \ + --hash=sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd \ + --hash=sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76 \ + --hash=sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1 \ + --hash=sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60 \ + --hash=sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34 \ + --hash=sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4 \ + --hash=sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864 \ + --hash=sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66 \ + --hash=sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c \ + --hash=sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e \ + --hash=sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54 \ + --hash=sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8 \ + --hash=sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e # via pydantic pygments==2.17.2 \ --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via rich -pyopenssl==23.3.0 \ - --hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \ - --hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12 +pyopenssl==24.0.0 \ + --hash=sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf \ + --hash=sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3 # via aws-sam-cli (setup.py) python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ @@ -588,13 +581,13 @@ python-dateutil==2.8.2 \ # arrow # botocore # dateparser -python-slugify==8.0.1 \ - --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ - --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 +python-slugify==8.0.3 \ + --hash=sha256:c71189c161e8c671f1b141034d9a56308a8a5978cd13d40446c879569212fdd1 \ + --hash=sha256:e04cba5f1c562502a1175c84a8bc23890c54cdaf23fccaaf0bf78511508cabed # via cookiecutter -pytz==2023.3.post1 \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 +pytz==2024.1 \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 # via dateparser pyyaml==6.0.1 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ @@ -641,101 +634,106 @@ pyyaml==6.0.1 \ # aws-sam-cli (setup.py) # cfn-lint # cookiecutter -referencing==0.32.0 \ - --hash=sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161 \ - --hash=sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99 +referencing==0.33.0 \ + --hash=sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5 \ + --hash=sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7 # via # jsonschema # jsonschema-specifications -regex==2023.10.3 \ - --hash=sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a \ - --hash=sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07 \ - --hash=sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca \ - --hash=sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58 \ - --hash=sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54 \ - --hash=sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed \ - --hash=sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff \ - --hash=sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528 \ - --hash=sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9 \ - --hash=sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971 \ - --hash=sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14 \ - --hash=sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af \ - --hash=sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302 \ - --hash=sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec \ - --hash=sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597 \ - --hash=sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b \ - --hash=sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd \ - --hash=sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767 \ - --hash=sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f \ - --hash=sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6 \ - --hash=sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293 \ - --hash=sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be \ - --hash=sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41 \ - --hash=sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc \ - --hash=sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29 \ - --hash=sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964 \ - --hash=sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d \ - --hash=sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a \ - --hash=sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc \ - --hash=sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55 \ - --hash=sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af \ - --hash=sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930 \ - --hash=sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e \ - --hash=sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d \ - --hash=sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863 \ - --hash=sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c \ - --hash=sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f \ - --hash=sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e \ - --hash=sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d \ - --hash=sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368 \ - --hash=sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb \ - --hash=sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52 \ - --hash=sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8 \ - --hash=sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4 \ - --hash=sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac \ - --hash=sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e \ - --hash=sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2 \ - --hash=sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a \ - --hash=sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4 \ - --hash=sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa \ - --hash=sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533 \ - --hash=sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b \ - --hash=sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588 \ - --hash=sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0 \ - --hash=sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915 \ - --hash=sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841 \ - --hash=sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a \ - --hash=sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988 \ - --hash=sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292 \ - --hash=sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3 \ - --hash=sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c \ - --hash=sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f \ - --hash=sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420 \ - --hash=sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9 \ - --hash=sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f \ - --hash=sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0 \ - --hash=sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b \ - --hash=sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037 \ - --hash=sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b \ - --hash=sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee \ - --hash=sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c \ - --hash=sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b \ - --hash=sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353 \ - --hash=sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051 \ - --hash=sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039 \ - --hash=sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a \ - --hash=sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b \ - --hash=sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e \ - --hash=sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5 \ - --hash=sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf \ - --hash=sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94 \ - --hash=sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991 \ - --hash=sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711 \ - --hash=sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a \ - --hash=sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab \ - --hash=sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a \ - --hash=sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11 \ - --hash=sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48 +regex==2023.12.25 \ + --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ + --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ + --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ + --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ + --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ + --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ + --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ + --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ + --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ + --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ + --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ + --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ + --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ + --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ + --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ + --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ + --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ + --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ + --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ + --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ + --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ + --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ + --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ + --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ + --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ + --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ + --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ + --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ + --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ + --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ + --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ + --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ + --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ + --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ + --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ + --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ + --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ + --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ + --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ + --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ + --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ + --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ + --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ + --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ + --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ + --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ + --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ + --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ + --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ + --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ + --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ + --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ + --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ + --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ + --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ + --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ + --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ + --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ + --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ + --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ + --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ + --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ + --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ + --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ + --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ + --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ + --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ + --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ + --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ + --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ + --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ + --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ + --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ + --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ + --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ + --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ + --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ + --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ + --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ + --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ + --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ + --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ + --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ + --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ + --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ + --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ + --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ + --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ + --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ + --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ + --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ + --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ + --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 # via # aws-sam-cli (setup.py) # cfn-lint @@ -753,106 +751,106 @@ rich==13.7.0 \ # via # aws-sam-cli (setup.py) # cookiecutter -rpds-py==0.13.2 \ - --hash=sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276 \ - --hash=sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f \ - --hash=sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60 \ - --hash=sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0 \ - --hash=sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d \ - --hash=sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3 \ - --hash=sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2 \ - --hash=sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9 \ - --hash=sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb \ - --hash=sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b \ - --hash=sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a \ - --hash=sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d \ - --hash=sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1 \ - --hash=sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7 \ - --hash=sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9 \ - --hash=sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4 \ - --hash=sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53 \ - --hash=sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea \ - --hash=sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66 \ - --hash=sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190 \ - --hash=sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3 \ - --hash=sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12 \ - --hash=sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824 \ - --hash=sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27 \ - --hash=sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e \ - --hash=sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8 \ - --hash=sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8 \ - --hash=sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914 \ - --hash=sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211 \ - --hash=sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab \ - --hash=sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468 \ - --hash=sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3 \ - --hash=sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff \ - --hash=sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c \ - --hash=sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d \ - --hash=sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e \ - --hash=sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a \ - --hash=sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e \ - --hash=sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a \ - --hash=sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0 \ - --hash=sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1 \ - --hash=sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3 \ - --hash=sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42 \ - --hash=sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452 \ - --hash=sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198 \ - --hash=sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa \ - --hash=sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b \ - --hash=sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4 \ - --hash=sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1 \ - --hash=sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad \ - --hash=sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c \ - --hash=sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381 \ - --hash=sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0 \ - --hash=sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2 \ - --hash=sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3 \ - --hash=sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31 \ - --hash=sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74 \ - --hash=sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6 \ - --hash=sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff \ - --hash=sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b \ - --hash=sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca \ - --hash=sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd \ - --hash=sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a \ - --hash=sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568 \ - --hash=sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1 \ - --hash=sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c \ - --hash=sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad \ - --hash=sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7 \ - --hash=sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d \ - --hash=sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658 \ - --hash=sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1 \ - --hash=sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64 \ - --hash=sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815 \ - --hash=sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1 \ - --hash=sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac \ - --hash=sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07 \ - --hash=sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e \ - --hash=sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee \ - --hash=sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45 \ - --hash=sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc \ - --hash=sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41 \ - --hash=sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2 \ - --hash=sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083 \ - --hash=sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e \ - --hash=sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266 \ - --hash=sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141 \ - --hash=sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b \ - --hash=sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933 \ - --hash=sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21 \ - --hash=sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0 \ - --hash=sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7 \ - --hash=sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc \ - --hash=sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba \ - --hash=sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a \ - --hash=sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57 \ - --hash=sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2 \ - --hash=sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007 \ - --hash=sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f \ - --hash=sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f +rpds-py==0.17.1 \ + --hash=sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147 \ + --hash=sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7 \ + --hash=sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2 \ + --hash=sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68 \ + --hash=sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1 \ + --hash=sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382 \ + --hash=sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d \ + --hash=sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921 \ + --hash=sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38 \ + --hash=sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4 \ + --hash=sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a \ + --hash=sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d \ + --hash=sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518 \ + --hash=sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e \ + --hash=sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d \ + --hash=sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf \ + --hash=sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5 \ + --hash=sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba \ + --hash=sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6 \ + --hash=sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59 \ + --hash=sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253 \ + --hash=sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6 \ + --hash=sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f \ + --hash=sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3 \ + --hash=sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea \ + --hash=sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1 \ + --hash=sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76 \ + --hash=sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93 \ + --hash=sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad \ + --hash=sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad \ + --hash=sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc \ + --hash=sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049 \ + --hash=sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d \ + --hash=sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90 \ + --hash=sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d \ + --hash=sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd \ + --hash=sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25 \ + --hash=sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2 \ + --hash=sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f \ + --hash=sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6 \ + --hash=sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4 \ + --hash=sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c \ + --hash=sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8 \ + --hash=sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d \ + --hash=sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b \ + --hash=sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19 \ + --hash=sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453 \ + --hash=sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9 \ + --hash=sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde \ + --hash=sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296 \ + --hash=sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58 \ + --hash=sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec \ + --hash=sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99 \ + --hash=sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a \ + --hash=sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb \ + --hash=sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383 \ + --hash=sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d \ + --hash=sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896 \ + --hash=sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc \ + --hash=sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6 \ + --hash=sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b \ + --hash=sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7 \ + --hash=sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22 \ + --hash=sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf \ + --hash=sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394 \ + --hash=sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0 \ + --hash=sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57 \ + --hash=sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74 \ + --hash=sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83 \ + --hash=sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29 \ + --hash=sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9 \ + --hash=sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f \ + --hash=sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745 \ + --hash=sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb \ + --hash=sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811 \ + --hash=sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55 \ + --hash=sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342 \ + --hash=sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23 \ + --hash=sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82 \ + --hash=sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041 \ + --hash=sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb \ + --hash=sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066 \ + --hash=sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55 \ + --hash=sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6 \ + --hash=sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a \ + --hash=sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140 \ + --hash=sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b \ + --hash=sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9 \ + --hash=sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256 \ + --hash=sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c \ + --hash=sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772 \ + --hash=sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4 \ + --hash=sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae \ + --hash=sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920 \ + --hash=sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a \ + --hash=sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b \ + --hash=sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361 \ + --hash=sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8 \ + --hash=sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a # via # jsonschema # referencing @@ -912,9 +910,9 @@ ruamel-yaml-clib==0.2.8 \ --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 # via ruamel-yaml -s3transfer==0.9.0 \ - --hash=sha256:01d4d2c35a016db8cb14f9a4d5e84c1f8c96e7ffc211422555eed45c11fa7eb1 \ - --hash=sha256:9e1b186ec8bb5907a1e82b51237091889a9973a2bb799a924bcd9f301ff79d3d +s3transfer==0.10.0 \ + --hash=sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e \ + --hash=sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b # via boto3 sarif-om==1.0.4 \ --hash=sha256:539ef47a662329b1c8502388ad92457425e95dc0aaaf995fe46f4984c4771911 \ @@ -938,17 +936,17 @@ tomlkit==0.12.3 \ --hash=sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4 \ --hash=sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba # via aws-sam-cli (setup.py) -types-awscrt==0.19.17 \ - --hash=sha256:047e30ac6156b6c25e0937ab2d45c9d6ace854021604da35d45fa832115adf82 \ - --hash=sha256:e677de979521f39b59a10e4f4464d395b970cb6812913efaee6eec689f454a81 +types-awscrt==0.20.3 \ + --hash=sha256:06a859189a329ca8e66d56ceeef2391488e39b878fbd2141f115eab4d416fe22 \ + --hash=sha256:f61a120d3e98ee1387bc5ca4b93437f258cc5c2af1f55f8634ec4cee5729f178 # via botocore-stubs -types-python-dateutil==2.8.19.14 \ - --hash=sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b \ - --hash=sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9 +types-python-dateutil==2.8.19.20240106 \ + --hash=sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f \ + --hash=sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2 # via arrow -types-s3transfer==0.7.0 \ - --hash=sha256:aca0f2486d0a3a5037cd5b8f3e20a4522a29579a8dd183281ff0aa1c4e2c8aa7 \ - --hash=sha256:ae9ed9273465d9f43da8b96307383da410c6b59c3b2464c88d20b578768e97c6 +types-s3transfer==0.10.0 \ + --hash=sha256:35e4998c25df7f8985ad69dedc8e4860e8af3b43b7615e940d53c00d413bdc69 \ + --hash=sha256:44fcdf0097b924a9aab1ee4baa1179081a9559ca62a88c807e2b256893ce688f # via boto3-stubs typing-extensions==4.9.0 \ --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ @@ -1015,10 +1013,6 @@ watchdog==3.0.0 \ --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 # via aws-sam-cli (setup.py) -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker werkzeug==3.0.1 \ --hash=sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc \ --hash=sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 @@ -1029,7 +1023,7 @@ wheel==0.42.0 \ # via aws-lambda-builders # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via aws-lambda-builders diff --git a/requirements/reproducible-mac.txt b/requirements/reproducible-mac.txt index 3082a8cc29a..98078d0f887 100644 --- a/requirements/reproducible-mac.txt +++ b/requirements/reproducible-mac.txt @@ -12,21 +12,21 @@ arrow==1.3.0 \ --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 # via cookiecutter -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # jschema-to-python # jsonschema # referencing # sarif-om -aws-lambda-builders==1.43.0 \ - --hash=sha256:15c4b497824a296690e9497dba93186544fbe8cf6af9afb1da2d3834ab84ab20 \ - --hash=sha256:9a2bc476f6fd86fe32584f083436e862b124fd71ae307a8a1a85fae458589d09 +aws-lambda-builders==1.45.0 \ + --hash=sha256:5c19a6628eecf21578cd9c521e747f4a2163c62c527cd840b11b62a10b661348 \ + --hash=sha256:a4db7766198c052900905bd7ee3b1a8b486511394cdabffed054204d43b29943 # via aws-sam-cli (setup.py) -aws-sam-translator==1.82.0 \ - --hash=sha256:29ba61f2a70b2b1cf0c76b92b78a23c7cdd19ea1b0a5992753180b56d040d20b \ - --hash=sha256:f78e58194461635aef6255d04e82a9b690e331ca9fd669d1401bf7f9a93ae49f +aws-sam-translator==1.84.0 \ + --hash=sha256:a24f43e80095c79258a1f1c7a0b8169f55daf0b2bc237d5b9010b02ba86fa3bb \ + --hash=sha256:dbfd5669b5ef4bd7bc7af4775eec2ce4db61a2c2a17d721e67b51cf6a6dd63f9 # via # aws-sam-cli (setup.py) # cfn-lint @@ -56,31 +56,31 @@ blinker==1.7.0 \ --hash=sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 \ --hash=sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182 # via flask -boto3==1.34.0 \ - --hash=sha256:8b3c4d4e720c0ad706590c284b8f30c76de3472c1ce1bac610425f99bf6ab53b \ - --hash=sha256:c9b400529932ed4652304756528ab235c6730aa5d00cb4d9e4848ce460c82c16 +boto3==1.34.32 \ + --hash=sha256:7bf924c942426839efd7fa5c2c4fe85dba208258393e8017a5ad327c30e5948d \ + --hash=sha256:9e62f42de2873baab96eb822386d6a3b1d77f6715cb9033d7b4e6e9ebb0cdbe7 # via # aws-sam-cli (setup.py) # aws-sam-translator -boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.0 \ - --hash=sha256:39ad9a9ab399c012713a719d90feb1dee819d310f136a0c7d7fddc477d7f251e \ - --hash=sha256:477b7da7432ab26123324249411111f2350e0b5ef0418e7bc1124600c810ac41 +boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.32 \ + --hash=sha256:077f13b0856862bedafb92b8499b960624d06f684595be701fade51a8e9615ed \ + --hash=sha256:27fc3b5b69379f0557d881d3f27c201c257eabff535d343ed5fd4a162a5fb389 # via # aws-sam-cli (setup.py) # boto3-stubs -botocore==1.34.0 \ - --hash=sha256:6ec19f6c9f61c3df22fb3e083940ac7946a3d96128db1f370f10aea702bb157f \ - --hash=sha256:711b406de910585395466ca649bceeea87a04300ddf74d9a2e20727c7f27f2f1 +botocore==1.34.32 \ + --hash=sha256:466aee158bd0429dbd567c4e2bdf7be9a0a5a74409f8b295c30f34d84c497f9c \ + --hash=sha256:aa26a74df83eed3db9542c1cf9108138794c344918b36a506c0723717f1acaab # via # boto3 # s3transfer -botocore-stubs==1.34.0 \ - --hash=sha256:13698a763521622f89808ac618eafdb79df49614b4a80bb5ecf894adfb45ac37 \ - --hash=sha256:5e3a4e2d0bc65657e4205745478847df78b4d485f5c5c5af9764f01685cf0536 +botocore-stubs==1.34.32 \ + --hash=sha256:978c97b8c02b5ffa3726a5052e5715aecc52c640a75a8088b3a58453c2b054b2 \ + --hash=sha256:e5b04b8ab81e736088470b7be244de072ac2f986caf0f51b7e2087400778dc9f # via boto3-stubs -certifi==2023.11.17 \ - --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ - --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 +certifi==2024.2.2 \ + --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ + --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -136,9 +136,9 @@ cffi==1.16.0 \ --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 # via cryptography -cfn-lint==0.83.5 \ - --hash=sha256:91145a94968f0f3c0095fcc4366602efb3b9f5eee413171845f298fa1227e0fa \ - --hash=sha256:97ed0b36f77defba9fe843d2401160c7bb2a81dd4478dd17859bac9f027da311 +cfn-lint==0.85.0 \ + --hash=sha256:64d6e8d85cdc573b61add78f9ff95a142a1834edb4793d1291551f6d953f73fe \ + --hash=sha256:e4849e1779bd1a9f4543617372708a20519b6d7cad5f980e20c6deaa227361a2 # via aws-sam-cli (setup.py) chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ @@ -251,50 +251,59 @@ cookiecutter==2.5.0 \ --hash=sha256:8aa2f12ed11bc05628651e9dc4353a10571dd9908aaaaeec959a2b9ea465a5d2 \ --hash=sha256:e61e9034748e3f41b8bd2c11f00d030784b48711c4d5c42363c50989a65331ec # via aws-sam-cli (setup.py) -cryptography==41.0.7 \ - --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ - --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ - --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ - --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ - --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ - --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ - --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ - --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ - --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ - --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ - --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ - --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ - --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ - --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ - --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ - --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ - --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ - --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ - --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ - --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ - --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ - --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ - --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d +cryptography==42.0.2 \ + --hash=sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380 \ + --hash=sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589 \ + --hash=sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea \ + --hash=sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65 \ + --hash=sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a \ + --hash=sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3 \ + --hash=sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008 \ + --hash=sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1 \ + --hash=sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2 \ + --hash=sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635 \ + --hash=sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2 \ + --hash=sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90 \ + --hash=sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee \ + --hash=sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a \ + --hash=sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242 \ + --hash=sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12 \ + --hash=sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2 \ + --hash=sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d \ + --hash=sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be \ + --hash=sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee \ + --hash=sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6 \ + --hash=sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529 \ + --hash=sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929 \ + --hash=sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1 \ + --hash=sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6 \ + --hash=sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a \ + --hash=sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446 \ + --hash=sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9 \ + --hash=sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888 \ + --hash=sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4 \ + --hash=sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33 \ + --hash=sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f # via pyopenssl dateparser==1.2.0 \ --hash=sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830 \ --hash=sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30 # via aws-sam-cli (setup.py) -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via aws-sam-cli (setup.py) -flask==3.0.0 \ - --hash=sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638 \ - --hash=sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58 +flask==3.0.1 \ + --hash=sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403 \ + --hash=sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 # via aws-sam-cli (setup.py) idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 +importlib-metadata==7.0.1 \ + --hash=sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e \ + --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc # via flask importlib-resources==6.1.1 \ --hash=sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a \ @@ -306,9 +315,9 @@ itsdangerous==2.1.2 \ --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a # via flask -jinja2==3.1.2 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 +jinja2==3.1.3 \ + --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ + --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 # via # cookiecutter # flask @@ -335,16 +344,16 @@ jsonpointer==2.4 \ --hash=sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a \ --hash=sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88 # via jsonpatch -jsonschema==4.20.0 \ - --hash=sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa \ - --hash=sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3 +jsonschema==4.21.1 \ + --hash=sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f \ + --hash=sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5 # via # aws-sam-cli (setup.py) # aws-sam-translator # cfn-lint -jsonschema-specifications==2023.11.2 \ - --hash=sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8 \ - --hash=sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93 +jsonschema-specifications==2023.12.1 \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c # via jsonschema junit-xml==1.9 \ --hash=sha256:de16a051990d4e25a3982b2dd9e89d671067548718866416faec14d9de56db9f \ @@ -354,57 +363,67 @@ markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 +markupsafe==2.1.4 \ + --hash=sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69 \ + --hash=sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0 \ + --hash=sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d \ + --hash=sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec \ + --hash=sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5 \ + --hash=sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 \ + --hash=sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3 \ + --hash=sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74 \ + --hash=sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0 \ + --hash=sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949 \ + --hash=sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d \ + --hash=sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279 \ + --hash=sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f \ + --hash=sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6 \ + --hash=sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc \ + --hash=sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e \ + --hash=sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954 \ + --hash=sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656 \ + --hash=sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc \ + --hash=sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518 \ + --hash=sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56 \ + --hash=sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc \ + --hash=sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa \ + --hash=sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565 \ + --hash=sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 \ + --hash=sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb \ + --hash=sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250 \ + --hash=sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4 \ + --hash=sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 \ + --hash=sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc \ + --hash=sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474 \ + --hash=sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863 \ + --hash=sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8 \ + --hash=sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f \ + --hash=sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 \ + --hash=sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e \ + --hash=sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e \ + --hash=sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb \ + --hash=sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f \ + --hash=sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a \ + --hash=sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26 \ + --hash=sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d \ + --hash=sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2 \ + --hash=sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131 \ + --hash=sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789 \ + --hash=sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6 \ + --hash=sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a \ + --hash=sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858 \ + --hash=sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e \ + --hash=sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb \ + --hash=sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e \ + --hash=sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 \ + --hash=sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7 \ + --hash=sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea \ + --hash=sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b \ + --hash=sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6 \ + --hash=sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475 \ + --hash=sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74 \ + --hash=sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a \ + --hash=sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00 # via # jinja2 # werkzeug @@ -420,17 +439,17 @@ mypy-boto3-apigateway==1.34.0 \ --hash=sha256:372ca74ede1442cb7d171a7cc0b64d92900cda258790f07b9cd9b92886ef92ef \ --hash=sha256:3c724120971c74fb65a94eb7e4b92a3a4b28df6c70ca04a007072e6c73f6eda7 # via boto3-stubs -mypy-boto3-cloudformation==1.34.0 \ - --hash=sha256:4e63a2bca1882971881d65983acd774c2fc636bbc5dc8c3e1f4a41c539cf3c90 \ - --hash=sha256:9b25df9ef15d9dc8e4e892cc07aa9343f15f2ed5eb7d33eb5eb65adfa63f538f +mypy-boto3-cloudformation==1.34.32 \ + --hash=sha256:49d04c090dae3fd8289738ae592cac9d6faa5169684de40c2730b425bba2a32d \ + --hash=sha256:bfe5ec405eae6dae31dc9874729eef5e668e634eae8972032f00400d17bd2c7d # via boto3-stubs mypy-boto3-ecr==1.34.0 \ --hash=sha256:3346c02c22b16068c9acc67d990e32060bf7cdaea5f3d43c50e44308fbbc3439 \ --hash=sha256:b83fb0311e968a42d4ca821b006c18d4a3e3e364b8cebee758ea4fa97c5ac345 # via boto3-stubs -mypy-boto3-iam==1.34.0 \ - --hash=sha256:2485e753cfe138ece94bab1c4983d0db4dc76e25314d3ffdb9bde5c72ad1a92c \ - --hash=sha256:7edeac8ad54fc5f669d7d4b30fd9c744ed58c3ed36a55ad44179cf450d48e605 +mypy-boto3-iam==1.34.8 \ + --hash=sha256:0d13057a2141c5633b78ed0b1aed8f2f8a11a9c58a8a17a25622d966428a41b0 \ + --hash=sha256:6faf68cf800182924687b6711b3f9afa8d940ad993f259a3b91e55e82892d641 # via boto3-stubs mypy-boto3-kinesis==1.34.0 \ --hash=sha256:1add81c53f6e36599e0c22e142024867759aaf2f4954bcb2baa21c284c852377 \ @@ -440,17 +459,17 @@ mypy-boto3-lambda==1.34.0 \ --hash=sha256:109a7e126e84d6da6cacf8ab5c7c6f2be022417fe7bfb7f9b019767d7034f73b \ --hash=sha256:e74c0ce548da747a8c6e643c39dad8aa54d67e057f57740ec780a7e565590627 # via boto3-stubs -mypy-boto3-s3==1.34.0 \ - --hash=sha256:633876d2a96dbb924f9667084316c1759bff40c19a9a38313d5a4e825c5fc641 \ - --hash=sha256:7644a00e096ebb1c3292551059f64ff8329625dacd40827ced9481b14d64c733 +mypy-boto3-s3==1.34.14 \ + --hash=sha256:71c39ab0623cdb442d225b71c1783f6a513cff4c4a13505a2efbb2e3aff2e965 \ + --hash=sha256:f9669ecd182d5bf3532f5f2dcc5e5237776afe157ad5a0b37b26d6bec5fcc432 # via boto3-stubs mypy-boto3-schemas==1.34.0 \ --hash=sha256:28c016609dcffc606bd8425ee92894c46e943ab77033e1ae46481f00c39b7f75 \ --hash=sha256:3b25a71944192b0980c3bb5132deb7c06ee9b88580ed63f257fad97cf3bf2927 # via boto3-stubs -mypy-boto3-secretsmanager==1.34.0 \ - --hash=sha256:d3b0c26f4264775a2505cbd4a73a4efd5c4a151d8fcdcf938683afb1bf717a32 \ - --hash=sha256:f7c1a99a28e650ac91834db69a8dabe6734f9ace92f1d7a2d366160a11401133 +mypy-boto3-secretsmanager==1.34.17 \ + --hash=sha256:0dbd1cdbe7992324c3414cccf0256e3905827bbf1f6a8d58c255635f6a2b4bfb \ + --hash=sha256:a547932d99c3f711b27b9ea1c38fc063050910c0bf6c8eb346abd96ace61668e # via boto3-stubs mypy-boto3-signer==1.34.0 \ --hash=sha256:c11ed943ccd38ee54fc0ca90ed347ef770d695df49535eab96dd97fb3dbdc592 \ @@ -494,124 +513,98 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.6.0 \ + --hash=sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae \ + --hash=sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf # via aws-sam-translator -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.16.1 \ + --hash=sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7 \ + --hash=sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca \ + --hash=sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51 \ + --hash=sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da \ + --hash=sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc \ + --hash=sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae \ + --hash=sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4 \ + --hash=sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b \ + --hash=sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0 \ + --hash=sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e \ + --hash=sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118 \ + --hash=sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506 \ + --hash=sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798 \ + --hash=sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f \ + --hash=sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d \ + --hash=sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948 \ + --hash=sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f \ + --hash=sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9 \ + --hash=sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137 \ + --hash=sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640 \ + --hash=sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f \ + --hash=sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff \ + --hash=sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706 \ + --hash=sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d \ + --hash=sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f \ + --hash=sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c \ + --hash=sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8 \ + --hash=sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1 \ + --hash=sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7 \ + --hash=sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95 \ + --hash=sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60 \ + --hash=sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253 \ + --hash=sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e \ + --hash=sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c \ + --hash=sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc \ + --hash=sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3 \ + --hash=sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8 \ + --hash=sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9 \ + --hash=sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c \ + --hash=sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388 \ + --hash=sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95 \ + --hash=sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91 \ + --hash=sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818 \ + --hash=sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8 \ + --hash=sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f \ + --hash=sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394 \ + --hash=sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13 \ + --hash=sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17 \ + --hash=sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7 \ + --hash=sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06 \ + --hash=sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f \ + --hash=sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196 \ + --hash=sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66 \ + --hash=sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf \ + --hash=sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c \ + --hash=sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76 \ + --hash=sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0 \ + --hash=sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212 \ + --hash=sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f \ + --hash=sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49 \ + --hash=sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206 \ + --hash=sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48 \ + --hash=sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c \ + --hash=sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2 \ + --hash=sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05 \ + --hash=sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610 \ + --hash=sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd \ + --hash=sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76 \ + --hash=sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1 \ + --hash=sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60 \ + --hash=sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34 \ + --hash=sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4 \ + --hash=sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864 \ + --hash=sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66 \ + --hash=sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c \ + --hash=sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e \ + --hash=sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54 \ + --hash=sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8 \ + --hash=sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e # via pydantic pygments==2.17.2 \ --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via rich -pyopenssl==23.3.0 \ - --hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \ - --hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12 +pyopenssl==24.0.0 \ + --hash=sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf \ + --hash=sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3 # via aws-sam-cli (setup.py) python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ @@ -620,13 +613,13 @@ python-dateutil==2.8.2 \ # arrow # botocore # dateparser -python-slugify==8.0.1 \ - --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ - --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 +python-slugify==8.0.3 \ + --hash=sha256:c71189c161e8c671f1b141034d9a56308a8a5978cd13d40446c879569212fdd1 \ + --hash=sha256:e04cba5f1c562502a1175c84a8bc23890c54cdaf23fccaaf0bf78511508cabed # via cookiecutter -pytz==2023.3.post1 \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 +pytz==2024.1 \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 # via dateparser pyyaml==6.0.1 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ @@ -673,101 +666,106 @@ pyyaml==6.0.1 \ # aws-sam-cli (setup.py) # cfn-lint # cookiecutter -referencing==0.32.0 \ - --hash=sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161 \ - --hash=sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99 +referencing==0.33.0 \ + --hash=sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5 \ + --hash=sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7 # via # jsonschema # jsonschema-specifications -regex==2023.10.3 \ - --hash=sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a \ - --hash=sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07 \ - --hash=sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca \ - --hash=sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58 \ - --hash=sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54 \ - --hash=sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed \ - --hash=sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff \ - --hash=sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528 \ - --hash=sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9 \ - --hash=sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971 \ - --hash=sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14 \ - --hash=sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af \ - --hash=sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302 \ - --hash=sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec \ - --hash=sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597 \ - --hash=sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b \ - --hash=sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd \ - --hash=sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767 \ - --hash=sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f \ - --hash=sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6 \ - --hash=sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293 \ - --hash=sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be \ - --hash=sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41 \ - --hash=sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc \ - --hash=sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29 \ - --hash=sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964 \ - --hash=sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d \ - --hash=sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a \ - --hash=sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc \ - --hash=sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55 \ - --hash=sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af \ - --hash=sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930 \ - --hash=sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e \ - --hash=sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d \ - --hash=sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863 \ - --hash=sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c \ - --hash=sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f \ - --hash=sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e \ - --hash=sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d \ - --hash=sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368 \ - --hash=sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb \ - --hash=sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52 \ - --hash=sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8 \ - --hash=sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4 \ - --hash=sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac \ - --hash=sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e \ - --hash=sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2 \ - --hash=sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a \ - --hash=sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4 \ - --hash=sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa \ - --hash=sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533 \ - --hash=sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b \ - --hash=sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588 \ - --hash=sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0 \ - --hash=sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915 \ - --hash=sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841 \ - --hash=sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a \ - --hash=sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988 \ - --hash=sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292 \ - --hash=sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3 \ - --hash=sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c \ - --hash=sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f \ - --hash=sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420 \ - --hash=sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9 \ - --hash=sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f \ - --hash=sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0 \ - --hash=sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b \ - --hash=sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037 \ - --hash=sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b \ - --hash=sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee \ - --hash=sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c \ - --hash=sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b \ - --hash=sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353 \ - --hash=sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051 \ - --hash=sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039 \ - --hash=sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a \ - --hash=sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b \ - --hash=sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e \ - --hash=sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5 \ - --hash=sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf \ - --hash=sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94 \ - --hash=sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991 \ - --hash=sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711 \ - --hash=sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a \ - --hash=sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab \ - --hash=sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a \ - --hash=sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11 \ - --hash=sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48 +regex==2023.12.25 \ + --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ + --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ + --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ + --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ + --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ + --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ + --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ + --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ + --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ + --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ + --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ + --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ + --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ + --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ + --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ + --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ + --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ + --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ + --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ + --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ + --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ + --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ + --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ + --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ + --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ + --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ + --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ + --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ + --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ + --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ + --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ + --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ + --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ + --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ + --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ + --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ + --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ + --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ + --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ + --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ + --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ + --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ + --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ + --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ + --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ + --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ + --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ + --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ + --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ + --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ + --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ + --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ + --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ + --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ + --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ + --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ + --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ + --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ + --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ + --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ + --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ + --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ + --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ + --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ + --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ + --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ + --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ + --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ + --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ + --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ + --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ + --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ + --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ + --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ + --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ + --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ + --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ + --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ + --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ + --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ + --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ + --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ + --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ + --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ + --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ + --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ + --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ + --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ + --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ + --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ + --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ + --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ + --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 # via # aws-sam-cli (setup.py) # cfn-lint @@ -785,106 +783,106 @@ rich==13.7.0 \ # via # aws-sam-cli (setup.py) # cookiecutter -rpds-py==0.13.2 \ - --hash=sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276 \ - --hash=sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f \ - --hash=sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60 \ - --hash=sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0 \ - --hash=sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d \ - --hash=sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3 \ - --hash=sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2 \ - --hash=sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9 \ - --hash=sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb \ - --hash=sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b \ - --hash=sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a \ - --hash=sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d \ - --hash=sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1 \ - --hash=sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7 \ - --hash=sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9 \ - --hash=sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4 \ - --hash=sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53 \ - --hash=sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea \ - --hash=sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66 \ - --hash=sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190 \ - --hash=sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3 \ - --hash=sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12 \ - --hash=sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824 \ - --hash=sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27 \ - --hash=sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e \ - --hash=sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8 \ - --hash=sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8 \ - --hash=sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914 \ - --hash=sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211 \ - --hash=sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab \ - --hash=sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468 \ - --hash=sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3 \ - --hash=sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff \ - --hash=sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c \ - --hash=sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d \ - --hash=sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e \ - --hash=sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a \ - --hash=sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e \ - --hash=sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a \ - --hash=sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0 \ - --hash=sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1 \ - --hash=sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3 \ - --hash=sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42 \ - --hash=sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452 \ - --hash=sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198 \ - --hash=sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa \ - --hash=sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b \ - --hash=sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4 \ - --hash=sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1 \ - --hash=sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad \ - --hash=sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c \ - --hash=sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381 \ - --hash=sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0 \ - --hash=sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2 \ - --hash=sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3 \ - --hash=sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31 \ - --hash=sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74 \ - --hash=sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6 \ - --hash=sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff \ - --hash=sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b \ - --hash=sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca \ - --hash=sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd \ - --hash=sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a \ - --hash=sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568 \ - --hash=sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1 \ - --hash=sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c \ - --hash=sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad \ - --hash=sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7 \ - --hash=sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d \ - --hash=sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658 \ - --hash=sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1 \ - --hash=sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64 \ - --hash=sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815 \ - --hash=sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1 \ - --hash=sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac \ - --hash=sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07 \ - --hash=sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e \ - --hash=sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee \ - --hash=sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45 \ - --hash=sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc \ - --hash=sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41 \ - --hash=sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2 \ - --hash=sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083 \ - --hash=sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e \ - --hash=sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266 \ - --hash=sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141 \ - --hash=sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b \ - --hash=sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933 \ - --hash=sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21 \ - --hash=sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0 \ - --hash=sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7 \ - --hash=sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc \ - --hash=sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba \ - --hash=sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a \ - --hash=sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57 \ - --hash=sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2 \ - --hash=sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007 \ - --hash=sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f \ - --hash=sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f +rpds-py==0.17.1 \ + --hash=sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147 \ + --hash=sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7 \ + --hash=sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2 \ + --hash=sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68 \ + --hash=sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1 \ + --hash=sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382 \ + --hash=sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d \ + --hash=sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921 \ + --hash=sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38 \ + --hash=sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4 \ + --hash=sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a \ + --hash=sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d \ + --hash=sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518 \ + --hash=sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e \ + --hash=sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d \ + --hash=sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf \ + --hash=sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5 \ + --hash=sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba \ + --hash=sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6 \ + --hash=sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59 \ + --hash=sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253 \ + --hash=sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6 \ + --hash=sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f \ + --hash=sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3 \ + --hash=sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea \ + --hash=sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1 \ + --hash=sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76 \ + --hash=sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93 \ + --hash=sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad \ + --hash=sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad \ + --hash=sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc \ + --hash=sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049 \ + --hash=sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d \ + --hash=sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90 \ + --hash=sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d \ + --hash=sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd \ + --hash=sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25 \ + --hash=sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2 \ + --hash=sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f \ + --hash=sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6 \ + --hash=sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4 \ + --hash=sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c \ + --hash=sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8 \ + --hash=sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d \ + --hash=sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b \ + --hash=sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19 \ + --hash=sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453 \ + --hash=sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9 \ + --hash=sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde \ + --hash=sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296 \ + --hash=sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58 \ + --hash=sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec \ + --hash=sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99 \ + --hash=sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a \ + --hash=sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb \ + --hash=sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383 \ + --hash=sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d \ + --hash=sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896 \ + --hash=sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc \ + --hash=sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6 \ + --hash=sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b \ + --hash=sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7 \ + --hash=sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22 \ + --hash=sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf \ + --hash=sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394 \ + --hash=sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0 \ + --hash=sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57 \ + --hash=sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74 \ + --hash=sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83 \ + --hash=sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29 \ + --hash=sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9 \ + --hash=sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f \ + --hash=sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745 \ + --hash=sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb \ + --hash=sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811 \ + --hash=sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55 \ + --hash=sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342 \ + --hash=sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23 \ + --hash=sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82 \ + --hash=sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041 \ + --hash=sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb \ + --hash=sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066 \ + --hash=sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55 \ + --hash=sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6 \ + --hash=sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a \ + --hash=sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140 \ + --hash=sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b \ + --hash=sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9 \ + --hash=sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256 \ + --hash=sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c \ + --hash=sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772 \ + --hash=sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4 \ + --hash=sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae \ + --hash=sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920 \ + --hash=sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a \ + --hash=sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b \ + --hash=sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361 \ + --hash=sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8 \ + --hash=sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a # via # jsonschema # referencing @@ -944,9 +942,9 @@ ruamel-yaml-clib==0.2.8 \ --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 # via ruamel-yaml -s3transfer==0.9.0 \ - --hash=sha256:01d4d2c35a016db8cb14f9a4d5e84c1f8c96e7ffc211422555eed45c11fa7eb1 \ - --hash=sha256:9e1b186ec8bb5907a1e82b51237091889a9973a2bb799a924bcd9f301ff79d3d +s3transfer==0.10.0 \ + --hash=sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e \ + --hash=sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b # via boto3 sarif-om==1.0.4 \ --hash=sha256:539ef47a662329b1c8502388ad92457425e95dc0aaaf995fe46f4984c4771911 \ @@ -970,17 +968,17 @@ tomlkit==0.12.3 \ --hash=sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4 \ --hash=sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba # via aws-sam-cli (setup.py) -types-awscrt==0.19.17 \ - --hash=sha256:047e30ac6156b6c25e0937ab2d45c9d6ace854021604da35d45fa832115adf82 \ - --hash=sha256:e677de979521f39b59a10e4f4464d395b970cb6812913efaee6eec689f454a81 +types-awscrt==0.20.3 \ + --hash=sha256:06a859189a329ca8e66d56ceeef2391488e39b878fbd2141f115eab4d416fe22 \ + --hash=sha256:f61a120d3e98ee1387bc5ca4b93437f258cc5c2af1f55f8634ec4cee5729f178 # via botocore-stubs -types-python-dateutil==2.8.19.14 \ - --hash=sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b \ - --hash=sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9 +types-python-dateutil==2.8.19.20240106 \ + --hash=sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f \ + --hash=sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2 # via arrow -types-s3transfer==0.7.0 \ - --hash=sha256:aca0f2486d0a3a5037cd5b8f3e20a4522a29579a8dd183281ff0aa1c4e2c8aa7 \ - --hash=sha256:ae9ed9273465d9f43da8b96307383da410c6b59c3b2464c88d20b578768e97c6 +types-s3transfer==0.10.0 \ + --hash=sha256:35e4998c25df7f8985ad69dedc8e4860e8af3b43b7615e940d53c00d413bdc69 \ + --hash=sha256:44fcdf0097b924a9aab1ee4baa1179081a9559ca62a88c807e2b256893ce688f # via boto3-stubs typing-extensions==4.9.0 \ --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ @@ -1050,10 +1048,6 @@ watchdog==3.0.0 \ --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 # via aws-sam-cli (setup.py) -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker werkzeug==3.0.1 \ --hash=sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc \ --hash=sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 @@ -1070,7 +1064,7 @@ zipp==3.17.0 \ # importlib-resources # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via aws-lambda-builders diff --git a/requirements/reproducible-win.txt b/requirements/reproducible-win.txt index 64ae94737a9..919e335d417 100644 --- a/requirements/reproducible-win.txt +++ b/requirements/reproducible-win.txt @@ -12,21 +12,21 @@ arrow==1.3.0 \ --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 # via cookiecutter -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # jschema-to-python # jsonschema # referencing # sarif-om -aws-lambda-builders==1.43.0 \ - --hash=sha256:15c4b497824a296690e9497dba93186544fbe8cf6af9afb1da2d3834ab84ab20 \ - --hash=sha256:9a2bc476f6fd86fe32584f083436e862b124fd71ae307a8a1a85fae458589d09 +aws-lambda-builders==1.45.0 \ + --hash=sha256:5c19a6628eecf21578cd9c521e747f4a2163c62c527cd840b11b62a10b661348 \ + --hash=sha256:a4db7766198c052900905bd7ee3b1a8b486511394cdabffed054204d43b29943 # via aws-sam-cli (setup.py) -aws-sam-translator==1.82.0 \ - --hash=sha256:29ba61f2a70b2b1cf0c76b92b78a23c7cdd19ea1b0a5992753180b56d040d20b \ - --hash=sha256:f78e58194461635aef6255d04e82a9b690e331ca9fd669d1401bf7f9a93ae49f +aws-sam-translator==1.84.0 \ + --hash=sha256:a24f43e80095c79258a1f1c7a0b8169f55daf0b2bc237d5b9010b02ba86fa3bb \ + --hash=sha256:dbfd5669b5ef4bd7bc7af4775eec2ce4db61a2c2a17d721e67b51cf6a6dd63f9 # via # aws-sam-cli (setup.py) # cfn-lint @@ -38,31 +38,31 @@ blinker==1.7.0 \ --hash=sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 \ --hash=sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182 # via flask -boto3==1.34.0 \ - --hash=sha256:8b3c4d4e720c0ad706590c284b8f30c76de3472c1ce1bac610425f99bf6ab53b \ - --hash=sha256:c9b400529932ed4652304756528ab235c6730aa5d00cb4d9e4848ce460c82c16 +boto3==1.34.32 \ + --hash=sha256:7bf924c942426839efd7fa5c2c4fe85dba208258393e8017a5ad327c30e5948d \ + --hash=sha256:9e62f42de2873baab96eb822386d6a3b1d77f6715cb9033d7b4e6e9ebb0cdbe7 # via # aws-sam-cli (setup.py) # aws-sam-translator -boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.0 \ - --hash=sha256:39ad9a9ab399c012713a719d90feb1dee819d310f136a0c7d7fddc477d7f251e \ - --hash=sha256:477b7da7432ab26123324249411111f2350e0b5ef0418e7bc1124600c810ac41 +boto3-stubs[apigateway,cloudformation,ecr,iam,kinesis,lambda,s3,schemas,secretsmanager,signer,sqs,stepfunctions,sts,xray]==1.34.32 \ + --hash=sha256:077f13b0856862bedafb92b8499b960624d06f684595be701fade51a8e9615ed \ + --hash=sha256:27fc3b5b69379f0557d881d3f27c201c257eabff535d343ed5fd4a162a5fb389 # via # aws-sam-cli (setup.py) # boto3-stubs -botocore==1.34.0 \ - --hash=sha256:6ec19f6c9f61c3df22fb3e083940ac7946a3d96128db1f370f10aea702bb157f \ - --hash=sha256:711b406de910585395466ca649bceeea87a04300ddf74d9a2e20727c7f27f2f1 +botocore==1.34.32 \ + --hash=sha256:466aee158bd0429dbd567c4e2bdf7be9a0a5a74409f8b295c30f34d84c497f9c \ + --hash=sha256:aa26a74df83eed3db9542c1cf9108138794c344918b36a506c0723717f1acaab # via # boto3 # s3transfer -botocore-stubs==1.34.0 \ - --hash=sha256:13698a763521622f89808ac618eafdb79df49614b4a80bb5ecf894adfb45ac37 \ - --hash=sha256:5e3a4e2d0bc65657e4205745478847df78b4d485f5c5c5af9764f01685cf0536 +botocore-stubs==1.34.32 \ + --hash=sha256:978c97b8c02b5ffa3726a5052e5715aecc52c640a75a8088b3a58453c2b054b2 \ + --hash=sha256:e5b04b8ab81e736088470b7be244de072ac2f986caf0f51b7e2087400778dc9f # via boto3-stubs -certifi==2023.11.17 \ - --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ - --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 +certifi==2024.2.2 \ + --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ + --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 # via requests cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ @@ -118,9 +118,9 @@ cffi==1.16.0 \ --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 # via cryptography -cfn-lint==0.83.5 \ - --hash=sha256:91145a94968f0f3c0095fcc4366602efb3b9f5eee413171845f298fa1227e0fa \ - --hash=sha256:97ed0b36f77defba9fe843d2401160c7bb2a81dd4478dd17859bac9f027da311 +cfn-lint==0.85.0 \ + --hash=sha256:64d6e8d85cdc573b61add78f9ff95a142a1834edb4793d1291551f6d953f73fe \ + --hash=sha256:e4849e1779bd1a9f4543617372708a20519b6d7cad5f980e20c6deaa227361a2 # via aws-sam-cli (setup.py) chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ @@ -237,42 +237,51 @@ cookiecutter==2.5.0 \ --hash=sha256:8aa2f12ed11bc05628651e9dc4353a10571dd9908aaaaeec959a2b9ea465a5d2 \ --hash=sha256:e61e9034748e3f41b8bd2c11f00d030784b48711c4d5c42363c50989a65331ec # via aws-sam-cli (setup.py) -cryptography==41.0.7 \ - --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ - --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ - --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ - --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ - --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ - --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ - --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ - --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ - --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ - --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ - --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ - --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ - --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ - --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ - --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ - --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ - --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ - --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ - --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ - --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ - --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ - --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ - --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d +cryptography==42.0.2 \ + --hash=sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380 \ + --hash=sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589 \ + --hash=sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea \ + --hash=sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65 \ + --hash=sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a \ + --hash=sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3 \ + --hash=sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008 \ + --hash=sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1 \ + --hash=sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2 \ + --hash=sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635 \ + --hash=sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2 \ + --hash=sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90 \ + --hash=sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee \ + --hash=sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a \ + --hash=sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242 \ + --hash=sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12 \ + --hash=sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2 \ + --hash=sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d \ + --hash=sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be \ + --hash=sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee \ + --hash=sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6 \ + --hash=sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529 \ + --hash=sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929 \ + --hash=sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1 \ + --hash=sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6 \ + --hash=sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a \ + --hash=sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446 \ + --hash=sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9 \ + --hash=sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888 \ + --hash=sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4 \ + --hash=sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33 \ + --hash=sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f # via pyopenssl dateparser==1.2.0 \ --hash=sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830 \ --hash=sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30 # via aws-sam-cli (setup.py) -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via aws-sam-cli (setup.py) -flask==3.0.0 \ - --hash=sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638 \ - --hash=sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58 +flask==3.0.1 \ + --hash=sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403 \ + --hash=sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 # via aws-sam-cli (setup.py) idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -282,9 +291,9 @@ itsdangerous==2.1.2 \ --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a # via flask -jinja2==3.1.2 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 +jinja2==3.1.3 \ + --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ + --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 # via # cookiecutter # flask @@ -311,16 +320,16 @@ jsonpointer==2.4 \ --hash=sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a \ --hash=sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88 # via jsonpatch -jsonschema==4.20.0 \ - --hash=sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa \ - --hash=sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3 +jsonschema==4.21.1 \ + --hash=sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f \ + --hash=sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5 # via # aws-sam-cli (setup.py) # aws-sam-translator # cfn-lint -jsonschema-specifications==2023.11.2 \ - --hash=sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8 \ - --hash=sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93 +jsonschema-specifications==2023.12.1 \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c # via jsonschema junit-xml==1.9 \ --hash=sha256:de16a051990d4e25a3982b2dd9e89d671067548718866416faec14d9de56db9f \ @@ -330,57 +339,67 @@ markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 +markupsafe==2.1.4 \ + --hash=sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69 \ + --hash=sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0 \ + --hash=sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d \ + --hash=sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec \ + --hash=sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5 \ + --hash=sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 \ + --hash=sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3 \ + --hash=sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74 \ + --hash=sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0 \ + --hash=sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949 \ + --hash=sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d \ + --hash=sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279 \ + --hash=sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f \ + --hash=sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6 \ + --hash=sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc \ + --hash=sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e \ + --hash=sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954 \ + --hash=sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656 \ + --hash=sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc \ + --hash=sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518 \ + --hash=sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56 \ + --hash=sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc \ + --hash=sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa \ + --hash=sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565 \ + --hash=sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 \ + --hash=sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb \ + --hash=sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250 \ + --hash=sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4 \ + --hash=sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 \ + --hash=sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc \ + --hash=sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474 \ + --hash=sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863 \ + --hash=sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8 \ + --hash=sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f \ + --hash=sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 \ + --hash=sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e \ + --hash=sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e \ + --hash=sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb \ + --hash=sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f \ + --hash=sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a \ + --hash=sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26 \ + --hash=sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d \ + --hash=sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2 \ + --hash=sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131 \ + --hash=sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789 \ + --hash=sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6 \ + --hash=sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a \ + --hash=sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858 \ + --hash=sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e \ + --hash=sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb \ + --hash=sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e \ + --hash=sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 \ + --hash=sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7 \ + --hash=sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea \ + --hash=sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b \ + --hash=sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6 \ + --hash=sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475 \ + --hash=sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74 \ + --hash=sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a \ + --hash=sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00 # via # jinja2 # werkzeug @@ -396,17 +415,17 @@ mypy-boto3-apigateway==1.34.0 \ --hash=sha256:372ca74ede1442cb7d171a7cc0b64d92900cda258790f07b9cd9b92886ef92ef \ --hash=sha256:3c724120971c74fb65a94eb7e4b92a3a4b28df6c70ca04a007072e6c73f6eda7 # via boto3-stubs -mypy-boto3-cloudformation==1.34.0 \ - --hash=sha256:4e63a2bca1882971881d65983acd774c2fc636bbc5dc8c3e1f4a41c539cf3c90 \ - --hash=sha256:9b25df9ef15d9dc8e4e892cc07aa9343f15f2ed5eb7d33eb5eb65adfa63f538f +mypy-boto3-cloudformation==1.34.32 \ + --hash=sha256:49d04c090dae3fd8289738ae592cac9d6faa5169684de40c2730b425bba2a32d \ + --hash=sha256:bfe5ec405eae6dae31dc9874729eef5e668e634eae8972032f00400d17bd2c7d # via boto3-stubs mypy-boto3-ecr==1.34.0 \ --hash=sha256:3346c02c22b16068c9acc67d990e32060bf7cdaea5f3d43c50e44308fbbc3439 \ --hash=sha256:b83fb0311e968a42d4ca821b006c18d4a3e3e364b8cebee758ea4fa97c5ac345 # via boto3-stubs -mypy-boto3-iam==1.34.0 \ - --hash=sha256:2485e753cfe138ece94bab1c4983d0db4dc76e25314d3ffdb9bde5c72ad1a92c \ - --hash=sha256:7edeac8ad54fc5f669d7d4b30fd9c744ed58c3ed36a55ad44179cf450d48e605 +mypy-boto3-iam==1.34.8 \ + --hash=sha256:0d13057a2141c5633b78ed0b1aed8f2f8a11a9c58a8a17a25622d966428a41b0 \ + --hash=sha256:6faf68cf800182924687b6711b3f9afa8d940ad993f259a3b91e55e82892d641 # via boto3-stubs mypy-boto3-kinesis==1.34.0 \ --hash=sha256:1add81c53f6e36599e0c22e142024867759aaf2f4954bcb2baa21c284c852377 \ @@ -416,17 +435,17 @@ mypy-boto3-lambda==1.34.0 \ --hash=sha256:109a7e126e84d6da6cacf8ab5c7c6f2be022417fe7bfb7f9b019767d7034f73b \ --hash=sha256:e74c0ce548da747a8c6e643c39dad8aa54d67e057f57740ec780a7e565590627 # via boto3-stubs -mypy-boto3-s3==1.34.0 \ - --hash=sha256:633876d2a96dbb924f9667084316c1759bff40c19a9a38313d5a4e825c5fc641 \ - --hash=sha256:7644a00e096ebb1c3292551059f64ff8329625dacd40827ced9481b14d64c733 +mypy-boto3-s3==1.34.14 \ + --hash=sha256:71c39ab0623cdb442d225b71c1783f6a513cff4c4a13505a2efbb2e3aff2e965 \ + --hash=sha256:f9669ecd182d5bf3532f5f2dcc5e5237776afe157ad5a0b37b26d6bec5fcc432 # via boto3-stubs mypy-boto3-schemas==1.34.0 \ --hash=sha256:28c016609dcffc606bd8425ee92894c46e943ab77033e1ae46481f00c39b7f75 \ --hash=sha256:3b25a71944192b0980c3bb5132deb7c06ee9b88580ed63f257fad97cf3bf2927 # via boto3-stubs -mypy-boto3-secretsmanager==1.34.0 \ - --hash=sha256:d3b0c26f4264775a2505cbd4a73a4efd5c4a151d8fcdcf938683afb1bf717a32 \ - --hash=sha256:f7c1a99a28e650ac91834db69a8dabe6734f9ace92f1d7a2d366160a11401133 +mypy-boto3-secretsmanager==1.34.17 \ + --hash=sha256:0dbd1cdbe7992324c3414cccf0256e3905827bbf1f6a8d58c255635f6a2b4bfb \ + --hash=sha256:a547932d99c3f711b27b9ea1c38fc063050910c0bf6c8eb346abd96ace61668e # via boto3-stubs mypy-boto3-signer==1.34.0 \ --hash=sha256:c11ed943ccd38ee54fc0ca90ed347ef770d695df49535eab96dd97fb3dbdc592 \ @@ -466,124 +485,98 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.6.0 \ + --hash=sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae \ + --hash=sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf # via aws-sam-translator -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.16.1 \ + --hash=sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7 \ + --hash=sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca \ + --hash=sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51 \ + --hash=sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da \ + --hash=sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc \ + --hash=sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae \ + --hash=sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4 \ + --hash=sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b \ + --hash=sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0 \ + --hash=sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e \ + --hash=sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118 \ + --hash=sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506 \ + --hash=sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798 \ + --hash=sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f \ + --hash=sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d \ + --hash=sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948 \ + --hash=sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f \ + --hash=sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9 \ + --hash=sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137 \ + --hash=sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640 \ + --hash=sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f \ + --hash=sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff \ + --hash=sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706 \ + --hash=sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d \ + --hash=sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f \ + --hash=sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c \ + --hash=sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8 \ + --hash=sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1 \ + --hash=sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7 \ + --hash=sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95 \ + --hash=sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60 \ + --hash=sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253 \ + --hash=sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e \ + --hash=sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c \ + --hash=sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc \ + --hash=sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3 \ + --hash=sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8 \ + --hash=sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9 \ + --hash=sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c \ + --hash=sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388 \ + --hash=sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95 \ + --hash=sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91 \ + --hash=sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818 \ + --hash=sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8 \ + --hash=sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f \ + --hash=sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394 \ + --hash=sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13 \ + --hash=sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17 \ + --hash=sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7 \ + --hash=sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06 \ + --hash=sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f \ + --hash=sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196 \ + --hash=sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66 \ + --hash=sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf \ + --hash=sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c \ + --hash=sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76 \ + --hash=sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0 \ + --hash=sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212 \ + --hash=sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f \ + --hash=sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49 \ + --hash=sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206 \ + --hash=sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48 \ + --hash=sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c \ + --hash=sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2 \ + --hash=sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05 \ + --hash=sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610 \ + --hash=sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd \ + --hash=sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76 \ + --hash=sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1 \ + --hash=sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60 \ + --hash=sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34 \ + --hash=sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4 \ + --hash=sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864 \ + --hash=sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66 \ + --hash=sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c \ + --hash=sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e \ + --hash=sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54 \ + --hash=sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8 \ + --hash=sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e # via pydantic pygments==2.17.2 \ --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via rich -pyopenssl==23.3.0 \ - --hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \ - --hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12 +pyopenssl==24.0.0 \ + --hash=sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf \ + --hash=sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3 # via aws-sam-cli (setup.py) python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ @@ -592,13 +585,13 @@ python-dateutil==2.8.2 \ # arrow # botocore # dateparser -python-slugify==8.0.1 \ - --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ - --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 +python-slugify==8.0.3 \ + --hash=sha256:c71189c161e8c671f1b141034d9a56308a8a5978cd13d40446c879569212fdd1 \ + --hash=sha256:e04cba5f1c562502a1175c84a8bc23890c54cdaf23fccaaf0bf78511508cabed # via cookiecutter -pytz==2023.3.post1 \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 +pytz==2024.1 \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 # via dateparser pywin32==306 \ --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ @@ -661,101 +654,106 @@ pyyaml==6.0.1 \ # aws-sam-cli (setup.py) # cfn-lint # cookiecutter -referencing==0.32.0 \ - --hash=sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161 \ - --hash=sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99 +referencing==0.33.0 \ + --hash=sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5 \ + --hash=sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7 # via # jsonschema # jsonschema-specifications -regex==2023.10.3 \ - --hash=sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a \ - --hash=sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07 \ - --hash=sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca \ - --hash=sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58 \ - --hash=sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54 \ - --hash=sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed \ - --hash=sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff \ - --hash=sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528 \ - --hash=sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9 \ - --hash=sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971 \ - --hash=sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14 \ - --hash=sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af \ - --hash=sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302 \ - --hash=sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec \ - --hash=sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597 \ - --hash=sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b \ - --hash=sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd \ - --hash=sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767 \ - --hash=sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f \ - --hash=sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6 \ - --hash=sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293 \ - --hash=sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be \ - --hash=sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41 \ - --hash=sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc \ - --hash=sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29 \ - --hash=sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964 \ - --hash=sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d \ - --hash=sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a \ - --hash=sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc \ - --hash=sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55 \ - --hash=sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af \ - --hash=sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930 \ - --hash=sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e \ - --hash=sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d \ - --hash=sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863 \ - --hash=sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c \ - --hash=sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f \ - --hash=sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e \ - --hash=sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d \ - --hash=sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368 \ - --hash=sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb \ - --hash=sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52 \ - --hash=sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8 \ - --hash=sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4 \ - --hash=sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac \ - --hash=sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e \ - --hash=sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2 \ - --hash=sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a \ - --hash=sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4 \ - --hash=sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa \ - --hash=sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533 \ - --hash=sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b \ - --hash=sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588 \ - --hash=sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0 \ - --hash=sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915 \ - --hash=sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841 \ - --hash=sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a \ - --hash=sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988 \ - --hash=sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292 \ - --hash=sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3 \ - --hash=sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c \ - --hash=sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f \ - --hash=sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420 \ - --hash=sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9 \ - --hash=sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f \ - --hash=sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0 \ - --hash=sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b \ - --hash=sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037 \ - --hash=sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b \ - --hash=sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee \ - --hash=sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c \ - --hash=sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b \ - --hash=sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353 \ - --hash=sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051 \ - --hash=sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039 \ - --hash=sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a \ - --hash=sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b \ - --hash=sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e \ - --hash=sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5 \ - --hash=sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf \ - --hash=sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94 \ - --hash=sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991 \ - --hash=sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711 \ - --hash=sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a \ - --hash=sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab \ - --hash=sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a \ - --hash=sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11 \ - --hash=sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48 +regex==2023.12.25 \ + --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ + --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ + --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ + --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ + --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ + --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ + --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ + --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ + --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ + --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ + --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ + --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ + --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ + --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ + --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ + --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ + --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ + --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ + --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ + --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ + --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ + --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ + --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ + --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ + --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ + --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ + --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ + --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ + --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ + --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ + --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ + --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ + --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ + --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ + --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ + --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ + --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ + --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ + --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ + --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ + --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ + --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ + --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ + --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ + --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ + --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ + --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ + --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ + --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ + --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ + --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ + --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ + --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ + --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ + --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ + --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ + --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ + --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ + --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ + --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ + --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ + --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ + --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ + --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ + --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ + --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ + --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ + --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ + --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ + --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ + --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ + --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ + --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ + --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ + --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ + --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ + --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ + --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ + --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ + --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ + --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ + --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ + --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ + --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ + --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ + --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ + --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ + --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ + --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ + --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ + --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ + --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ + --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 # via # aws-sam-cli (setup.py) # cfn-lint @@ -773,106 +771,106 @@ rich==13.7.0 \ # via # aws-sam-cli (setup.py) # cookiecutter -rpds-py==0.13.2 \ - --hash=sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276 \ - --hash=sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f \ - --hash=sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60 \ - --hash=sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0 \ - --hash=sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d \ - --hash=sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3 \ - --hash=sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2 \ - --hash=sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9 \ - --hash=sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb \ - --hash=sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b \ - --hash=sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a \ - --hash=sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d \ - --hash=sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1 \ - --hash=sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7 \ - --hash=sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9 \ - --hash=sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4 \ - --hash=sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53 \ - --hash=sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea \ - --hash=sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66 \ - --hash=sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190 \ - --hash=sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3 \ - --hash=sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12 \ - --hash=sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824 \ - --hash=sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27 \ - --hash=sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e \ - --hash=sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8 \ - --hash=sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8 \ - --hash=sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914 \ - --hash=sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211 \ - --hash=sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab \ - --hash=sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468 \ - --hash=sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3 \ - --hash=sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff \ - --hash=sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c \ - --hash=sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d \ - --hash=sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e \ - --hash=sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a \ - --hash=sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e \ - --hash=sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a \ - --hash=sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0 \ - --hash=sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1 \ - --hash=sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3 \ - --hash=sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42 \ - --hash=sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452 \ - --hash=sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198 \ - --hash=sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa \ - --hash=sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b \ - --hash=sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4 \ - --hash=sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1 \ - --hash=sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad \ - --hash=sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c \ - --hash=sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381 \ - --hash=sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0 \ - --hash=sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2 \ - --hash=sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3 \ - --hash=sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31 \ - --hash=sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74 \ - --hash=sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6 \ - --hash=sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff \ - --hash=sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b \ - --hash=sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca \ - --hash=sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd \ - --hash=sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a \ - --hash=sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568 \ - --hash=sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1 \ - --hash=sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c \ - --hash=sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad \ - --hash=sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7 \ - --hash=sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d \ - --hash=sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658 \ - --hash=sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1 \ - --hash=sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64 \ - --hash=sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815 \ - --hash=sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1 \ - --hash=sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac \ - --hash=sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07 \ - --hash=sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e \ - --hash=sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee \ - --hash=sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45 \ - --hash=sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc \ - --hash=sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41 \ - --hash=sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2 \ - --hash=sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083 \ - --hash=sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e \ - --hash=sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266 \ - --hash=sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141 \ - --hash=sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b \ - --hash=sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933 \ - --hash=sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21 \ - --hash=sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0 \ - --hash=sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7 \ - --hash=sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc \ - --hash=sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba \ - --hash=sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a \ - --hash=sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57 \ - --hash=sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2 \ - --hash=sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007 \ - --hash=sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f \ - --hash=sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f +rpds-py==0.17.1 \ + --hash=sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147 \ + --hash=sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7 \ + --hash=sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2 \ + --hash=sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68 \ + --hash=sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1 \ + --hash=sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382 \ + --hash=sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d \ + --hash=sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921 \ + --hash=sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38 \ + --hash=sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4 \ + --hash=sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a \ + --hash=sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d \ + --hash=sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518 \ + --hash=sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e \ + --hash=sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d \ + --hash=sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf \ + --hash=sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5 \ + --hash=sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba \ + --hash=sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6 \ + --hash=sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59 \ + --hash=sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253 \ + --hash=sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6 \ + --hash=sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f \ + --hash=sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3 \ + --hash=sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea \ + --hash=sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1 \ + --hash=sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76 \ + --hash=sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93 \ + --hash=sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad \ + --hash=sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad \ + --hash=sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc \ + --hash=sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049 \ + --hash=sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d \ + --hash=sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90 \ + --hash=sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d \ + --hash=sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd \ + --hash=sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25 \ + --hash=sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2 \ + --hash=sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f \ + --hash=sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6 \ + --hash=sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4 \ + --hash=sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c \ + --hash=sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8 \ + --hash=sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d \ + --hash=sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b \ + --hash=sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19 \ + --hash=sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453 \ + --hash=sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9 \ + --hash=sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde \ + --hash=sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296 \ + --hash=sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58 \ + --hash=sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec \ + --hash=sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99 \ + --hash=sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a \ + --hash=sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb \ + --hash=sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383 \ + --hash=sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d \ + --hash=sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896 \ + --hash=sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc \ + --hash=sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6 \ + --hash=sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b \ + --hash=sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7 \ + --hash=sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22 \ + --hash=sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf \ + --hash=sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394 \ + --hash=sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0 \ + --hash=sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57 \ + --hash=sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74 \ + --hash=sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83 \ + --hash=sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29 \ + --hash=sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9 \ + --hash=sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f \ + --hash=sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745 \ + --hash=sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb \ + --hash=sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811 \ + --hash=sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55 \ + --hash=sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342 \ + --hash=sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23 \ + --hash=sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82 \ + --hash=sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041 \ + --hash=sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb \ + --hash=sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066 \ + --hash=sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55 \ + --hash=sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6 \ + --hash=sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a \ + --hash=sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140 \ + --hash=sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b \ + --hash=sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9 \ + --hash=sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256 \ + --hash=sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c \ + --hash=sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772 \ + --hash=sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4 \ + --hash=sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae \ + --hash=sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920 \ + --hash=sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a \ + --hash=sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b \ + --hash=sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361 \ + --hash=sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8 \ + --hash=sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a # via # jsonschema # referencing @@ -932,9 +930,9 @@ ruamel-yaml-clib==0.2.8 \ --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 # via ruamel-yaml -s3transfer==0.9.0 \ - --hash=sha256:01d4d2c35a016db8cb14f9a4d5e84c1f8c96e7ffc211422555eed45c11fa7eb1 \ - --hash=sha256:9e1b186ec8bb5907a1e82b51237091889a9973a2bb799a924bcd9f301ff79d3d +s3transfer==0.10.0 \ + --hash=sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e \ + --hash=sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b # via boto3 sarif-om==1.0.4 \ --hash=sha256:539ef47a662329b1c8502388ad92457425e95dc0aaaf995fe46f4984c4771911 \ @@ -958,17 +956,17 @@ tomlkit==0.12.3 \ --hash=sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4 \ --hash=sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba # via aws-sam-cli (setup.py) -types-awscrt==0.19.17 \ - --hash=sha256:047e30ac6156b6c25e0937ab2d45c9d6ace854021604da35d45fa832115adf82 \ - --hash=sha256:e677de979521f39b59a10e4f4464d395b970cb6812913efaee6eec689f454a81 +types-awscrt==0.20.3 \ + --hash=sha256:06a859189a329ca8e66d56ceeef2391488e39b878fbd2141f115eab4d416fe22 \ + --hash=sha256:f61a120d3e98ee1387bc5ca4b93437f258cc5c2af1f55f8634ec4cee5729f178 # via botocore-stubs -types-python-dateutil==2.8.19.14 \ - --hash=sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b \ - --hash=sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9 +types-python-dateutil==2.8.19.20240106 \ + --hash=sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f \ + --hash=sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2 # via arrow -types-s3transfer==0.7.0 \ - --hash=sha256:aca0f2486d0a3a5037cd5b8f3e20a4522a29579a8dd183281ff0aa1c4e2c8aa7 \ - --hash=sha256:ae9ed9273465d9f43da8b96307383da410c6b59c3b2464c88d20b578768e97c6 +types-s3transfer==0.10.0 \ + --hash=sha256:35e4998c25df7f8985ad69dedc8e4860e8af3b43b7615e940d53c00d413bdc69 \ + --hash=sha256:44fcdf0097b924a9aab1ee4baa1179081a9559ca62a88c807e2b256893ce688f # via boto3-stubs typing-extensions==4.9.0 \ --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ @@ -993,9 +991,9 @@ typing-extensions==4.9.0 \ # mypy-boto3-xray # pydantic # pydantic-core -tzdata==2023.3 \ - --hash=sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a \ - --hash=sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda +tzdata==2023.4 \ + --hash=sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3 \ + --hash=sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9 # via tzlocal tzlocal==5.2 \ --hash=sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8 \ @@ -1039,10 +1037,6 @@ watchdog==3.0.0 \ --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 # via aws-sam-cli (setup.py) -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker werkzeug==3.0.1 \ --hash=sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc \ --hash=sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 @@ -1053,7 +1047,7 @@ wheel==0.42.0 \ # via aws-lambda-builders # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via aws-lambda-builders diff --git a/samcli/__init__.py b/samcli/__init__.py index ed98927f4eb..513927b9d1d 100644 --- a/samcli/__init__.py +++ b/samcli/__init__.py @@ -2,4 +2,4 @@ SAM CLI version """ -__version__ = "1.105.0" +__version__ = "1.109.0" diff --git a/samcli/cli/cli_config_file.py b/samcli/cli/cli_config_file.py index 5c26c93ee77..ee2a69e9d96 100644 --- a/samcli/cli/cli_config_file.py +++ b/samcli/cli/cli_config_file.py @@ -406,9 +406,9 @@ def hello(name): def decorator_configuration_setup(f): configuration_setup_params = () configuration_setup_attrs = {} - configuration_setup_attrs[ - "help" - ] = "This is a hidden click option whose callback function loads configuration parameters." + configuration_setup_attrs["help"] = ( + "This is a hidden click option whose callback function loads configuration parameters." + ) configuration_setup_attrs["is_eager"] = True configuration_setup_attrs["expose_value"] = False configuration_setup_attrs["hidden"] = True diff --git a/samcli/cli/command.py b/samcli/cli/command.py index df142669487..9a52bd08dc0 100644 --- a/samcli/cli/command.py +++ b/samcli/cli/command.py @@ -1,6 +1,7 @@ """ Base classes that implement the CLI framework """ + import importlib import logging from collections import OrderedDict diff --git a/samcli/cli/core/command.py b/samcli/cli/core/command.py index 27f239b31a3..7c45f71aa0d 100644 --- a/samcli/cli/core/command.py +++ b/samcli/cli/core/command.py @@ -4,6 +4,7 @@ Should be used by all commands for a consistent UI experience """ + from typing import Any, Dict, List, Optional from click import Command, Context, Parameter, style diff --git a/samcli/cli/core/options.py b/samcli/cli/core/options.py index 8d9132c8cf3..b1b56fcf05e 100644 --- a/samcli/cli/core/options.py +++ b/samcli/cli/core/options.py @@ -1,6 +1,7 @@ """ Base Command Options related Data Structures for formatting. """ + from typing import Dict, List # The ordering of the option lists matter, they are the order in which options will be displayed. diff --git a/samcli/cli/formatters.py b/samcli/cli/formatters.py index c6045ea2b53..6a907cec36f 100644 --- a/samcli/cli/formatters.py +++ b/samcli/cli/formatters.py @@ -1,6 +1,7 @@ """ Click Help Formatter Classes that are customized for the root command. """ + from contextlib import contextmanager from typing import Iterator, Optional, Sequence diff --git a/samcli/cli/global_config.py b/samcli/cli/global_config.py index 6b4b8c71b25..b4f587ce84d 100644 --- a/samcli/cli/global_config.py +++ b/samcli/cli/global_config.py @@ -1,6 +1,7 @@ """ Provides global configuration helpers. """ + import json import logging import os @@ -154,8 +155,7 @@ def get_value( value_type: Type[bool], is_flag: bool, reload_config: bool = False, - ) -> bool: - ... + ) -> bool: ... # Overload for case where type is specified @overload @@ -166,8 +166,7 @@ def get_value( value_type: Type[T] = T, # type: ignore is_flag: bool = False, reload_config: bool = False, - ) -> Optional[T]: - ... + ) -> Optional[T]: ... # Overload for case where type is not specified and default to object @overload @@ -178,8 +177,7 @@ def get_value( value_type: object = object, is_flag: bool = False, reload_config: bool = False, - ) -> Any: - ... + ) -> Any: ... def get_value( self, diff --git a/samcli/cli/hidden_imports.py b/samcli/cli/hidden_imports.py index 99d21820a9d..c6c30b071a4 100644 --- a/samcli/cli/hidden_imports.py +++ b/samcli/cli/hidden_imports.py @@ -1,6 +1,7 @@ """ Keeps list of hidden/dynamic imports that is being used in SAM CLI, so that pyinstaller can include these packages """ + import pkgutil from types import ModuleType diff --git a/samcli/cli/root/command_list.py b/samcli/cli/root/command_list.py index cfa70007390..dc5316b5caa 100644 --- a/samcli/cli/root/command_list.py +++ b/samcli/cli/root/command_list.py @@ -1,6 +1,7 @@ """ Data structure to host the root command name and short help text to speed up load time. """ + SAM_CLI_COMMANDS = { "init": "Initialize an AWS SAM application.", "validate": "Validate an AWS SAM template.", diff --git a/samcli/cli/types.py b/samcli/cli/types.py index a1488407d66..894437b9a1f 100644 --- a/samcli/cli/types.py +++ b/samcli/cli/types.py @@ -453,6 +453,33 @@ def convert(self, value, param, ctx): return {key: _value} +class DockerAdditionalHostType(click.ParamType): + """ + Custom Parameter Type for managing Docker container's host file for local commands + """ + + name = "list" + MIN_KEY_VALUE_PAIR_LENGTH = 2 + + def convert(self, value, param, ctx): + """Converts the user provided parameters value with the format "host:IP" to dict + {"host": "IP"} + + Parameters + ------------ + value: User provided value for the click option + param: click parameter + ctx: Context + """ + host_ip_pair = value.split(":", maxsplit=1) + if len(host_ip_pair) < self.MIN_KEY_VALUE_PAIR_LENGTH: + raise click.BadParameter(f"{param.opts[0]} is not a valid format, it needs to be of the form hostname:IP") + host = host_ip_pair[0] + ip = host_ip_pair[1] + LOG.debug("Converting provided %s option value to dict", param.opts[0]) + return {host: ip} + + class RemoteInvokeOutputFormatType(click.Choice): """ Custom Parameter Type for output-format option of remote invoke command. diff --git a/samcli/commands/_utils/cdk_support_decorators.py b/samcli/commands/_utils/cdk_support_decorators.py index 4e9ccbb39b5..ddfdc8b487e 100644 --- a/samcli/commands/_utils/cdk_support_decorators.py +++ b/samcli/commands/_utils/cdk_support_decorators.py @@ -1,4 +1,5 @@ """CDK Support""" + import logging import click diff --git a/samcli/commands/_utils/click_mutex.py b/samcli/commands/_utils/click_mutex.py index 397e43acba5..1691bd2ce6e 100644 --- a/samcli/commands/_utils/click_mutex.py +++ b/samcli/commands/_utils/click_mutex.py @@ -1,6 +1,7 @@ """ Module to check mutually exclusive cli parameters """ + from typing import Any, List, Mapping, Tuple, cast import click diff --git a/samcli/commands/_utils/command_exception_handler.py b/samcli/commands/_utils/command_exception_handler.py index e9dc5a862a9..e84bdf41cc2 100644 --- a/samcli/commands/_utils/command_exception_handler.py +++ b/samcli/commands/_utils/command_exception_handler.py @@ -2,6 +2,7 @@ Contains method decorator which can be used to convert common exceptions into click exceptions which will end execution gracefully """ + from functools import wraps from typing import Any, Callable, Dict, Optional diff --git a/samcli/commands/_utils/constants.py b/samcli/commands/_utils/constants.py index 7f0f8bb0e3b..e411142ad7f 100644 --- a/samcli/commands/_utils/constants.py +++ b/samcli/commands/_utils/constants.py @@ -1,6 +1,7 @@ """ SAM CLI Default Build constants """ + import os DEFAULT_STACK_NAME = "sam-app" diff --git a/samcli/commands/_utils/custom_options/replace_help_option.py b/samcli/commands/_utils/custom_options/replace_help_option.py index ff538c7a25d..cfce8eee60f 100644 --- a/samcli/commands/_utils/custom_options/replace_help_option.py +++ b/samcli/commands/_utils/custom_options/replace_help_option.py @@ -1,6 +1,7 @@ """ Click option for replacing help text option name. """ + import click diff --git a/samcli/commands/_utils/experimental.py b/samcli/commands/_utils/experimental.py index b8b75570c1c..23622ec0a9b 100644 --- a/samcli/commands/_utils/experimental.py +++ b/samcli/commands/_utils/experimental.py @@ -1,4 +1,5 @@ """Experimental flag""" + import logging import sys from dataclasses import dataclass diff --git a/samcli/commands/_utils/option_value_processor.py b/samcli/commands/_utils/option_value_processor.py index f117d95eb04..6625637df97 100644 --- a/samcli/commands/_utils/option_value_processor.py +++ b/samcli/commands/_utils/option_value_processor.py @@ -1,6 +1,7 @@ """ Parsing utilities commonly used to process information for commands """ + import logging from typing import Dict, Optional, Tuple diff --git a/samcli/commands/_utils/options.py b/samcli/commands/_utils/options.py index 4796610b563..e2a599979af 100644 --- a/samcli/commands/_utils/options.py +++ b/samcli/commands/_utils/options.py @@ -156,6 +156,21 @@ def remote_invoke_boto_parameter_callback(ctx, param, provided_value): return boto_api_parameters +def local_add_host_callback(ctx, param, provided_value): + """ + Create a dictionary of hostnames to IP addresses to add into Docker container's hosts file. + :param ctx: Click Context + :param param: Param name + :param provided_value: Value provided by Click, after being processed by DockerAdditionalHostType. + :return: dictionary of hostnames to IP addresses. + """ + extra_hosts = {} + for value in provided_value: + extra_hosts.update(value) + + return extra_hosts + + def artifact_callback(ctx, param, provided_value, artifact): """ Provide an error if there are zip/image artifact based resources, @@ -317,9 +332,11 @@ def template_click_option(include_build=True): callback=partial(get_or_default_template_file_name, include_build=include_build), show_default=True, is_eager=True, - help="AWS SAM template which references built artifacts for resources in the template. (if applicable)" - if include_build - else "AWS SAM template file.", + help=( + "AWS SAM template which references built artifacts for resources in the template. (if applicable)" + if include_build + else "AWS SAM template file." + ), ) @@ -752,9 +769,9 @@ def hook_name_setup(f): def hook_name_processer_wrapper(f): configuration_setup_params = () configuration_setup_attrs = {} - configuration_setup_attrs[ - "help" - ] = "This is a hidden click option whose callback function to run the provided hook package." + configuration_setup_attrs["help"] = ( + "This is a hidden click option whose callback function to run the provided hook package." + ) configuration_setup_attrs["is_eager"] = True configuration_setup_attrs["expose_value"] = False configuration_setup_attrs["hidden"] = True diff --git a/samcli/commands/_utils/table_print.py b/samcli/commands/_utils/table_print.py index edb686ee6f9..0e22378e982 100644 --- a/samcli/commands/_utils/table_print.py +++ b/samcli/commands/_utils/table_print.py @@ -1,6 +1,7 @@ """ Utilities for table pretty printing using click """ + import shutil import textwrap from functools import wraps diff --git a/samcli/commands/_utils/template.py b/samcli/commands/_utils/template.py index 8a45c2e0d30..622900d7e52 100644 --- a/samcli/commands/_utils/template.py +++ b/samcli/commands/_utils/template.py @@ -1,6 +1,7 @@ """ Utilities to manipulate template """ + import itertools import os import pathlib diff --git a/samcli/commands/bootstrap/command.py b/samcli/commands/bootstrap/command.py index 64c18cf8bd2..4a6a4e2a27b 100644 --- a/samcli/commands/bootstrap/command.py +++ b/samcli/commands/bootstrap/command.py @@ -1,6 +1,7 @@ """ CLI command for "bootstrap", which sets up a SAM development environment """ + import click from samcli.cli.main import aws_creds_options, common_options, pass_context diff --git a/samcli/commands/build/build_context.py b/samcli/commands/build/build_context.py index 7e2450a1552..c976f13532a 100644 --- a/samcli/commands/build/build_context.py +++ b/samcli/commands/build/build_context.py @@ -1,6 +1,7 @@ """ Context object used by build command """ + import logging import os import pathlib diff --git a/samcli/commands/build/click_container.py b/samcli/commands/build/click_container.py index 2b6273036b6..8e6ad43d4b0 100644 --- a/samcli/commands/build/click_container.py +++ b/samcli/commands/build/click_container.py @@ -1,6 +1,7 @@ """ Module to check container based cli parameters """ + import click diff --git a/samcli/commands/build/core/formatters.py b/samcli/commands/build/core/formatters.py index f8e2502de1d..6444732a21c 100644 --- a/samcli/commands/build/core/formatters.py +++ b/samcli/commands/build/core/formatters.py @@ -1,6 +1,7 @@ """ Build Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.build.core.options import ALL_OPTIONS diff --git a/samcli/commands/build/core/options.py b/samcli/commands/build/core/options.py index 80f3b06ebbf..2da97d83ed9 100644 --- a/samcli/commands/build/core/options.py +++ b/samcli/commands/build/core/options.py @@ -1,6 +1,7 @@ """ Build Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.row_modifiers import RowDefinition diff --git a/samcli/commands/build/utils.py b/samcli/commands/build/utils.py index ad84b047d46..7f5668efbf3 100644 --- a/samcli/commands/build/utils.py +++ b/samcli/commands/build/utils.py @@ -1,6 +1,7 @@ """ Utilities for sam build command """ + import pathlib from enum import Enum from typing import List diff --git a/samcli/commands/delete/command.py b/samcli/commands/delete/command.py index 0088ba6647d..b4a29320732 100644 --- a/samcli/commands/delete/command.py +++ b/samcli/commands/delete/command.py @@ -7,9 +7,10 @@ import click -from samcli.cli.cli_config_file import save_params_option +from samcli.cli.cli_config_file import ConfigProvider, configuration_option, save_params_option from samcli.cli.main import aws_creds_options, common_options, pass_context, print_cmdline_args from samcli.commands._utils.command_exception_handler import command_exception_handler +from samcli.commands.delete.delete_context import CONFIG_COMMAND, CONFIG_SECTION from samcli.lib.telemetry.metric import track_command from samcli.lib.utils.version_checker import check_newer_version @@ -33,34 +34,12 @@ context_settings={"ignore_unknown_options": False, "allow_interspersed_args": True, "allow_extra_args": True}, help=HELP_TEXT, ) +@configuration_option(provider=ConfigProvider(CONFIG_SECTION, [CONFIG_COMMAND])) @click.option( "--stack-name", required=False, help="The name of the AWS CloudFormation stack you want to delete. ", ) -@click.option( - "--config-file", - help=( - "The path and file name of the configuration file containing default parameter values to use. " - "Its default value is 'samconfig.toml' in project directory. For more information about configuration files, " - "see: " - "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html." - ), - type=click.STRING, - default="samconfig.toml", - show_default=True, -) -@click.option( - "--config-env", - help=( - "The environment name specifying the default parameter values in the configuration file to use. " - "Its default value is 'default'. For more information about configuration files, see: " - "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html." - ), - type=click.STRING, - default="default", - show_default=True, -) @click.option( "--no-prompts", help=("Specify this flag to allow SAM CLI to skip through the guided prompts."), @@ -92,11 +71,11 @@ def cli( ctx, stack_name: str, - config_file: str, - config_env: str, no_prompts: bool, s3_bucket: str, s3_prefix: str, + config_env: str, + config_file: str, save_params: bool, ): """ @@ -107,8 +86,6 @@ def cli( do_cli( stack_name=stack_name, region=ctx.region, - config_file=config_file, - config_env=config_env, profile=ctx.profile, no_prompts=no_prompts, s3_bucket=s3_bucket, @@ -119,8 +96,6 @@ def cli( def do_cli( stack_name: str, region: str, - config_file: str, - config_env: str, profile: str, no_prompts: bool, s3_bucket: Optional[str], @@ -135,8 +110,6 @@ def do_cli( stack_name=stack_name, region=region, profile=profile, - config_file=config_file, - config_env=config_env, no_prompts=no_prompts, s3_bucket=s3_bucket, s3_prefix=s3_prefix, diff --git a/samcli/commands/delete/delete_context.py b/samcli/commands/delete/delete_context.py index 2de317d46e0..e944eaeb8bb 100644 --- a/samcli/commands/delete/delete_context.py +++ b/samcli/commands/delete/delete_context.py @@ -1,6 +1,7 @@ """ Delete a SAM stack """ + import logging from typing import Optional @@ -8,7 +9,6 @@ from botocore.exceptions import NoCredentialsError, NoRegionError from click import confirm, prompt -from samcli.cli.cli_config_file import ConfigProvider from samcli.commands.delete.exceptions import CfDeleteFailedStatusError from samcli.commands.exceptions import AWSServiceClientError, RegionError from samcli.lib.bootstrap.companion_stack.companion_stack_builder import CompanionStack @@ -34,8 +34,6 @@ def __init__( stack_name: str, region: str, profile: str, - config_file: str, - config_env: str, no_prompts: bool, s3_bucket: Optional[str], s3_prefix: Optional[str], @@ -43,8 +41,6 @@ def __init__( self.stack_name = stack_name self.region = region self.profile = profile - self.config_file = config_file - self.config_env = config_env self.no_prompts = no_prompts self.s3_bucket = s3_bucket self.s3_prefix = s3_prefix @@ -58,7 +54,6 @@ def __init__( self.companion_stack_name = None def __enter__(self): - self.parse_config_file() if not self.stack_name: LOG.debug("No stack-name input found") if not self.no_prompts: @@ -77,32 +72,6 @@ def __enter__(self): def __exit__(self, *args): pass - def parse_config_file(self): - """ - Read the provided config file if it exists and assign the options values. - """ - config_provider = ConfigProvider(CONFIG_SECTION, [CONFIG_COMMAND]) - config_options = config_provider( - config_path=self.config_file, config_env=self.config_env, cmd_names=[CONFIG_COMMAND] - ) - if not config_options: - return - - if not self.stack_name: - self.stack_name = config_options.get("stack_name", None) - # If the stack_name is same as the one present in samconfig file, - # get the information about parameters if not specified by user. - if self.stack_name and self.stack_name == config_options.get("stack_name", None): - LOG.debug("Local config present and using the defined options") - if not self.region: - self.region = config_options.get("region", None) - if not self.profile: - self.profile = config_options.get("profile", None) - if not self.s3_bucket: - self.s3_bucket = config_options.get("s3_bucket", None) - if not self.s3_prefix: - self.s3_prefix = config_options.get("s3_prefix", None) - def init_clients(self): """ Initialize all the clients being used by sam delete. diff --git a/samcli/commands/delete/exceptions.py b/samcli/commands/delete/exceptions.py index 1b6a21f8bc3..af034c18490 100644 --- a/samcli/commands/delete/exceptions.py +++ b/samcli/commands/delete/exceptions.py @@ -1,6 +1,7 @@ """ Exceptions that are raised by sam delete """ + from samcli.commands.exceptions import UserException diff --git a/samcli/commands/deploy/auth_utils.py b/samcli/commands/deploy/auth_utils.py index 7e13cd85931..fca6c4f4784 100644 --- a/samcli/commands/deploy/auth_utils.py +++ b/samcli/commands/deploy/auth_utils.py @@ -1,12 +1,14 @@ """ Utilities for checking authorization of certain resource types """ + import logging from typing import List, Tuple from samcli.commands.local.lib.swagger.reader import SwaggerReader from samcli.lib.providers.provider import Stack from samcli.lib.providers.sam_function_provider import SamFunctionProvider +from samcli.lib.utils.resources import AWS_APIGATEWAY_RESTAPI, AWS_APIGATEWAY_V2_API LOG = logging.getLogger(__name__) @@ -101,6 +103,11 @@ def _auth_id(resources_dict, event_properties, identifier): """ resource_name = event_properties.get(identifier, "") api_resource = resources_dict.get(resource_name, {}) + + # Auth does not apply to ApiGateway::RestApi or ApiGatwayV2::Api resources so return true and continue + if api_resource and (api_resource.get("Type") in [AWS_APIGATEWAY_RESTAPI, AWS_APIGATEWAY_V2_API]): + return True + return any( [ api_resource.get("Properties", {}).get("Auth", False), diff --git a/samcli/commands/deploy/command.py b/samcli/commands/deploy/command.py index 20b9743cadd..09a30ce553f 100644 --- a/samcli/commands/deploy/command.py +++ b/samcli/commands/deploy/command.py @@ -1,6 +1,7 @@ """ CLI command for "deploy" command """ + import logging import os @@ -347,9 +348,11 @@ def do_cli( no_progressbar=no_progressbar, s3_prefix=guided_context.guided_s3_prefix if guided else s3_prefix, kms_key_id=kms_key_id, - parameter_overrides=sanitize_parameter_overrides(guided_context.guided_parameter_overrides) - if guided - else parameter_overrides, + parameter_overrides=( + sanitize_parameter_overrides(guided_context.guided_parameter_overrides) + if guided + else parameter_overrides + ), capabilities=guided_context.guided_capabilities if guided else capabilities, no_execute_changeset=no_execute_changeset, role_arn=role_arn, diff --git a/samcli/commands/deploy/core/options.py b/samcli/commands/deploy/core/options.py index 6c4bbdb0a01..f7e943367bc 100644 --- a/samcli/commands/deploy/core/options.py +++ b/samcli/commands/deploy/core/options.py @@ -1,6 +1,7 @@ """ Deploy Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/deploy/exceptions.py b/samcli/commands/deploy/exceptions.py index a3b915259eb..2cbbcd5b42e 100644 --- a/samcli/commands/deploy/exceptions.py +++ b/samcli/commands/deploy/exceptions.py @@ -1,6 +1,7 @@ """ Exceptions that are raised by sam deploy """ + from samcli.commands.exceptions import UserException diff --git a/samcli/commands/deploy/guided_config.py b/samcli/commands/deploy/guided_config.py index 78866944cdc..b1eacea8273 100644 --- a/samcli/commands/deploy/guided_config.py +++ b/samcli/commands/deploy/guided_config.py @@ -1,6 +1,7 @@ """ Set of Utilities to deal with reading/writing to configuration file during sam deploy """ + from typing import Any import click diff --git a/samcli/commands/docs/command.py b/samcli/commands/docs/command.py index e42bef44488..303dd09fd87 100644 --- a/samcli/commands/docs/command.py +++ b/samcli/commands/docs/command.py @@ -1,6 +1,7 @@ """ CLI command for "docs" command """ + from typing import Type from click import Command, command diff --git a/samcli/commands/docs/core/command.py b/samcli/commands/docs/core/command.py index a22b98e42e6..4cb362330c1 100644 --- a/samcli/commands/docs/core/command.py +++ b/samcli/commands/docs/core/command.py @@ -1,6 +1,7 @@ """ Module contains classes for creating the docs command from click """ + import os from typing import List, Optional diff --git a/samcli/commands/docs/core/formatter.py b/samcli/commands/docs/core/formatter.py index e11a168defe..99f3c6a9207 100644 --- a/samcli/commands/docs/core/formatter.py +++ b/samcli/commands/docs/core/formatter.py @@ -1,6 +1,7 @@ """ Base formatter for the docs command help text """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier diff --git a/samcli/commands/exceptions.py b/samcli/commands/exceptions.py index b5e8e516eb4..d8708c92722 100644 --- a/samcli/commands/exceptions.py +++ b/samcli/commands/exceptions.py @@ -1,6 +1,7 @@ """ Class containing error conditions that are exposed to the user. """ + import traceback from typing import IO, Optional from urllib.parse import quote diff --git a/samcli/commands/init/__init__.py b/samcli/commands/init/__init__.py index 6a88e92de21..7f72e7f7fd4 100644 --- a/samcli/commands/init/__init__.py +++ b/samcli/commands/init/__init__.py @@ -1,4 +1,5 @@ """ Expose top level cli command for `init` """ + from .command import cli diff --git a/samcli/commands/init/command.py b/samcli/commands/init/command.py index 6f60ca1d868..e1d1c717b74 100644 --- a/samcli/commands/init/command.py +++ b/samcli/commands/init/command.py @@ -1,6 +1,7 @@ """ Init command to scaffold a project app from a template """ + import json import logging from json import JSONDecodeError diff --git a/samcli/commands/init/core/options.py b/samcli/commands/init/core/options.py index 586c919ba57..291c2801a39 100644 --- a/samcli/commands/init/core/options.py +++ b/samcli/commands/init/core/options.py @@ -1,6 +1,7 @@ """ Init Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/init/init_flow_helpers.py b/samcli/commands/init/init_flow_helpers.py index 6ca7352b1b8..fe8d41b623b 100644 --- a/samcli/commands/init/init_flow_helpers.py +++ b/samcli/commands/init/init_flow_helpers.py @@ -1,6 +1,7 @@ """ Init flow based helper functions """ + import functools import logging import re diff --git a/samcli/commands/init/init_templates.py b/samcli/commands/init/init_templates.py index f2744c8da6b..b1d1d55a01f 100644 --- a/samcli/commands/init/init_templates.py +++ b/samcli/commands/init/init_templates.py @@ -1,6 +1,7 @@ """ Manages the set of application templates. """ + import itertools import json import logging diff --git a/samcli/commands/init/interactive_init_flow.py b/samcli/commands/init/interactive_init_flow.py index 8f724dbed11..57a1c1f64b8 100644 --- a/samcli/commands/init/interactive_init_flow.py +++ b/samcli/commands/init/interactive_init_flow.py @@ -1,6 +1,7 @@ """ Isolates interactive init prompt flow. Expected to call generator logic at end of flow. """ + import logging import pathlib import tempfile diff --git a/samcli/commands/list/cli_common/list_common_context.py b/samcli/commands/list/cli_common/list_common_context.py index 455314ec198..e51c8de07f7 100644 --- a/samcli/commands/list/cli_common/list_common_context.py +++ b/samcli/commands/list/cli_common/list_common_context.py @@ -1,6 +1,7 @@ """ Common context class to inherit from for sam list sub-commands """ + from samcli.lib.utils.boto_utils import get_boto_client_provider_with_config diff --git a/samcli/commands/list/endpoints/endpoints_context.py b/samcli/commands/list/endpoints/endpoints_context.py index 9f31eff9ce4..3f5b932e61c 100644 --- a/samcli/commands/list/endpoints/endpoints_context.py +++ b/samcli/commands/list/endpoints/endpoints_context.py @@ -1,6 +1,7 @@ """ Display of the Endpoints of a SAM stack """ + import logging from typing import Optional diff --git a/samcli/commands/list/exceptions.py b/samcli/commands/list/exceptions.py index 9269249d0ee..b0ecb9a8d1c 100644 --- a/samcli/commands/list/exceptions.py +++ b/samcli/commands/list/exceptions.py @@ -2,7 +2,6 @@ Exceptions for SAM list """ - from samcli.commands.exceptions import UserException diff --git a/samcli/commands/list/json_consumer.py b/samcli/commands/list/json_consumer.py index 0153830ac6e..78d54810a5e 100644 --- a/samcli/commands/list/json_consumer.py +++ b/samcli/commands/list/json_consumer.py @@ -1,6 +1,7 @@ """ The json consumer for 'sam list' """ + import click from samcli.lib.list.list_interfaces import ListInfoPullerConsumer diff --git a/samcli/commands/list/resources/resources_context.py b/samcli/commands/list/resources/resources_context.py index ea971bc7b15..ba8e5d1dbeb 100644 --- a/samcli/commands/list/resources/resources_context.py +++ b/samcli/commands/list/resources/resources_context.py @@ -1,6 +1,7 @@ """ Display the Resources of a SAM stack """ + import logging from typing import Optional diff --git a/samcli/commands/list/stack_outputs/stack_outputs_context.py b/samcli/commands/list/stack_outputs/stack_outputs_context.py index efd40eed8a0..ab8a922bbb9 100644 --- a/samcli/commands/list/stack_outputs/stack_outputs_context.py +++ b/samcli/commands/list/stack_outputs/stack_outputs_context.py @@ -1,6 +1,7 @@ """ Display the Outputs of a SAM stack """ + import logging from typing import Optional diff --git a/samcli/commands/list/table_consumer.py b/samcli/commands/list/table_consumer.py index e39915b2f34..f6c70136dee 100644 --- a/samcli/commands/list/table_consumer.py +++ b/samcli/commands/list/table_consumer.py @@ -1,6 +1,7 @@ """ The table consumer for 'sam list' """ + from typing import Any, Dict from samcli.commands._utils.table_print import pprint_column_names, pprint_columns diff --git a/samcli/commands/local/cli_common/invoke_context.py b/samcli/commands/local/cli_common/invoke_context.py index 30dc8b4c031..92557611439 100644 --- a/samcli/commands/local/cli_common/invoke_context.py +++ b/samcli/commands/local/cli_common/invoke_context.py @@ -1,6 +1,7 @@ """ Reads CLI arguments and performs necessary preparation to be able to run the function """ + import errno import json import logging @@ -97,6 +98,7 @@ def __init__( shutdown: bool = False, container_host: Optional[str] = None, container_host_interface: Optional[str] = None, + add_host: Optional[dict] = None, invoke_images: Optional[str] = None, ) -> None: """ @@ -148,6 +150,8 @@ def __init__( Optional. Host of locally emulated Lambda container container_host_interface string Optional. Interface that Docker host binds ports to + add_host dict + Optional. Docker extra hosts support from --add-host parameters invoke_images dict Optional. A dictionary that defines the custom invoke image URI of each function """ @@ -177,6 +181,9 @@ def __init__( self._container_host = container_host self._container_host_interface = container_host_interface + + self._extra_hosts: Optional[Dict] = add_host + self._invoke_images = invoke_images self._containers_mode = ContainersMode.COLD @@ -396,6 +403,7 @@ def local_lambda_runner(self) -> LocalLambdaRunner: debug_context=self._debug_context, container_host=self._container_host, container_host_interface=self._container_host_interface, + extra_hosts=self._extra_hosts, ) return self._local_lambda_runner diff --git a/samcli/commands/local/cli_common/options.py b/samcli/commands/local/cli_common/options.py index 052902eab7e..8550a8ba958 100644 --- a/samcli/commands/local/cli_common/options.py +++ b/samcli/commands/local/cli_common/options.py @@ -1,11 +1,18 @@ """ Common CLI options for invoke command """ + from pathlib import Path import click -from samcli.commands._utils.options import docker_click_options, parameter_override_click_option, template_click_option +from samcli.cli.types import DockerAdditionalHostType +from samcli.commands._utils.options import ( + docker_click_options, + local_add_host_callback, + parameter_override_click_option, + template_click_option, +) from samcli.commands.local.cli_common.invoke_context import ContainersInitializationMode from samcli.local.docker.container import DEFAULT_CONTAINER_HOST_INTERFACE @@ -65,6 +72,18 @@ def local_common_options(f): help="IP address of the host network interface that container ports should bind to. " "Use 0.0.0.0 to bind to all interfaces.", ), + click.option( + "--add-host", + multiple=True, + type=DockerAdditionalHostType(), + callback=local_add_host_callback, + required=False, + help="Passes a hostname to IP address mapping to the Docker container's host file. " + "This parameter can be passed multiple times." + "" + "Example:" + "--add-host example.com:127.0.0.1", + ), click.option( "--invoke-image", "-ii", diff --git a/samcli/commands/local/generate_event/core/command.py b/samcli/commands/local/generate_event/core/command.py index 1fd17d4a46b..2303867218d 100644 --- a/samcli/commands/local/generate_event/core/command.py +++ b/samcli/commands/local/generate_event/core/command.py @@ -1,6 +1,7 @@ """ Generate Event Command Class. """ + from click import Context, style from samcli.cli.core.command import CoreCommand diff --git a/samcli/commands/local/invoke/cli.py b/samcli/commands/local/invoke/cli.py index ac3856bb008..a31d68386d0 100644 --- a/samcli/commands/local/invoke/cli.py +++ b/samcli/commands/local/invoke/cli.py @@ -90,6 +90,7 @@ def cli( config_env, container_host, container_host_interface, + add_host, invoke_image, hook_name, skip_prepare_infra, @@ -121,6 +122,7 @@ def cli( parameter_overrides, container_host, container_host_interface, + add_host, invoke_image, hook_name, ) # pragma: no cover @@ -147,6 +149,7 @@ def do_cli( # pylint: disable=R0914 parameter_overrides, container_host, container_host_interface, + add_host, invoke_image, hook_name, ): @@ -195,6 +198,7 @@ def do_cli( # pylint: disable=R0914 shutdown=shutdown, container_host=container_host, container_host_interface=container_host_interface, + add_host=add_host, invoke_images=processed_invoke_images, ) as context: # Invoke the function diff --git a/samcli/commands/local/invoke/core/command.py b/samcli/commands/local/invoke/core/command.py index 3551530462d..1d4f9ce3f52 100644 --- a/samcli/commands/local/invoke/core/command.py +++ b/samcli/commands/local/invoke/core/command.py @@ -1,6 +1,7 @@ """ Invoke Command Class. """ + import json from click import Context, style diff --git a/samcli/commands/local/invoke/core/formatters.py b/samcli/commands/local/invoke/core/formatters.py index bad4eb881bd..b08fd9bcb4f 100644 --- a/samcli/commands/local/invoke/core/formatters.py +++ b/samcli/commands/local/invoke/core/formatters.py @@ -1,6 +1,7 @@ """ Invoke Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.local.invoke.core.options import ALL_OPTIONS diff --git a/samcli/commands/local/invoke/core/options.py b/samcli/commands/local/invoke/core/options.py index 25a9576b218..dbd9b652ebd 100644 --- a/samcli/commands/local/invoke/core/options.py +++ b/samcli/commands/local/invoke/core/options.py @@ -1,6 +1,7 @@ """ Invoke Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info @@ -32,6 +33,7 @@ "shutdown", "container_host", "container_host_interface", + "add_host", "invoke_image", ] diff --git a/samcli/commands/local/lib/exceptions.py b/samcli/commands/local/lib/exceptions.py index 7d739f3ef2f..c19b694d60c 100644 --- a/samcli/commands/local/lib/exceptions.py +++ b/samcli/commands/local/lib/exceptions.py @@ -1,6 +1,7 @@ """ Custom exceptions raised by this local library """ + from samcli.commands.exceptions import UserException diff --git a/samcli/commands/local/lib/local_api_service.py b/samcli/commands/local/lib/local_api_service.py index 9b5b90108ca..a40c5539604 100644 --- a/samcli/commands/local/lib/local_api_service.py +++ b/samcli/commands/local/lib/local_api_service.py @@ -18,7 +18,7 @@ class LocalApiService: Lambda function. """ - def __init__(self, lambda_invoke_context, port, host, static_dir, disable_authorizer): + def __init__(self, lambda_invoke_context, port, host, static_dir, disable_authorizer, ssl_context): """ Initialize the local API service. @@ -28,11 +28,14 @@ def __init__(self, lambda_invoke_context, port, host, static_dir, disable_author :param string host: Local hostname or IP address to bind to :param string static_dir: Optional, directory from which static files will be mounted :param bool disable_authorizer: Optional, flag for disabling the parsing of lambda authorizers + :param tuple(string, string) ssl_context: Optional, path to ssl certificate and key files to start service + in https """ self.port = port self.host = host self.static_dir = static_dir + self.ssl_context = ssl_context self.cwd = lambda_invoke_context.get_cwd() self.disable_authorizer = disable_authorizer @@ -66,13 +69,14 @@ def start(self): static_dir=static_dir_path, port=self.port, host=self.host, + ssl_context=self.ssl_context, stderr=self.stderr_stream, ) service.create() # Print out the list of routes that will be mounted - self._print_routes(self.api_provider.api.routes, self.host, self.port) + self._print_routes(self.api_provider.api.routes, self.host, self.port, bool(self.ssl_context)) LOG.info( "You can now browse to the above endpoints to invoke your functions. " "You do not need to restart/reload SAM CLI while working on your functions, " @@ -84,7 +88,7 @@ def start(self): service.run() @staticmethod - def _print_routes(routes, host, port): + def _print_routes(routes, host, port, ssl_enabled=False): """ Helper method to print the APIs that will be mounted. This method is purely for printing purposes. This method takes in a list of Route Configurations and prints out the Routes grouped by path. @@ -100,14 +104,19 @@ def _print_routes(routes, host, port): Host name where the service is running :param int port: Port number where the service is running + :param bool ssl_enabled: + Boolean parameter to set whether SSL configuration is enabled :returns list(string): List of lines that were printed to the console. Helps with testing """ print_lines = [] + protocol = "https" if ssl_enabled else "http" for route in routes: methods_str = "[{}]".format(", ".join(route.methods)) - output = "Mounting {} at http://{}:{}{} {}".format(route.function_name, host, port, route.path, methods_str) + output = "Mounting {} at {}://{}:{}{} {}".format( + route.function_name, protocol, host, port, route.path, methods_str + ) print_lines.append(output) LOG.info(output) diff --git a/samcli/commands/local/lib/local_lambda.py b/samcli/commands/local/lib/local_lambda.py index 14f7578187a..e2d0e80b9e6 100644 --- a/samcli/commands/local/lib/local_lambda.py +++ b/samcli/commands/local/lib/local_lambda.py @@ -51,6 +51,7 @@ def __init__( debug_context: Optional[DebugContext] = None, container_host: Optional[str] = None, container_host_interface: Optional[str] = None, + extra_hosts: Optional[dict] = None, ) -> None: """ Initializes the class @@ -65,6 +66,7 @@ def __init__( :param DebugContext debug_context: Optional. Debug context for the function (includes port, args, and path). :param string container_host: Optional. Host of locally emulated Lambda container :param string container_host_interface: Optional. Interface that Docker host binds ports to + :param dict extra_hosts: Optional. Dict of hostname to IP resolutions """ self.local_runtime = local_runtime @@ -78,6 +80,7 @@ def __init__( self._boto3_region: Optional[str] = None self.container_host = container_host self.container_host_interface = container_host_interface + self.extra_hosts = extra_hosts def invoke( self, @@ -149,6 +152,7 @@ def invoke( stderr=stderr, container_host=self.container_host, container_host_interface=self.container_host_interface, + extra_hosts=self.extra_hosts, ) except ContainerResponseException: # NOTE(sriram-mv): This should still result in a exit code zero to avoid regressions. diff --git a/samcli/commands/local/lib/local_lambda_service.py b/samcli/commands/local/lib/local_lambda_service.py index 07d11f78f05..9b4083dcc65 100644 --- a/samcli/commands/local/lib/local_lambda_service.py +++ b/samcli/commands/local/lib/local_lambda_service.py @@ -1,6 +1,7 @@ """ Connects the CLI with Local Lambda Invoke Service. """ + import logging from samcli.local.lambda_service.local_lambda_invoke_service import LocalLambdaInvokeService @@ -14,7 +15,7 @@ class LocalLambdaService: that are defined in a SAM file. """ - def __init__(self, lambda_invoke_context, port, host): + def __init__(self, lambda_invoke_context, port, host, ssl_context=None): """ Initialize the Local Lambda Invoke service. @@ -22,10 +23,13 @@ def __init__(self, lambda_invoke_context, port, host): that can help with Lambda invocation :param int port: Port to listen on :param string host: Local hostname or IP address to bind to + :param tuple(string, string) ssl_context: Optional, path to ssl certificate and key files to start service + in https """ self.port = port self.host = host + self.ssl_context = ssl_context self.lambda_runner = lambda_invoke_context.local_lambda_runner self.stderr_stream = lambda_invoke_context.stderr @@ -43,7 +47,11 @@ def start(self): # to the console or a log file. stderr from Docker container contains runtime logs and output of print # statements from the Lambda function service = LocalLambdaInvokeService( - lambda_runner=self.lambda_runner, port=self.port, host=self.host, stderr=self.stderr_stream + lambda_runner=self.lambda_runner, + port=self.port, + host=self.host, + ssl_context=self.ssl_context, + stderr=self.stderr_stream, ) service.create() diff --git a/samcli/commands/local/lib/swagger/parser.py b/samcli/commands/local/lib/swagger/parser.py index 68ada78024a..dd97a2a9597 100644 --- a/samcli/commands/local/lib/swagger/parser.py +++ b/samcli/commands/local/lib/swagger/parser.py @@ -359,7 +359,6 @@ def get_routes(self, event_type=Route.API) -> List[Route]: authorizer_name = None use_default_authorizer = True - if authorizers is not None: if not isinstance(authorizers, list): raise InvalidSecurityDefinition( @@ -373,7 +372,7 @@ def get_routes(self, event_type=Route.API) -> List[Route]: f"for path='{full_path}' method='{method}', found '{len(authorizers)}'" ) - if len(authorizers) == 1: + if len(authorizers) == 1 and authorizers[0] != {}: # user has authorizer defined authorizer_object = authorizers[0] authorizer_object = list(authorizers[0]) diff --git a/samcli/commands/local/lib/validators/identity_source_validator.py b/samcli/commands/local/lib/validators/identity_source_validator.py index e95cc6a3165..d9c45b5cf3d 100644 --- a/samcli/commands/local/lib/validators/identity_source_validator.py +++ b/samcli/commands/local/lib/validators/identity_source_validator.py @@ -1,6 +1,7 @@ """ Handles the validation of identity sources """ + import re from samcli.local.apigw.route import Route diff --git a/samcli/commands/local/lib/validators/lambda_auth_props.py b/samcli/commands/local/lib/validators/lambda_auth_props.py index 96a9ce05b1f..7c111b02fc5 100644 --- a/samcli/commands/local/lib/validators/lambda_auth_props.py +++ b/samcli/commands/local/lib/validators/lambda_auth_props.py @@ -1,6 +1,7 @@ """ Module to help validate Lambda Authorizer properties """ + import logging from abc import ABC, abstractmethod diff --git a/samcli/commands/local/start_api/cli.py b/samcli/commands/local/start_api/cli.py index ead889c3440..cba1ebe7eaa 100644 --- a/samcli/commands/local/start_api/cli.py +++ b/samcli/commands/local/start_api/cli.py @@ -3,12 +3,14 @@ """ import logging +from ssl import SSLError import click from samcli.cli.cli_config_file import ConfigProvider, configuration_option, save_params_option from samcli.cli.main import aws_creds_options, pass_context, print_cmdline_args from samcli.cli.main import common_options as cli_framework_options +from samcli.commands._utils.click_mutex import ClickMutex from samcli.commands._utils.option_value_processor import process_image_options from samcli.commands._utils.options import ( generate_next_command_recommendation, @@ -77,6 +79,22 @@ default=False, help="Disable custom Lambda Authorizers from being parsed and invoked.", ) +@click.option( + "--ssl-cert-file", + default=None, + type=click.Path(exists=True), + cls=ClickMutex, + required_param_lists=[["ssl_key_file"]], + help="Path to SSL certificate file (default: None)", +) +@click.option( + "--ssl-key-file", + default=None, + type=click.Path(exists=True), + cls=ClickMutex, + required_param_lists=[["ssl_cert_file"]], + help="Path to SSL key file (default: None)", +) @invoke_common_options @warm_containers_common_options @local_common_options @@ -116,10 +134,13 @@ def cli( debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, skip_prepare_infra, terraform_plan_file, + ssl_cert_file, + ssl_key_file, ): """ `sam local start-api` command entry point @@ -150,8 +171,11 @@ def cli( debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, + ssl_cert_file, + ssl_key_file, ) # pragma: no cover @@ -179,8 +203,11 @@ def do_cli( # pylint: disable=R0914 debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, + ssl_cert_file, + ssl_key_file, ): """ Implementation of the ``cli`` method, just separated out for unit testing purposes @@ -225,13 +252,16 @@ def do_cli( # pylint: disable=R0914 container_host=container_host, container_host_interface=container_host_interface, invoke_images=processed_invoke_images, + add_host=add_host, ) as invoke_context: + ssl_context = (ssl_cert_file, ssl_key_file) if ssl_cert_file else None service = LocalApiService( lambda_invoke_context=invoke_context, port=port, host=host, static_dir=static_dir, disable_authorizer=disable_authorizer, + ssl_context=ssl_context, ) service.start() if not hook_name: @@ -243,7 +273,8 @@ def do_cli( # pylint: disable=R0914 ] ) click.secho(command_suggestions, fg="yellow") - + except SSLError as ex: + raise UserException(f"SSL Error: {ex.strerror}", wrapped_from=ex.__class__.__name__) from ex except NoApisDefined as ex: raise UserException( "Template does not have any APIs connected to Lambda functions", wrapped_from=ex.__class__.__name__ diff --git a/samcli/commands/local/start_api/core/formatters.py b/samcli/commands/local/start_api/core/formatters.py index 79b2536a0b4..a353c2d7815 100644 --- a/samcli/commands/local/start_api/core/formatters.py +++ b/samcli/commands/local/start_api/core/formatters.py @@ -1,6 +1,7 @@ """ Invoke API Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.local.start_api.core.options import ALL_OPTIONS diff --git a/samcli/commands/local/start_api/core/options.py b/samcli/commands/local/start_api/core/options.py index be20cbe825a..01b79ae7b7e 100644 --- a/samcli/commands/local/start_api/core/options.py +++ b/samcli/commands/local/start_api/core/options.py @@ -1,6 +1,7 @@ """ Invoke Start API Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info @@ -22,6 +23,8 @@ CONTAINER_OPTION_NAMES: List[str] = [ "host", "port", + "ssl_cert_file", + "ssl_key_file", "env_vars", "container_env_vars", "debug_port", @@ -36,6 +39,7 @@ "shutdown", "container_host", "container_host_interface", + "add_host", "invoke_image", "disable_authorizer", ] diff --git a/samcli/commands/local/start_lambda/cli.py b/samcli/commands/local/start_lambda/cli.py index 338e76332c8..88a5078d7e9 100644 --- a/samcli/commands/local/start_lambda/cli.py +++ b/samcli/commands/local/start_lambda/cli.py @@ -96,6 +96,7 @@ def cli( debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, skip_prepare_infra, @@ -128,6 +129,7 @@ def cli( debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, ) # pragma: no cover @@ -155,6 +157,7 @@ def do_cli( # pylint: disable=R0914 debug_function, container_host, container_host_interface, + add_host, invoke_image, hook_name, ): @@ -200,6 +203,7 @@ def do_cli( # pylint: disable=R0914 shutdown=shutdown, container_host=container_host, container_host_interface=container_host_interface, + add_host=add_host, invoke_images=processed_invoke_images, ) as invoke_context: service = LocalLambdaService(lambda_invoke_context=invoke_context, port=port, host=host) diff --git a/samcli/commands/local/start_lambda/core/formatters.py b/samcli/commands/local/start_lambda/core/formatters.py index 6e8eae43225..11f0f66ffd9 100644 --- a/samcli/commands/local/start_lambda/core/formatters.py +++ b/samcli/commands/local/start_lambda/core/formatters.py @@ -1,6 +1,7 @@ """ Invoke Lambda Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.local.start_lambda.core.options import ALL_OPTIONS diff --git a/samcli/commands/local/start_lambda/core/options.py b/samcli/commands/local/start_lambda/core/options.py index 73d3f973102..88bd7e0a22f 100644 --- a/samcli/commands/local/start_lambda/core/options.py +++ b/samcli/commands/local/start_lambda/core/options.py @@ -1,6 +1,7 @@ """ Invoke Start Lambda Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info @@ -34,6 +35,7 @@ "shutdown", "container_host", "container_host_interface", + "add_host", "invoke_image", ] diff --git a/samcli/commands/logs/core/options.py b/samcli/commands/logs/core/options.py index 715111cd42f..901fc9f6527 100644 --- a/samcli/commands/logs/core/options.py +++ b/samcli/commands/logs/core/options.py @@ -1,6 +1,7 @@ """ Logs Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/logs/puller_factory.py b/samcli/commands/logs/puller_factory.py index c322a44819e..1bb50237c85 100644 --- a/samcli/commands/logs/puller_factory.py +++ b/samcli/commands/logs/puller_factory.py @@ -2,6 +2,7 @@ File keeps Factory method to prepare required puller information with its producers and consumers """ + import logging from typing import List, Optional diff --git a/samcli/commands/logs/validation_and_exception_handlers.py b/samcli/commands/logs/validation_and_exception_handlers.py index 48ef9a01932..461fd3f2f79 100644 --- a/samcli/commands/logs/validation_and_exception_handlers.py +++ b/samcli/commands/logs/validation_and_exception_handlers.py @@ -1,6 +1,7 @@ """ Contains helper functions for validation and exception handling of "sam logs" command """ + from functools import wraps from typing import Any, Callable, Dict diff --git a/samcli/commands/package/command.py b/samcli/commands/package/command.py index 249aee5cfbd..994f3a3ffe2 100644 --- a/samcli/commands/package/command.py +++ b/samcli/commands/package/command.py @@ -1,6 +1,7 @@ """ CLI command for "package" command """ + import click from samcli.cli.cli_config_file import ConfigProvider, configuration_option, save_params_option diff --git a/samcli/commands/package/core/command.py b/samcli/commands/package/core/command.py index 16a9ee3d2a6..e0f1056ec1c 100644 --- a/samcli/commands/package/core/command.py +++ b/samcli/commands/package/core/command.py @@ -1,6 +1,7 @@ """ `sam package` command class for help text visual layer. """ + import click from click import Context, style from rich.table import Table diff --git a/samcli/commands/package/core/options.py b/samcli/commands/package/core/options.py index 6dc97001a0d..37ea91379ee 100644 --- a/samcli/commands/package/core/options.py +++ b/samcli/commands/package/core/options.py @@ -1,6 +1,7 @@ """ Package Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/package/exceptions.py b/samcli/commands/package/exceptions.py index f5fdee0297d..a7819601172 100644 --- a/samcli/commands/package/exceptions.py +++ b/samcli/commands/package/exceptions.py @@ -1,6 +1,7 @@ """ Exceptions that are raised by sam package """ + from samcli.commands.exceptions import UserException diff --git a/samcli/commands/pipeline/bootstrap/cli.py b/samcli/commands/pipeline/bootstrap/cli.py index 991d0a62695..36438b5efc3 100644 --- a/samcli/commands/pipeline/bootstrap/cli.py +++ b/samcli/commands/pipeline/bootstrap/cli.py @@ -1,6 +1,7 @@ """ CLI command for "pipeline bootstrap", which sets up the require pipeline infrastructure resources """ + import os from textwrap import dedent from typing import Any, Dict, List, Optional diff --git a/samcli/commands/pipeline/bootstrap/guided_context.py b/samcli/commands/pipeline/bootstrap/guided_context.py index fec10ba1426..0847c028fd7 100644 --- a/samcli/commands/pipeline/bootstrap/guided_context.py +++ b/samcli/commands/pipeline/bootstrap/guided_context.py @@ -2,6 +2,7 @@ An interactive flow that prompt the user for required information to bootstrap the AWS account of an environment with the required infrastructure """ + import os import sys from textwrap import dedent @@ -317,9 +318,11 @@ def _get_user_inputs(self) -> List[Tuple[str, Callable[[], None]]]: inputs.extend( [ ( - f"Pipeline user ARN: {self.pipeline_user_arn}" - if self.pipeline_user_arn - else "Pipeline user: [to be created]", + ( + f"Pipeline user ARN: {self.pipeline_user_arn}" + if self.pipeline_user_arn + else "Pipeline user: [to be created]" + ), self._prompt_pipeline_user, ) ] @@ -328,27 +331,35 @@ def _get_user_inputs(self) -> List[Tuple[str, Callable[[], None]]]: inputs.extend( [ ( - f"Pipeline execution role ARN: {self.pipeline_execution_role_arn}" - if self.pipeline_execution_role_arn - else "Pipeline execution role: [to be created]", + ( + f"Pipeline execution role ARN: {self.pipeline_execution_role_arn}" + if self.pipeline_execution_role_arn + else "Pipeline execution role: [to be created]" + ), self._prompt_pipeline_execution_role, ), ( - f"CloudFormation execution role ARN: {self.cloudformation_execution_role_arn}" - if self.cloudformation_execution_role_arn - else "CloudFormation execution role: [to be created]", + ( + f"CloudFormation execution role ARN: {self.cloudformation_execution_role_arn}" + if self.cloudformation_execution_role_arn + else "CloudFormation execution role: [to be created]" + ), self._prompt_cloudformation_execution_role, ), ( - f"Artifacts bucket ARN: {self.artifacts_bucket_arn}" - if self.artifacts_bucket_arn - else "Artifacts bucket: [to be created]", + ( + f"Artifacts bucket ARN: {self.artifacts_bucket_arn}" + if self.artifacts_bucket_arn + else "Artifacts bucket: [to be created]" + ), self._prompt_artifacts_bucket, ), ( - f"ECR image repository ARN: {self.image_repository_arn}" - if self.image_repository_arn - else f"ECR image repository: [{'to be created' if self.create_image_repository else 'skipped'}]", + ( + f"ECR image repository ARN: {self.image_repository_arn}" + if self.image_repository_arn + else f"ECR image repository: [{'to be created' if self.create_image_repository else 'skipped'}]" + ), self._prompt_image_repository, ), ] diff --git a/samcli/commands/pipeline/bootstrap/oidc_config.py b/samcli/commands/pipeline/bootstrap/oidc_config.py index 776b69abe8b..427a6cce757 100644 --- a/samcli/commands/pipeline/bootstrap/oidc_config.py +++ b/samcli/commands/pipeline/bootstrap/oidc_config.py @@ -1,6 +1,7 @@ """ Represents a pipeline OIDC provider """ + from dataclasses import dataclass from typing import Optional diff --git a/samcli/commands/pipeline/bootstrap/pipeline_oidc_provider.py b/samcli/commands/pipeline/bootstrap/pipeline_oidc_provider.py index b45f4171ca8..45b1ccec187 100644 --- a/samcli/commands/pipeline/bootstrap/pipeline_oidc_provider.py +++ b/samcli/commands/pipeline/bootstrap/pipeline_oidc_provider.py @@ -1,6 +1,7 @@ """ Represents a pipeline OIDC provider """ + from abc import abstractmethod from typing import List diff --git a/samcli/commands/pipeline/external_links.py b/samcli/commands/pipeline/external_links.py index 77301ebb1bb..f4e8978c73c 100644 --- a/samcli/commands/pipeline/external_links.py +++ b/samcli/commands/pipeline/external_links.py @@ -2,6 +2,7 @@ The module to store external links. Put them in a centralized place so that we can verify their validity automatically. """ + CONFIG_AWS_CRED_DOC_URL = "https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html" _SAM_DOC_PREFIX = "https://docs.aws.amazon.com/serverless-application-model/latest/developerguide" diff --git a/samcli/commands/pipeline/init/cli.py b/samcli/commands/pipeline/init/cli.py index 416c1c8fdf9..de1f20851e8 100644 --- a/samcli/commands/pipeline/init/cli.py +++ b/samcli/commands/pipeline/init/cli.py @@ -1,6 +1,7 @@ """ CLI command for "pipeline init" command """ + from typing import Any, Optional import click diff --git a/samcli/commands/pipeline/init/interactive_init_flow.py b/samcli/commands/pipeline/init/interactive_init_flow.py index b6c93acc4fb..ce29274c3c7 100644 --- a/samcli/commands/pipeline/init/interactive_init_flow.py +++ b/samcli/commands/pipeline/init/interactive_init_flow.py @@ -2,6 +2,7 @@ Interactive flow that prompts that users for pipeline template (cookiecutter template) and used it to generate pipeline configuration file """ + import json import logging import os diff --git a/samcli/commands/pipeline/init/pipeline_templates_manifest.py b/samcli/commands/pipeline/init/pipeline_templates_manifest.py index e9729511faa..64b87876a8d 100644 --- a/samcli/commands/pipeline/init/pipeline_templates_manifest.py +++ b/samcli/commands/pipeline/init/pipeline_templates_manifest.py @@ -19,6 +19,7 @@ provider: Github Actions location: templates/cookiecutter-github-actions-two-environments-pipeline """ + from pathlib import Path from typing import Dict, List diff --git a/samcli/commands/publish/command.py b/samcli/commands/publish/command.py index 22997f5e72b..5c9f6c31471 100644 --- a/samcli/commands/publish/command.py +++ b/samcli/commands/publish/command.py @@ -41,12 +41,18 @@ SERVERLESSREPO_CONSOLE_URL = "https://console.aws.amazon.com/serverlessrepo/home?region={}#/published-applications/{}" SEMANTIC_VERSION_HELP = "Optional. The value provided here overrides SemanticVersion in the template metadata." SEMANTIC_VERSION = "SemanticVersion" +FAIL_ON_SAME_VERSION = """ +If set, AWS SAM CLI will prevent a publish and return a non-zero exit code +if the publish is attempted with a semantic version that already exists on the SAR application. +Default is False. +""" @click.command("publish", help=HELP_TEXT, short_help=SHORT_HELP) @configuration_option(provider=ConfigProvider(section="parameters")) @template_common_option @click.option("--semantic-version", help=SEMANTIC_VERSION_HELP) +@click.option("--fail-on-same-version", default=False, required=False, is_flag=True, help=FAIL_ON_SAME_VERSION) @aws_creds_options @cli_framework_options @save_params_option @@ -59,21 +65,25 @@ def cli( ctx, template_file, semantic_version, + fail_on_same_version, save_params, config_file, config_env, ): # All logic must be implemented in the ``do_cli`` method. This helps with easy unit testing - do_cli(ctx, template_file, semantic_version) # pragma: no cover + do_cli(ctx, template_file, semantic_version, fail_on_same_version) # pragma: no cover -def do_cli(ctx, template, semantic_version): +def do_cli(ctx, template, semantic_version, fail_on_same_version): """Publish the application based on command line inputs.""" from samcli.commands.exceptions import UserException from samcli.vendor.serverlessrepo import publish_application - from samcli.vendor.serverlessrepo.exceptions import InvalidS3UriError, ServerlessRepoError + from samcli.vendor.serverlessrepo.exceptions import ( + InvalidS3UriError, + ServerlessRepoError, + ) from samcli.vendor.serverlessrepo.parser import METADATA, SERVERLESS_REPO_APPLICATION try: @@ -87,7 +97,7 @@ def do_cli(ctx, template, semantic_version): template_data.get(METADATA).get(SERVERLESS_REPO_APPLICATION)[SEMANTIC_VERSION] = semantic_version try: - publish_output = publish_application(template_data) + publish_output = publish_application(template=template_data, fail_on_same_version=fail_on_same_version) click.secho("Publish Succeeded", fg="green") click.secho(_gen_success_message(publish_output)) except InvalidS3UriError as ex: diff --git a/samcli/commands/remote/exceptions.py b/samcli/commands/remote/exceptions.py index fc913e7e602..3e6df6b5888 100644 --- a/samcli/commands/remote/exceptions.py +++ b/samcli/commands/remote/exceptions.py @@ -1,6 +1,7 @@ """ Exceptions that are used by remote invoke or remote test-events commands """ + from samcli.commands.exceptions import UserException diff --git a/samcli/commands/remote/invoke/cli.py b/samcli/commands/remote/invoke/cli.py index c1c08b3fe02..2d7d3ef71b0 100644 --- a/samcli/commands/remote/invoke/cli.py +++ b/samcli/commands/remote/invoke/cli.py @@ -1,4 +1,5 @@ """CLI command for "invoke" command.""" + import logging from io import TextIOWrapper diff --git a/samcli/commands/remote/invoke/core/command.py b/samcli/commands/remote/invoke/core/command.py index 6c6912e9370..f0137dcaff9 100644 --- a/samcli/commands/remote/invoke/core/command.py +++ b/samcli/commands/remote/invoke/core/command.py @@ -1,6 +1,7 @@ """ Invoke Command Class. """ + import json from click import Context, style diff --git a/samcli/commands/remote/invoke/core/formatters.py b/samcli/commands/remote/invoke/core/formatters.py index ee8cee01aa7..df1d723ab1b 100644 --- a/samcli/commands/remote/invoke/core/formatters.py +++ b/samcli/commands/remote/invoke/core/formatters.py @@ -1,6 +1,7 @@ """ Remote Invoke Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.remote.invoke.core.options import ALL_OPTIONS diff --git a/samcli/commands/remote/invoke/core/options.py b/samcli/commands/remote/invoke/core/options.py index 7d9008ffe3b..d22f223ae4f 100644 --- a/samcli/commands/remote/invoke/core/options.py +++ b/samcli/commands/remote/invoke/core/options.py @@ -1,6 +1,7 @@ """ Remote Invoke Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/remote/remote_invoke_context.py b/samcli/commands/remote/remote_invoke_context.py index bf98b6317a5..cc5dedddb8b 100644 --- a/samcli/commands/remote/remote_invoke_context.py +++ b/samcli/commands/remote/remote_invoke_context.py @@ -1,6 +1,7 @@ """ Context object used by `sam remote invoke` command """ + import logging from dataclasses import dataclass from typing import Optional, cast diff --git a/samcli/commands/remote/test_event/core/base_options.py b/samcli/commands/remote/test_event/core/base_options.py index 5b4edd0d0d9..dacc6a5c450 100644 --- a/samcli/commands/remote/test_event/core/base_options.py +++ b/samcli/commands/remote/test_event/core/base_options.py @@ -1,6 +1,7 @@ """ Remote Test Event Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.row_modifiers import RowDefinition diff --git a/samcli/commands/remote/test_event/core/formatters.py b/samcli/commands/remote/test_event/core/formatters.py index 73a295ad3d7..26ea664739f 100644 --- a/samcli/commands/remote/test_event/core/formatters.py +++ b/samcli/commands/remote/test_event/core/formatters.py @@ -1,6 +1,7 @@ """ Remote Test Event Command Formatter base. """ + from typing import List from samcli.cli.formatters import RootCommandHelpTextFormatter diff --git a/samcli/commands/remote/test_event/delete/core/command.py b/samcli/commands/remote/test_event/delete/core/command.py index 15cd46a9e86..f928cadfd3e 100644 --- a/samcli/commands/remote/test_event/delete/core/command.py +++ b/samcli/commands/remote/test_event/delete/core/command.py @@ -1,6 +1,7 @@ """ Delete Test Event Command Class. """ + from click import Context, style from samcli.cli.core.command import CoreCommand diff --git a/samcli/commands/remote/test_event/delete/core/options.py b/samcli/commands/remote/test_event/delete/core/options.py index 820e58275fc..7ae49a3c796 100644 --- a/samcli/commands/remote/test_event/delete/core/options.py +++ b/samcli/commands/remote/test_event/delete/core/options.py @@ -1,6 +1,7 @@ """ Delete Remote Test Event Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, add_common_options_info diff --git a/samcli/commands/remote/test_event/get/cli.py b/samcli/commands/remote/test_event/get/cli.py index 85f6e68d51e..e8685ca41a8 100644 --- a/samcli/commands/remote/test_event/get/cli.py +++ b/samcli/commands/remote/test_event/get/cli.py @@ -1,4 +1,5 @@ """CLI command for "test-event get" command.""" + import logging import sys from io import TextIOWrapper diff --git a/samcli/commands/remote/test_event/get/core/command.py b/samcli/commands/remote/test_event/get/core/command.py index 0d029a805d0..b68f0f46484 100644 --- a/samcli/commands/remote/test_event/get/core/command.py +++ b/samcli/commands/remote/test_event/get/core/command.py @@ -1,6 +1,7 @@ """ Get Test Event Command Class. """ + from click import Context, style from samcli.cli.core.command import CoreCommand diff --git a/samcli/commands/remote/test_event/get/core/formatters.py b/samcli/commands/remote/test_event/get/core/formatters.py index 857f06b31ba..491ecad6e98 100644 --- a/samcli/commands/remote/test_event/get/core/formatters.py +++ b/samcli/commands/remote/test_event/get/core/formatters.py @@ -1,6 +1,7 @@ """ Get Test Event Command Formatter. """ + from samcli.commands.remote.test_event.core.formatters import RemoteTestEventCommandHelpTextFormatter from samcli.commands.remote.test_event.get.core.options import ALL_OPTIONS diff --git a/samcli/commands/remote/test_event/get/core/options.py b/samcli/commands/remote/test_event/get/core/options.py index b3d15142753..449399e42c0 100644 --- a/samcli/commands/remote/test_event/get/core/options.py +++ b/samcli/commands/remote/test_event/get/core/options.py @@ -1,6 +1,7 @@ """ Get Remote Test Event Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, add_common_options_info diff --git a/samcli/commands/remote/test_event/list/core/command.py b/samcli/commands/remote/test_event/list/core/command.py index fa0ca884892..19426299862 100644 --- a/samcli/commands/remote/test_event/list/core/command.py +++ b/samcli/commands/remote/test_event/list/core/command.py @@ -1,6 +1,7 @@ """ List Test Event Command Class. """ + from click import Context, style from samcli.cli.core.command import CoreCommand diff --git a/samcli/commands/remote/test_event/list/core/formatters.py b/samcli/commands/remote/test_event/list/core/formatters.py index 25bcaaac421..d632abe2f72 100644 --- a/samcli/commands/remote/test_event/list/core/formatters.py +++ b/samcli/commands/remote/test_event/list/core/formatters.py @@ -1,6 +1,7 @@ """ List Test Events Command Formatter. """ + from samcli.commands.remote.test_event.core.formatters import RemoteTestEventCommandHelpTextFormatter from samcli.commands.remote.test_event.list.core.options import ALL_OPTIONS diff --git a/samcli/commands/remote/test_event/list/core/options.py b/samcli/commands/remote/test_event/list/core/options.py index 21e1f068a3f..659d0a7d390 100644 --- a/samcli/commands/remote/test_event/list/core/options.py +++ b/samcli/commands/remote/test_event/list/core/options.py @@ -1,6 +1,7 @@ """ List Remote Test Events Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, add_common_options_info diff --git a/samcli/commands/remote/test_event/put/cli.py b/samcli/commands/remote/test_event/put/cli.py index 03426b51ec6..df98670c356 100644 --- a/samcli/commands/remote/test_event/put/cli.py +++ b/samcli/commands/remote/test_event/put/cli.py @@ -1,4 +1,5 @@ """CLI command for "test-event put" command.""" + import logging import sys from io import TextIOWrapper diff --git a/samcli/commands/remote/test_event/put/core/command.py b/samcli/commands/remote/test_event/put/core/command.py index 631e758ab66..3740e75776d 100644 --- a/samcli/commands/remote/test_event/put/core/command.py +++ b/samcli/commands/remote/test_event/put/core/command.py @@ -1,6 +1,7 @@ """ Put Test Event Command Class. """ + import json from click import Context, style diff --git a/samcli/commands/remote/test_event/put/core/formatters.py b/samcli/commands/remote/test_event/put/core/formatters.py index 2967f4d223d..a5ee6315f72 100644 --- a/samcli/commands/remote/test_event/put/core/formatters.py +++ b/samcli/commands/remote/test_event/put/core/formatters.py @@ -1,6 +1,7 @@ """ Put Test Event Command Formatter. """ + from samcli.commands.remote.test_event.core.formatters import RemoteTestEventCommandHelpTextFormatter from samcli.commands.remote.test_event.put.core.options import ALL_OPTIONS diff --git a/samcli/commands/remote/test_event/put/core/options.py b/samcli/commands/remote/test_event/put/core/options.py index 3b2a0c61ec1..a428a7c16de 100644 --- a/samcli/commands/remote/test_event/put/core/options.py +++ b/samcli/commands/remote/test_event/put/core/options.py @@ -1,6 +1,7 @@ """ Put Remote Test Event Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, add_common_options_info diff --git a/samcli/commands/remote/test_event/test_event.py b/samcli/commands/remote/test_event/test_event.py index 5916378aaa3..f725fad6025 100644 --- a/samcli/commands/remote/test_event/test_event.py +++ b/samcli/commands/remote/test_event/test_event.py @@ -1,4 +1,5 @@ """Command group for "test-event" suite of commands.""" + import click from samcli.commands.remote.test_event.delete.cli import cli as delete_cli diff --git a/samcli/commands/sync/command.py b/samcli/commands/sync/command.py index dfafae7ea40..edbcb98e857 100644 --- a/samcli/commands/sync/command.py +++ b/samcli/commands/sync/command.py @@ -1,4 +1,5 @@ """CLI command for "sync" command.""" + import logging import os from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple diff --git a/samcli/commands/sync/core/command.py b/samcli/commands/sync/core/command.py index e498c1cfe7a..d5fbbbee412 100644 --- a/samcli/commands/sync/core/command.py +++ b/samcli/commands/sync/core/command.py @@ -1,6 +1,7 @@ """ Sync Command Class. """ + from click import Context, style from samcli.cli.core.command import CoreCommand diff --git a/samcli/commands/sync/core/formatters.py b/samcli/commands/sync/core/formatters.py index 81791e802dd..a9dec82f760 100644 --- a/samcli/commands/sync/core/formatters.py +++ b/samcli/commands/sync/core/formatters.py @@ -1,6 +1,7 @@ """ Sync Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.sync.core.options import ALL_OPTIONS diff --git a/samcli/commands/sync/core/options.py b/samcli/commands/sync/core/options.py index c03e6ef1908..509261025cd 100644 --- a/samcli/commands/sync/core/options.py +++ b/samcli/commands/sync/core/options.py @@ -1,6 +1,7 @@ """ Sync Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/sync/sync_context.py b/samcli/commands/sync/sync_context.py index a9541d3fcf7..c0c75705a5b 100644 --- a/samcli/commands/sync/sync_context.py +++ b/samcli/commands/sync/sync_context.py @@ -1,6 +1,7 @@ """ Context object used by sync command """ + import logging import threading from dataclasses import dataclass diff --git a/samcli/commands/traces/command.py b/samcli/commands/traces/command.py index 783ac63d434..e3f1f3a5610 100644 --- a/samcli/commands/traces/command.py +++ b/samcli/commands/traces/command.py @@ -1,6 +1,7 @@ """ CLI command for "traces" command """ + import logging import click diff --git a/samcli/commands/traces/traces_puller_factory.py b/samcli/commands/traces/traces_puller_factory.py index ae6e0bfb1d5..11a6ca58146 100644 --- a/samcli/commands/traces/traces_puller_factory.py +++ b/samcli/commands/traces/traces_puller_factory.py @@ -1,6 +1,7 @@ """ Factory methods which generates puller and consumer instances for XRay events """ + from typing import Any, List from samcli.commands.traces.trace_console_consumers import XRayTraceConsoleConsumer diff --git a/samcli/commands/validate/core/formatters.py b/samcli/commands/validate/core/formatters.py index 4cabeb568c5..69f12b0a4bc 100644 --- a/samcli/commands/validate/core/formatters.py +++ b/samcli/commands/validate/core/formatters.py @@ -1,6 +1,7 @@ """ Validate Command Formatter. """ + from samcli.cli.formatters import RootCommandHelpTextFormatter from samcli.cli.row_modifiers import BaseLineRowModifier from samcli.commands.validate.core.options import ALL_OPTIONS diff --git a/samcli/commands/validate/core/options.py b/samcli/commands/validate/core/options.py index 7e4993e130c..61eb1d0abfc 100644 --- a/samcli/commands/validate/core/options.py +++ b/samcli/commands/validate/core/options.py @@ -1,6 +1,7 @@ """ Validate Command Options related Datastructures for formatting. """ + from typing import Dict, List from samcli.cli.core.options import ALL_COMMON_OPTIONS, SAVE_PARAMS_OPTIONS, add_common_options_info diff --git a/samcli/commands/validate/validate.py b/samcli/commands/validate/validate.py index c47e205d8cf..db0a130b24d 100644 --- a/samcli/commands/validate/validate.py +++ b/samcli/commands/validate/validate.py @@ -1,6 +1,7 @@ """ CLI Command for Validating a SAM Template """ + import os import boto3 diff --git a/samcli/hook_packages/terraform/__init__.py b/samcli/hook_packages/terraform/__init__.py index 5dbd4c5c5d6..e75196dfb68 100644 --- a/samcli/hook_packages/terraform/__init__.py +++ b/samcli/hook_packages/terraform/__init__.py @@ -1,4 +1,5 @@ """ Expose top level prepare hook """ + from .main import prepare diff --git a/samcli/hook_packages/terraform/hooks/prepare/constants.py b/samcli/hook_packages/terraform/hooks/prepare/constants.py index e6ea7a1fca0..afa6876768d 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/constants.py +++ b/samcli/hook_packages/terraform/hooks/prepare/constants.py @@ -1,6 +1,7 @@ """ Constants related to the Terraform prepare hook. """ + import re from samcli.lib.utils.resources import AWS_LAMBDA_FUNCTION as CFN_AWS_LAMBDA_FUNCTION diff --git a/samcli/hook_packages/terraform/hooks/prepare/enrich.py b/samcli/hook_packages/terraform/hooks/prepare/enrich.py index 9b27d91ccf9..5ca32ae0758 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/enrich.py +++ b/samcli/hook_packages/terraform/hooks/prepare/enrich.py @@ -3,6 +3,7 @@ This module populates the values required for each of the Lambda resources """ + import json import logging import os diff --git a/samcli/hook_packages/terraform/hooks/prepare/exceptions.py b/samcli/hook_packages/terraform/hooks/prepare/exceptions.py index 3a8d9c2b67b..3074301272b 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/exceptions.py +++ b/samcli/hook_packages/terraform/hooks/prepare/exceptions.py @@ -1,6 +1,7 @@ """ Module containing prepare hook-related exceptions """ + import os from samcli.commands.exceptions import UserException diff --git a/samcli/hook_packages/terraform/hooks/prepare/hook.py b/samcli/hook_packages/terraform/hooks/prepare/hook.py index 76a730cb54e..e287893ee35 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/hook.py +++ b/samcli/hook_packages/terraform/hooks/prepare/hook.py @@ -3,6 +3,7 @@ This module contains the main prepare method """ + import json import logging import os diff --git a/samcli/hook_packages/terraform/hooks/prepare/makefile_generator.py b/samcli/hook_packages/terraform/hooks/prepare/makefile_generator.py index f9606ffbd31..ab0615bf0fa 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/makefile_generator.py +++ b/samcli/hook_packages/terraform/hooks/prepare/makefile_generator.py @@ -3,6 +3,7 @@ This module generates the Makefile for the project and the rules for each of the Lambda functions found """ + import logging import os import shutil diff --git a/samcli/hook_packages/terraform/hooks/prepare/property_builder.py b/samcli/hook_packages/terraform/hooks/prepare/property_builder.py index efb88bedf3c..bdbd1c7d241 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/property_builder.py +++ b/samcli/hook_packages/terraform/hooks/prepare/property_builder.py @@ -1,6 +1,7 @@ """ Terraform prepare property builder """ + import logging from json import loads from json.decoder import JSONDecodeError diff --git a/samcli/hook_packages/terraform/hooks/prepare/resource_linking.py b/samcli/hook_packages/terraform/hooks/prepare/resource_linking.py index a7fbadd4e22..7b1e339644b 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/resource_linking.py +++ b/samcli/hook_packages/terraform/hooks/prepare/resource_linking.py @@ -2,6 +2,7 @@ Use Terraform plan to link resources together e.g. linking layers to functions """ + import logging import re from dataclasses import dataclass @@ -157,9 +158,9 @@ class ResourceLinkingPair: cfn_resource_update_call_back_function: Callable[[Dict, List[ReferenceType]], None] linking_exceptions: ResourcePairExceptions # function to extract the terraform destination value from the linking field value - tf_destination_value_extractor_from_link_field_value_function: Callable[ - [str], str - ] = _default_tf_destination_value_id_extractor + tf_destination_value_extractor_from_link_field_value_function: Callable[[str], str] = ( + _default_tf_destination_value_id_extractor + ) class ResourceLinker: @@ -357,12 +358,14 @@ def _link_using_linking_fields(self, cfn_resource: Dict) -> None: ) dest_resources = [ - LogicalIdReference( - value=child_resources_linking_attributes_logical_id_mapping[value][0], - resource_type=child_resources_linking_attributes_logical_id_mapping[value][1], + ( + LogicalIdReference( + value=child_resources_linking_attributes_logical_id_mapping[value][0], + resource_type=child_resources_linking_attributes_logical_id_mapping[value][1], + ) + if value in child_resources_linking_attributes_logical_id_mapping + else ExistingResourceReference(value) ) - if value in child_resources_linking_attributes_logical_id_mapping - else ExistingResourceReference(value) for value in values ] diff --git a/samcli/hook_packages/terraform/hooks/prepare/resources/code_resource_utils.py b/samcli/hook_packages/terraform/hooks/prepare/resources/code_resource_utils.py index f496409cbc6..88eb44d1c55 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/resources/code_resource_utils.py +++ b/samcli/hook_packages/terraform/hooks/prepare/resources/code_resource_utils.py @@ -1,6 +1,7 @@ """ Utilities module specific to code resources such as Lambda functions and Lambda layers """ + from typing import Any, Dict from samcli.hook_packages.terraform.hooks.prepare.resource_linking import _resolve_resource_attribute diff --git a/samcli/hook_packages/terraform/hooks/prepare/resources/internal.py b/samcli/hook_packages/terraform/hooks/prepare/resources/internal.py index ffbe11f1a06..4effa859733 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/resources/internal.py +++ b/samcli/hook_packages/terraform/hooks/prepare/resources/internal.py @@ -1,4 +1,5 @@ """Module containing logic specific to internal resources handling during the prepare hook execution""" + from samcli.hook_packages.terraform.hooks.prepare.types import ResourceProperties INTERNAL_PREFIX = "Internal::" diff --git a/samcli/hook_packages/terraform/hooks/prepare/resources/lambda_function.py b/samcli/hook_packages/terraform/hooks/prepare/resources/lambda_function.py index 46460904b0a..1738119fe91 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/resources/lambda_function.py +++ b/samcli/hook_packages/terraform/hooks/prepare/resources/lambda_function.py @@ -1,4 +1,5 @@ """Module containing logic specific to Lambda function resource handling during the prepare hook execution""" + from typing import Dict, List, Tuple from samcli.hook_packages.terraform.hooks.prepare.resources.code_resource_utils import ( diff --git a/samcli/hook_packages/terraform/hooks/prepare/resources/resource_properties.py b/samcli/hook_packages/terraform/hooks/prepare/resources/resource_properties.py index 76931dd22bc..8fbf58149b8 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/resources/resource_properties.py +++ b/samcli/hook_packages/terraform/hooks/prepare/resources/resource_properties.py @@ -1,4 +1,5 @@ """Module for getting the resource property mappings for various resource types""" + from typing import Dict from samcli.hook_packages.terraform.hooks.prepare.constants import ( diff --git a/samcli/hook_packages/terraform/hooks/prepare/translate.py b/samcli/hook_packages/terraform/hooks/prepare/translate.py index bd32102eb21..e71540bcdac 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/translate.py +++ b/samcli/hook_packages/terraform/hooks/prepare/translate.py @@ -3,6 +3,7 @@ This method contains the logic required to translate the `terraform show` JSON output into a Cloudformation template """ + import hashlib import logging from typing import Any, Dict, Iterator, List, Tuple, Type, Union diff --git a/samcli/hook_packages/terraform/hooks/prepare/types.py b/samcli/hook_packages/terraform/hooks/prepare/types.py index 361ddc95fd3..30e27085ebb 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/types.py +++ b/samcli/hook_packages/terraform/hooks/prepare/types.py @@ -1,4 +1,5 @@ """ Contains the data types used in the TF prepare hook""" + from abc import ABC from copy import deepcopy from dataclasses import dataclass diff --git a/samcli/hook_packages/terraform/hooks/prepare/utilities.py b/samcli/hook_packages/terraform/hooks/prepare/utilities.py index c0261b95b81..c58104eaa7e 100644 --- a/samcli/hook_packages/terraform/hooks/prepare/utilities.py +++ b/samcli/hook_packages/terraform/hooks/prepare/utilities.py @@ -1,4 +1,5 @@ """ Maintain the utilities functions used in prepare hook """ + from samcli.hook_packages.terraform.hooks.prepare.constants import COMPILED_REGULAR_EXPRESSION diff --git a/samcli/hook_packages/terraform/lib/utils.py b/samcli/hook_packages/terraform/lib/utils.py index 888c9f809b5..8fae5f9d96a 100644 --- a/samcli/hook_packages/terraform/lib/utils.py +++ b/samcli/hook_packages/terraform/lib/utils.py @@ -1,4 +1,5 @@ """Terraform utilities""" + import hashlib from typing import Any, Dict, List, Union diff --git a/samcli/hook_packages/terraform/main.py b/samcli/hook_packages/terraform/main.py index 9f402500f3b..e66309abf00 100644 --- a/samcli/hook_packages/terraform/main.py +++ b/samcli/hook_packages/terraform/main.py @@ -1,6 +1,7 @@ """ Module for Terraform hook entry points """ + from .hooks.prepare.hook import prepare as prepare_hook diff --git a/samcli/lib/bootstrap/companion_stack/companion_stack_builder.py b/samcli/lib/bootstrap/companion_stack/companion_stack_builder.py index 9d4f6fc7054..a8d21c3f0a3 100644 --- a/samcli/lib/bootstrap/companion_stack/companion_stack_builder.py +++ b/samcli/lib/bootstrap/companion_stack/companion_stack_builder.py @@ -1,6 +1,7 @@ """ Companion stack template builder """ + from typing import Dict, cast from samcli.lib.bootstrap.companion_stack.data_types import CompanionStack, ECRRepo diff --git a/samcli/lib/bootstrap/companion_stack/companion_stack_manager.py b/samcli/lib/bootstrap/companion_stack/companion_stack_manager.py index 8f183beb40c..4e647793b78 100644 --- a/samcli/lib/bootstrap/companion_stack/companion_stack_manager.py +++ b/samcli/lib/bootstrap/companion_stack/companion_stack_manager.py @@ -1,6 +1,7 @@ """ Companion stack manager """ + import logging from typing import Dict, List, Optional diff --git a/samcli/lib/bootstrap/companion_stack/data_types.py b/samcli/lib/bootstrap/companion_stack/data_types.py index 8cce26ba300..2725804220f 100644 --- a/samcli/lib/bootstrap/companion_stack/data_types.py +++ b/samcli/lib/bootstrap/companion_stack/data_types.py @@ -1,6 +1,7 @@ """ Date type classes for companion stacks """ + import posixpath import re from typing import Optional diff --git a/samcli/lib/bootstrap/nested_stack/nested_stack_builder.py b/samcli/lib/bootstrap/nested_stack/nested_stack_builder.py index 4ed9cbe1d3e..36a2177e1f7 100644 --- a/samcli/lib/bootstrap/nested_stack/nested_stack_builder.py +++ b/samcli/lib/bootstrap/nested_stack/nested_stack_builder.py @@ -1,6 +1,7 @@ """ StackBuilder implementation for nested stack """ + import re from typing import cast diff --git a/samcli/lib/bootstrap/nested_stack/nested_stack_manager.py b/samcli/lib/bootstrap/nested_stack/nested_stack_manager.py index b0d6faed980..ee2af65fa85 100644 --- a/samcli/lib/bootstrap/nested_stack/nested_stack_manager.py +++ b/samcli/lib/bootstrap/nested_stack/nested_stack_manager.py @@ -1,6 +1,7 @@ """ nested stack manager to generate nested stack information and update original template with it """ + import logging import os import shutil diff --git a/samcli/lib/bootstrap/stack_builder.py b/samcli/lib/bootstrap/stack_builder.py index 0654dd011f3..9e680f8fa2d 100644 --- a/samcli/lib/bootstrap/stack_builder.py +++ b/samcli/lib/bootstrap/stack_builder.py @@ -1,6 +1,7 @@ """ Abstract definitions for stack builder """ + import json from abc import ABC from copy import deepcopy diff --git a/samcli/lib/build/app_builder.py b/samcli/lib/build/app_builder.py index 0e49b7b2856..6c8b0f02f1d 100644 --- a/samcli/lib/build/app_builder.py +++ b/samcli/lib/build/app_builder.py @@ -1,6 +1,7 @@ """ Builds the application """ + import os import io import json diff --git a/samcli/lib/build/build_strategy.py b/samcli/lib/build/build_strategy.py index c59b3078b78..5fae26e79d7 100644 --- a/samcli/lib/build/build_strategy.py +++ b/samcli/lib/build/build_strategy.py @@ -1,6 +1,7 @@ """ Keeps implementation of different build strategies """ + import hashlib import logging import os.path @@ -26,6 +27,7 @@ from samcli.lib.build.exceptions import MissingBuildMethodException from samcli.lib.build.utils import warn_on_invalid_architecture +from samcli.lib.utils.architecture import X86_64, ARM64 LOG = logging.getLogger(__name__) @@ -218,6 +220,19 @@ def build_single_layer_definition(self, layer_definition: LayerBuildDefinition) if layer.build_method == "makefile": warn_on_invalid_architecture(layer_definition) + # There are two cases where we'd like to warn the customer + # 1. Compatible Architectures is only x86 (or not present) but Build Architecture is arm64 + # 2. Build Architecture is x86 (or not present) but Compatible Architectures is only arm64 + + build_architecture = layer.build_architecture or X86_64 + compatible_architectures = layer.compatible_architectures or [X86_64] + + if build_architecture not in compatible_architectures: + LOG.warning( + "WARNING: Layer '%s' has BuildArchitecture %s, which is not listed in CompatibleArchitectures", + layer.layer_id, + build_architecture, + ) single_build_dir = layer.get_build_dir(self._build_dir) # when a layer is passed here, it is ZIP function, codeuri and runtime are not None # codeuri and compatible_runtimes are not None diff --git a/samcli/lib/build/bundler.py b/samcli/lib/build/bundler.py index ba23158d397..797171391f2 100644 --- a/samcli/lib/build/bundler.py +++ b/samcli/lib/build/bundler.py @@ -1,6 +1,7 @@ """ Handles bundler properties as needed to modify the build process """ + import logging from copy import deepcopy from pathlib import Path, PosixPath diff --git a/samcli/lib/build/constants.py b/samcli/lib/build/constants.py index c7c4a3b94d0..3f15a06dc7e 100644 --- a/samcli/lib/build/constants.py +++ b/samcli/lib/build/constants.py @@ -1,6 +1,7 @@ """ build constants """ + from typing import Set DEPRECATED_RUNTIMES: Set[str] = { diff --git a/samcli/lib/build/dependency_hash_generator.py b/samcli/lib/build/dependency_hash_generator.py index bbf9f1bec0b..635618f91d2 100644 --- a/samcli/lib/build/dependency_hash_generator.py +++ b/samcli/lib/build/dependency_hash_generator.py @@ -1,4 +1,5 @@ """Utility Class for Getting Function or Layer Manifest Dependency Hashes""" + import pathlib from typing import Any, Optional diff --git a/samcli/lib/build/exceptions.py b/samcli/lib/build/exceptions.py index 2d33f367df0..e1f4ff50fcc 100644 --- a/samcli/lib/build/exceptions.py +++ b/samcli/lib/build/exceptions.py @@ -2,7 +2,6 @@ Build Related Exceptions. """ - from samcli.commands.exceptions import UserException diff --git a/samcli/lib/build/utils.py b/samcli/lib/build/utils.py index c4941f369aa..45ef2c46727 100644 --- a/samcli/lib/build/utils.py +++ b/samcli/lib/build/utils.py @@ -1,6 +1,7 @@ """ build utilities """ + import logging from typing import Union, Dict, Optional diff --git a/samcli/lib/cli_validation/image_repository_validation.py b/samcli/lib/cli_validation/image_repository_validation.py index 8d26ff558eb..67f4ea965e6 100644 --- a/samcli/lib/cli_validation/image_repository_validation.py +++ b/samcli/lib/cli_validation/image_repository_validation.py @@ -2,6 +2,7 @@ Image Repository Option Validation. This is to be run last after all CLI options have been processed. """ + import click from samcli.commands._utils.option_validator import Validator diff --git a/samcli/lib/cli_validation/remote_invoke_options_validations.py b/samcli/lib/cli_validation/remote_invoke_options_validations.py index bed1591f15d..4b645190ce3 100644 --- a/samcli/lib/cli_validation/remote_invoke_options_validations.py +++ b/samcli/lib/cli_validation/remote_invoke_options_validations.py @@ -1,6 +1,7 @@ """ This file contains validations remote invoke options """ + import logging import sys from functools import wraps diff --git a/samcli/lib/config/exceptions.py b/samcli/lib/config/exceptions.py index 4b3336ed8d4..aabcff57430 100644 --- a/samcli/lib/config/exceptions.py +++ b/samcli/lib/config/exceptions.py @@ -2,7 +2,6 @@ Exceptions to be used by samconfig.py """ - from samcli.commands.exceptions import UserException diff --git a/samcli/lib/config/file_manager.py b/samcli/lib/config/file_manager.py index 0629ace318b..607e4f727fb 100644 --- a/samcli/lib/config/file_manager.py +++ b/samcli/lib/config/file_manager.py @@ -2,7 +2,6 @@ Class to represent the parsing of different file types into Python objects. """ - import json import logging from abc import ABC, abstractmethod diff --git a/samcli/lib/cookiecutter/interactive_flow.py b/samcli/lib/cookiecutter/interactive_flow.py index 2c31ac12879..67e1256d1cc 100644 --- a/samcli/lib/cookiecutter/interactive_flow.py +++ b/samcli/lib/cookiecutter/interactive_flow.py @@ -1,4 +1,5 @@ """A flow of questions to be asked to the user in an interactive way.""" + from typing import Any, Dict, List, Optional, Tuple import click diff --git a/samcli/lib/cookiecutter/interactive_flow_creator.py b/samcli/lib/cookiecutter/interactive_flow_creator.py index 370e4a38311..8a7b9c5bae8 100644 --- a/samcli/lib/cookiecutter/interactive_flow_creator.py +++ b/samcli/lib/cookiecutter/interactive_flow_creator.py @@ -1,4 +1,5 @@ """ This module parses a json/yaml file that defines a flow of questions to fulfill the cookiecutter context""" + from typing import Dict, Optional, Tuple import yaml diff --git a/samcli/lib/cookiecutter/plugin.py b/samcli/lib/cookiecutter/plugin.py index 09cc7b113ca..a8a7cb4cad3 100644 --- a/samcli/lib/cookiecutter/plugin.py +++ b/samcli/lib/cookiecutter/plugin.py @@ -1,6 +1,7 @@ """ Plugins are sub-sets of templates, it encapsulate common behavior of different templates and plugged to each of them """ + from typing import NamedTuple from .interactive_flow import InteractiveFlow diff --git a/samcli/lib/cookiecutter/processor.py b/samcli/lib/cookiecutter/processor.py index 4f34df06f8a..bab7f887709 100644 --- a/samcli/lib/cookiecutter/processor.py +++ b/samcli/lib/cookiecutter/processor.py @@ -1,4 +1,5 @@ """ Define a processor to process the cookiecutter context before/after generating a cookiecutter project""" + from abc import ABC, abstractmethod from typing import Dict diff --git a/samcli/lib/cookiecutter/question.py b/samcli/lib/cookiecutter/question.py index 843d9dfc112..76412307f4f 100644 --- a/samcli/lib/cookiecutter/question.py +++ b/samcli/lib/cookiecutter/question.py @@ -1,4 +1,5 @@ """ This module represents the questions to ask to the user to fulfill the cookiecutter context. """ + from abc import ABC, abstractmethod from enum import Enum from typing import Any, Dict, List, Optional, Type, Union diff --git a/samcli/lib/cookiecutter/template.py b/samcli/lib/cookiecutter/template.py index ddce7b6b827..9ff2a279b91 100644 --- a/samcli/lib/cookiecutter/template.py +++ b/samcli/lib/cookiecutter/template.py @@ -2,6 +2,7 @@ This is the core module of the cookiecutter workflow, it defines how to create a template, prompt the user for values of the context and how to generate a project from the given template and provided context """ + import logging from typing import Dict, List, Optional diff --git a/samcli/lib/deploy/deployer.py b/samcli/lib/deploy/deployer.py index 0500a419014..effe6080015 100644 --- a/samcli/lib/deploy/deployer.py +++ b/samcli/lib/deploy/deployer.py @@ -258,9 +258,9 @@ def describe_changeset(self, change_set_id, stack_name, **kwargs): { "LogicalResourceId": resource_props.get("LogicalResourceId"), "ResourceType": resource_props.get("ResourceType"), - "Replacement": "N/A" - if resource_props.get("Replacement") is None - else resource_props.get("Replacement"), + "Replacement": ( + "N/A" if resource_props.get("Replacement") is None else resource_props.get("Replacement") + ), } ) diff --git a/samcli/lib/docker/log_streamer.py b/samcli/lib/docker/log_streamer.py index 3bb437781ae..c4aacfd09d1 100644 --- a/samcli/lib/docker/log_streamer.py +++ b/samcli/lib/docker/log_streamer.py @@ -1,6 +1,7 @@ """ Log streaming utilities when streaming logs from Docker """ + import os from typing import Dict diff --git a/samcli/lib/docs/browser_configuration.py b/samcli/lib/docs/browser_configuration.py index f966ee69ece..f3d00f0e177 100644 --- a/samcli/lib/docs/browser_configuration.py +++ b/samcli/lib/docs/browser_configuration.py @@ -1,6 +1,7 @@ """ Library housing logic for handling web browsers """ + import logging import webbrowser from enum import Enum diff --git a/samcli/lib/docs/documentation.py b/samcli/lib/docs/documentation.py index a78556238c5..fc5ae45a4f0 100644 --- a/samcli/lib/docs/documentation.py +++ b/samcli/lib/docs/documentation.py @@ -1,6 +1,7 @@ """ Library housing the logic for handling AWS SAM CLI documentation pages """ + import json import logging from pathlib import Path diff --git a/samcli/lib/generated_sample_events/events.py b/samcli/lib/generated_sample_events/events.py index 00ee4a38f05..5d8dd490ffc 100644 --- a/samcli/lib/generated_sample_events/events.py +++ b/samcli/lib/generated_sample_events/events.py @@ -21,7 +21,6 @@ class Events: - """ Events library class that loads and customizes event json files diff --git a/samcli/lib/hook/exceptions.py b/samcli/lib/hook/exceptions.py index a4b162826b3..c5867a7ed14 100644 --- a/samcli/lib/hook/exceptions.py +++ b/samcli/lib/hook/exceptions.py @@ -1,4 +1,5 @@ """Hooks Exceptions""" + from samcli.commands.exceptions import UserException diff --git a/samcli/lib/hook/hook_config.py b/samcli/lib/hook/hook_config.py index 92908642de4..7f53c184115 100644 --- a/samcli/lib/hook/hook_config.py +++ b/samcli/lib/hook/hook_config.py @@ -1,4 +1,5 @@ """Hook Package Config""" + import json from pathlib import Path from typing import Dict, NamedTuple, Optional, cast diff --git a/samcli/lib/hook/hook_wrapper.py b/samcli/lib/hook/hook_wrapper.py index 9580be5a00c..87bbdbb31bc 100644 --- a/samcli/lib/hook/hook_wrapper.py +++ b/samcli/lib/hook/hook_wrapper.py @@ -1,6 +1,7 @@ """ Hooks Wrapper Class """ + import importlib import logging from pathlib import Path diff --git a/samcli/lib/iac/cdk/cdk_iac.py b/samcli/lib/iac/cdk/cdk_iac.py index 700c1ef3c3f..bc79acdb158 100644 --- a/samcli/lib/iac/cdk/cdk_iac.py +++ b/samcli/lib/iac/cdk/cdk_iac.py @@ -1,6 +1,7 @@ """ Provide a CDK implementation of IaCPluginInterface """ + from typing import List from samcli.lib.iac.plugins_interfaces import IaCPluginInterface, LookupPath, SamCliProject, Stack diff --git a/samcli/lib/iac/cfn/cfn_iac.py b/samcli/lib/iac/cfn/cfn_iac.py index 7617af2f92f..7676fa19648 100644 --- a/samcli/lib/iac/cfn/cfn_iac.py +++ b/samcli/lib/iac/cfn/cfn_iac.py @@ -1,6 +1,7 @@ """ Provide a CFN implementation of IaCPluginInterface """ + import logging import os from typing import List, Optional diff --git a/samcli/lib/iac/constants.py b/samcli/lib/iac/constants.py index c3c992aa250..dead7f559c1 100644 --- a/samcli/lib/iac/constants.py +++ b/samcli/lib/iac/constants.py @@ -1,5 +1,6 @@ """ General IaC constants """ + PARAMETER_OVERRIDES = "parameter_overrides" GLOBAL_PARAMETER_OVERRIDES = "global_parameter_overrides" diff --git a/samcli/lib/iac/exceptions.py b/samcli/lib/iac/exceptions.py index ed84517f6e5..2d1872cb601 100644 --- a/samcli/lib/iac/exceptions.py +++ b/samcli/lib/iac/exceptions.py @@ -1,6 +1,7 @@ """ IaC Exceptions """ + from typing import Optional from samcli.commands.exceptions import UserException diff --git a/samcli/lib/iac/iac_factory.py b/samcli/lib/iac/iac_factory.py index 766925e7972..3b629b4abce 100644 --- a/samcli/lib/iac/iac_factory.py +++ b/samcli/lib/iac/iac_factory.py @@ -1,6 +1,7 @@ """ Provide a factory class for IaC project creation """ + import fnmatch import os diff --git a/samcli/lib/init/__init__.py b/samcli/lib/init/__init__.py index e0b8ff0e5b0..241076bc058 100644 --- a/samcli/lib/init/__init__.py +++ b/samcli/lib/init/__init__.py @@ -1,6 +1,7 @@ """ Init module to scaffold a project app from a template """ + import itertools import logging import platform diff --git a/samcli/lib/init/default_samconfig.py b/samcli/lib/init/default_samconfig.py index c45d5fea771..c075761b208 100644 --- a/samcli/lib/init/default_samconfig.py +++ b/samcli/lib/init/default_samconfig.py @@ -1,6 +1,7 @@ """ Module for creating default samconfig.toml files after initialize a sample app """ + from dataclasses import dataclass from enum import Enum from typing import Any, List diff --git a/samcli/lib/init/template_modifiers/application_insights_template_modifier.py b/samcli/lib/init/template_modifiers/application_insights_template_modifier.py index 4a447843079..42139026ad4 100644 --- a/samcli/lib/init/template_modifiers/application_insights_template_modifier.py +++ b/samcli/lib/init/template_modifiers/application_insights_template_modifier.py @@ -1,6 +1,7 @@ """ Class used to parse and update template when application-insights is enabled """ + import logging from typing import Any diff --git a/samcli/lib/init/template_modifiers/cli_template_modifier.py b/samcli/lib/init/template_modifiers/cli_template_modifier.py index 848defc7b77..fe21a1f39b1 100644 --- a/samcli/lib/init/template_modifiers/cli_template_modifier.py +++ b/samcli/lib/init/template_modifiers/cli_template_modifier.py @@ -1,6 +1,7 @@ """ Class used to parse and update template with new field """ + import logging from abc import abstractmethod from copy import deepcopy diff --git a/samcli/lib/init/template_modifiers/structured_logging_template_modifier.py b/samcli/lib/init/template_modifiers/structured_logging_template_modifier.py index 798ce9cd181..7221ae8a339 100644 --- a/samcli/lib/init/template_modifiers/structured_logging_template_modifier.py +++ b/samcli/lib/init/template_modifiers/structured_logging_template_modifier.py @@ -1,6 +1,7 @@ """ Class used to parse and update template when structured logging is enabled """ + import logging from typing import Any diff --git a/samcli/lib/init/template_modifiers/xray_tracing_template_modifier.py b/samcli/lib/init/template_modifiers/xray_tracing_template_modifier.py index e0c0a445d79..961cf077008 100644 --- a/samcli/lib/init/template_modifiers/xray_tracing_template_modifier.py +++ b/samcli/lib/init/template_modifiers/xray_tracing_template_modifier.py @@ -1,6 +1,7 @@ """ Class used to parse and update template when tracing is enabled """ + import logging from typing import Any diff --git a/samcli/lib/intrinsic_resolver/intrinsic_property_resolver.py b/samcli/lib/intrinsic_resolver/intrinsic_property_resolver.py index 3fdd1c2e586..1fee887de78 100644 --- a/samcli/lib/intrinsic_resolver/intrinsic_property_resolver.py +++ b/samcli/lib/intrinsic_resolver/intrinsic_property_resolver.py @@ -1,6 +1,7 @@ """ Process and simplifies CloudFormation intrinsic properties such as FN::* and Ref """ + import base64 import copy import logging diff --git a/samcli/lib/intrinsic_resolver/intrinsics_symbol_table.py b/samcli/lib/intrinsic_resolver/intrinsics_symbol_table.py index e5d704214ea..feefb46c031 100644 --- a/samcli/lib/intrinsic_resolver/intrinsics_symbol_table.py +++ b/samcli/lib/intrinsic_resolver/intrinsics_symbol_table.py @@ -1,6 +1,7 @@ """ The symbol table that is used in IntrinsicResolver in order to resolve runtime attributes """ + import logging import os diff --git a/samcli/lib/intrinsic_resolver/invalid_intrinsic_validation.py b/samcli/lib/intrinsic_resolver/invalid_intrinsic_validation.py index bc11644efbf..a8e6e6f6e89 100644 --- a/samcli/lib/intrinsic_resolver/invalid_intrinsic_validation.py +++ b/samcli/lib/intrinsic_resolver/invalid_intrinsic_validation.py @@ -1,6 +1,7 @@ """ A list of helper functions that cleanup the processing in IntrinsicResolver and IntrinsicSymbolTable """ + from samcli.lib.intrinsic_resolver.invalid_intrinsic_exception import InvalidIntrinsicException diff --git a/samcli/lib/list/data_to_json_mapper.py b/samcli/lib/list/data_to_json_mapper.py index d99f5dc04fa..81d44ca4932 100644 --- a/samcli/lib/list/data_to_json_mapper.py +++ b/samcli/lib/list/data_to_json_mapper.py @@ -1,6 +1,7 @@ """ Implementation of the data to json mapper """ + import json from typing import Dict diff --git a/samcli/lib/list/endpoints/endpoints_def.py b/samcli/lib/list/endpoints/endpoints_def.py index 7bd29dea77f..f44b75b6e64 100644 --- a/samcli/lib/list/endpoints/endpoints_def.py +++ b/samcli/lib/list/endpoints/endpoints_def.py @@ -1,6 +1,7 @@ """ The container for Endpoints """ + from dataclasses import dataclass from typing import Any diff --git a/samcli/lib/list/endpoints/endpoints_producer.py b/samcli/lib/list/endpoints/endpoints_producer.py index b708944e312..70c82687ce2 100644 --- a/samcli/lib/list/endpoints/endpoints_producer.py +++ b/samcli/lib/list/endpoints/endpoints_producer.py @@ -1,6 +1,7 @@ """ The producer for the 'sam list endpoints' command """ + import dataclasses import json import logging @@ -468,9 +469,9 @@ def get_response_domain_dict(response: Dict[Any, Any]) -> Dict[str, str]: resource.get(RESOURCE_TYPE, "") == AWS_APIGATEWAY_DOMAIN_NAME or resource.get(RESOURCE_TYPE, "") == AWS_APIGATEWAY_V2_DOMAIN_NAME ): - response_domain_dict[ - resource.get(LOGICAL_RESOURCE_ID, "") - ] = f'https://{resource.get(PHYSICAL_RESOURCE_ID, "")}' + response_domain_dict[resource.get(LOGICAL_RESOURCE_ID, "")] = ( + f'https://{resource.get(PHYSICAL_RESOURCE_ID, "")}' + ) return response_domain_dict diff --git a/samcli/lib/list/endpoints/endpoints_to_table_mapper.py b/samcli/lib/list/endpoints/endpoints_to_table_mapper.py index 6efe234edb5..6521616f595 100644 --- a/samcli/lib/list/endpoints/endpoints_to_table_mapper.py +++ b/samcli/lib/list/endpoints/endpoints_to_table_mapper.py @@ -1,6 +1,7 @@ """ Implementation of the endpoints to table mapper """ + from collections import OrderedDict from typing import Any, Dict diff --git a/samcli/lib/list/list_interfaces.py b/samcli/lib/list/list_interfaces.py index 91b8b559ca9..ed6d7c45981 100644 --- a/samcli/lib/list/list_interfaces.py +++ b/samcli/lib/list/list_interfaces.py @@ -1,6 +1,7 @@ """ Interface for MapperConsumerFactory, Producer, Mapper, ListInfoPullerConsumer """ + from abc import ABC, abstractmethod from enum import Enum from typing import Generic, TypeVar diff --git a/samcli/lib/list/mapper_consumer_container.py b/samcli/lib/list/mapper_consumer_container.py index 80360d7a16a..babf6d81d4c 100644 --- a/samcli/lib/list/mapper_consumer_container.py +++ b/samcli/lib/list/mapper_consumer_container.py @@ -1,6 +1,7 @@ """ Container for a mapper and a consumer """ + from dataclasses import dataclass from samcli.lib.list.list_interfaces import ListInfoPullerConsumer, Mapper diff --git a/samcli/lib/list/mapper_consumer_factory.py b/samcli/lib/list/mapper_consumer_factory.py index 84b9d1c02e6..bdf6578ea1a 100644 --- a/samcli/lib/list/mapper_consumer_factory.py +++ b/samcli/lib/list/mapper_consumer_factory.py @@ -1,6 +1,7 @@ """ The factory for returning the appropriate mapper and consumer """ + from samcli.commands.list.json_consumer import StringConsumerJsonOutput from samcli.commands.list.table_consumer import StringConsumerTableOutput from samcli.lib.list.data_to_json_mapper import DataToJsonMapper diff --git a/samcli/lib/list/resources/resource_mapping_producer.py b/samcli/lib/list/resources/resource_mapping_producer.py index 96b7e7c56c0..562f145f9a8 100644 --- a/samcli/lib/list/resources/resource_mapping_producer.py +++ b/samcli/lib/list/resources/resource_mapping_producer.py @@ -1,6 +1,7 @@ """ The producer for the 'sam list resources' command """ + import dataclasses import logging from typing import Any, Dict diff --git a/samcli/lib/list/resources/resources_def.py b/samcli/lib/list/resources/resources_def.py index 37bebecbba3..802ac4faf96 100644 --- a/samcli/lib/list/resources/resources_def.py +++ b/samcli/lib/list/resources/resources_def.py @@ -1,6 +1,7 @@ """ The container for Resources """ + from dataclasses import dataclass diff --git a/samcli/lib/list/resources/resources_to_table_mapper.py b/samcli/lib/list/resources/resources_to_table_mapper.py index ca87644ed76..d33757a66fd 100644 --- a/samcli/lib/list/resources/resources_to_table_mapper.py +++ b/samcli/lib/list/resources/resources_to_table_mapper.py @@ -1,6 +1,7 @@ """ Implementation of the resources to table mapper """ + from collections import OrderedDict from typing import Any, Dict diff --git a/samcli/lib/list/stack_outputs/stack_output_to_table_mapper.py b/samcli/lib/list/stack_outputs/stack_output_to_table_mapper.py index 0be89deae60..68c8255526e 100644 --- a/samcli/lib/list/stack_outputs/stack_output_to_table_mapper.py +++ b/samcli/lib/list/stack_outputs/stack_output_to_table_mapper.py @@ -1,6 +1,7 @@ """ Implementation of the stack output to table mapper """ + from collections import OrderedDict from typing import Any, Dict diff --git a/samcli/lib/list/stack_outputs/stack_outputs.py b/samcli/lib/list/stack_outputs/stack_outputs.py index 292da23b481..b0500afa0d0 100644 --- a/samcli/lib/list/stack_outputs/stack_outputs.py +++ b/samcli/lib/list/stack_outputs/stack_outputs.py @@ -1,6 +1,7 @@ """ The container for stack outputs """ + from dataclasses import dataclass diff --git a/samcli/lib/list/stack_outputs/stack_outputs_producer.py b/samcli/lib/list/stack_outputs/stack_outputs_producer.py index dc8df62d8e2..198664b6284 100644 --- a/samcli/lib/list/stack_outputs/stack_outputs_producer.py +++ b/samcli/lib/list/stack_outputs/stack_outputs_producer.py @@ -1,6 +1,7 @@ """ The producer for the 'sam list stack-outputs' command """ + import dataclasses import logging from typing import Any, Optional diff --git a/samcli/lib/observability/cw_logs/cw_log_event.py b/samcli/lib/observability/cw_logs/cw_log_event.py index 49b9a4e889c..1258cec9f1b 100644 --- a/samcli/lib/observability/cw_logs/cw_log_event.py +++ b/samcli/lib/observability/cw_logs/cw_log_event.py @@ -1,6 +1,7 @@ """ CloudWatch log event type """ + from typing import Optional from samcli.lib.observability.observability_info_puller import ObservabilityEvent diff --git a/samcli/lib/observability/cw_logs/cw_log_formatters.py b/samcli/lib/observability/cw_logs/cw_log_formatters.py index 63b2ffd983a..e761bea5f51 100644 --- a/samcli/lib/observability/cw_logs/cw_log_formatters.py +++ b/samcli/lib/observability/cw_logs/cw_log_formatters.py @@ -1,6 +1,7 @@ """ Contains all mappers (formatters) for CloudWatch logs """ + import json import logging from json import JSONDecodeError diff --git a/samcli/lib/observability/cw_logs/cw_log_group_provider.py b/samcli/lib/observability/cw_logs/cw_log_group_provider.py index 0ff83925e5c..0bcb70328af 100644 --- a/samcli/lib/observability/cw_logs/cw_log_group_provider.py +++ b/samcli/lib/observability/cw_logs/cw_log_group_provider.py @@ -1,6 +1,7 @@ """ Discover & provide the log group name """ + import logging from typing import Optional @@ -53,7 +54,9 @@ def for_lambda_function(boto_client_provider: BotoProviderType, function_name: s """ log_group_name = "" try: - function_configuration = boto_client_provider("lambda").get_function_configuration(function_name) + function_configuration = boto_client_provider("lambda").get_function_configuration( + FunctionName=function_name + ) logging_config = function_configuration.get("LoggingConfig") if logging_config: log_group_name = logging_config.get("LogGroup") diff --git a/samcli/lib/observability/cw_logs/cw_log_puller.py b/samcli/lib/observability/cw_logs/cw_log_puller.py index b2f8c885d19..409be8d3a5d 100644 --- a/samcli/lib/observability/cw_logs/cw_log_puller.py +++ b/samcli/lib/observability/cw_logs/cw_log_puller.py @@ -1,6 +1,7 @@ """ CloudWatch log event puller implementation """ + import logging import time from datetime import datetime diff --git a/samcli/lib/observability/observability_info_puller.py b/samcli/lib/observability/observability_info_puller.py index d5990feae5c..ef160410455 100644 --- a/samcli/lib/observability/observability_info_puller.py +++ b/samcli/lib/observability/observability_info_puller.py @@ -1,6 +1,7 @@ """ Interfaces and generic implementations for observability events (like CW logs) """ + import logging from abc import ABC, abstractmethod from datetime import datetime diff --git a/samcli/lib/observability/util.py b/samcli/lib/observability/util.py index d3996d63539..24b610b46a9 100644 --- a/samcli/lib/observability/util.py +++ b/samcli/lib/observability/util.py @@ -1,6 +1,7 @@ """ Utility classes and methods for observability commands and functionality """ + from enum import Enum diff --git a/samcli/lib/observability/xray_traces/xray_event_mappers.py b/samcli/lib/observability/xray_traces/xray_event_mappers.py index bcd367dd975..224cb3bad67 100644 --- a/samcli/lib/observability/xray_traces/xray_event_mappers.py +++ b/samcli/lib/observability/xray_traces/xray_event_mappers.py @@ -1,6 +1,7 @@ """ Contains mapper implementations of XRay events """ + import json from copy import deepcopy from datetime import datetime diff --git a/samcli/lib/observability/xray_traces/xray_event_puller.py b/samcli/lib/observability/xray_traces/xray_event_puller.py index 506257e4d6e..b012f986939 100644 --- a/samcli/lib/observability/xray_traces/xray_event_puller.py +++ b/samcli/lib/observability/xray_traces/xray_event_puller.py @@ -1,6 +1,7 @@ """ This file contains puller implementations for XRay """ + import logging import time from datetime import datetime diff --git a/samcli/lib/observability/xray_traces/xray_events.py b/samcli/lib/observability/xray_traces/xray_events.py index de610ca1157..f39fcea5a02 100644 --- a/samcli/lib/observability/xray_traces/xray_events.py +++ b/samcli/lib/observability/xray_traces/xray_events.py @@ -1,6 +1,7 @@ """ Keeps XRay event definitions """ + import json import operator from typing import List, Optional diff --git a/samcli/lib/observability/xray_traces/xray_service_graph_event_puller.py b/samcli/lib/observability/xray_traces/xray_service_graph_event_puller.py index 9c3f0c3caf9..019b27aa5c8 100644 --- a/samcli/lib/observability/xray_traces/xray_service_graph_event_puller.py +++ b/samcli/lib/observability/xray_traces/xray_service_graph_event_puller.py @@ -1,6 +1,7 @@ """ This file contains puller implementations for XRay """ + import logging from datetime import datetime from typing import Any, Dict, List, Optional, Set, Union diff --git a/samcli/lib/package/ecr_uploader.py b/samcli/lib/package/ecr_uploader.py index 0393596b39a..6414ccf071b 100644 --- a/samcli/lib/package/ecr_uploader.py +++ b/samcli/lib/package/ecr_uploader.py @@ -1,6 +1,7 @@ """ Client for uploading packaged artifacts to ecr """ + import base64 import logging from io import StringIO diff --git a/samcli/lib/package/ecr_utils.py b/samcli/lib/package/ecr_utils.py index 2a068e55c08..c13be0f65f6 100644 --- a/samcli/lib/package/ecr_utils.py +++ b/samcli/lib/package/ecr_utils.py @@ -1,6 +1,7 @@ """ ECR Packaging Utils """ + import re """ diff --git a/samcli/lib/package/image_utils.py b/samcli/lib/package/image_utils.py index b5a0a6bf83b..fbff23ece0f 100644 --- a/samcli/lib/package/image_utils.py +++ b/samcli/lib/package/image_utils.py @@ -1,6 +1,7 @@ """ Image artifacts based utilities """ + import docker from docker.errors import APIError, NullResource diff --git a/samcli/lib/package/local_files_utils.py b/samcli/lib/package/local_files_utils.py index d6dc1aa1480..e7a9bf68e61 100644 --- a/samcli/lib/package/local_files_utils.py +++ b/samcli/lib/package/local_files_utils.py @@ -1,6 +1,7 @@ """ Utilities for local files handling. """ + import os import tempfile import uuid diff --git a/samcli/lib/package/packageable_resources.py b/samcli/lib/package/packageable_resources.py index ca245715b5f..d2986cc98dc 100644 --- a/samcli/lib/package/packageable_resources.py +++ b/samcli/lib/package/packageable_resources.py @@ -1,6 +1,7 @@ """ Code for all Package-able resources """ + import logging import os import shutil diff --git a/samcli/lib/package/permissions.py b/samcli/lib/package/permissions.py index 24da0bdac57..47c987df0eb 100644 --- a/samcli/lib/package/permissions.py +++ b/samcli/lib/package/permissions.py @@ -1,6 +1,7 @@ """ Classes which will change permissions on a ZipInfo object """ + import platform import zipfile diff --git a/samcli/lib/package/stream_cursor_utils.py b/samcli/lib/package/stream_cursor_utils.py index 924e431baa3..5f31b3b7724 100644 --- a/samcli/lib/package/stream_cursor_utils.py +++ b/samcli/lib/package/stream_cursor_utils.py @@ -1,6 +1,7 @@ """ Stream cursor utilities for moving cursor in the terminal. """ + import os import platform diff --git a/samcli/lib/package/utils.py b/samcli/lib/package/utils.py index d0a1ae9787d..ef0405060a9 100644 --- a/samcli/lib/package/utils.py +++ b/samcli/lib/package/utils.py @@ -1,6 +1,7 @@ """ Utilities involved in Packaging. """ + import contextlib import functools import logging diff --git a/samcli/lib/pipeline/bootstrap/resource.py b/samcli/lib/pipeline/bootstrap/resource.py index cb5eb000e3f..8f4f4518084 100644 --- a/samcli/lib/pipeline/bootstrap/resource.py +++ b/samcli/lib/pipeline/bootstrap/resource.py @@ -1,4 +1,5 @@ """ Represents AWS resource""" + from typing import Optional from samcli.lib.utils.arn_utils import ARNParts diff --git a/samcli/lib/pipeline/bootstrap/stage.py b/samcli/lib/pipeline/bootstrap/stage.py index 06ab4fa6dc2..7bca9dc3153 100644 --- a/samcli/lib/pipeline/bootstrap/stage.py +++ b/samcli/lib/pipeline/bootstrap/stage.py @@ -1,4 +1,5 @@ """ Application Environment """ + import hashlib import json import os @@ -240,13 +241,17 @@ def _get_non_user_provided_resources_msg(self) -> str: [] if self.pipeline_user.is_user_provided or self.use_oidc_provider else [self.pipeline_user.comment], [] if not self.use_oidc_provider else [self.oidc_provider.comment], [] if self.pipeline_execution_role.is_user_provided else [self.pipeline_execution_role.comment], - [] - if self.cloudformation_execution_role.is_user_provided - else [self.cloudformation_execution_role.comment], + ( + [] + if self.cloudformation_execution_role.is_user_provided + else [self.cloudformation_execution_role.comment] + ), [] if self.artifacts_bucket.is_user_provided else [self.artifacts_bucket.comment], - [] - if self.image_repository.is_user_provided or not self.create_image_repository - else [self.image_repository.comment], + ( + [] + if self.image_repository.is_user_provided or not self.create_image_repository + else [self.image_repository.comment] + ), ] ) return "\n".join([f"\t- {comment}" for comment in resource_comments]) diff --git a/samcli/lib/providers/cfn_api_provider.py b/samcli/lib/providers/cfn_api_provider.py index b8f9e6f28c5..f0a46cb74e9 100644 --- a/samcli/lib/providers/cfn_api_provider.py +++ b/samcli/lib/providers/cfn_api_provider.py @@ -1,4 +1,5 @@ """Parses SAM given a template""" + import logging from typing import Any, Dict, List, Optional, Tuple, cast diff --git a/samcli/lib/providers/cfn_base_api_provider.py b/samcli/lib/providers/cfn_base_api_provider.py index 646bff37ab2..bd336df7011 100644 --- a/samcli/lib/providers/cfn_base_api_provider.py +++ b/samcli/lib/providers/cfn_base_api_provider.py @@ -1,4 +1,5 @@ """Class that parses the CloudFormation Api Template""" + import logging from typing import Any, Dict, List, Optional, Type, Union diff --git a/samcli/lib/providers/provider.py b/samcli/lib/providers/provider.py index 59e3f98f7f1..d14f3fa4b0a 100644 --- a/samcli/lib/providers/provider.py +++ b/samcli/lib/providers/provider.py @@ -2,6 +2,7 @@ A provider class that can parse and return Lambda Functions from a variety of sources. A SAM template is one such source """ + import hashlib import logging import os @@ -244,22 +245,9 @@ def __init__( self._compatible_runtimes = compatible_runtimes self._custom_layer_id = metadata.get(SAM_RESOURCE_ID_KEY) - if "BuildArchitecture" not in metadata: - LOG.warning( - "WARNING: No BuildArchitecture specifed in Layer `%s`" + " Metadata. Defaulting to x86_64.", - self._custom_layer_id, - ) - self._build_architecture = cast(str, metadata.get("BuildArchitecture", X86_64)) self._compatible_architectures = compatible_architectures - if self._compatible_architectures and self._build_architecture not in self._compatible_architectures: - LOG.warning( - "WARNING: Layer `%s` has BuildArchitecture `%s`," + " which is not listed in CompatibleArchitectures.", - self._custom_layer_id, - self._build_architecture, - ) - self._skip_build = bool(metadata.get(SAM_METADATA_SKIP_BUILD_KEY, False)) @staticmethod diff --git a/samcli/lib/providers/sam_function_provider.py b/samcli/lib/providers/sam_function_provider.py index cfed427ce08..da0c64eaca3 100644 --- a/samcli/lib/providers/sam_function_provider.py +++ b/samcli/lib/providers/sam_function_provider.py @@ -1,6 +1,7 @@ """ Class that provides functions from a given SAM template """ + import logging from typing import Any, Dict, Iterator, List, Optional, cast diff --git a/samcli/lib/providers/sam_layer_provider.py b/samcli/lib/providers/sam_layer_provider.py index 44d68fafbbf..ecd642f751d 100644 --- a/samcli/lib/providers/sam_layer_provider.py +++ b/samcli/lib/providers/sam_layer_provider.py @@ -1,6 +1,7 @@ """ Class that provides layers from a given SAM template """ + import logging from typing import Dict, List, Optional diff --git a/samcli/lib/providers/sam_stack_provider.py b/samcli/lib/providers/sam_stack_provider.py index f1746198864..0f9b174f95a 100644 --- a/samcli/lib/providers/sam_stack_provider.py +++ b/samcli/lib/providers/sam_stack_provider.py @@ -1,6 +1,7 @@ """ Class that provides all nested stacks from a given SAM template """ + import logging import os from typing import Dict, Iterator, List, Optional, Tuple, Union, cast diff --git a/samcli/lib/remote_invoke/kinesis_invoke_executors.py b/samcli/lib/remote_invoke/kinesis_invoke_executors.py index ad020bd1ef9..0c34c457e4e 100644 --- a/samcli/lib/remote_invoke/kinesis_invoke_executors.py +++ b/samcli/lib/remote_invoke/kinesis_invoke_executors.py @@ -1,6 +1,7 @@ """ Remote invoke executor implementation for Kinesis streams """ + import logging import uuid from dataclasses import asdict, dataclass diff --git a/samcli/lib/remote_invoke/lambda_invoke_executors.py b/samcli/lib/remote_invoke/lambda_invoke_executors.py index 507999210e2..423a604d3ed 100644 --- a/samcli/lib/remote_invoke/lambda_invoke_executors.py +++ b/samcli/lib/remote_invoke/lambda_invoke_executors.py @@ -1,6 +1,7 @@ """ Remote invoke executor implementation for Lambda """ + import base64 import json import logging diff --git a/samcli/lib/remote_invoke/remote_invoke_executor_factory.py b/samcli/lib/remote_invoke/remote_invoke_executor_factory.py index 5d0daaa3955..4b1d46e55b4 100644 --- a/samcli/lib/remote_invoke/remote_invoke_executor_factory.py +++ b/samcli/lib/remote_invoke/remote_invoke_executor_factory.py @@ -1,6 +1,7 @@ """ Remote Invoke factory to instantiate remote invoker for given resource """ + import logging from typing import Any, Callable, Dict, Optional diff --git a/samcli/lib/remote_invoke/remote_invoke_executors.py b/samcli/lib/remote_invoke/remote_invoke_executors.py index f15899c02aa..8dce0390c2b 100644 --- a/samcli/lib/remote_invoke/remote_invoke_executors.py +++ b/samcli/lib/remote_invoke/remote_invoke_executors.py @@ -1,6 +1,7 @@ """ Abstract class definitions and generic implementations for remote invoke """ + import json import logging from abc import ABC, abstractmethod diff --git a/samcli/lib/remote_invoke/sqs_invoke_executors.py b/samcli/lib/remote_invoke/sqs_invoke_executors.py index b4454158faa..b92653f838f 100644 --- a/samcli/lib/remote_invoke/sqs_invoke_executors.py +++ b/samcli/lib/remote_invoke/sqs_invoke_executors.py @@ -1,6 +1,7 @@ """ Remote invoke executor implementation for SQS """ + import json import logging from dataclasses import asdict, dataclass diff --git a/samcli/lib/remote_invoke/stepfunctions_invoke_executors.py b/samcli/lib/remote_invoke/stepfunctions_invoke_executors.py index f4d6a384c8e..8a3a833214f 100644 --- a/samcli/lib/remote_invoke/stepfunctions_invoke_executors.py +++ b/samcli/lib/remote_invoke/stepfunctions_invoke_executors.py @@ -1,6 +1,7 @@ """ Remote invoke executor implementation for Step Functions """ + import logging import time from datetime import datetime diff --git a/samcli/lib/sync/continuous_sync_flow_executor.py b/samcli/lib/sync/continuous_sync_flow_executor.py index 69a9f02de24..94932184af1 100644 --- a/samcli/lib/sync/continuous_sync_flow_executor.py +++ b/samcli/lib/sync/continuous_sync_flow_executor.py @@ -1,4 +1,5 @@ """SyncFlowExecutor that will run continuously until stop is called.""" + import logging import time from concurrent.futures.thread import ThreadPoolExecutor diff --git a/samcli/lib/sync/exceptions.py b/samcli/lib/sync/exceptions.py index 89c2e529e59..c064e7a55ee 100644 --- a/samcli/lib/sync/exceptions.py +++ b/samcli/lib/sync/exceptions.py @@ -1,4 +1,5 @@ """Exceptions related to sync functionalities""" + from typing import TYPE_CHECKING, Dict, Optional if TYPE_CHECKING: # pragma: no cover diff --git a/samcli/lib/sync/flows/alias_version_sync_flow.py b/samcli/lib/sync/flows/alias_version_sync_flow.py index be03d0bf4e6..f3a270b69dd 100644 --- a/samcli/lib/sync/flows/alias_version_sync_flow.py +++ b/samcli/lib/sync/flows/alias_version_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow for Lambda Function Alias and Version""" + import hashlib import logging from typing import TYPE_CHECKING, Any, Dict, List, Optional diff --git a/samcli/lib/sync/flows/auto_dependency_layer_sync_flow.py b/samcli/lib/sync/flows/auto_dependency_layer_sync_flow.py index 8271d889deb..002f51c228f 100644 --- a/samcli/lib/sync/flows/auto_dependency_layer_sync_flow.py +++ b/samcli/lib/sync/flows/auto_dependency_layer_sync_flow.py @@ -1,6 +1,7 @@ """ Contains sync flow implementation for Auto Dependency Layer """ + import hashlib import logging import os diff --git a/samcli/lib/sync/flows/function_sync_flow.py b/samcli/lib/sync/flows/function_sync_flow.py index 55a04f59259..bf007eb71f8 100644 --- a/samcli/lib/sync/flows/function_sync_flow.py +++ b/samcli/lib/sync/flows/function_sync_flow.py @@ -1,4 +1,5 @@ """Base SyncFlow for Lambda Function""" + import logging import time from abc import ABC diff --git a/samcli/lib/sync/flows/generic_api_sync_flow.py b/samcli/lib/sync/flows/generic_api_sync_flow.py index afd261dc884..b3452dad3c3 100644 --- a/samcli/lib/sync/flows/generic_api_sync_flow.py +++ b/samcli/lib/sync/flows/generic_api_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow interface for HttpApi and RestApi""" + import hashlib import logging from abc import ABC diff --git a/samcli/lib/sync/flows/image_function_sync_flow.py b/samcli/lib/sync/flows/image_function_sync_flow.py index a2abb2a396c..7cb9abda51a 100644 --- a/samcli/lib/sync/flows/image_function_sync_flow.py +++ b/samcli/lib/sync/flows/image_function_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow for Image based Lambda Functions""" + import logging from contextlib import ExitStack from typing import TYPE_CHECKING, Any, Dict, List, Optional diff --git a/samcli/lib/sync/flows/layer_sync_flow.py b/samcli/lib/sync/flows/layer_sync_flow.py index e8ed77b0745..a8e60f0c090 100644 --- a/samcli/lib/sync/flows/layer_sync_flow.py +++ b/samcli/lib/sync/flows/layer_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow for Layers""" + import base64 import hashlib import logging diff --git a/samcli/lib/sync/flows/rest_api_sync_flow.py b/samcli/lib/sync/flows/rest_api_sync_flow.py index 8bfc5234601..419d4d3532d 100644 --- a/samcli/lib/sync/flows/rest_api_sync_flow.py +++ b/samcli/lib/sync/flows/rest_api_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow for RestApi""" + import logging from typing import TYPE_CHECKING, Dict, List, Optional, Set, cast diff --git a/samcli/lib/sync/flows/stepfunctions_sync_flow.py b/samcli/lib/sync/flows/stepfunctions_sync_flow.py index 35e75d8dcab..e1a394cb7f7 100644 --- a/samcli/lib/sync/flows/stepfunctions_sync_flow.py +++ b/samcli/lib/sync/flows/stepfunctions_sync_flow.py @@ -1,4 +1,5 @@ """Base SyncFlow for StepFunctions""" + import hashlib import logging from pathlib import Path diff --git a/samcli/lib/sync/flows/zip_function_sync_flow.py b/samcli/lib/sync/flows/zip_function_sync_flow.py index 5e04685a081..4c051c10746 100644 --- a/samcli/lib/sync/flows/zip_function_sync_flow.py +++ b/samcli/lib/sync/flows/zip_function_sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow for ZIP based Lambda Functions""" + import base64 import hashlib import logging diff --git a/samcli/lib/sync/infra_sync_executor.py b/samcli/lib/sync/infra_sync_executor.py index e5c48d44dd2..30b0ef7cdac 100644 --- a/samcli/lib/sync/infra_sync_executor.py +++ b/samcli/lib/sync/infra_sync_executor.py @@ -1,6 +1,7 @@ """ InfraSyncExecutor class which runs build, package and deploy contexts """ + import copy import logging import re @@ -337,9 +338,9 @@ def _auto_skip_infra_sync( nested_template_location, stack_resource_detail.get("StackResourceDetail", {}).get("PhysicalResourceId", ""), parameter_overrides={}, # Do not pass the same parameter overrides to the nested stack - nested_prefix=nested_prefix + resource_logical_id + "/" - if nested_prefix - else resource_logical_id + "/", + nested_prefix=( + nested_prefix + resource_logical_id + "/" if nested_prefix else resource_logical_id + "/" + ), ): return False diff --git a/samcli/lib/sync/sync_flow.py b/samcli/lib/sync/sync_flow.py index cf671fb5a82..1110297f221 100644 --- a/samcli/lib/sync/sync_flow.py +++ b/samcli/lib/sync/sync_flow.py @@ -1,4 +1,5 @@ """SyncFlow base class """ + import logging from abc import ABC, abstractmethod from enum import Enum diff --git a/samcli/lib/sync/sync_flow_executor.py b/samcli/lib/sync/sync_flow_executor.py index d6f712cfead..db73abc528a 100644 --- a/samcli/lib/sync/sync_flow_executor.py +++ b/samcli/lib/sync/sync_flow_executor.py @@ -1,8 +1,10 @@ """Executor for SyncFlows""" + import logging import time from concurrent.futures import Future, ThreadPoolExecutor from dataclasses import dataclass +from datetime import datetime from queue import Queue from threading import RLock from typing import Callable, List, Optional, Set @@ -310,8 +312,12 @@ def _handle_result( sync_flow_result: SyncFlowResult = future.result() for dependent_sync_flow in sync_flow_result.dependent_sync_flows: self.add_sync_flow(dependent_sync_flow) + message = ( + f"{datetime.now().strftime('%d/%b/%Y:%H:%M:%S')}: " + f"Finished syncing {sync_flow_result.sync_flow.log_name}." + ) LOG.info( - self._color.color_log(msg=f"Finished syncing {sync_flow_result.sync_flow.log_name}.", color="green"), + self._color.color_log(msg=message, color="green"), extra=dict(markup=True), ) return True diff --git a/samcli/lib/sync/sync_flow_factory.py b/samcli/lib/sync/sync_flow_factory.py index f9704bf95cb..4fbdda54b3b 100644 --- a/samcli/lib/sync/sync_flow_factory.py +++ b/samcli/lib/sync/sync_flow_factory.py @@ -1,4 +1,5 @@ """SyncFlow Factory for creating SyncFlows based on resource types""" + import logging from typing import TYPE_CHECKING, Callable, Dict, List, Optional, cast diff --git a/samcli/lib/sync/watch_manager.py b/samcli/lib/sync/watch_manager.py index ca3935878e3..5f7cb176961 100644 --- a/samcli/lib/sync/watch_manager.py +++ b/samcli/lib/sync/watch_manager.py @@ -1,6 +1,7 @@ """ WatchManager for Sync Watch Logic """ + import logging import platform import threading diff --git a/samcli/lib/telemetry/metric.py b/samcli/lib/telemetry/metric.py index 681d2adc641..7f3127cf86a 100644 --- a/samcli/lib/telemetry/metric.py +++ b/samcli/lib/telemetry/metric.py @@ -1,6 +1,7 @@ """ Provides methods to generate and send metrics """ + import logging import platform import uuid diff --git a/samcli/lib/telemetry/user_agent.py b/samcli/lib/telemetry/user_agent.py index 875a4d8788c..c6b6e6bee96 100644 --- a/samcli/lib/telemetry/user_agent.py +++ b/samcli/lib/telemetry/user_agent.py @@ -1,6 +1,7 @@ """ Reads user agent information from environment and returns it for telemetry consumption """ + import os import re from typing import Optional diff --git a/samcli/lib/translate/sam_template_validator.py b/samcli/lib/translate/sam_template_validator.py index ff789925e02..5c2a9ed33da 100644 --- a/samcli/lib/translate/sam_template_validator.py +++ b/samcli/lib/translate/sam_template_validator.py @@ -1,6 +1,7 @@ """ Library for Validating Sam Templates """ + import functools import logging from typing import Dict, Optional, cast diff --git a/samcli/lib/utils/architecture.py b/samcli/lib/utils/architecture.py index db0cc85721c..93b1bac82a9 100644 --- a/samcli/lib/utils/architecture.py +++ b/samcli/lib/utils/architecture.py @@ -1,6 +1,7 @@ """ Architecture tools """ + from typing import TYPE_CHECKING, Dict, List, cast from samcli.commands.exceptions import UserException diff --git a/samcli/lib/utils/arn_utils.py b/samcli/lib/utils/arn_utils.py index 2df2aef9eab..be9fa24cbc5 100644 --- a/samcli/lib/utils/arn_utils.py +++ b/samcli/lib/utils/arn_utils.py @@ -1,6 +1,7 @@ """ Module for utilities for ARN (Amazon Resource Names) """ + import re diff --git a/samcli/lib/utils/async_utils.py b/samcli/lib/utils/async_utils.py index 4652769d9eb..82062d84872 100644 --- a/samcli/lib/utils/async_utils.py +++ b/samcli/lib/utils/async_utils.py @@ -1,6 +1,7 @@ """ Contains asyncio related methods and helpers """ + import logging from asyncio import AbstractEventLoop, gather, new_event_loop from concurrent.futures.thread import ThreadPoolExecutor diff --git a/samcli/lib/utils/boto_utils.py b/samcli/lib/utils/boto_utils.py index eab922f7ddf..5cf91a331b4 100644 --- a/samcli/lib/utils/boto_utils.py +++ b/samcli/lib/utils/boto_utils.py @@ -1,6 +1,7 @@ """ This module contains utility functions for boto3 library """ + from typing import Any, Optional from boto3 import Session @@ -28,17 +29,16 @@ def get_boto_config_with_user_agent(**kwargs) -> Config: """ gc = GlobalConfig() return Config( - user_agent_extra=f"aws-sam-cli/{__version__}/{gc.installation_id}" - if gc.telemetry_enabled - else f"aws-sam-cli/{__version__}", + user_agent_extra=( + f"aws-sam-cli/{__version__}/{gc.installation_id}" if gc.telemetry_enabled else f"aws-sam-cli/{__version__}" + ), **kwargs, ) # Type definition of following boto providers, which is equal to Callable[[str], Any] class BotoProviderType(Protocol): - def __call__(self, service_name: str) -> Any: - ... # pragma: no cover + def __call__(self, service_name: str) -> Any: ... # pragma: no cover def get_boto_client_provider_from_session_with_config(session: Session, **kwargs) -> BotoProviderType: diff --git a/samcli/lib/utils/cloudformation.py b/samcli/lib/utils/cloudformation.py index 04f49eef699..def89c6a11b 100644 --- a/samcli/lib/utils/cloudformation.py +++ b/samcli/lib/utils/cloudformation.py @@ -1,6 +1,7 @@ """ This utility file contains methods to read information from certain CFN stack """ + import logging import posixpath from typing import Any, Dict, Iterable, Optional, Set diff --git a/samcli/lib/utils/code_trigger_factory.py b/samcli/lib/utils/code_trigger_factory.py index eb009d9aa54..9ff6b47b156 100644 --- a/samcli/lib/utils/code_trigger_factory.py +++ b/samcli/lib/utils/code_trigger_factory.py @@ -1,6 +1,7 @@ """ Factory for creating CodeResourceTriggers """ + import logging from pathlib import Path from typing import Any, Callable, Dict, List, Optional, cast diff --git a/samcli/lib/utils/defaults.py b/samcli/lib/utils/defaults.py index 4a07b113ac2..37478b2a7a5 100644 --- a/samcli/lib/utils/defaults.py +++ b/samcli/lib/utils/defaults.py @@ -1,6 +1,7 @@ """ Contains helpers for providing default values """ + from botocore.session import get_session diff --git a/samcli/lib/utils/definition_validator.py b/samcli/lib/utils/definition_validator.py index b267316de52..383fa80f1b1 100644 --- a/samcli/lib/utils/definition_validator.py +++ b/samcli/lib/utils/definition_validator.py @@ -1,4 +1,5 @@ """DefinitionValidator for Validating YAML and JSON Files""" + import logging from pathlib import Path from typing import Any, Dict, Optional diff --git a/samcli/lib/utils/file_observer.py b/samcli/lib/utils/file_observer.py index a3ce40b4406..230f47a7a6a 100644 --- a/samcli/lib/utils/file_observer.py +++ b/samcli/lib/utils/file_observer.py @@ -1,6 +1,7 @@ """ Wraps watchdog to observe file system for any change. """ + import logging import platform import threading diff --git a/samcli/lib/utils/hash.py b/samcli/lib/utils/hash.py index b40a2ecb193..3c00eada966 100644 --- a/samcli/lib/utils/hash.py +++ b/samcli/lib/utils/hash.py @@ -1,6 +1,7 @@ """ Hash calculation utilities for files and directories. """ + import hashlib import os import sys diff --git a/samcli/lib/utils/lock_distributor.py b/samcli/lib/utils/lock_distributor.py index 2d4ad8dec0a..141b2341b69 100644 --- a/samcli/lib/utils/lock_distributor.py +++ b/samcli/lib/utils/lock_distributor.py @@ -1,4 +1,5 @@ """LockDistributor for creating and managing a set of locks""" + import multiprocessing import multiprocessing.managers import threading diff --git a/samcli/lib/utils/managed_cloudformation_stack.py b/samcli/lib/utils/managed_cloudformation_stack.py index 83cee2e0a5b..19d1bc2c502 100644 --- a/samcli/lib/utils/managed_cloudformation_stack.py +++ b/samcli/lib/utils/managed_cloudformation_stack.py @@ -1,6 +1,7 @@ """ Bootstrap's user's development environment by creating cloud resources required by SAM CLI """ + import logging from collections.abc import Collection from typing import Dict, List, Optional, Union, cast diff --git a/samcli/lib/utils/osutils.py b/samcli/lib/utils/osutils.py index a9a12bf88cf..27430bfc629 100644 --- a/samcli/lib/utils/osutils.py +++ b/samcli/lib/utils/osutils.py @@ -1,6 +1,7 @@ """ Common OS utilities """ + import io import logging import os diff --git a/samcli/lib/utils/path_observer.py b/samcli/lib/utils/path_observer.py index c61cc07cf8a..d22546d4d22 100644 --- a/samcli/lib/utils/path_observer.py +++ b/samcli/lib/utils/path_observer.py @@ -1,6 +1,7 @@ """ HandlerObserver and its helper classes. """ + import logging import re from dataclasses import dataclass diff --git a/samcli/lib/utils/path_utils.py b/samcli/lib/utils/path_utils.py index 694cd93e504..b47c6217699 100644 --- a/samcli/lib/utils/path_utils.py +++ b/samcli/lib/utils/path_utils.py @@ -1,6 +1,7 @@ """ Common Path related utilities """ + from pathlib import PureWindowsPath diff --git a/samcli/lib/utils/preview_runtimes.py b/samcli/lib/utils/preview_runtimes.py index a81f308e1d1..27fcd0eadf2 100644 --- a/samcli/lib/utils/preview_runtimes.py +++ b/samcli/lib/utils/preview_runtimes.py @@ -2,6 +2,7 @@ Keeps list of preview runtimes, which can be used with sam build or sam local commands. But deployment of them would probably fail until their GA date """ + from typing import Set PREVIEW_RUNTIMES: Set[str] = {"dotnet8"} diff --git a/samcli/lib/utils/profile.py b/samcli/lib/utils/profile.py index ab6edc55265..94c9fd6c2d5 100644 --- a/samcli/lib/utils/profile.py +++ b/samcli/lib/utils/profile.py @@ -1,6 +1,7 @@ """ Module for aws profile related helpers """ + from typing import List from botocore.session import Session diff --git a/samcli/lib/utils/resource_trigger.py b/samcli/lib/utils/resource_trigger.py index 024a3b3caf7..9f35aec33b7 100644 --- a/samcli/lib/utils/resource_trigger.py +++ b/samcli/lib/utils/resource_trigger.py @@ -1,4 +1,5 @@ """ResourceTrigger Classes for Creating PathHandlers According to a Resource""" + import platform import re from abc import ABC, abstractmethod diff --git a/samcli/lib/utils/resource_type_based_factory.py b/samcli/lib/utils/resource_type_based_factory.py index 67a46f08af3..01d8b9659c8 100644 --- a/samcli/lib/utils/resource_type_based_factory.py +++ b/samcli/lib/utils/resource_type_based_factory.py @@ -1,4 +1,5 @@ """Base Factory Abstract Class for Creating Objects Specific to a Resource Type""" + import logging from abc import ABC, abstractmethod from typing import Callable, Dict, Generic, List, Optional, TypeVar diff --git a/samcli/lib/utils/retry.py b/samcli/lib/utils/retry.py index 2b8042d4472..bfe8ccd4c26 100644 --- a/samcli/lib/utils/retry.py +++ b/samcli/lib/utils/retry.py @@ -1,6 +1,7 @@ """ Retry decorator to retry decorated function based on Exception with exponential backoff and number of attempts built-in. """ + import math import time from functools import wraps diff --git a/samcli/lib/utils/s3.py b/samcli/lib/utils/s3.py index e841fb236c4..7be4c4ab0cb 100644 --- a/samcli/lib/utils/s3.py +++ b/samcli/lib/utils/s3.py @@ -1,4 +1,5 @@ """Contains utility functions related to AWS S3 service""" + from typing import Any, Dict, Optional from urllib.parse import parse_qs, urlparse diff --git a/samcli/lib/utils/sam_logging.py b/samcli/lib/utils/sam_logging.py index 8ed2617ad99..bc02de61ef2 100644 --- a/samcli/lib/utils/sam_logging.py +++ b/samcli/lib/utils/sam_logging.py @@ -1,6 +1,7 @@ """ Configures a logger """ + import logging import os import sys diff --git a/samcli/lib/utils/stream_writer.py b/samcli/lib/utils/stream_writer.py index 78bae0d8ffc..28c88d23da2 100644 --- a/samcli/lib/utils/stream_writer.py +++ b/samcli/lib/utils/stream_writer.py @@ -1,11 +1,13 @@ """ This class acts like a wrapper around output streams to provide any flexibility with output we need """ -from typing import TextIO + +from io import BytesIO, TextIOWrapper +from typing import Optional, TextIO, Union class StreamWriter: - def __init__(self, stream: TextIO, auto_flush: bool = False): + def __init__(self, stream: TextIO, stream_bytes: Optional[Union[TextIO, BytesIO]] = None, auto_flush: bool = False): """ Instatiates new StreamWriter to the specified stream @@ -13,16 +15,40 @@ def __init__(self, stream: TextIO, auto_flush: bool = False): ---------- stream io.RawIOBase Stream to wrap + stream_bytes io.TextIO | io.BytesIO + Stream to wrap if bytes are being written auto_flush bool Whether to autoflush the stream upon writing """ self._stream = stream + self._stream_bytes = stream if isinstance(stream, TextIOWrapper) else stream_bytes self._auto_flush = auto_flush @property def stream(self) -> TextIO: return self._stream + def write_bytes(self, output: bytes): + """ + Writes specified text to the underlying stream + Parameters + ---------- + output bytes-like object + Bytes to write into buffer + """ + # all these ifs are to satisfy the linting/type checking + if not self._stream_bytes: + return + if isinstance(self._stream_bytes, TextIOWrapper): + self._stream_bytes.buffer.write(output) + if self._auto_flush: + self._stream_bytes.flush() + + elif isinstance(self._stream_bytes, BytesIO): + self._stream_bytes.write(output) + if self._auto_flush: + self._stream_bytes.flush() + def write_str(self, output: str): """ Writes specified text to the underlying stream @@ -39,3 +65,5 @@ def write_str(self, output: str): def flush(self): self._stream.flush() + if self._stream_bytes: + self._stream_bytes.flush() diff --git a/samcli/lib/utils/subprocess_utils.py b/samcli/lib/utils/subprocess_utils.py index 4539df19b61..284ea04d813 100644 --- a/samcli/lib/utils/subprocess_utils.py +++ b/samcli/lib/utils/subprocess_utils.py @@ -1,6 +1,7 @@ """ Utils for invoking subprocess calls """ + import logging import os import platform diff --git a/samcli/lib/utils/version_checker.py b/samcli/lib/utils/version_checker.py index 6c0f64278ed..44250446b99 100644 --- a/samcli/lib/utils/version_checker.py +++ b/samcli/lib/utils/version_checker.py @@ -1,6 +1,7 @@ """ Contains information about newer version checker for SAM CLI """ + import logging from datetime import datetime, timedelta from functools import wraps diff --git a/samcli/lib/warnings/sam_cli_warning.py b/samcli/lib/warnings/sam_cli_warning.py index 506529e7744..6e5aaf46fab 100644 --- a/samcli/lib/warnings/sam_cli_warning.py +++ b/samcli/lib/warnings/sam_cli_warning.py @@ -1,6 +1,7 @@ """ Provides all Warnings checkers for sam template """ + import logging from typing import Dict diff --git a/samcli/local/apigw/authorizers/authorizer.py b/samcli/local/apigw/authorizers/authorizer.py index 17101b06d24..b25452db0d7 100644 --- a/samcli/local/apigw/authorizers/authorizer.py +++ b/samcli/local/apigw/authorizers/authorizer.py @@ -1,6 +1,7 @@ """ Base Authorizer class definition """ + from dataclasses import dataclass diff --git a/samcli/local/apigw/authorizers/lambda_authorizer.py b/samcli/local/apigw/authorizers/lambda_authorizer.py index ed3483eee5f..eb4860b9754 100644 --- a/samcli/local/apigw/authorizers/lambda_authorizer.py +++ b/samcli/local/apigw/authorizers/lambda_authorizer.py @@ -1,11 +1,12 @@ """ Custom Lambda Authorizer class definition """ + import re from abc import ABC, abstractmethod from dataclasses import dataclass from json import JSONDecodeError, loads -from typing import Any, Dict, List, Optional, Tuple, Type, cast +from typing import Any, Dict, List, Optional, Tuple, Type, Union, cast from urllib.parse import parse_qsl from samcli.commands.local.lib.validators.identity_source_validator import IdentitySourceValidator @@ -321,13 +322,13 @@ def _parse_identity_sources(self, identity_sources: List[str]) -> None: break - def is_valid_response(self, response: str, method_arn: str) -> bool: + def is_valid_response(self, response: Union[str, bytes], method_arn: str) -> bool: """ Validates whether a Lambda authorizer request is authenticated or not. Parameters ---------- - response: str + response: Union[str, bytes] JSON string containing the output from a Lambda authorizer method_arn: str The method ARN of the route that invoked the Lambda authorizer @@ -418,13 +419,13 @@ def _validate_simple_response(self, response: dict) -> bool: return cast(bool, is_authorized) - def get_context(self, response: str) -> Dict[str, Any]: + def get_context(self, response: Union[str, bytes]) -> Dict[str, Any]: """ Returns the context (if set) from the authorizer response and appends the principalId to it. Parameters ---------- - response: str + response: Union[str, bytes] Output from Lambda authorizer Returns diff --git a/samcli/local/apigw/event_constructor.py b/samcli/local/apigw/event_constructor.py index 441d94d20e7..b9e07ecb8d1 100644 --- a/samcli/local/apigw/event_constructor.py +++ b/samcli/local/apigw/event_constructor.py @@ -9,6 +9,7 @@ from typing import Any, Dict from samcli.local.apigw.path_converter import PathConverter +from samcli.local.apigw.route import Route from samcli.local.events.api_event import ( ApiGatewayLambdaEvent, ApiGatewayV2LambdaEvent, @@ -22,16 +23,18 @@ def construct_v1_event( - flask_request, port, binary_types, stage_name=None, stage_variables=None, operation_name=None + flask_request, port, binary_types, stage_name=None, stage_variables=None, operation_name=None, api_type=Route.API ) -> Dict[str, Any]: """ - Helper method that constructs the Event to be passed to Lambda + Helper method that constructs the Event to be passed to Lambda. + Used for Http apis with payload v1 and Rest apis because the payloads are almost identical :param request flask_request: Flask Request :param port: the port number :param binary_types: list of binary types :param stage_name: Optional, the stage name string :param stage_variables: Optional, API Gateway Stage Variables + :param api_type: Optional, the type of api payload being constructed :return: JSON object """ @@ -86,6 +89,7 @@ def construct_v1_event( path=flask_request.path, is_base_64_encoded=is_base_64, stage_variables=stage_variables, + api_type=api_type, ) event_dict = event.to_dict() diff --git a/samcli/local/apigw/exceptions.py b/samcli/local/apigw/exceptions.py index 474e51560bb..565284186e3 100644 --- a/samcli/local/apigw/exceptions.py +++ b/samcli/local/apigw/exceptions.py @@ -1,6 +1,7 @@ """ Exceptions used by API Gateway service """ + from samcli.commands.exceptions import UserException diff --git a/samcli/local/apigw/local_apigw_service.py b/samcli/local/apigw/local_apigw_service.py index 3a3c834ec0c..1e0f871fcda 100644 --- a/samcli/local/apigw/local_apigw_service.py +++ b/samcli/local/apigw/local_apigw_service.py @@ -6,7 +6,7 @@ from datetime import datetime from io import StringIO from time import time -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Tuple, Union from flask import Flask, Request, request from werkzeug.datastructures import Headers @@ -66,6 +66,7 @@ def __init__( port: Optional[int] = None, host: Optional[str] = None, stderr: Optional[StreamWriter] = None, + ssl_context: Optional[Tuple[str, str]] = None, ): """ Creates an ApiGatewayService @@ -84,10 +85,13 @@ def __init__( host : str Optional. host to start the service on Defaults to '127.0.0.1 + ssl_context : (str, str) + Optional. tuple(str, str) indicating the cert and key files to use to start in https mode + Defaults to None stderr : samcli.lib.utils.stream_writer.StreamWriter Optional stream writer where the stderr from Docker container should be written to """ - super().__init__(lambda_runner.is_debugging(), port=port, host=host) + super().__init__(lambda_runner.is_debugging(), port=port, host=host, ssl_context=ssl_context) self.api = api self.lambda_runner = lambda_runner self.static_dir = static_dir @@ -473,6 +477,7 @@ def _generate_lambda_event(self, flask_request: Request, route: Route, method: s stage_name=self.api.stage_name, stage_variables=self.api.stage_variables, operation_name=route_key, + api_type=route.event_type, ) def _build_v1_context(self, route: Route) -> Dict[str, Any]: @@ -589,7 +594,7 @@ def _valid_identity_sources(self, request: Request, route: Route) -> bool: return True - def _invoke_lambda_function(self, lambda_function_name: str, event: dict) -> str: + def _invoke_lambda_function(self, lambda_function_name: str, event: dict) -> Union[str, bytes]: """ Helper method to invoke a function and setup stdout+stderr @@ -602,8 +607,8 @@ def _invoke_lambda_function(self, lambda_function_name: str, event: dict) -> str Returns ------- - str - A string containing the output from the Lambda function + Union[str, bytes] + A string or bytes containing the output from the Lambda function """ with StringIO() as stdout: event_str = json.dumps(event, sort_keys=True) diff --git a/samcli/local/apigw/route.py b/samcli/local/apigw/route.py index 20858265d68..51a64c34f35 100644 --- a/samcli/local/apigw/route.py +++ b/samcli/local/apigw/route.py @@ -1,6 +1,7 @@ """ Route definition for local start-api """ + from typing import List, Optional from samcli.local.apigw.authorizers.authorizer import Authorizer diff --git a/samcli/local/docker/container.py b/samcli/local/docker/container.py index 7450f25d447..508ef5e1eed 100644 --- a/samcli/local/docker/container.py +++ b/samcli/local/docker/container.py @@ -1,6 +1,7 @@ """ Representation of a generic Docker container """ + import io import json import logging @@ -31,6 +32,11 @@ CONTAINER_CONNECTION_TIMEOUT = float(os.environ.get("SAM_CLI_CONTAINER_CONNECTION_TIMEOUT", 20)) DEFAULT_CONTAINER_HOST_INTERFACE = "127.0.0.1" +# Keep a lock instance to access the locks for individual containers (see dict below) +CONCURRENT_CALL_MANAGER_LOCK = threading.Lock() +# Keeps locks per container (aka per function) so that one function can be invoked one at a time +CONCURRENT_CALL_MANAGER: Dict[str, threading.Lock] = {} + class ContainerResponseException(Exception): """ @@ -79,6 +85,7 @@ def __init__( container_host_interface=DEFAULT_CONTAINER_HOST_INTERFACE, mount_with_write: bool = False, host_tmp_dir: Optional[str] = None, + extra_hosts: Optional[dict] = None, ): """ Initializes the class with given configuration. This does not automatically create or run the container. @@ -100,6 +107,7 @@ def __init__( :param bool mount_with_write: Optional. Mount source code directory with write permissions when building on container :param string host_tmp_dir: Optional. Temporary directory on the host when mounting with write permissions. + :param dict extra_hosts: Optional. Dict of hostname to IP resolutions """ self._image = image @@ -114,13 +122,14 @@ def __init__( self._container_opts = container_opts self._additional_volumes = additional_volumes self._logs_thread = None + self._extra_hosts = extra_hosts self._logs_thread_event = None # Use the given Docker client or create new one self.docker_client = docker_client or docker.from_env(version=DOCKER_MIN_API_VERSION) # Runtime properties of the container. They won't have value until container is created or started - self.id = None + self.id: Optional[str] = None # aws-lambda-rie defaults to 8080 as the port, however that's a common port. A port is chosen by # selecting the first free port in a range that's not ephemeral. @@ -215,6 +224,9 @@ def create(self): # Ex: 128m => 128MB kwargs["mem_limit"] = "{}m".format(self._memory_limit_mb) + if self._extra_hosts: + kwargs["extra_hosts"] = self._extra_hosts + real_container = self.docker_client.containers.create(self._image, **kwargs) self.id = real_container.id @@ -245,7 +257,11 @@ def _create_mapped_symlink_files(self) -> Dict[str, Dict[str, str]]: on the container """ mount_mode = "ro,delegated" - additional_volumes = {} + additional_volumes: Dict[str, Dict[str, str]] = {} + + if not pathlib.Path(self._host_dir).exists(): + LOG.debug("Host directory not found, skip resolving symlinks") + return additional_volumes with os.scandir(self._host_dir) as directory_iterator: for file in directory_iterator: @@ -363,21 +379,35 @@ def start(self, input_data=None): raise ex @retry(exc=requests.exceptions.RequestException, exc_raise=ContainerResponseException) - def wait_for_http_response(self, name, event, stdout) -> Union[str, bytes]: + def wait_for_http_response(self, name, event, stdout) -> Tuple[Union[str, bytes], bool]: # TODO(sriram-mv): `aws-lambda-rie` is in a mode where the function_name is always "function" # NOTE(sriram-mv): There is a connection timeout set on the http call to `aws-lambda-rie`, however there is not # a read time out for the response received from the server. - resp = requests.post( - self.URL.format(host=self._container_host, port=self.rapid_port_host, function_name="function"), - data=event.encode("utf-8"), - timeout=(self.RAPID_CONNECTION_TIMEOUT, None), - ) + # generate a lock key with host-port combination which is unique per function + lock_key = f"{self._container_host}-{self.rapid_port_host}" + LOG.debug("Getting lock for the key %s", lock_key) + with CONCURRENT_CALL_MANAGER_LOCK: + lock = CONCURRENT_CALL_MANAGER.get(lock_key) + if not lock: + lock = threading.Lock() + CONCURRENT_CALL_MANAGER[lock_key] = lock + LOG.debug("Waiting to retrieve the lock (%s) to start invocation", lock_key) + with lock: + resp = requests.post( + self.URL.format(host=self._container_host, port=self.rapid_port_host, function_name="function"), + data=event.encode("utf-8"), + timeout=(self.RAPID_CONNECTION_TIMEOUT, None), + ) + try: - return json.dumps(json.loads(resp.content), ensure_ascii=False) + # if response is an image then json.loads/dumps will throw a UnicodeDecodeError so return raw content + if "image" in resp.headers["Content-Type"]: + return resp.content, True + return json.dumps(json.loads(resp.content), ensure_ascii=False), False except json.JSONDecodeError: LOG.debug("Failed to deserialize response from RIE, returning the raw response as is") - return resp.content + return resp.content, False def wait_for_result(self, full_path, event, stdout, stderr, start_timer=None): # NOTE(sriram-mv): Let logging happen in its own thread, so that a http request can be sent. @@ -400,13 +430,15 @@ def wait_for_result(self, full_path, event, stdout, stderr, start_timer=None): # start the timer for function timeout right before executing the function, as waiting for the socket # can take some time timer = start_timer() if start_timer else None - response = self.wait_for_http_response(full_path, event, stdout) + response, is_image = self.wait_for_http_response(full_path, event, stdout) if timer: timer.cancel() self._logs_thread_event.wait(timeout=1) if isinstance(response, str): stdout.write_str(response) + elif isinstance(response, bytes) and is_image: + stdout.write_bytes(response) elif isinstance(response, bytes): stdout.write_str(response.decode("utf-8")) stdout.flush() diff --git a/samcli/local/docker/container_analyzer.py b/samcli/local/docker/container_analyzer.py new file mode 100644 index 00000000000..5e70a4c1fb5 --- /dev/null +++ b/samcli/local/docker/container_analyzer.py @@ -0,0 +1,49 @@ +""" +Class for handling the analysis and inspection of Docker containers +""" + +import logging +from dataclasses import dataclass + +from samcli.local.docker.container import Container +from samcli.local.docker.manager import ContainerManager + +LOG = logging.getLogger(__name__) + +DEFAULT_OUT_OF_MEMORY = False + + +@dataclass +class ContainerState: + out_of_memory: bool + + +class ContainerAnalyzer: + def __init__(self, container_manager: ContainerManager, container: Container): + self.container_manager = container_manager + self.container = container + + def inspect(self) -> ContainerState: + """ + Inspect the state of a container by calling the "inspect()" API that Docker provides. + Extract relevant information into a ContainerState object. + + Returns + ------- + ContainerState: + Returns a ContainerState object with relevant container data + """ + if not self.container.id: + LOG.debug("Container ID not defined, unable to fetch container state") + return ContainerState(DEFAULT_OUT_OF_MEMORY) + + state = self.container_manager.inspect(self.container.id) + + if isinstance(state, bool): + LOG.debug("Unable to fetch container state") + return ContainerState(DEFAULT_OUT_OF_MEMORY) + + container_state = ContainerState(state.get("State", {}).get("OOMKilled", DEFAULT_OUT_OF_MEMORY)) + LOG.debug("[Container state] OOMKilled %s", container_state.out_of_memory) + + return container_state diff --git a/samcli/local/docker/effective_user.py b/samcli/local/docker/effective_user.py index b6ed8ec9b3a..0ce23120dcc 100644 --- a/samcli/local/docker/effective_user.py +++ b/samcli/local/docker/effective_user.py @@ -1,6 +1,7 @@ """ Representation of an effective user """ + import os from dataclasses import dataclass from typing import Optional diff --git a/samcli/local/docker/exceptions.py b/samcli/local/docker/exceptions.py index 5aee68e9ccd..cc006980838 100644 --- a/samcli/local/docker/exceptions.py +++ b/samcli/local/docker/exceptions.py @@ -2,6 +2,8 @@ Docker container related exceptions """ +from samcli.commands.exceptions import UserException + class ContainerNotStartableException(Exception): pass @@ -17,3 +19,9 @@ class PortAlreadyInUse(Exception): """ Exception to raise when the provided port is not available for use. """ + + +class ContainerFailureError(UserException): + """ + Raised when the invoke container fails execution + """ diff --git a/samcli/local/docker/lambda_container.py b/samcli/local/docker/lambda_container.py index c9a3dfd2b37..3eea56c72d4 100644 --- a/samcli/local/docker/lambda_container.py +++ b/samcli/local/docker/lambda_container.py @@ -1,6 +1,7 @@ """ Represents Lambda runtime containers. """ + import logging import os from typing import List @@ -51,6 +52,7 @@ def __init__( debug_options=None, container_host=None, container_host_interface=DEFAULT_CONTAINER_HOST_INTERFACE, + extra_hosts=None, function_full_path=None, ): """ @@ -87,6 +89,8 @@ def __init__( Optional. Host of locally emulated Lambda container container_host_interface Optional. Interface that Docker host binds ports to + extra_hosts + Optional. Dict of hostname to IP resolutions function_full_path str Optional. The function full path, unique in all stacks """ @@ -138,6 +142,7 @@ def __init__( additional_volumes=additional_volumes, container_host=container_host, container_host_interface=container_host_interface, + extra_hosts=extra_hosts, ) @staticmethod diff --git a/samcli/local/docker/lambda_image.py b/samcli/local/docker/lambda_image.py index ead6878ff5c..1fe7e2f2bef 100644 --- a/samcli/local/docker/lambda_image.py +++ b/samcli/local/docker/lambda_image.py @@ -1,6 +1,7 @@ """ Generates a Docker Image to be used for invoking a function locally """ + import hashlib import logging import os diff --git a/samcli/local/docker/manager.py b/samcli/local/docker/manager.py index 6975828cd1c..ceda43ce8ea 100644 --- a/samcli/local/docker/manager.py +++ b/samcli/local/docker/manager.py @@ -5,6 +5,7 @@ import logging import sys import threading +from typing import Union, cast import docker @@ -193,6 +194,26 @@ def has_image(self, image_name): except docker.errors.ImageNotFound: return False + def inspect(self, container: str) -> Union[bool, dict]: + """ + Low-level Docker API for inspecting the container state + + Parameters + ---------- + container: str + ID of the container + + Returns + ------- + Union[bool, dict] + Container inspection state if successful, False otherwise + """ + try: + return cast(dict, self.docker_client.api.inspect_container(container)) + except (docker.errors.APIError, docker.errors.NullResource) as ex: + LOG.debug("Failed to call Docker inspect: %s", str(ex)) + return False + class DockerImagePullFailedException(Exception): pass diff --git a/samcli/local/events/api_event.py b/samcli/local/events/api_event.py index 1b82c7caea1..5a172d6cf81 100644 --- a/samcli/local/events/api_event.py +++ b/samcli/local/events/api_event.py @@ -1,9 +1,12 @@ """Holds Classes for API Gateway to Lambda Events""" + import uuid from datetime import datetime from time import time from typing import Any, Dict +from samcli.local.apigw.route import Route + class ContextIdentity: def __init__( @@ -169,6 +172,7 @@ def __init__( stage_variables=None, path=None, is_base_64_encoded=False, + api_type=Route.API, ): """ Constructs an ApiGatewayLambdaEvent @@ -185,6 +189,7 @@ def __init__( :param dict stage_variables: API Gateway Stage Variables :param str path: Path of the request :param bool is_base_64_encoded: True if the data is base64 encoded. + :param str api_type: The type of API the event is being generated for """ if not isinstance(query_string_params, dict) and query_string_params is not None: @@ -205,7 +210,6 @@ def __init__( if not isinstance(stage_variables, dict) and stage_variables is not None: raise TypeError("'stage_variables' must be of type dict or None") - self.version = "1.0" self.http_method = http_method self.body = body self.resource = resource @@ -218,6 +222,7 @@ def __init__( self.stage_variables = stage_variables self.path = path self.is_base_64_encoded = is_base_64_encoded + self.api_type = api_type def to_dict(self) -> Dict[str, Any]: """ @@ -233,15 +238,14 @@ def to_dict(self) -> Dict[str, Any]: request_context_dict = self.request_context.to_dict() json_dict = { - "version": self.version, "httpMethod": self.http_method, "body": self.body if self.body else None, "resource": self.resource, "requestContext": request_context_dict, "queryStringParameters": dict(self.query_string_params) if self.query_string_params else None, - "multiValueQueryStringParameters": dict(self.multi_value_query_string_params) - if self.multi_value_query_string_params - else None, + "multiValueQueryStringParameters": ( + dict(self.multi_value_query_string_params) if self.multi_value_query_string_params else None + ), "headers": dict(self.headers) if self.headers else None, "multiValueHeaders": dict(self.multi_value_headers) if self.multi_value_headers else None, "pathParameters": dict(self.path_parameters) if self.path_parameters else None, @@ -250,6 +254,10 @@ def to_dict(self) -> Dict[str, Any]: "isBase64Encoded": self.is_base_64_encoded, } + # v1 payloads and rest api payloads are identical save for the version field + if self.api_type == Route.HTTP: + json_dict["version"] = "1.0" + return json_dict diff --git a/samcli/local/lambda_service/local_lambda_invoke_service.py b/samcli/local/lambda_service/local_lambda_invoke_service.py index 546066449cb..a847802b3c4 100644 --- a/samcli/local/lambda_service/local_lambda_invoke_service.py +++ b/samcli/local/lambda_service/local_lambda_invoke_service.py @@ -30,7 +30,7 @@ def to_url(self, value): class LocalLambdaInvokeService(BaseLocalService): - def __init__(self, lambda_runner, port, host, stderr=None): + def __init__(self, lambda_runner, port, host, stderr=None, ssl_context=None): """ Creates a Local Lambda Service that will only response to invoking a function @@ -42,10 +42,13 @@ def __init__(self, lambda_runner, port, host, stderr=None): Optional. port for the service to start listening on host str Optional. host to start the service on + ssl_context : (str, str) + Optional. tuple(str, str) indicating the cert and key files to use to start in https mode + Defaults to None stderr io.BaseIO Optional stream where the stderr from Docker container should be written to """ - super().__init__(lambda_runner.is_debugging(), port=port, host=host) + super().__init__(lambda_runner.is_debugging(), port=port, host=host, ssl_context=ssl_context) self.lambda_runner = lambda_runner self.stderr = stderr @@ -162,8 +165,9 @@ def _invoke_request_handler(self, function_name): request_data = request_data.decode("utf-8") - stdout_stream = io.StringIO() - stdout_stream_writer = StreamWriter(stdout_stream, auto_flush=True) + stdout_stream_string = io.StringIO() + stdout_stream_bytes = io.BytesIO() + stdout_stream_writer = StreamWriter(stdout_stream_string, stdout_stream_bytes, auto_flush=True) try: self.lambda_runner.invoke(function_name, request_data, stdout=stdout_stream_writer, stderr=self.stderr) @@ -175,7 +179,9 @@ def _invoke_request_handler(self, function_name): "Inline code is not supported for sam local commands. Please write your code in a separate file." ) - lambda_response, is_lambda_user_error_response = LambdaOutputParser.get_lambda_output(stdout_stream) + lambda_response, is_lambda_user_error_response = LambdaOutputParser.get_lambda_output( + stdout_stream_string, stdout_stream_bytes + ) if is_lambda_user_error_response: return self.service_response( diff --git a/samcli/local/lambdafn/config.py b/samcli/local/lambdafn/config.py index 7a90c3651dc..ed9ada46e92 100644 --- a/samcli/local/lambdafn/config.py +++ b/samcli/local/lambdafn/config.py @@ -1,6 +1,7 @@ """ Lambda Function configuration data required by the runtime """ + from samcli.commands.local.cli_common.user_exceptions import InvalidSamTemplateException from .env_vars import EnvironmentVariables diff --git a/samcli/local/lambdafn/runtime.py b/samcli/local/lambdafn/runtime.py index 0272604656c..5cc276becf5 100644 --- a/samcli/local/lambdafn/runtime.py +++ b/samcli/local/lambdafn/runtime.py @@ -1,6 +1,7 @@ """ Classes representing a local Lambda runtime """ + import copy import logging import os @@ -13,6 +14,9 @@ from samcli.lib.telemetry.metric import capture_parameter from samcli.lib.utils.file_observer import LambdaFunctionObserver from samcli.lib.utils.packagetype import ZIP +from samcli.local.docker.container import Container +from samcli.local.docker.container_analyzer import ContainerAnalyzer +from samcli.local.docker.exceptions import ContainerFailureError from samcli.local.docker.lambda_container import LambdaContainer from ...lib.providers.provider import LayerVersion @@ -46,7 +50,9 @@ def __init__(self, container_manager, image_builder): self._image_builder = image_builder self._temp_uncompressed_paths_to_be_cleaned = [] - def create(self, function_config, debug_context=None, container_host=None, container_host_interface=None): + def create( + self, function_config, debug_context=None, container_host=None, container_host_interface=None, extra_hosts=None + ): """ Create a new Container for the passed function, then store it in a dictionary using the function name, so it can be retrieved later and used in the other functions. Make sure to use the debug_context only @@ -97,6 +103,7 @@ def create(self, function_config, debug_context=None, container_host=None, conta debug_options=debug_context, container_host=container_host, container_host_interface=container_host_interface, + extra_hosts=extra_hosts, function_full_path=function_config.full_path, ) try: @@ -159,6 +166,7 @@ def invoke( stderr: Optional[StreamWriter] = None, container_host=None, container_host_interface=None, + extra_hosts=None, ): """ Invoke the given Lambda function locally. @@ -181,12 +189,16 @@ def invoke( Host of locally emulated Lambda container :param string container_host_interface: Optional. Interface that Docker host binds ports to + :param dict extra_hosts: Optional. + Dict of hostname to IP resolutions :raises Keyboard """ container = None try: # Start the container. This call returns immediately after the container starts - container = self.create(function_config, debug_context, container_host, container_host_interface) + container = self.create( + function_config, debug_context, container_host, container_host_interface, extra_hosts + ) container = self.run(container, function_config, debug_context) # Setup appropriate interrupt - timeout or Ctrl+C - before function starts executing and # get callback function to start timeout timer @@ -223,9 +235,30 @@ def _on_invoke_done(self, container): The current running container """ if container: + self._check_exit_state(container) self._container_manager.stop(container) self._clean_decompressed_paths() + def _check_exit_state(self, container: Container): + """ + Check and validate the exit state of the invoke container. + + Parameters + ---------- + container: Container + Docker container to be checked + + Raises + ------- + ContainerFailureError + If the exit reason is due to out-of-memory, return exit code 1 + + """ + container_analyzer = ContainerAnalyzer(self._container_manager, container) + exit_state = container_analyzer.inspect() + if exit_state.out_of_memory: + raise ContainerFailureError("Container invocation failed due to maximum memory usage") + def _configure_interrupt(self, function_full_path, timeout, container, is_debugging): """ When a Lambda function is executing, we setup certain interrupt handlers to stop the execution. @@ -351,7 +384,9 @@ def __init__(self, container_manager, image_builder, observer=None): super().__init__(container_manager, image_builder) - def create(self, function_config, debug_context=None, container_host=None, container_host_interface=None): + def create( + self, function_config, debug_context=None, container_host=None, container_host_interface=None, extra_hosts=None + ): """ Create a new Container for the passed function, then store it in a dictionary using the function name, so it can be retrieved later and used in the other functions. Make sure to use the debug_context only @@ -405,7 +440,9 @@ def create(self, function_config, debug_context=None, container_host=None, conta self._observer.watch(function_config) self._observer.start() - container = super().create(function_config, debug_context, container_host, container_host_interface) + container = super().create( + function_config, debug_context, container_host, container_host_interface, extra_hosts + ) self._function_configs[function_config.full_path] = function_config self._containers[function_config.full_path] = container diff --git a/samcli/local/services/base_local_service.py b/samcli/local/services/base_local_service.py index 671d48888c8..638d55c17b4 100644 --- a/samcli/local/services/base_local_service.py +++ b/samcli/local/services/base_local_service.py @@ -1,8 +1,9 @@ """Base class for all Services that interact with Local Lambda""" + import io import json import logging -from typing import Tuple +from typing import Optional, Tuple, Union from flask import Response @@ -10,7 +11,7 @@ class BaseLocalService: - def __init__(self, is_debugging, port, host): + def __init__(self, is_debugging, port, host, ssl_context): """ Creates a BaseLocalService class @@ -22,10 +23,13 @@ def __init__(self, is_debugging, port, host): Optional. port for the service to start listening on Defaults to 3000 host str Optional. host to start the service on Defaults to '127.0.0.1 + ssl_context tuple(str, str) + Optional. path to ssl certificate and key files to start service in https """ self.is_debugging = is_debugging self.port = port self.host = host + self.ssl_context = ssl_context self._app = None def create(self): @@ -62,7 +66,7 @@ def run(self): flask.cli.show_server_banner = lambda *args: None - self._app.run(threaded=multi_threaded, host=self.host, port=self.port) + self._app.run(threaded=multi_threaded, host=self.host, port=self.port, ssl_context=self.ssl_context) @staticmethod def service_response(body, headers, status_code): @@ -82,7 +86,9 @@ def service_response(body, headers, status_code): class LambdaOutputParser: @staticmethod - def get_lambda_output(stdout_stream: io.StringIO) -> Tuple[str, bool]: + def get_lambda_output( + stdout_stream_str: io.StringIO, stdout_stream_bytes: Optional[io.BytesIO] = None + ) -> Tuple[Union[str, bytes], bool]: """ This method will extract read the given stream and return the response from Lambda function separated out from any log statements it might have outputted. Logs end up in the stdout stream if the Lambda function @@ -90,9 +96,12 @@ def get_lambda_output(stdout_stream: io.StringIO) -> Tuple[str, bool]: Parameters ---------- - stdout_stream : io.BaseIO + stdout_stream_str : io.BaseIO Stream to fetch data from + stdout_stream_bytes : Optional[io.BytesIO], optional + Stream to fetch raw bytes data from + Returns ------- str @@ -100,7 +109,9 @@ def get_lambda_output(stdout_stream: io.StringIO) -> Tuple[str, bool]: bool If the response is an error/exception from the container """ - lambda_response = stdout_stream.getvalue() + lambda_response: Union[str, bytes] = stdout_stream_str.getvalue() + if stdout_stream_bytes and not lambda_response: + lambda_response = stdout_stream_bytes.getvalue() # When the Lambda Function returns an Error/Exception, the output is added to the stdout of the container. From # our perspective, the container returned some value, which is not always true. Since the output is the only diff --git a/samcli/runtime_config.json b/samcli/runtime_config.json index 9ceb81017c7..e80b128a36d 100644 --- a/samcli/runtime_config.json +++ b/samcli/runtime_config.json @@ -1,3 +1,3 @@ { - "app_template_repo_commit": "4f2d39629050c935934a5024955a2e384b8260c5" + "app_template_repo_commit": "8aa3d54040f6c970cf57bdc6292078e067c83a4e" } diff --git a/samcli/vendor/serverlessrepo/exceptions.py b/samcli/vendor/serverlessrepo/exceptions.py index ea73eae3438..06717c4428c 100644 --- a/samcli/vendor/serverlessrepo/exceptions.py +++ b/samcli/vendor/serverlessrepo/exceptions.py @@ -6,9 +6,10 @@ class ServerlessRepoError(Exception): MESSAGE = "" - def __init__(self, **kwargs): + def __init__(self, message=None, **kwargs): """Init the exception object.""" - Exception.__init__(self, self.MESSAGE.format(**kwargs)) + message = self.MESSAGE.format(**kwargs) if message is None else message + Exception.__init__(self, message) class InvalidApplicationMetadataError(ServerlessRepoError): @@ -41,6 +42,18 @@ class InvalidS3UriError(ServerlessRepoError): MESSAGE = "{message}" +class MissingSemanticVersionError(ServerlessRepoError): + """Raised when a required semantic version is not provided""" + + # If --fail-on-same-version is set, then a Semantic Version is required + + +class DuplicateSemanticVersionError(ServerlessRepoError): + """Raised when a publish is attempted with a Semantic Version that already exists""" + + # If --fail-on-same-version is set, then publish fails on duplicate semantic versions + + class ServerlessRepoClientError(ServerlessRepoError): """Wrapper for botocore ClientError.""" diff --git a/samcli/vendor/serverlessrepo/publish.py b/samcli/vendor/serverlessrepo/publish.py index ed19af9d285..603755bce70 100644 --- a/samcli/vendor/serverlessrepo/publish.py +++ b/samcli/vendor/serverlessrepo/publish.py @@ -1,6 +1,7 @@ """Module containing functions to publish or update application.""" import copy +import logging import re import boto3 @@ -9,25 +10,55 @@ from samcli.yamlhelper import yaml_dump from .application_metadata import ApplicationMetadata -from .exceptions import InvalidS3UriError, S3PermissionsRequired, ServerlessRepoClientError +from .exceptions import ( + DuplicateSemanticVersionError, + InvalidS3UriError, + MissingSemanticVersionError, + S3PermissionsRequired, + ServerlessRepoClientError, +) from .parser import get_app_metadata, parse_application_id, parse_template, strip_app_metadata +LOG = logging.getLogger(__name__) + CREATE_APPLICATION = "CREATE_APPLICATION" UPDATE_APPLICATION = "UPDATE_APPLICATION" CREATE_APPLICATION_VERSION = "CREATE_APPLICATION_VERSION" -def publish_application(template, sar_client=None): +def publish_application(template, sar_client=None, fail_on_same_version=False): """ Create a new application or new application version in SAR. - :param template: Content of a packaged YAML or JSON SAM template - :type template: str_or_dict - :param sar_client: The boto3 client used to access SAR - :type sar_client: boto3.client - :return: Dictionary containing application id, actions taken, and updated details - :rtype: dict - :raises ValueError + Parameters + ---------- + template: str | dict + Content of a packaged YAML or JSON SAM template + + sar_client: boto3.client + The boto3 client used to access SAR + + fail_on_same_version: bool + Whether or not publish hard fails when a duplicate semantic version is provided + + Returns + ------- + dict + Dictionary containing application id, actions taken, and updated details + + Raises + ------ + ValueError + If the template is null + + ClientError + If sar client operations fail + + MissingSemanticVersionError + If --fail-on-same-version is set in sam publish command but no semantic version is provided + + DuplicateSemanticVersionError + If --fail-on-same-version is set in sam publish command and the provided semantic version already exists """ if not template: raise ValueError("Require SAM template to publish the application") @@ -51,6 +82,31 @@ def publish_application(template, sar_client=None): # Update the application if it already exists error_message = e.response["Error"]["Message"] application_id = parse_application_id(error_message) + + if fail_on_same_version: + if not app_metadata.semantic_version: + raise MissingSemanticVersionError( + "--fail-on-same-version is set, but no semantic version is specified.\n" + "Please provide a semantic version in either the " + "template metadata or with the --semantic-version option." + ) + + semantic_version = app_metadata.semantic_version + + # Check if the given semantic version already exists + try: + application_exists = _check_app_with_semantic_version_exists( + sar_client, application_id, semantic_version + ) + except ClientError as e: + raise _wrap_client_error(e) + + if application_exists: + raise DuplicateSemanticVersionError( + f"Cannot publish version {semantic_version} for application " + f"{application_id} because it already exists" + ) + try: request = _update_application_request(app_metadata, application_id) sar_client.update_application(**request) @@ -68,6 +124,10 @@ def publish_application(template, sar_client=None): if not _is_conflict_exception(e): raise _wrap_client_error(e) + LOG.warning( + "WARNING: Publishing with semantic version that already exists. This may cause issues deploying." + ) + return { "application_id": application_id, "actions": actions, @@ -75,15 +135,63 @@ def publish_application(template, sar_client=None): } +def _check_app_with_semantic_version_exists(sar_client, application_id, semantic_version): + """ + Checks if a given SAR application exists with a given semantic version + + Parameters + ---------- + sar_client: boto3.client + The boto3 client used to access SAR + + application_id: str + Application Id to check + + semantic_version: str + The semantic version to check with Application Id + + Returns + ------- + bool + Whether or not the given Application exists with the given semantic version + + Raises + ------ + ClientError + If the sar client operations fail + + """ + + # SAR API does not have a direct method to check if an application exists + # with a given semantic version, but if it does not exist, a NotFoundException is thrown. + try: + sar_client.get_application(ApplicationId=application_id, SemanticVersion=semantic_version) + return True + except ClientError as error: + if error.response["Error"]["Code"] == "NotFoundException": + return False + else: + raise error + + def _get_template_dict(template): """ Parse string template and or copy dictionary template. - :param template: Content of a packaged YAML or JSON SAM template - :type template: str_or_dict - :return: Template as a dictionary - :rtype: dict - :raises ValueError + Parameters + ---------- + template: str | dict + Content of a packaged YAML or JSON SAM template + + Returns + ------- + dict + Template as a dictionary + + Raises + ------ + ValueError + If the supplied template is not a string or dictionary """ if isinstance(template, str): return parse_template(template) @@ -98,12 +206,18 @@ def _create_application_request(app_metadata, template): """ Construct the request body to create application. - :param app_metadata: Object containing app metadata - :type app_metadata: ApplicationMetadata - :param template: A packaged YAML or JSON SAM template - :type template: str - :return: SAR CreateApplication request body - :rtype: dict + Parameters + ---------- + app_metadata: ApplicationMetadata + Object containing app metadata + + template: str + A packaged YAML or JSON SAM template + + Returns + ------- + dict + SAR CreateApplication request body """ app_metadata.validate(["author", "description", "name"]) request = { @@ -129,12 +243,18 @@ def _update_application_request(app_metadata, application_id): """ Construct the request body to update application. - :param app_metadata: Object containing app metadata - :type app_metadata: ApplicationMetadata - :param application_id: The Amazon Resource Name (ARN) of the application - :type application_id: str - :return: SAR UpdateApplication request body - :rtype: dict + Parameters + ---------- + app_metadata: ApplicationMetadata + Object containing app metadata + + application_id: str + The Amazon Resource Name (ARN) of the application + + Returns + ------- + dict + SAR CreateApplication request body """ request = { "ApplicationId": application_id, @@ -152,14 +272,21 @@ def _create_application_version_request(app_metadata, application_id, template): """ Construct the request body to create application version. - :param app_metadata: Object containing app metadata - :type app_metadata: ApplicationMetadata - :param application_id: The Amazon Resource Name (ARN) of the application - :type application_id: str - :param template: A packaged YAML or JSON SAM template - :type template: str - :return: SAR CreateApplicationVersion request body - :rtype: dict + Parameters + ---------- + app_metadata: ApplicationMetadata + Object containing app metadata + + application_id: str + The Amazon Resource Name (ARN) of the application + + template: str + A packaged YAML or JSON SAM template + + Returns + ------- + dict + SAR CreateApplication request body """ app_metadata.validate(["semantic_version"]) request = { @@ -175,9 +302,15 @@ def _is_conflict_exception(e): """ Check whether the botocore ClientError is ConflictException. - :param e: botocore exception - :type e: ClientError - :return: True if e is ConflictException + Parameters + ---------- + e: ClientError + botocore exception + + Returns + ------- + bool + True if e is ConflictException, False otherwise """ error_code = e.response["Error"]["Code"] return error_code == "ConflictException" @@ -187,9 +320,15 @@ def _wrap_client_error(e): """ Wrap botocore ClientError exception into ServerlessRepoClientError. - :param e: botocore exception - :type e: ClientError - :return: S3PermissionsRequired or InvalidS3UriError or general ServerlessRepoClientError + Parameters + ---------- + e: ClientError + botocore exception + + Returns + ------- + ServerlessRepoError + S3PermissionsRequired or InvalidS3UriError or general ServerlessRepoClientError """ error_code = e.response["Error"]["Code"] message = e.response["Error"]["Message"] @@ -209,12 +348,18 @@ def _get_publish_details(actions, app_metadata_template): """ Get the changed application details after publishing. - :param actions: Actions taken during publishing - :type actions: list of str - :param app_metadata_template: Original template definitions of app metadata - :type app_metadata_template: dict - :return: Updated fields and values of the application - :rtype: dict + Parameters + ---------- + actions: str | list + Actions taken during publishing + + app_metadata_template: dict + Original template definitions of app metadata + + Returns + ------- + dict + Updated fields and values of the application """ if actions == [CREATE_APPLICATION]: return {k: v for k, v in app_metadata_template.items() if v} diff --git a/samcli/yamlhelper.py b/samcli/yamlhelper.py index 5dbae210e13..cb7cdbcf6f6 100644 --- a/samcli/yamlhelper.py +++ b/samcli/yamlhelper.py @@ -119,9 +119,9 @@ def yaml_parse(yamlstr) -> Dict: # json parser. return cast(Dict, json.loads(yamlstr, object_pairs_hook=OrderedDict)) except ValueError: - yaml.constructor.SafeConstructor.yaml_constructors[ - TIMESTAMP_TAG - ] = yaml.constructor.SafeConstructor.yaml_constructors[TAG_STR] + yaml.constructor.SafeConstructor.yaml_constructors[TIMESTAMP_TAG] = ( + yaml.constructor.SafeConstructor.yaml_constructors[TAG_STR] + ) yaml.SafeLoader.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, _dict_constructor) yaml.SafeLoader.add_multi_constructor("!", intrinsics_multi_constructor) return cast(Dict, yaml.safe_load(yamlstr)) diff --git a/schema/make_schema.py b/schema/make_schema.py index e1d7e889cf0..8e1a8e15687 100644 --- a/schema/make_schema.py +++ b/schema/make_schema.py @@ -1,6 +1,5 @@ """Handles JSON schema generation logic""" - import importlib import json from dataclasses import dataclass diff --git a/schema/samcli.json b/schema/samcli.json index e8c6da026e3..4fe0d3f4674 100644 --- a/schema/samcli.json +++ b/schema/samcli.json @@ -405,7 +405,7 @@ "properties": { "parameters": { "title": "Parameters for the local invoke command", - "description": "Available parameters for the local invoke command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* event:\nJSON file containing event data passed to the Lambda function during invoke. If this option is not specified, no event is assumed. Pass in the value '-' to input JSON via stdin\n* no_event:\nDEPRECATED: By default no event is assumed.\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", + "description": "Available parameters for the local invoke command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* event:\nJSON file containing event data passed to the Lambda function during invoke. If this option is not specified, no event is assumed. Pass in the value '-' to input JSON via stdin\n* no_event:\nDEPRECATED: By default no event is assumed.\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* add_host:\nPasses a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", "type": "object", "properties": { "terraform_plan_file": { @@ -523,6 +523,14 @@ "description": "IP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.", "default": "127.0.0.1" }, + "add_host": { + "title": "add_host", + "type": "array", + "description": "Passes a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1", + "items": { + "type": "string" + } + }, "invoke_image": { "title": "invoke_image", "type": "string", @@ -566,7 +574,7 @@ "properties": { "parameters": { "title": "Parameters for the local start api command", - "description": "Available parameters for the local start api command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* host:\nLocal hostname or IP address to bind to (default: '127.0.0.1')\n* port:\nLocal port number to listen on (default: '3000')\n* static_dir:\nAny static assets (e.g. CSS/Javascript/HTML) files located in this directory will be presented at /\n* disable_authorizer:\nDisable custom Lambda Authorizers from being parsed and invoked.\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* warm_containers:\nOptional. Specifies how AWS SAM CLI manages \ncontainers for each function.\nTwo modes are available:\nEAGER: Containers for all functions are \nloaded at startup and persist between \ninvocations.\nLAZY: Containers are only loaded when each \nfunction is first invoked. Those containers \npersist for additional invocations.\n* debug_function:\nOptional. Specifies the Lambda Function logicalId to apply debug options to when --warm-containers is specified. This parameter applies to --debug-port, --debugger-path, and --debug-args.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", + "description": "Available parameters for the local start api command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* host:\nLocal hostname or IP address to bind to (default: '127.0.0.1')\n* port:\nLocal port number to listen on (default: '3000')\n* static_dir:\nAny static assets (e.g. CSS/Javascript/HTML) files located in this directory will be presented at /\n* disable_authorizer:\nDisable custom Lambda Authorizers from being parsed and invoked.\n* ssl_cert_file:\nPath to SSL certificate file (default: None)\n* ssl_key_file:\nPath to SSL key file (default: None)\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* warm_containers:\nOptional. Specifies how AWS SAM CLI manages \ncontainers for each function.\nTwo modes are available:\nEAGER: Containers for all functions are \nloaded at startup and persist between \ninvocations.\nLAZY: Containers are only loaded when each \nfunction is first invoked. Those containers \npersist for additional invocations.\n* debug_function:\nOptional. Specifies the Lambda Function logicalId to apply debug options to when --warm-containers is specified. This parameter applies to --debug-port, --debugger-path, and --debug-args.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* add_host:\nPasses a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", "type": "object", "properties": { "terraform_plan_file": { @@ -607,6 +615,16 @@ "type": "boolean", "description": "Disable custom Lambda Authorizers from being parsed and invoked." }, + "ssl_cert_file": { + "title": "ssl_cert_file", + "type": "string", + "description": "Path to SSL certificate file (default: None)" + }, + "ssl_key_file": { + "title": "ssl_key_file", + "type": "string", + "description": "Path to SSL key file (default: None)" + }, "template_file": { "title": "template_file", "type": "string", @@ -710,6 +728,14 @@ "description": "IP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.", "default": "127.0.0.1" }, + "add_host": { + "title": "add_host", + "type": "array", + "description": "Passes a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1", + "items": { + "type": "string" + } + }, "invoke_image": { "title": "invoke_image", "type": "string", @@ -768,7 +794,7 @@ "properties": { "parameters": { "title": "Parameters for the local start lambda command", - "description": "Available parameters for the local start lambda command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* host:\nLocal hostname or IP address to bind to (default: '127.0.0.1')\n* port:\nLocal port number to listen on (default: '3001')\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* warm_containers:\nOptional. Specifies how AWS SAM CLI manages \ncontainers for each function.\nTwo modes are available:\nEAGER: Containers for all functions are \nloaded at startup and persist between \ninvocations.\nLAZY: Containers are only loaded when each \nfunction is first invoked. Those containers \npersist for additional invocations.\n* debug_function:\nOptional. Specifies the Lambda Function logicalId to apply debug options to when --warm-containers is specified. This parameter applies to --debug-port, --debugger-path, and --debug-args.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", + "description": "Available parameters for the local start lambda command:\n* terraform_plan_file:\nUsed for passing a custom plan file when executing the Terraform hook.\n* hook_name:\nHook package id to extend AWS SAM CLI commands functionality. \n\nExample: `terraform` to extend AWS SAM CLI commands functionality to support terraform applications. \n\nAvailable Hook Names: ['terraform']\n* skip_prepare_infra:\nSkip preparation stage when there are no infrastructure changes. Only used in conjunction with --hook-name.\n* host:\nLocal hostname or IP address to bind to (default: '127.0.0.1')\n* port:\nLocal port number to listen on (default: '3001')\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* env_vars:\nJSON file containing values for Lambda function's environment variables.\n* parameter_overrides:\nString that contains AWS CloudFormation parameter overrides encoded as key=value pairs.\n* debug_port:\nWhen specified, Lambda function container will start in debug mode and will expose this port on localhost.\n* debugger_path:\nHost path to a debugger that will be mounted into the Lambda container.\n* debug_args:\nAdditional arguments to be passed to the debugger.\n* container_env_vars:\nJSON file containing additional environment variables to be set within the container when used in a debugging session locally.\n* docker_volume_basedir:\nSpecify the location basedir where the SAM template exists. If Docker is running on a remote machine, Path of the SAM template must be mounted on the Docker machine and modified to match the remote machine.\n* log_file:\nFile to capture output logs.\n* layer_cache_basedir:\nSpecify the location basedir where the lambda layers used by the template will be downloaded to.\n* skip_pull_image:\nSkip pulling down the latest Docker image for Lambda runtime.\n* docker_network:\nName or ID of an existing docker network for AWS Lambda docker containers to connect to, along with the default bridge network. If not specified, the Lambda containers will only connect to the default bridge docker network.\n* force_image_build:\nForce rebuilding the image used for invoking functions with layers.\n* warm_containers:\nOptional. Specifies how AWS SAM CLI manages \ncontainers for each function.\nTwo modes are available:\nEAGER: Containers for all functions are \nloaded at startup and persist between \ninvocations.\nLAZY: Containers are only loaded when each \nfunction is first invoked. Those containers \npersist for additional invocations.\n* debug_function:\nOptional. Specifies the Lambda Function logicalId to apply debug options to when --warm-containers is specified. This parameter applies to --debug-port, --debugger-path, and --debug-args.\n* shutdown:\nEmulate a shutdown event after invoke completes, to test extension handling of shutdown behavior.\n* container_host:\nHost of locally emulated Lambda container. This option is useful when the container runs on a different host than AWS SAM CLI. For example, if one wants to run AWS SAM CLI in a Docker container on macOS, this option could specify `host.docker.internal`\n* container_host_interface:\nIP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.\n* add_host:\nPasses a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1\n* invoke_image:\nContainer image URIs for invoking functions or starting api and function. One can specify the image URI used for the local function invocation (--invoke-image public.ecr.aws/sam/build-nodejs14.x:latest). One can also specify for each individual function with (--invoke-image Function1=public.ecr.aws/sam/build-nodejs14.x:latest). If a function does not have invoke image specified, the default AWS SAM CLI emulation image will be used.\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* save_params:\nSave the parameters provided via the command line to the configuration file.", "type": "object", "properties": { "terraform_plan_file": { @@ -901,6 +927,14 @@ "description": "IP address of the host network interface that container ports should bind to. Use 0.0.0.0 to bind to all interfaces.", "default": "127.0.0.1" }, + "add_host": { + "title": "add_host", + "type": "array", + "description": "Passes a hostname to IP address mapping to the Docker container's host file. This parameter can be passed multiple times.Example:--add-host example.com:127.0.0.1", + "items": { + "type": "string" + } + }, "invoke_image": { "title": "invoke_image", "type": "string", @@ -1404,7 +1438,7 @@ "properties": { "parameters": { "title": "Parameters for the publish command", - "description": "Available parameters for the publish command:\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* semantic_version:\nOptional. The value provided here overrides SemanticVersion in the template metadata.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* save_params:\nSave the parameters provided via the command line to the configuration file.", + "description": "Available parameters for the publish command:\n* template_file:\nAWS SAM template which references built artifacts for resources in the template. (if applicable)\n* semantic_version:\nOptional. The value provided here overrides SemanticVersion in the template metadata.\n* fail_on_same_version:\nIf set, AWS SAM CLI will prevent a publish and return a non-zero exit code\nif the publish is attempted with a semantic version that already exists on the SAR application.\nDefault is False.\n* profile:\nSelect a specific profile from your credential file to get AWS credentials.\n* region:\nSet the AWS Region of the service. (e.g. us-east-1)\n* beta_features:\nEnable/Disable beta features.\n* debug:\nTurn on debug logging to print debug message generated by AWS SAM CLI and display timestamps.\n* save_params:\nSave the parameters provided via the command line to the configuration file.", "type": "object", "properties": { "template_file": { @@ -1418,6 +1452,11 @@ "type": "string", "description": "Optional. The value provided here overrides SemanticVersion in the template metadata." }, + "fail_on_same_version": { + "title": "fail_on_same_version", + "type": "boolean", + "description": "If set, AWS SAM CLI will prevent a publish and return a non-zero exit code\nif the publish is attempted with a semantic version that already exists on the SAR application.\nDefault is False." + }, "profile": { "title": "profile", "type": "string", diff --git a/tests/end_to_end/test_runtimes_e2e.py b/tests/end_to_end/test_runtimes_e2e.py index b5d73461611..84670913b5a 100644 --- a/tests/end_to_end/test_runtimes_e2e.py +++ b/tests/end_to_end/test_runtimes_e2e.py @@ -115,6 +115,7 @@ class TestHelloWorldZipPackagePermissionsEndToEnd(EndToEndBase): app_template = "hello-world" def test_hello_world_workflow(self): + os.environ["SAM_CLI_RIE_DEV"] = "1" function_name = "HelloWorldFunction" with EndToEndTestContext(self.app_name) as e2e_context: self.template_path = e2e_context.template_path @@ -123,7 +124,7 @@ def test_hello_world_workflow(self): package_command_list = self._get_package_command( s3_prefix="end-to-end-package-test", use_json=True, output_template_file="packaged_template.json" ) - local_command_list = self._get_local_command(function_name) + local_command_list = self._get_local_command(function_name) + ["--debug"] stages = [ DefaultInitStage(InitValidator(e2e_context), e2e_context, init_command_list, self.app_name), EndToEndBaseStage(BuildValidator(e2e_context), e2e_context, build_command_list), @@ -133,6 +134,7 @@ def test_hello_world_workflow(self): EndToEndBaseStage(LocalInvokeValidator(e2e_context), e2e_context, local_command_list), ] self._run_tests(stages) + os.environ.pop("SAM_CLI_RIE_DEV", None) @skipIf(SKIP_E2E_TESTS, "Skip E2E tests in CI/CD only") diff --git a/tests/end_to_end/test_stages.py b/tests/end_to_end/test_stages.py index f4056063311..c24af1826aa 100644 --- a/tests/end_to_end/test_stages.py +++ b/tests/end_to_end/test_stages.py @@ -2,6 +2,7 @@ from unittest import TestCase +import logging import boto3 import zipfile import json @@ -16,6 +17,8 @@ from tests.end_to_end.end_to_end_context import EndToEndTestContext from tests.testing_utils import CommandResult, run_command, run_command_with_input +LOG = logging.getLogger(__name__) + class BaseValidator(TestCase): def __init__(self, test_context: EndToEndTestContext): @@ -109,6 +112,12 @@ def _download_packaged_file(self): with zipfile.ZipFile(zip_file_path, "r") as zip_refzip: zip_refzip.extractall(path=built_function_path) + file_list = zip_refzip.namelist() + + for extracted_file in file_list: + permission_mask = oct(os.stat(os.path.join(built_function_path, extracted_file)).st_mode)[-3:] + LOG.info("Extracted file %s, with permission mask %s", extracted_file, permission_mask) + class DefaultSyncStage(EndToEndBaseStage): def run_stage(self) -> CommandResult: diff --git a/tests/get_testing_resources.py b/tests/get_testing_resources.py index 2d19a9cd7d5..c91a79fd77c 100644 --- a/tests/get_testing_resources.py +++ b/tests/get_testing_resources.py @@ -2,6 +2,7 @@ Script for getting test account credentials and managed test account resources. The output will be a json string with creds and resource names. """ + import json import os diff --git a/tests/integration/buildcmd/test_build_cmd.py b/tests/integration/buildcmd/test_build_cmd.py index 2b15e13484d..d0df4c99187 100644 --- a/tests/integration/buildcmd/test_build_cmd.py +++ b/tests/integration/buildcmd/test_build_cmd.py @@ -46,6 +46,7 @@ BuildIntegEsbuildBase, ) + LOG = logging.getLogger(__name__) # SAR tests require credentials. This is to skip running the test where credentials are not available. @@ -1228,9 +1229,11 @@ def test_dotnet_in_process(self, runtime, code_uri, mode, architecture="x86_64") self._verify_built_artifact( self.default_build_dir, self.FUNCTION_LOGICAL_ID, - self.EXPECTED_FILES_PROJECT_MANIFEST - if runtime != "provided.al2" - else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED, + ( + self.EXPECTED_FILES_PROJECT_MANIFEST + if runtime != "provided.al2" + else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED + ), ) self._verify_resource_property( @@ -1301,9 +1304,11 @@ def test_dotnet_in_container_mount_with_write_explicit(self, runtime, code_uri, self._verify_built_artifact( self.default_build_dir, self.FUNCTION_LOGICAL_ID, - self.EXPECTED_FILES_PROJECT_MANIFEST - if runtime != "provided.al2" - else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED, + ( + self.EXPECTED_FILES_PROJECT_MANIFEST + if runtime != "provided.al2" + else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED + ), ) self._verify_resource_property( @@ -1377,9 +1382,11 @@ def test_dotnet_in_container_mount_with_write_interactive( self._verify_built_artifact( self.default_build_dir, self.FUNCTION_LOGICAL_ID, - self.EXPECTED_FILES_PROJECT_MANIFEST - if runtime != "provided.al2" - else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED, + ( + self.EXPECTED_FILES_PROJECT_MANIFEST + if runtime != "provided.al2" + else self.EXPECTED_FILES_PROJECT_MANIFEST_PROVIDED + ), ) self._verify_resource_property( @@ -1681,6 +1688,8 @@ def test_build_layer_with_makefile_no_compatible_runtimes(self): ) def test_build_layer_with_architecture_not_compatible(self, build_method, use_container): # The BuildArchitecture is not one of the listed CompatibleArchitectures + if use_container and (SKIP_DOCKER_TESTS or SKIP_DOCKER_BUILD): + self.skipTest(SKIP_DOCKER_MESSAGE) layer_identifier = "LayerWithNoCompatibleArchitectures" @@ -1697,7 +1706,59 @@ def test_build_layer_with_architecture_not_compatible(self, build_method, use_co command_result = run_command(cmdlist, cwd=self.working_dir) # Capture warning self.assertIn( - f"Layer `{layer_identifier}` has BuildArchitecture `x86_64`, which is not listed in CompatibleArchitectures.", + f"Layer '{layer_identifier}' has BuildArchitecture x86_64, which is not listed in CompatibleArchitectures", + str(command_result.stderr.decode("utf-8")), + ) + # Build should still succeed + self.assertEqual(command_result.process.returncode, 0) + + @parameterized.expand([("python3.8", False), ("python3.8", "use_container")]) + def test_build_arch_no_compatible_arch(self, runtime, use_container): + # BuildArchitecture is present, but CompatibleArchitectures section is missing + if use_container and (SKIP_DOCKER_TESTS or SKIP_DOCKER_BUILD): + self.skipTest(SKIP_DOCKER_MESSAGE) + + layer_identifier = "LayerWithBuildArchButNoCompatibleArchs" + + overrides = { + "LayerBuildMethod": runtime, + "LayerMakeContentUri": "PyLayer", + "LayerBuildArchitecture": "arm64", + } + cmdlist = self.get_command_list( + use_container=use_container, parameter_overrides=overrides, function_identifier=layer_identifier + ) + + command_result = run_command(cmdlist, cwd=self.working_dir) + # Capture warning + self.assertIn( + f"Layer '{layer_identifier}' has BuildArchitecture arm64, which is not listed in CompatibleArchitectures", + str(command_result.stderr), + ) + # Build should still succeed + self.assertEqual(command_result.process.returncode, 0) + + @parameterized.expand([("python3.8", False), ("python3.8", "use_container")]) + def test_compatible_arch_no_build_arch(self, runtime, use_container): + # CompatibleArchitectures is present, but BuildArchitecture section is missing + if use_container and (SKIP_DOCKER_TESTS or SKIP_DOCKER_BUILD): + self.skipTest(SKIP_DOCKER_MESSAGE) + + layer_identifier = "LayerWithCompatibleArchsButNoBuildArch" + + overrides = { + "LayerBuildMethod": runtime, + "LayerMakeContentUri": "PyLayer", + "LayerCompatibleArchitecture": "arm64", + } + cmdlist = self.get_command_list( + use_container=use_container, parameter_overrides=overrides, function_identifier=layer_identifier + ) + + command_result = run_command(cmdlist, cwd=self.working_dir) + # Capture warning + self.assertIn( + f"Layer '{layer_identifier}' has BuildArchitecture x86_64, which is not listed in CompatibleArchitectures", str(command_result.stderr), ) # Build should still succeed @@ -1742,18 +1803,19 @@ def test_build_fails_with_missing_metadata(self, runtime, use_container, layer_i self.assertEqual(command_result.process.returncode, 1) self.assertFalse(self.default_build_dir.joinpath(layer_identifier).exists()) - @parameterized.expand([("python3.7", False, "LayerOne"), ("python3.7", "use_container", "LayerOne")]) - def test_build_with_missing_buildarchitecture(self, runtime, use_container, layer_identifier): + @parameterized.expand([False, "use_container"]) + def test_function_build_succeeds_with_referenced_layer(self, use_container): if use_container and (SKIP_DOCKER_TESTS or SKIP_DOCKER_BUILD): self.skipTest(SKIP_DOCKER_MESSAGE) - overrides = {"LayerBuildMethod": runtime, "LayerContentUri": "PyLayer"} + overrides = {"Runtime": "python3.8", "CodeUri": "Python"} + cmdlist = self.get_command_list( - use_container=use_container, parameter_overrides=overrides, function_identifier=layer_identifier + use_container=use_container, parameter_overrides=overrides, function_identifier="FunctionTwo" ) + command_result = run_command(cmdlist, cwd=self.working_dir) self.assertEqual(command_result.process.returncode, 0) - self.assertIn("No BuildArchitecture specifed", str(command_result.stderr)) @parameterized.expand([("python3.7", False), ("python3.7", "use_container")]) def test_build_function_and_layer(self, runtime, use_container): diff --git a/tests/integration/buildcmd/test_build_terraform_applications.py b/tests/integration/buildcmd/test_build_terraform_applications.py index 22fd93c7f09..79131aab76d 100644 --- a/tests/integration/buildcmd/test_build_terraform_applications.py +++ b/tests/integration/buildcmd/test_build_terraform_applications.py @@ -80,9 +80,9 @@ def build_with_prepare_hook(self): command_list_parameters["use_container"] = True command_list_parameters["build_image"] = self.docker_tag if self.override: - command_list_parameters[ - "container_env_var" - ] = "TF_VAR_HELLO_FUNCTION_SRC_CODE=./artifacts/HelloWorldFunction2" + command_list_parameters["container_env_var"] = ( + "TF_VAR_HELLO_FUNCTION_SRC_CODE=./artifacts/HelloWorldFunction2" + ) environment_variables = os.environ.copy() if self.override: diff --git a/tests/integration/delete/test_delete_command.py b/tests/integration/delete/test_delete_command.py index b0a35c12b11..71150983f3a 100644 --- a/tests/integration/delete/test_delete_command.py +++ b/tests/integration/delete/test_delete_command.py @@ -6,6 +6,7 @@ import docker from botocore.exceptions import ClientError from parameterized import parameterized +from samcli.lib.config.samconfig import DEFAULT_CONFIG_FILE_NAME from tests.integration.delete.delete_integ_base import DeleteIntegBase from tests.testing_utils import RUNNING_ON_CI, RUNNING_TEST_FOR_MASTER_ON_CI, RUN_BY_CANARY, CommandResult @@ -126,15 +127,13 @@ def test_delete_no_prompts_with_s3_prefix_present_zip(self, template_file): stack_name = self._method_to_stack_name(self.id()) - config_file_name = stack_name + ".toml" - deploy_command_list = self.get_deploy_command_list( - template_file=template_path, guided=True, config_file=config_file_name - ) + config_file_name = DEFAULT_CONFIG_FILE_NAME + deploy_command_list = self.get_deploy_command_list(template_file=template_path, guided=True) _ = run_command_with_input(deploy_command_list, "{}\n\n\n\n\n\n\n\n\n".format(stack_name).encode()) config_file_path = self.test_data_path.joinpath(config_file_name) delete_command_list = self.get_delete_command_list( - stack_name=stack_name, config_file=config_file_path, region=self._session.region_name, no_prompts=True + stack_name=stack_name, region=self._session.region_name, no_prompts=True ) delete_process_execute = run_command(delete_command_list) @@ -155,9 +154,9 @@ def test_delete_no_prompts_with_s3_prefix_present_image(self, template_file): stack_name = self._method_to_stack_name(self.id()) - config_file_name = stack_name + ".toml" + config_file_name = DEFAULT_CONFIG_FILE_NAME deploy_command_list = self.get_deploy_command_list( - template_file=template_path, guided=True, config_file=config_file_name, image_repository=self.ecr_repo_name + template_file=template_path, guided=True, image_repository=self.ecr_repo_name ) _ = run_command_with_input( deploy_command_list, f"{stack_name}\n\n{self.ecr_repo_name}\n\n\ny\n\n\n\n\n\n".encode() @@ -165,7 +164,7 @@ def test_delete_no_prompts_with_s3_prefix_present_image(self, template_file): config_file_path = self.test_data_path.joinpath(config_file_name) delete_command_list = self.get_delete_command_list( - stack_name=stack_name, config_file=config_file_path, region=self._session.region_name, no_prompts=True + stack_name=stack_name, region=self._session.region_name, no_prompts=True ) delete_process_execute = run_command(delete_command_list) @@ -186,14 +185,12 @@ def test_delete_guided_config_file_present(self, template_file): stack_name = self._method_to_stack_name(self.id()) - config_file_name = stack_name + ".toml" - deploy_command_list = self.get_deploy_command_list( - template_file=template_path, guided=True, config_file=config_file_name - ) + config_file_name = DEFAULT_CONFIG_FILE_NAME + deploy_command_list = self.get_deploy_command_list(template_file=template_path, guided=True) _ = run_command_with_input(deploy_command_list, "{}\n\n\n\n\n\n\n\n\n".format(stack_name).encode()) config_file_path = self.test_data_path.joinpath(config_file_name) - delete_command_list = self.get_delete_command_list(stack_name=stack_name, config_file=config_file_path) + delete_command_list = self.get_delete_command_list(stack_name=stack_name) delete_process_execute = run_command_with_input(delete_command_list, "y\nn\ny\n".encode()) self.validate_delete_process(delete_process_execute) diff --git a/tests/integration/local/invoke/test_integrations_cli.py b/tests/integration/local/invoke/test_integrations_cli.py index c1a114b5d49..3c33a25cead 100644 --- a/tests/integration/local/invoke/test_integrations_cli.py +++ b/tests/integration/local/invoke/test_integrations_cli.py @@ -1197,6 +1197,41 @@ def test_invoke_inline_code_function(self): self.assertEqual(process.returncode, 1) +class TestInvokeFunctionWithImageBytesAsReturn(InvokeIntegBase): + template = Path("template-return-image.yaml") + + @pytest.mark.flaky(reruns=3) + def test_invoke_returncode_is_zero(self): + command_list = InvokeIntegBase.get_command_list( + "GetImageFunction", template_path=self.template_path, event_path=self.event_path + ) + + process = Popen(command_list, stdout=PIPE) + try: + process.communicate(timeout=TIMEOUT) + except TimeoutExpired: + process.kill() + raise + + self.assertEqual(process.returncode, 0) + + @pytest.mark.flaky(reruns=3) + def test_invoke_image_is_returned(self): + command_list = InvokeIntegBase.get_command_list( + "GetImageFunction", template_path=self.template_path, event_path=self.event_path + ) + + process = Popen(command_list, stdout=PIPE) + try: + stdout, _ = process.communicate(timeout=TIMEOUT) + except TimeoutExpired: + process.kill() + raise + + # The first byte of a png image file is \x89 so we can check that to verify that it returned an image + self.assertEqual(stdout[0:1], b"\x89") + + class TestInvokeFunctionWithError(InvokeIntegBase): template = Path("template.yml") diff --git a/tests/integration/local/start_api/test_start_api.py b/tests/integration/local/start_api/test_start_api.py index c0b5fb44e2b..984a4c639e2 100644 --- a/tests/integration/local/start_api/test_start_api.py +++ b/tests/integration/local/start_api/test_start_api.py @@ -149,10 +149,11 @@ def test_large_input_request_http10(self): @parameterized_class( - ("template_path",), + ("template_path", "container_mode"), [ - ("/testdata/start_api/template.yaml",), - ("/testdata/start_api/cdk/template_cdk.yaml",), + ("/testdata/start_api/template.yaml", "LAZY"), + ("/testdata/start_api/template.yaml", "EAGER"), + ("/testdata/start_api/cdk/template_cdk.yaml", "LAZY"), ], ) class TestParallelRequests(StartApiIntegBaseClass): @@ -179,16 +180,15 @@ def test_same_endpoint(self): for _ in range(0, number_of_requests) ] results = [r.result() for r in as_completed(futures)] - end_time = time() - self.assertEqual(len(results), 10) - self.assertGreater(end_time - start_time, 10) - for result in results: self.assertEqual(result.status_code, 200) self.assertEqual(result.json(), {"message": "HelloWorld! I just slept and waking up."}) self.assertEqual(result.raw.version, 11) # Checks if the response is HTTP/1.1 version + # after checking responses now check the time to complete + self.assertEqual(len(results), 10) + self.assertGreater(end_time - start_time, 10) @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") diff --git a/tests/integration/logs/test_logs_command.py b/tests/integration/logs/test_logs_command.py index 22a15b8c725..f1edd48a237 100644 --- a/tests/integration/logs/test_logs_command.py +++ b/tests/integration/logs/test_logs_command.py @@ -230,6 +230,7 @@ def _check_logs(self, cmd_list: List, log_strings: List[str], output: str = "tex REGULAR_STACK_FUNCTION_LIST = [ "ApiGwFunction", "SfnFunction", + "FunctionWithCustomLoggingConfig", ] REGULAR_STACK_APIGW_LIST = [ "HelloWorldServerlessApi", diff --git a/tests/integration/publish/publish_app_integ_base.py b/tests/integration/publish/publish_app_integ_base.py index b8480c1a273..faa2895f192 100644 --- a/tests/integration/publish/publish_app_integ_base.py +++ b/tests/integration/publish/publish_app_integ_base.py @@ -80,7 +80,9 @@ def assert_metadata_details(self, app_metadata, std_output): for key, value in app_metadata.items(): self.assertIn('"{}":{}'.format(key, json.dumps(value)), stripped_std_output) - def get_command_list(self, template_path=None, region=None, profile=None, semantic_version=None): + def get_command_list( + self, template_path=None, region=None, profile=None, semantic_version=None, fail_on_same_version=None + ): command_list = [get_sam_command(), "publish"] if template_path: @@ -95,4 +97,7 @@ def get_command_list(self, template_path=None, region=None, profile=None, semant if semantic_version: command_list = command_list + ["--semantic-version", semantic_version] + if fail_on_same_version: + command_list = command_list + ["--fail-on-same-version"] + return command_list diff --git a/tests/integration/publish/test_command_integ.py b/tests/integration/publish/test_command_integ.py index 6d6d759f2bc..b7cc2bf0ff2 100644 --- a/tests/integration/publish/test_command_integ.py +++ b/tests/integration/publish/test_command_integ.py @@ -74,6 +74,24 @@ def test_update_application_version_with_semantic_version_option(self): app_metadata[SEMANTIC_VERSION] = "0.1.0" self.assert_metadata_details(app_metadata, result.stdout.decode("utf-8")) + @pytest.mark.flaky(reruns=3) + def test_update_application_fail_on_same_semantic_version(self): + template_path = self.temp_dir.joinpath("template_create_app_version.yaml") + command_list = self.get_command_list( + template_path=template_path, region=self.region_name, semantic_version="0.1.0" + ) + # Publish the version initially + run_command(command_list) + + second_command_list = self.get_command_list( + template_path=template_path, region=self.region_name, semantic_version="0.1.0", fail_on_same_version=True + ) + + # Attempt to publish again with the same semantic version and with --fail-on-same-version + result = run_command(second_command_list) + expected_msg = "Cannot publish version 0.1.0 for application" + self.assertIn(expected_msg, result.stderr.decode("utf-8")) + @skipIf(SKIP_PUBLISH_TESTS, "Skip publish tests in CI/CD only") class TestPublishNewApp(PublishAppIntegBase): diff --git a/tests/integration/sync/test_sync_adl.py b/tests/integration/sync/test_sync_adl.py index 854325af207..f5e0a4c32e3 100644 --- a/tests/integration/sync/test_sync_adl.py +++ b/tests/integration/sync/test_sync_adl.py @@ -128,7 +128,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Layer HelloWorldFunction", + "Finished syncing Layer HelloWorldFunction", timeout=60, ) lambda_response = json.loads(self._get_lambda_response(lambda_functions[0])) @@ -142,7 +142,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Layer HelloWorldFunction", + "Finished syncing Layer HelloWorldFunction", timeout=60, ) self._confirm_lambda_error(lambda_functions[0]) @@ -154,7 +154,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=60, ) diff --git a/tests/integration/sync/test_sync_watch.py b/tests/integration/sync/test_sync_watch.py index f450060cb95..133d1ddbde7 100644 --- a/tests/integration/sync/test_sync_watch.py +++ b/tests/integration/sync/test_sync_watch.py @@ -223,7 +223,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=45, ) layer_contents = self.get_dependency_layer_contents_from_arn(self.stack_resources, "python", 2) @@ -235,7 +235,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "before", "function", "app.py"), ) read_until_string( - self.watch_process, "\x1b[32mFinished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 + self.watch_process, "Finished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) for lambda_function in lambda_functions: @@ -250,7 +250,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=30, ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) @@ -264,7 +264,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "after", "apigateway", "definition.json"), self.test_data_path.joinpath("code", "before", "apigateway", "definition.json"), ) - read_until_string(self.watch_process, "\x1b[32mFinished syncing RestApi HelloWorldApi.\x1b[0m\n", timeout=20) + read_until_string(self.watch_process, "Finished syncing RestApi HelloWorldApi.\x1b[0m\n", timeout=20) time.sleep(API_SLEEP) rest_api = self.stack_resources.get(AWS_APIGATEWAY_RESTAPI)[0] self.assertEqual(self._get_api_message(rest_api), '{"message": "hello 2"}') @@ -274,9 +274,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "after", "statemachine", "function.asl.json"), self.test_data_path.joinpath("code", "before", "statemachine", "function.asl.json"), ) - read_until_string( - self.watch_process, "\x1b[32mFinished syncing StepFunctions HelloStepFunction.\x1b[0m\n", timeout=20 - ) + read_until_string(self.watch_process, "Finished syncing StepFunctions HelloStepFunction.\x1b[0m\n", timeout=20) state_machine = self.stack_resources.get(AWS_STEPFUNCTIONS_STATEMACHINE)[0] time.sleep(SFN_SLEEP) self.assertEqual(self._get_sfn_response(state_machine), '"World 2"') @@ -326,8 +324,7 @@ def test_sync_watch_code_nested_stack(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync " - "LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync " "LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", timeout=45, ) layer_contents = self.get_dependency_layer_contents_from_arn(self.stack_resources, "python", 2) @@ -340,7 +337,7 @@ def test_sync_watch_code_nested_stack(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Lambda Function LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", + "Finished syncing Lambda Function LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", timeout=30, ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) @@ -356,7 +353,7 @@ def test_sync_watch_code_nested_stack(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync LocalNestedChildStack/HelloWorldFunction.\x1b[0m\n", timeout=30, ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) @@ -372,7 +369,7 @@ def test_sync_watch_code_nested_stack(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing RestApi LocalNestedChildStack/HelloWorldApi.\x1b[0m\n", + "Finished syncing RestApi LocalNestedChildStack/HelloWorldApi.\x1b[0m\n", timeout=20, ) time.sleep(API_SLEEP) @@ -386,7 +383,7 @@ def test_sync_watch_code_nested_stack(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing StepFunctions LocalNestedChildStack/HelloStepFunction.\x1b[0m\n", + "Finished syncing StepFunctions LocalNestedChildStack/HelloStepFunction.\x1b[0m\n", timeout=20, ) state_machine = self.stack_resources.get(AWS_STEPFUNCTIONS_STATEMACHINE)[0] @@ -413,7 +410,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "before", "esbuild_function", "app.ts"), ) read_until_string( - self.watch_process, "\x1b[32mFinished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 + self.watch_process, "Finished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) for lambda_function in lambda_functions: @@ -473,7 +470,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "before", "function", "requirements.txt"), ) read_until_string( - self.watch_process, "\x1b[32mFinished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=45 + self.watch_process, "Finished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=45 ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) @@ -521,7 +518,7 @@ def test_sync_watch_code(self): tags="integ=true clarity=yes foo_bar=baz", ) self.watch_process = start_persistent_process(sync_command_list, cwd=self.test_data_path) - read_until_string(self.watch_process, "\x1b[32mSync watch started.\x1b[0m\n", timeout=30) + read_until_string(self.watch_process, "Sync watch started.\x1b[0m\n", timeout=30) self.stack_resources = self._get_stacks(self.stack_name) @@ -535,7 +532,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=45, ) layer_contents = self.get_dependency_layer_contents_from_arn(self.stack_resources, "python", 2) @@ -547,7 +544,7 @@ def test_sync_watch_code(self): self.test_data_path.joinpath("code", "before", "function", "app.py"), ) read_until_string( - self.watch_process, "\x1b[32mFinished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 + self.watch_process, "Finished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=30 ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) for lambda_function in lambda_functions: @@ -562,7 +559,7 @@ def test_sync_watch_code(self): ) read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=30, ) lambda_functions = self.stack_resources.get(AWS_LAMBDA_FUNCTION) @@ -679,7 +676,7 @@ def test_sync_watch_auto_skip_infra(self): self.watch_process = start_persistent_process(sync_command_list, cwd=self.test_dir) read_until_string( - self.watch_process, "\x1b[32mFinished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=100 + self.watch_process, "Finished syncing Lambda Function HelloWorldFunction.\x1b[0m\n", timeout=100 ) kill_process(self.watch_process) @@ -714,7 +711,7 @@ def test_sync_watch_auto_skip_infra(self): read_until_string( self.watch_process, - "\x1b[32mFinished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", + "Finished syncing Function Layer Reference Sync HelloWorldFunction.\x1b[0m\n", timeout=100, ) @@ -749,7 +746,7 @@ def test_sync_watch_auto_skip_infra(self): read_until_string( self.watch_process, - "\x1b[32mFinished syncing RestApi HelloWorldApi.\x1b[0m\n", + "Finished syncing RestApi HelloWorldApi.\x1b[0m\n", timeout=100, ) time.sleep(API_SLEEP) @@ -781,7 +778,7 @@ def test_sync_watch_auto_skip_infra(self): read_until_string( self.watch_process, - "\x1b[32mFinished syncing StepFunctions HelloStepFunction.\x1b[0m\n", + "Finished syncing StepFunctions HelloStepFunction.\x1b[0m\n", timeout=100, ) time.sleep(SFN_SLEEP) diff --git a/tests/integration/testdata/buildcmd/layers-functions-template.yaml b/tests/integration/testdata/buildcmd/layers-functions-template.yaml index 3f0bc318b54..36810c782f4 100644 --- a/tests/integration/testdata/buildcmd/layers-functions-template.yaml +++ b/tests/integration/testdata/buildcmd/layers-functions-template.yaml @@ -32,6 +32,16 @@ Resources: Layers: - !Ref LayerOne + FunctionTwo: + Type: AWS::Serverless::Function + Properties: + Handler: !Ref Handler + Runtime: !Ref Runtime + CodeUri: !Ref CodeUri + Timeout: 600 + Layers: + - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:012345678912:layer:layerName:1 + LayerOne: Type: AWS::Serverless::LayerVersion Properties: @@ -87,4 +97,23 @@ Resources: - !Ref LayerCompatibleArchitecture Metadata: BuildMethod: !Ref LayerBuildMethod - BuildArchitecture: !Ref LayerBuildArchitecture \ No newline at end of file + BuildArchitecture: !Ref LayerBuildArchitecture + + LayerWithBuildArchButNoCompatibleArchs: + Type: AWS::Serverless::LayerVersion + Properties: + Description: Build arch present but CompatibleArchs not present + ContentUri: !Ref LayerMakeContentUri + Metadata: + BuildMethod: !Ref LayerBuildMethod + BuildArchitecture: !Ref LayerBuildArchitecture + + LayerWithCompatibleArchsButNoBuildArch: + Type: AWS::Serverless::LayerVersion + Properties: + Description: Build arch present but CompatibleArchs not present + ContentUri: !Ref LayerMakeContentUri + CompatibleArchitectures: + - !Ref LayerCompatibleArchitecture + Metadata: + BuildMethod: !Ref LayerBuildMethod \ No newline at end of file diff --git a/tests/integration/testdata/invoke/image-for-lambda.png b/tests/integration/testdata/invoke/image-for-lambda.png new file mode 100644 index 00000000000..56a3af614bf Binary files /dev/null and b/tests/integration/testdata/invoke/image-for-lambda.png differ diff --git a/tests/integration/testdata/invoke/main.py b/tests/integration/testdata/invoke/main.py index e33635ccb49..0f2753a6ffd 100644 --- a/tests/integration/testdata/invoke/main.py +++ b/tests/integration/testdata/invoke/main.py @@ -60,3 +60,10 @@ def execute_git(event, context): def no_response(event, context): print("lambda called") + + +def image_handler(event, context): + with open("image-for-lambda.png", "rb") as f: + image_bytes = f.read() + + return image_bytes \ No newline at end of file diff --git a/tests/integration/testdata/invoke/template-return-image.yaml b/tests/integration/testdata/invoke/template-return-image.yaml new file mode 100644 index 00000000000..f59f8e5453a --- /dev/null +++ b/tests/integration/testdata/invoke/template-return-image.yaml @@ -0,0 +1,12 @@ +AWSTemplateFormatVersion : '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: A hello world application. + +Resources: + GetImageFunction: + Type: AWS::Serverless::Function + Properties: + Handler: main.image_handler + Runtime: python3.11 + CodeUri: . + Timeout: 600 \ No newline at end of file diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/function-with-custom-logging/app.py b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/function-with-custom-logging/app.py new file mode 100644 index 00000000000..989804c8015 --- /dev/null +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/function-with-custom-logging/app.py @@ -0,0 +1,5 @@ + +def handler(event, context): + print("Hello world from ChildStack/FunctionWithCustomLoggingConfig function") + print("this should be filtered ChildStackFunctionWithCustomLoggingConfig") + return {} \ No newline at end of file diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/function-with-custom-logging/app.py b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/function-with-custom-logging/app.py new file mode 100644 index 00000000000..7cd5b2269fc --- /dev/null +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/function-with-custom-logging/app.py @@ -0,0 +1,5 @@ + +def handler(event, context): + print("Hello world from ChildStack/GrandChildStack/FunctionWithCustomLoggingConfig function") + print("this should be filtered ChildStackGrandChildStackFunctionWithCustomLoggingConfig") + return {} diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/template.yaml b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/template.yaml index b7a4dc30f0a..6c95dbce729 100644 --- a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/template.yaml +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/grand-child-stack/template.yaml @@ -66,7 +66,7 @@ Resources: Properties: CodeUri: apigw-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active Events: HelloWorld: @@ -81,7 +81,7 @@ Resources: Properties: CodeUri: sfn-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active HelloWorldServerlessApi: @@ -113,6 +113,17 @@ Resources: ManagedPolicyArns: - !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" + FunctionWithCustomLoggingConfig: + Type: AWS::Serverless::Function + Properties: + CodeUri: function-with-custom-logging/ + Handler: app.handler + Runtime: python3.12 + Tracing: Active + LoggingConfig: + LogFormat: JSON + LogGroup: !Sub /aws/lambda/${AWS::StackName} + Outputs: HelloWorldServerlessApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/template.yaml b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/template.yaml index c6f1aef18f3..83ed191545b 100644 --- a/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/template.yaml +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/child-stack/template.yaml @@ -66,7 +66,7 @@ Resources: Properties: CodeUri: apigw-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active Events: HelloWorld: @@ -81,7 +81,7 @@ Resources: Properties: CodeUri: sfn-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active HelloWorldServerlessApi: @@ -113,6 +113,17 @@ Resources: ManagedPolicyArns: - !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" + FunctionWithCustomLoggingConfig: + Type: AWS::Serverless::Function + Properties: + CodeUri: function-with-custom-logging/ + Handler: app.handler + Runtime: python3.12 + Tracing: Active + LoggingConfig: + LogFormat: JSON + LogGroup: !Sub /aws/lambda/${AWS::StackName} + GrandChildStack: Type: AWS::Serverless::Application Properties: diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/function-with-custom-logging/app.py b/tests/integration/testdata/logs/nested-python-apigw-sfn/function-with-custom-logging/app.py new file mode 100644 index 00000000000..e980e304ade --- /dev/null +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/function-with-custom-logging/app.py @@ -0,0 +1,5 @@ + +def handler(event, context): + print("Hello world from FunctionWithCustomLoggingConfig function") + print("this should be filtered FunctionWithCustomLoggingConfig") + return {} diff --git a/tests/integration/testdata/logs/nested-python-apigw-sfn/template.yaml b/tests/integration/testdata/logs/nested-python-apigw-sfn/template.yaml index 5506f108f36..02fb86362cb 100644 --- a/tests/integration/testdata/logs/nested-python-apigw-sfn/template.yaml +++ b/tests/integration/testdata/logs/nested-python-apigw-sfn/template.yaml @@ -66,7 +66,7 @@ Resources: Properties: CodeUri: apigw-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active Events: HelloWorld: @@ -81,7 +81,7 @@ Resources: Properties: CodeUri: sfn-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active HelloWorldServerlessApi: @@ -113,6 +113,17 @@ Resources: ManagedPolicyArns: - !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" + FunctionWithCustomLoggingConfig: + Type: AWS::Serverless::Function + Properties: + CodeUri: function-with-custom-logging/ + Handler: app.handler + Runtime: python3.12 + Tracing: Active + LoggingConfig: + LogFormat: JSON + LogGroup: !Sub /aws/lambda/${AWS::StackName} + ChildStack: Type: AWS::Serverless::Application Properties: diff --git a/tests/integration/testdata/logs/python-apigw-sfn/function-with-custom-logging/app.py b/tests/integration/testdata/logs/python-apigw-sfn/function-with-custom-logging/app.py new file mode 100644 index 00000000000..e980e304ade --- /dev/null +++ b/tests/integration/testdata/logs/python-apigw-sfn/function-with-custom-logging/app.py @@ -0,0 +1,5 @@ + +def handler(event, context): + print("Hello world from FunctionWithCustomLoggingConfig function") + print("this should be filtered FunctionWithCustomLoggingConfig") + return {} diff --git a/tests/integration/testdata/logs/python-apigw-sfn/template.yaml b/tests/integration/testdata/logs/python-apigw-sfn/template.yaml index b7a4dc30f0a..6c95dbce729 100644 --- a/tests/integration/testdata/logs/python-apigw-sfn/template.yaml +++ b/tests/integration/testdata/logs/python-apigw-sfn/template.yaml @@ -66,7 +66,7 @@ Resources: Properties: CodeUri: apigw-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active Events: HelloWorld: @@ -81,7 +81,7 @@ Resources: Properties: CodeUri: sfn-function/ Handler: app.handler - Runtime: python3.9 + Runtime: python3.12 Tracing: Active HelloWorldServerlessApi: @@ -113,6 +113,17 @@ Resources: ManagedPolicyArns: - !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" + FunctionWithCustomLoggingConfig: + Type: AWS::Serverless::Function + Properties: + CodeUri: function-with-custom-logging/ + Handler: app.handler + Runtime: python3.12 + Tracing: Active + LoggingConfig: + LogFormat: JSON + LogGroup: !Sub /aws/lambda/${AWS::StackName} + Outputs: HelloWorldServerlessApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" diff --git a/tests/integration/testdata/sync/code/before/template-makefile-create-new-file.yaml b/tests/integration/testdata/sync/code/before/template-makefile-create-new-file.yaml index dde583cc6e9..d35d56be45f 100644 --- a/tests/integration/testdata/sync/code/before/template-makefile-create-new-file.yaml +++ b/tests/integration/testdata/sync/code/before/template-makefile-create-new-file.yaml @@ -11,7 +11,7 @@ Resources: Properties: CodeUri: makefile_function_create_new_file/ Handler: main.handler - Runtime: python3.7 + Runtime: python3.11 Layers: - !Ref HelloWorldLayer Metadata: @@ -22,6 +22,6 @@ Resources: Properties: ContentUri: makefile_layer_create_new_file/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: BuildMethod: makefile \ No newline at end of file diff --git a/tests/integration/testdata/sync/code/before/template-python-code-only-layer.yaml b/tests/integration/testdata/sync/code/before/template-python-code-only-layer.yaml index 133dc915dee..3c2afbd0df0 100644 --- a/tests/integration/testdata/sync/code/before/template-python-code-only-layer.yaml +++ b/tests/integration/testdata/sync/code/before/template-python-code-only-layer.yaml @@ -22,7 +22,7 @@ Resources: Properties: CodeUri: function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -32,7 +32,7 @@ Resources: Properties: CodeUri: function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayerWithoutBuildMethod Tracing: Active @@ -42,7 +42,7 @@ Resources: Properties: CodeUri: function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldPreBuiltZipLayer Tracing: Active @@ -54,9 +54,9 @@ Resources: Description: Hello World Layer ContentUri: layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 HelloWorldLayerWithoutBuildMethod: Type: AWS::Serverless::LayerVersion @@ -65,7 +65,7 @@ Resources: Description: Hello World Layer without BuildMethod ContentUri: layer_without_build_method/ CompatibleRuntimes: - - python3.7 + - python3.11 HelloWorldPreBuiltZipLayer: Type: AWS::Serverless::LayerVersion @@ -74,7 +74,7 @@ Resources: Description: Hello World Layer which is pre-built as ZIP file ContentUri: layer_zip/layer.zip CompatibleRuntimes: - - python3.7 + - python3.11 HelloStepFunction: Type: AWS::Serverless::StateMachine diff --git a/tests/integration/testdata/sync/code/before/template-python-code-only.yaml b/tests/integration/testdata/sync/code/before/template-python-code-only.yaml index a90129ba1e2..0c1200c5c7f 100644 --- a/tests/integration/testdata/sync/code/before/template-python-code-only.yaml +++ b/tests/integration/testdata/sync/code/before/template-python-code-only.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -28,6 +28,6 @@ Resources: Description: Hello World Layer ContentUri: layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 diff --git a/tests/integration/testdata/sync/code/before/template-python-no-dependencies.yaml b/tests/integration/testdata/sync/code/before/template-python-no-dependencies.yaml index b95b0c76707..7961b53ce9c 100644 --- a/tests/integration/testdata/sync/code/before/template-python-no-dependencies.yaml +++ b/tests/integration/testdata/sync/code/before/template-python-no-dependencies.yaml @@ -11,4 +11,4 @@ Resources: Properties: CodeUri: python_function_no_deps/ Handler: app.lambda_handler - Runtime: python3.7 \ No newline at end of file + Runtime: python3.11 \ No newline at end of file diff --git a/tests/integration/testdata/sync/code/before/template-python.yaml b/tests/integration/testdata/sync/code/before/template-python.yaml index 56cb6422354..7199dfc9ff5 100644 --- a/tests/integration/testdata/sync/code/before/template-python.yaml +++ b/tests/integration/testdata/sync/code/before/template-python.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -40,9 +40,9 @@ Resources: Description: Hello World Layer ContentUri: layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 HelloStepFunction: Type: AWS::Serverless::StateMachine diff --git a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions.json b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions.json index 4bdebf1d5c2..501f219ab51 100644 --- a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions.json +++ b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions.json @@ -44,7 +44,8 @@ "CompatibleRuntimes": [ "python3.7", "python3.8", - "python3.9" + "python3.9", + "python3.11" ] }, "Metadata": { @@ -52,7 +53,7 @@ "aws:asset:path": "before/asset.b998895901bf33127f2c9dce715854f8b35aa73fb7eb5245ba9721580bbe6948", "aws:asset:is-bundled": false, "aws:asset:property": "Content", - "BuildMethod": "python3.7" + "BuildMethod": "python3.11" } }, "RandomCitiesFunctionServiceRole4EFB1CF5": { @@ -142,7 +143,7 @@ "Ref": "CountriesLibLayer259A7AF1" } ], - "Runtime": "python3.7" + "Runtime": "python3.11" }, "DependsOn": [ "RandomCitiesFunctionServiceRole4EFB1CF5" diff --git a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions_after.json b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions_after.json index a74eaccfd4a..1efd11e775b 100644 --- a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions_after.json +++ b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_level3_nested_zip_functions_after.json @@ -44,7 +44,8 @@ "CompatibleRuntimes": [ "python3.7", "python3.8", - "python3.9" + "python3.9", + "python3.11" ] }, "Metadata": { @@ -52,7 +53,7 @@ "aws:asset:path": "after/asset.b998895901bf33127f2c9dce715854f8b35aa73fb7eb5245ba9721580bbe6948", "aws:asset:is-bundled": false, "aws:asset:property": "Content", - "BuildMethod": "python3.7" + "BuildMethod": "python3.11" } }, "RandomCitiesFunctionServiceRole4EFB1CF5": { @@ -142,7 +143,7 @@ "Ref": "CountriesLibLayer259A7AF1" } ], - "Runtime": "python3.7" + "Runtime": "python3.11" }, "DependsOn": [ "RandomCitiesFunctionServiceRole4EFB1CF5" diff --git a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions.json b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions.json index 9b8144d2311..5eb15f6c79c 100644 --- a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions.json +++ b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions.json @@ -44,7 +44,8 @@ "CompatibleRuntimes": [ "python3.7", "python3.8", - "python3.9" + "python3.9", + "python3.11" ] }, "Metadata": { @@ -52,7 +53,7 @@ "aws:asset:path": "before/asset.b998895901bf33127f2c9dce715854f8b35aa73fb7eb5245ba9721580bbe6948", "aws:asset:is-bundled": false, "aws:asset:property": "Content", - "BuildMethod": "python3.7" + "BuildMethod": "python3.11" } }, "RandomCitiesFunctionServiceRole4EFB1CF5": { @@ -142,7 +143,7 @@ "Ref": "CountriesLibLayer259A7AF1" } ], - "Runtime": "python3.7" + "Runtime": "python3.11" }, "DependsOn": [ "RandomCitiesFunctionServiceRole4EFB1CF5" diff --git a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions_after.json b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions_after.json index ca59fdf28f9..6aead65356f 100644 --- a/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions_after.json +++ b/tests/integration/testdata/sync/infra/cdk/cdk_v1_synthesized_template_zip_functions_after.json @@ -44,7 +44,8 @@ "CompatibleRuntimes": [ "python3.7", "python3.8", - "python3.9" + "python3.9", + "python3.11" ] }, "Metadata": { @@ -52,7 +53,7 @@ "aws:asset:path": "after/asset.b998895901bf33127f2c9dce715854f8b35aa73fb7eb5245ba9721580bbe6948", "aws:asset:is-bundled": false, "aws:asset:property": "Content", - "BuildMethod": "python3.7" + "BuildMethod": "python3.11" } }, "RandomCitiesFunctionServiceRole4EFB1CF5": { @@ -142,7 +143,7 @@ "Ref": "CountriesLibLayer259A7AF1" } ], - "Runtime": "python3.7" + "Runtime": "python3.11" }, "DependsOn": [ "RandomCitiesFunctionServiceRole4EFB1CF5" diff --git a/tests/integration/testdata/sync/infra/template-python-after.yaml b/tests/integration/testdata/sync/infra/template-python-after.yaml index add839c5070..6293b89e29d 100644 --- a/tests/integration/testdata/sync/infra/template-python-after.yaml +++ b/tests/integration/testdata/sync/infra/template-python-after.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: after/Python/function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -40,9 +40,9 @@ Resources: Description: Hello World Layer ContentUri: after/Python/layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 HelloStepFunction: Type: AWS::Serverless::StateMachine diff --git a/tests/integration/testdata/sync/infra/template-python-auto-skip.yaml b/tests/integration/testdata/sync/infra/template-python-auto-skip.yaml index bfe4ca54255..8f3694986c0 100644 --- a/tests/integration/testdata/sync/infra/template-python-auto-skip.yaml +++ b/tests/integration/testdata/sync/infra/template-python-auto-skip.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: after/Python/function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -40,9 +40,9 @@ Resources: Description: Hello World Layer ContentUri: after/Python/layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 HelloStepFunction: Type: AWS::Serverless::StateMachine diff --git a/tests/integration/testdata/sync/infra/template-python-before.yaml b/tests/integration/testdata/sync/infra/template-python-before.yaml index 2ed2834830c..6167cfa57e8 100644 --- a/tests/integration/testdata/sync/infra/template-python-before.yaml +++ b/tests/integration/testdata/sync/infra/template-python-before.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: before/Python/function/ Handler: app.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -40,9 +40,9 @@ Resources: Description: Hello World Layer ContentUri: before/Python/layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 HelloStepFunction: Type: AWS::Serverless::StateMachine diff --git a/tests/integration/testdata/sync/nested/before/child_stack/child_child_stack/template.yaml b/tests/integration/testdata/sync/nested/before/child_stack/child_child_stack/template.yaml index eae704f5364..84c06c77ad0 100644 --- a/tests/integration/testdata/sync/nested/before/child_stack/child_child_stack/template.yaml +++ b/tests/integration/testdata/sync/nested/before/child_stack/child_child_stack/template.yaml @@ -24,7 +24,7 @@ Resources: # Build with nested stack already exhibits this behaviour CodeUri: ../child_functions/ Handler: child_function.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: ParentLayer2 Tracing: Active diff --git a/tests/integration/testdata/sync/nested/before/child_stack/template.yaml b/tests/integration/testdata/sync/nested/before/child_stack/template.yaml index c90b60f94a6..ad6c931be33 100644 --- a/tests/integration/testdata/sync/nested/before/child_stack/template.yaml +++ b/tests/integration/testdata/sync/nested/before/child_stack/template.yaml @@ -24,7 +24,7 @@ Resources: # Build with nested stack already exhibits this behaviour CodeUri: child_functions/ Handler: child_function.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: ParentLayer Tracing: Active @@ -40,9 +40,9 @@ Resources: # Build with nested stack already exhibits this behaviour ContentUri: ../root_layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 ChildChildStack: Type: AWS::Serverless::Application diff --git a/tests/integration/testdata/sync/nested/before/template.yaml b/tests/integration/testdata/sync/nested/before/template.yaml index ebe0cafc9ed..13ec4724115 100644 --- a/tests/integration/testdata/sync/nested/before/template.yaml +++ b/tests/integration/testdata/sync/nested/before/template.yaml @@ -19,7 +19,7 @@ Resources: Properties: CodeUri: root_function/ Handler: root_function.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: HelloWorldLayer Tracing: Active @@ -31,9 +31,9 @@ Resources: Description: Hello World Layer ContentUri: root_layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 ChildStack: Type: AWS::Serverless::Application diff --git a/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_function/template.yaml b/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_function/template.yaml index 75488615f78..edd463aa180 100644 --- a/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_function/template.yaml +++ b/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_function/template.yaml @@ -16,7 +16,7 @@ Resources: Properties: CodeUri: function/ Handler: function.lambda_handler - Runtime: python3.7 + Runtime: python3.11 Layers: - Ref: Layer Tracing: Active \ No newline at end of file diff --git a/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_layer/template.yaml b/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_layer/template.yaml index 2313c0bf7d2..5c8a07432bf 100644 --- a/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_layer/template.yaml +++ b/tests/integration/testdata/sync/nested_intrinsics/before/child_stack/child_layer/template.yaml @@ -14,9 +14,9 @@ Resources: Description: Hello World Layer ContentUri: layer/ CompatibleRuntimes: - - python3.7 + - python3.11 Metadata: - BuildMethod: python3.7 + BuildMethod: python3.11 Outputs: LayerName: diff --git a/tests/integration/validate/test_validate_command.py b/tests/integration/validate/test_validate_command.py index 3cd108572e8..fc26788aa0d 100644 --- a/tests/integration/validate/test_validate_command.py +++ b/tests/integration/validate/test_validate_command.py @@ -1,6 +1,7 @@ """ Integration tests for sam validate """ + import json import os import re diff --git a/tests/unit/commands/buildcmd/test_utils.py b/tests/unit/commands/buildcmd/test_utils.py index 20a79b3f0f3..2784f7c78c6 100644 --- a/tests/unit/commands/buildcmd/test_utils.py +++ b/tests/unit/commands/buildcmd/test_utils.py @@ -1,6 +1,7 @@ """ Unit tests for build command utils """ + from unittest import TestCase from unittest.mock import patch diff --git a/tests/unit/commands/delete/test_command.py b/tests/unit/commands/delete/test_command.py index 7a3ddeb37ed..46447596f47 100644 --- a/tests/unit/commands/delete/test_command.py +++ b/tests/unit/commands/delete/test_command.py @@ -25,8 +25,6 @@ def test_all_args(self, mock_delete_context, mock_delete_click): do_cli( stack_name=self.stack_name, region=self.region, - config_file=self.config_file, - config_env=self.config_env, profile=self.profile, no_prompts=self.no_prompts, s3_bucket=self.s3_bucket, @@ -37,8 +35,6 @@ def test_all_args(self, mock_delete_context, mock_delete_click): stack_name=self.stack_name, region=self.region, profile=self.profile, - config_file=self.config_file, - config_env=self.config_env, no_prompts=self.no_prompts, s3_bucket=self.s3_bucket, s3_prefix=self.s3_prefix, diff --git a/tests/unit/commands/delete/test_delete_context.py b/tests/unit/commands/delete/test_delete_context.py index d710f30ad5c..fce647808f7 100644 --- a/tests/unit/commands/delete/test_delete_context.py +++ b/tests/unit/commands/delete/test_delete_context.py @@ -28,8 +28,6 @@ def test_delete_context_stack_does_not_exist( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket=None, @@ -41,21 +39,17 @@ def test_delete_context_stack_does_not_exist( ] self.assertEqual(expected_click_echo_calls, patched_click_echo.call_args_list) - @patch.object(DeleteContext, "parse_config_file", MagicMock()) @patch.object(DeleteContext, "init_clients", MagicMock()) @patch("samcli.commands.delete.delete_context.get_boto_client_provider_with_config") def test_delete_context_enter(self, get_boto_client_provider_mock): with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket=None, s3_prefix=None, ) as delete_context: - self.assertEqual(delete_context.parse_config_file.call_count, 1) self.assertEqual(delete_context.init_clients.call_count, 1) @patch.object( @@ -73,26 +67,6 @@ def test_delete_context_enter(self, get_boto_client_provider_mock): ) ), ) - @patch("samcli.commands.delete.delete_context.click.get_current_context") - @patch("samcli.commands.delete.delete_context.get_boto_client_provider_with_config") - def test_delete_context_parse_config_file(self, get_boto_client_provider_mock, patched_click_get_current_context): - patched_click_get_current_context = MagicMock() - with DeleteContext( - stack_name=None, - region=None, - config_file="samconfig.toml", - config_env="default", - profile=None, - no_prompts=True, - s3_bucket=None, - s3_prefix=None, - ) as delete_context: - self.assertEqual(delete_context.stack_name, "test") - self.assertEqual(delete_context.region, "us-east-1") - self.assertEqual(delete_context.profile, "developer") - self.assertEqual(delete_context.s3_bucket, "s3-bucket") - self.assertEqual(delete_context.s3_prefix, "s3-prefix") - @patch("samcli.commands.delete.delete_context.prompt") @patch("samcli.commands.delete.delete_context.confirm") @patch("samcli.commands.delete.delete_context.click.get_current_context") @@ -105,8 +79,6 @@ def test_delete_no_user_input( with DeleteContext( stack_name=None, region=None, - config_file=None, - config_env=None, profile=None, no_prompts=None, s3_bucket=None, @@ -149,14 +121,12 @@ def test_delete_no_user_input( def test_delete_context_valid_execute_run(self, get_boto_client_provider_mock, patched_click_get_current_context): patched_click_get_current_context = MagicMock() with DeleteContext( - stack_name=None, + stack_name="test", region=None, - config_file="samconfig.toml", - config_env="default", profile=None, no_prompts=True, - s3_bucket=None, - s3_prefix=None, + s3_bucket="test", + s3_prefix="test", ) as delete_context: delete_context.run() @@ -181,8 +151,6 @@ def test_delete_context_no_s3_bucket( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket=None, @@ -226,8 +194,6 @@ def test_guided_prompts_s3_bucket_prefix_present_execute_run( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=None, s3_bucket=None, @@ -289,8 +255,6 @@ def test_guided_prompts_s3_bucket_present_no_prefix_execute_run( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=None, s3_bucket=None, @@ -344,8 +308,6 @@ def test_guided_prompts_ecr_companion_stack_present_execute_run( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=None, s3_bucket=None, @@ -428,8 +390,6 @@ def test_no_prompts_input_is_ecr_companion_stack_present_execute_run( with DeleteContext( stack_name="Companion-Stack-Name", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket=None, @@ -473,8 +433,6 @@ def test_retain_resources_delete_stack( with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket=None, @@ -490,14 +448,11 @@ def test_retain_resources_delete_stack( self.assertEqual(CfnUtils.delete_stack.call_count, 4) self.assertEqual(CfnUtils.wait_for_delete.call_count, 4) - @patch.object(DeleteContext, "parse_config_file", MagicMock()) @patch.object(DeleteContext, "init_clients", MagicMock()) def test_s3_option_flag(self): with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket="s3_bucket", @@ -521,15 +476,12 @@ def test_s3_option_flag(self): ) ), ) - @patch.object(DeleteContext, "parse_config_file", MagicMock()) @patch.object(DeleteContext, "init_clients", MagicMock()) @patch("samcli.commands.delete.delete_context.get_boto_client_provider_with_config") def test_s3_option_flag_overrides_config(self, get_boto_client_provider_mock): with DeleteContext( stack_name="test", region="us-east-1", - config_file="samconfig.toml", - config_env="default", profile="test", no_prompts=True, s3_bucket="s3_bucket_override", @@ -538,7 +490,6 @@ def test_s3_option_flag_overrides_config(self, get_boto_client_provider_mock): self.assertEqual(delete_context.s3_bucket, "s3_bucket_override") self.assertEqual(delete_context.s3_prefix, "s3_prefix_override") - @patch.object(DeleteContext, "parse_config_file", MagicMock()) @patch("samcli.commands.delete.delete_context.click.get_current_context") @patch("samcli.commands.delete.delete_context.get_boto_client_provider_with_config") def test_must_throw_error_if_boto3_cannot_resolve_credentials( @@ -550,8 +501,6 @@ def test_must_throw_error_if_boto3_cannot_resolve_credentials( with DeleteContext( stack_name="test", region=None, - config_file=None, - config_env=None, profile="profile_without_creds", no_prompts=True, s3_bucket=None, @@ -560,7 +509,6 @@ def test_must_throw_error_if_boto3_cannot_resolve_credentials( get_boto_client_provider_mock.assert_called_once_with(region=None, profile="profile_without_creds") self.assertIn("Unable to resolve credentials for the AWS SDK for Python client", ex) - @patch.object(DeleteContext, "parse_config_file", MagicMock()) @patch("samcli.commands.delete.delete_context.click.get_current_context") @patch("samcli.commands.delete.delete_context.get_boto_client_provider_with_config") def test_must_throw_error_if_boto3_cannot_resolve_region( @@ -572,8 +520,6 @@ def test_must_throw_error_if_boto3_cannot_resolve_region( with DeleteContext( stack_name="test", region=None, - config_file=None, - config_env=None, profile="profile_without_region", no_prompts=True, s3_bucket=None, diff --git a/tests/unit/commands/deploy/test_auth_utils.py b/tests/unit/commands/deploy/test_auth_utils.py index a5574c2c6fb..72f5123da4a 100644 --- a/tests/unit/commands/deploy/test_auth_utils.py +++ b/tests/unit/commands/deploy/test_auth_utils.py @@ -88,6 +88,35 @@ def test_auth_per_resource_defined_on_api_resource(self): _auth_per_resource = auth_per_resource([Stack("", "", "", {}, self.template_dict)]) self.assertEqual(_auth_per_resource, [("HelloWorldFunction", True)]) + def test_auth_per_resource_on_non_serverless_restapi(self): + self.template_dict["Resources"]["HelloWorldApi"] = OrderedDict( + [ + ("Type", "AWS::ApiGateway::RestApi"), + ("Properties", OrderedDict([("StageName", "Prod")])), + ] + ) + # setup the lambda function with a restapiId which has Auth defined. + self.template_dict["Resources"]["HelloWorldFunction"]["Properties"]["Events"]["HelloWorld"]["Properties"][ + "RestApiId" + ] = {"Ref": "HelloWorldApi"} + self.template_dict["Resources"]["HelloWorldFunction"]["Properties"]["Events"]["HelloWorld"]["Type"] = "Api" + _auth_per_resource = auth_per_resource([Stack("", "", "", {}, self.template_dict)]) + self.assertEqual(_auth_per_resource, [("HelloWorldFunction", True)]) + + def test_auth_per_resource_on_non_serverless_httpapi(self): + self.template_dict["Resources"]["HelloWorldApi"] = OrderedDict( + [ + ("Type", "AWS::ApiGatewayV2::Api"), + ] + ) + # setup the lambda function with a restapiId which has Auth defined. + self.template_dict["Resources"]["HelloWorldFunction"]["Properties"]["Events"]["HelloWorld"]["Properties"][ + "ApiId" + ] = {"Ref": "HelloWorldApi"} + self.template_dict["Resources"]["HelloWorldFunction"]["Properties"]["Events"]["HelloWorld"]["Type"] = "HttpApi" + _auth_per_resource = auth_per_resource([Stack("", "", "", {}, self.template_dict)]) + self.assertEqual(_auth_per_resource, [("HelloWorldFunction", True)]) + def test_auth_supplied_via_definition_body_uri(self): self.template_dict["Resources"]["HelloWorldApi"] = OrderedDict( [ diff --git a/tests/unit/commands/deploy/test_deploy_context.py b/tests/unit/commands/deploy/test_deploy_context.py index ad5638ef224..55dff41c94b 100644 --- a/tests/unit/commands/deploy/test_deploy_context.py +++ b/tests/unit/commands/deploy/test_deploy_context.py @@ -1,4 +1,5 @@ """Test sam deploy command""" + from unittest import TestCase from unittest.mock import ANY, patch, MagicMock, Mock import tempfile diff --git a/tests/unit/commands/deploy/test_guided_context.py b/tests/unit/commands/deploy/test_guided_context.py index a5137a781be..b52c8fbac51 100644 --- a/tests/unit/commands/deploy/test_guided_context.py +++ b/tests/unit/commands/deploy/test_guided_context.py @@ -35,10 +35,8 @@ def setUp(self): self.companion_stack_manager_mock.return_value.get_unreferenced_repos.return_value = [ self.unreferenced_repo_mock ] - self.companion_stack_manager_mock.return_value.get_repo_uri = ( - lambda repo: "123456789012.dkr.ecr.us-east-1.amazonaws.com/test2" - if repo == self.unreferenced_repo_mock - else None + self.companion_stack_manager_mock.return_value.get_repo_uri = lambda repo: ( + "123456789012.dkr.ecr.us-east-1.amazonaws.com/test2" if repo == self.unreferenced_repo_mock else None ) self.verify_image_patch = patch( diff --git a/tests/unit/commands/local/cli_common/test_invoke_context.py b/tests/unit/commands/local/cli_common/test_invoke_context.py index b89d5b61154..fce1c37f238 100644 --- a/tests/unit/commands/local/cli_common/test_invoke_context.py +++ b/tests/unit/commands/local/cli_common/test_invoke_context.py @@ -1,6 +1,7 @@ """ Tests the InvokeContext class """ + import errno import os @@ -630,6 +631,7 @@ def test_must_create_runner( aws_region="region", container_host=None, container_host_interface=None, + extra_hosts=None, ) result = self.context.local_lambda_runner @@ -708,6 +710,7 @@ def test_must_create_runner_using_warm_containers( aws_region="region", container_host=None, container_host_interface=None, + extra_hosts=None, ) result = self.context.local_lambda_runner @@ -792,6 +795,95 @@ def test_must_create_runner_with_container_host_option( aws_region="region", container_host="abcdef", container_host_interface="192.168.100.101", + extra_hosts=None, + ) + + result = self.context.local_lambda_runner + self.assertEqual(result, runner_mock) + # assert that lambda runner is created only one time, and the cached version used in the second call + self.assertEqual(LocalLambdaMock.call_count, 1) + + @patch("samcli.local.lambdafn.runtime.LambdaFunctionObserver") + @patch("samcli.commands.local.cli_common.invoke_context.LambdaImage") + @patch("samcli.commands.local.cli_common.invoke_context.LayerDownloader") + @patch("samcli.commands.local.cli_common.invoke_context.LambdaRuntime") + @patch("samcli.commands.local.cli_common.invoke_context.LocalLambdaRunner") + @patch("samcli.commands.local.cli_common.invoke_context.SamFunctionProvider") + def test_must_create_runner_with_extra_hosts_option( + self, + SamFunctionProviderMock, + LocalLambdaMock, + LambdaRuntimeMock, + download_layers_mock, + lambda_image_patch, + LambdaFunctionObserver_patch, + ): + runtime_mock = Mock() + LambdaRuntimeMock.return_value = runtime_mock + + runner_mock = Mock() + LocalLambdaMock.return_value = runner_mock + + download_mock = Mock() + download_layers_mock.return_value = download_mock + + image_mock = Mock() + lambda_image_patch.return_value = image_mock + + LambdaFunctionObserver_mock = Mock() + LambdaFunctionObserver_patch.return_value = LambdaFunctionObserver_mock + + cwd = "cwd" + self.context = InvokeContext( + template_file="template_file", + function_identifier="id", + env_vars_file="env_vars_file", + docker_volume_basedir="volumedir", + docker_network="network", + log_file="log_file", + skip_pull_image=True, + force_image_build=True, + debug_ports=[1111], + debugger_path="path-to-debugger", + debug_args="args", + aws_profile="profile", + aws_region="region", + container_host="abcdef", + add_host={"prod-na.host": "10.11.12.13", "gamma-na.host": "10.22.23.24"}, + ) + self.context.get_cwd = Mock() + self.context.get_cwd.return_value = cwd + + self.context._get_stacks = Mock() + self.context._get_stacks.return_value = [Mock()] + self.context._get_env_vars_value = Mock() + self.context._setup_log_file = Mock() + self.context._get_debug_context = Mock(return_value=None) + + container_manager_mock = Mock() + container_manager_mock.is_docker_reachable = PropertyMock(return_value=True) + self.context._get_container_manager = Mock(return_value=container_manager_mock) + + with self.context: + result = self.context.local_lambda_runner + self.assertEqual(result, runner_mock) + + LambdaRuntimeMock.assert_called_with(container_manager_mock, image_mock) + lambda_image_patch.assert_called_once_with(download_mock, True, True, invoke_images=None) + LocalLambdaMock.assert_called_with( + local_runtime=runtime_mock, + function_provider=ANY, + cwd=cwd, + debug_context=None, + env_vars_values=ANY, + aws_profile="profile", + aws_region="region", + container_host="abcdef", + container_host_interface=None, + extra_hosts={ + "prod-na.host": "10.11.12.13", + "gamma-na.host": "10.22.23.24", + }, ) result = self.context.local_lambda_runner @@ -875,6 +967,7 @@ def test_must_create_runner_with_invoke_image_option( aws_region="region", container_host=None, container_host_interface=None, + extra_hosts=None, ) result = self.context.local_lambda_runner diff --git a/tests/unit/commands/local/invoke/test_cli.py b/tests/unit/commands/local/invoke/test_cli.py index bf17f13cb94..a033905b8c7 100644 --- a/tests/unit/commands/local/invoke/test_cli.py +++ b/tests/unit/commands/local/invoke/test_cli.py @@ -43,6 +43,7 @@ def setUp(self): self.profile = "profile" self.container_host = "localhost" self.container_host_interface = "127.0.0.1" + self.add_host = (["prod-na.host:10.11.12.13"],) self.invoke_image = ("amazon/aws-sam-cli-emulation-image-python3.9",) self.hook_name = None @@ -72,6 +73,7 @@ def call_cli(self): shutdown=self.shutdown, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_image=self.invoke_image, hook_name=self.hook_name, ) @@ -108,6 +110,7 @@ def test_cli_must_setup_context_and_invoke(self, get_event_mock, InvokeContextMo aws_profile=self.profile, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_images={None: "amazon/aws-sam-cli-emulation-image-python3.9"}, ) @@ -147,6 +150,7 @@ def test_cli_must_invoke_with_no_event(self, get_event_mock, InvokeContextMock): aws_profile=self.profile, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_images={None: "amazon/aws-sam-cli-emulation-image-python3.9"}, ) diff --git a/tests/unit/commands/local/lib/swagger/test_parser.py b/tests/unit/commands/local/lib/swagger/test_parser.py index d854ca595ec..7af9041a4eb 100644 --- a/tests/unit/commands/local/lib/swagger/test_parser.py +++ b/tests/unit/commands/local/lib/swagger/test_parser.py @@ -1,6 +1,7 @@ """ Test the swagger parser """ + from unittest import TestCase from unittest.mock import ANY, patch, Mock @@ -232,6 +233,46 @@ def test_set_no_authorizer(self): self.assertEqual(results, expected_result) + def test_set_optional_authorizer(self): + function_name = "function" + payload_version = "1.0" + + swagger = { + "paths": { + "/path1": { + "get": { + "security": [{}], + "x-amazon-apigateway-integration": { + "type": "aws_proxy", + "uri": "someuri", + "payloadFormatVersion": payload_version, + }, + } + } + } + } + + parser = SwaggerParser(self.stack_path, swagger) + parser._get_integration_function_name = Mock(return_value=function_name) + parser._get_payload_format_version = Mock(return_value=payload_version) + + results = parser.get_routes() + print(results) + expected_result = [ + Route( + path="/path1", + methods=["get"], + function_name=function_name, + payload_format_version=payload_version, + stack_path=self.stack_path, + authorizer_name=None, + authorizer_object=None, + use_default_authorizer=False, + ), + ] + + self.assertEqual(results, expected_result) + def test_set_defined_authorizer(self): function_name = "function" payload_version = "1.0" diff --git a/tests/unit/commands/local/lib/test_local_api_service.py b/tests/unit/commands/local/lib/test_local_api_service.py index 4d2b10740b5..d054fa1c1ca 100644 --- a/tests/unit/commands/local/lib/test_local_api_service.py +++ b/tests/unit/commands/local/lib/test_local_api_service.py @@ -18,6 +18,7 @@ class TestLocalApiService_start(TestCase): def setUp(self): self.port = 123 self.host = "abc" + self.ssl_context = None self.static_dir = "static" self.cwd = "cwd" self.template = {"hello": "world"} @@ -50,7 +51,12 @@ def test_must_start_service(self, log_routes_mock, make_static_dir_mock, SamApiP # Now start the service local_service = LocalApiService( - self.lambda_invoke_context_mock, self.port, self.host, self.static_dir, self.disable_authorizer + self.lambda_invoke_context_mock, + self.port, + self.host, + self.static_dir, + self.disable_authorizer, + self.ssl_context, ) local_service.api_provider.api.routes = routing_list local_service.start() @@ -60,7 +66,7 @@ def test_must_start_service(self, log_routes_mock, make_static_dir_mock, SamApiP self.lambda_invoke_context_mock.stacks, cwd=self.cwd, disable_authorizer=self.disable_authorizer ) - log_routes_mock.assert_called_with(routing_list, self.host, self.port) + log_routes_mock.assert_called_with(routing_list, self.host, self.port, bool(self.ssl_context)) make_static_dir_mock.assert_called_with(self.cwd, self.static_dir) ApiGwServiceMock.assert_called_with( api=self.api_provider_mock.api, @@ -68,6 +74,7 @@ def test_must_start_service(self, log_routes_mock, make_static_dir_mock, SamApiP static_dir=static_dir_path, port=self.port, host=self.host, + ssl_context=self.ssl_context, stderr=self.stderr_mock, ) @@ -91,7 +98,12 @@ def test_must_raise_if_route_not_available( # Now start the service local_service = LocalApiService( - self.lambda_invoke_context_mock, self.port, self.host, self.static_dir, self.disable_authorizer + self.lambda_invoke_context_mock, + self.port, + self.host, + self.static_dir, + self.disable_authorizer, + self.ssl_context, ) local_service.api_provider.api.routes = routing_list with self.assertRaises(NoApisDefined): diff --git a/tests/unit/commands/local/lib/test_local_lambda.py b/tests/unit/commands/local/lib/test_local_lambda.py index 384771f7533..755e6acd0c9 100644 --- a/tests/unit/commands/local/lib/test_local_lambda.py +++ b/tests/unit/commands/local/lib/test_local_lambda.py @@ -1,6 +1,7 @@ """ Testing local lambda runner """ + import os import posixpath from unittest import TestCase @@ -572,6 +573,7 @@ def test_must_work(self, patched_validate_architecture_runtime): stderr=stderr, container_host=None, container_host_interface=None, + extra_hosts=None, ) @patch("samcli.commands.local.lib.local_lambda.validate_architecture_runtime") @@ -597,6 +599,7 @@ def test_must_work_packagetype_ZIP(self, patched_validate_architecture_runtime): stderr=stderr, container_host=None, container_host_interface=None, + extra_hosts=None, ) @patch("samcli.commands.local.lib.local_lambda.validate_architecture_runtime") @@ -680,6 +683,7 @@ def test_works_if_imageuri_and_Image_packagetype(self, patched_validate_architec stderr=stderr, container_host=None, container_host_interface=None, + extra_hosts=None, ) def test_must_raise_if_imageuri_not_found(self): @@ -759,6 +763,7 @@ def test_must_work(self, patched_validate_architecture_runtime): stderr=stderr, container_host="localhost", container_host_interface="127.0.0.1", + extra_hosts=None, ) diff --git a/tests/unit/commands/local/lib/test_local_lambda_service.py b/tests/unit/commands/local/lib/test_local_lambda_service.py index da28d4711ff..2c8a180f835 100644 --- a/tests/unit/commands/local/lib/test_local_lambda_service.py +++ b/tests/unit/commands/local/lib/test_local_lambda_service.py @@ -13,7 +13,9 @@ def test_initialization(self): lambda_invoke_context_mock.local_lambda_runner = lambda_runner_mock lambda_invoke_context_mock.stderr = stderr_mock - service = LocalLambdaService(lambda_invoke_context=lambda_invoke_context_mock, port=3000, host="localhost") + service = LocalLambdaService( + lambda_invoke_context=lambda_invoke_context_mock, port=3000, host="localhost", ssl_context=None + ) self.assertEqual(service.port, 3000) self.assertEqual(service.host, "localhost") @@ -32,12 +34,14 @@ def test_start(self, local_lambda_invoke_service_mock): lambda_invoke_context_mock.local_lambda_runner = lambda_runner_mock lambda_invoke_context_mock.stderr = stderr_mock - service = LocalLambdaService(lambda_invoke_context=lambda_invoke_context_mock, port=3000, host="localhost") + service = LocalLambdaService( + lambda_invoke_context=lambda_invoke_context_mock, port=3000, host="localhost", ssl_context=None + ) service.start() local_lambda_invoke_service_mock.assert_called_once_with( - lambda_runner=lambda_runner_mock, port=3000, host="localhost", stderr=stderr_mock + lambda_runner=lambda_runner_mock, port=3000, host="localhost", stderr=stderr_mock, ssl_context=None ) lambda_context_mock.create.assert_called_once() lambda_context_mock.run.assert_called_once() diff --git a/tests/unit/commands/local/start_api/test_cli.py b/tests/unit/commands/local/start_api/test_cli.py index 57ae7641338..1860dd66c09 100644 --- a/tests/unit/commands/local/start_api/test_cli.py +++ b/tests/unit/commands/local/start_api/test_cli.py @@ -48,7 +48,10 @@ def setUp(self): self.host = "host" self.port = 123 + self.ssl_cert_file = None + self.ssl_key_file = None self.static_dir = "staticdir" + self.add_host = [] self.container_host = "localhost" self.container_host_interface = "127.0.0.1" @@ -92,6 +95,7 @@ def test_cli_must_setup_context_and_start_service(self, local_api_service_mock, shutdown=self.shutdown, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_images={}, ) @@ -99,6 +103,7 @@ def test_cli_must_setup_context_and_start_service(self, local_api_service_mock, lambda_invoke_context=context_mock, port=self.port, host=self.host, + ssl_context=None, static_dir=self.static_dir, disable_authorizer=self.disable_authorizer, ) @@ -219,5 +224,8 @@ def call_cli(self): container_host_interface=self.container_host_interface, invoke_image=self.invoke_image, hook_name=self.hook_name, + ssl_cert_file=self.ssl_cert_file, + ssl_key_file=self.ssl_key_file, disable_authorizer=self.disable_authorizer, + add_host=self.add_host, ) diff --git a/tests/unit/commands/local/start_lambda/test_cli.py b/tests/unit/commands/local/start_lambda/test_cli.py index 4eb6dcdaeb1..aa779ed871a 100644 --- a/tests/unit/commands/local/start_lambda/test_cli.py +++ b/tests/unit/commands/local/start_lambda/test_cli.py @@ -42,6 +42,7 @@ def setUp(self): self.container_host = "localhost" self.container_host_interface = "127.0.0.1" + self.add_host = {} self.invoke_image = () self.hook_name = None @@ -81,6 +82,7 @@ def test_cli_must_setup_context_and_start_service(self, local_lambda_service_moc shutdown=self.shutdown, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_images={}, ) @@ -180,6 +182,7 @@ def call_cli(self): shutdown=self.shutdown, container_host=self.container_host, container_host_interface=self.container_host_interface, + add_host=self.add_host, invoke_image=self.invoke_image, hook_name=self.hook_name, ) diff --git a/tests/unit/commands/package/test_package_context.py b/tests/unit/commands/package/test_package_context.py index 682dfba17cb..8de0e0fd76c 100644 --- a/tests/unit/commands/package/test_package_context.py +++ b/tests/unit/commands/package/test_package_context.py @@ -1,4 +1,5 @@ """Test sam package command""" + from unittest import TestCase from unittest.mock import patch, MagicMock, Mock, call, ANY from parameterized import parameterized diff --git a/tests/unit/commands/publish/test_command.py b/tests/unit/commands/publish/test_command.py index ce0c124040b..47bb2d53c47 100644 --- a/tests/unit/commands/publish/test_command.py +++ b/tests/unit/commands/publish/test_command.py @@ -1,4 +1,5 @@ """Test sam publish CLI.""" + import json from unittest import TestCase from unittest.mock import patch, call, Mock @@ -30,7 +31,7 @@ def setUp(self): def test_must_raise_if_invalid_template(self, exception_to_raise, click_mock, get_template_data_mock): get_template_data_mock.side_effect = exception_to_raise("Template not found") with self.assertRaises(exception_to_raise) as context: - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) message = str(context.exception) self.assertEqual("Template not found", message) @@ -42,7 +43,7 @@ def test_must_raise_if_invalid_template(self, exception_to_raise, click_mock, ge def test_must_raise_if_serverlessrepo_error(self, click_mock, publish_application_mock): publish_application_mock.side_effect = ServerlessRepoError() with self.assertRaises(UserException): - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) click_mock.secho.assert_called_with("Publish Failed", fg="red") @@ -52,7 +53,7 @@ def test_must_raise_if_serverlessrepo_error(self, click_mock, publish_applicatio def test_must_raise_if_invalid_S3_uri_error(self, click_mock, publish_application_mock): publish_application_mock.side_effect = InvalidS3UriError(message="") with self.assertRaises(UserException) as context: - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) message = str(context.exception) self.assertTrue("Your SAM template contains invalid S3 URIs" in message) @@ -68,7 +69,7 @@ def test_must_succeed_to_create_application(self, click_mock, publish_applicatio "actions": [CREATE_APPLICATION], } - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) details_str = json.dumps({"attr1": "value1"}, indent=2) expected_msg = "Created new application with the following metadata:\n{}" expected_link = self.console_link.format(self.ctx_mock.region, self.application_id.replace("/", "~")) @@ -90,7 +91,7 @@ def test_must_succeed_to_update_application(self, click_mock, publish_applicatio "actions": [UPDATE_APPLICATION], } - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) details_str = json.dumps({"attr1": "value1"}, indent=2) expected_msg = 'The following metadata of application "{}" has been updated:\n{}' expected_link = self.console_link.format(self.ctx_mock.region, self.application_id.replace("/", "~")) @@ -118,7 +119,7 @@ def test_print_console_link_if_context_region_not_set(self, click_mock, boto3_mo session_mock.region_name = "us-west-1" boto3_mock.Session.return_value = session_mock - publish_cli(self.ctx_mock, self.template, None) + publish_cli(self.ctx_mock, self.template, None, False) expected_link = self.console_link.format(session_mock.region_name, self.application_id.replace("/", "~")) click_mock.secho.assert_called_with(expected_link, fg="yellow") @@ -128,8 +129,8 @@ def test_must_use_template_semantic_version(self, publish_application_mock, get_ template_data = {METADATA: {SERVERLESS_REPO_APPLICATION: {SEMANTIC_VERSION: "0.1"}}} get_template_data_mock.return_value = template_data publish_application_mock.return_value = {"application_id": self.application_id, "details": {}, "actions": {}} - publish_cli(self.ctx_mock, self.template, None) - publish_application_mock.assert_called_with(template_data) + publish_cli(self.ctx_mock, self.template, None, False) + publish_application_mock.assert_called_with(template=template_data, fail_on_same_version=False) @patch("samcli.commands.publish.command.get_template_data") @patch("samcli.vendor.serverlessrepo.publish_application") @@ -138,6 +139,6 @@ def test_must_override_template_semantic_version(self, publish_application_mock, get_template_data_mock.return_value = template_data publish_application_mock.return_value = {"application_id": self.application_id, "details": {}, "actions": {}} - publish_cli(self.ctx_mock, self.template, "0.2") + publish_cli(self.ctx_mock, self.template, "0.2", False) expected_template_data = {METADATA: {SERVERLESS_REPO_APPLICATION: {SEMANTIC_VERSION: "0.2"}}} - publish_application_mock.assert_called_with(expected_template_data) + publish_application_mock.assert_called_with(template=expected_template_data, fail_on_same_version=False) diff --git a/tests/unit/commands/samconfig/test_samconfig.py b/tests/unit/commands/samconfig/test_samconfig.py index eaeaa54b8a7..04597bcb5f0 100644 --- a/tests/unit/commands/samconfig/test_samconfig.py +++ b/tests/unit/commands/samconfig/test_samconfig.py @@ -393,6 +393,7 @@ def test_local_invoke(self, do_cli_mock): {"Key": "Value", "Key2": "Value2"}, "localhost", "127.0.0.1", + {}, ("image",), None, ) @@ -459,8 +460,11 @@ def test_local_start_api(self, do_cli_mock): None, "localhost", "127.0.0.1", + {}, ("image",), None, + None, + None, ) @patch("samcli.commands.local.start_lambda.cli.do_cli") @@ -521,6 +525,7 @@ def test_local_start_lambda(self, do_cli_mock): None, "localhost", "127.0.0.1", + {}, ("image",), None, ) @@ -906,7 +911,7 @@ def test_publish(self, do_cli_mock): LOG.exception("Command failed", exc_info=result.exc_info) self.assertIsNone(result.exception) - do_cli_mock.assert_called_with(ANY, str(Path(os.getcwd(), "mytemplate.yaml")), "0.1.1") + do_cli_mock.assert_called_with(ANY, str(Path(os.getcwd(), "mytemplate.yaml")), "0.1.1", False) @patch("samcli.cli.main.gather_system_info") @patch("samcli.cli.main.gather_additional_dependencies_info") @@ -1057,7 +1062,9 @@ def test_override_with_cli_params(self, do_cli_mock): } # NOTE: Because we don't load the full Click BaseCommand here, this is mounted as top-level command - with samconfig_parameters(["start-lambda"], self.scratch_dir, **config_values) as config_path: + with samconfig_parameters( + ["start-lambda"], self.scratch_dir, **config_values + ) as config_path, tempfile.NamedTemporaryFile() as key_file, tempfile.NamedTemporaryFile() as cert_file: from samcli.commands.local.start_lambda.cli import cli LOG.debug(Path(config_path).read_text()) @@ -1133,6 +1140,7 @@ def test_override_with_cli_params(self, do_cli_mock): None, "localhost", "127.0.0.1", + {}, ("image",), None, ) @@ -1159,7 +1167,9 @@ def test_override_with_cli_params_and_envvars(self, do_cli_mock): } # NOTE: Because we don't load the full Click BaseCommand here, this is mounted as top-level command - with samconfig_parameters(["start-lambda"], self.scratch_dir, **config_values) as config_path: + with samconfig_parameters( + ["start-lambda"], self.scratch_dir, **config_values + ) as config_path, tempfile.NamedTemporaryFile() as key_file, tempfile.NamedTemporaryFile() as cert_file: from samcli.commands.local.start_lambda.cli import cli LOG.debug(Path(config_path).read_text()) @@ -1227,6 +1237,7 @@ def test_override_with_cli_params_and_envvars(self, do_cli_mock): None, "localhost", "127.0.0.1", + {}, ("image",), None, ) diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/prepare_base.py b/tests/unit/hook_packages/terraform/hooks/prepare/prepare_base.py index 96193fa757b..a65a9c3e616 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/prepare_base.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/prepare_base.py @@ -1,6 +1,7 @@ """ Unit test base class for Terraform prepare hook """ + from unittest import TestCase from samcli.hook_packages.terraform.hooks.prepare.translate import AWS_PROVIDER_NAME, NULL_RESOURCE_PROVIDER_NAME diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_enrich.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_enrich.py index 9ae96eb42b2..5a214910787 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_enrich.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_enrich.py @@ -1,4 +1,5 @@ """Test Terraform prepare enrichment""" + from unittest.mock import Mock, call, patch from parameterized import parameterized from subprocess import CalledProcessError diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_hook.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_hook.py index a9153c99147..ef56f14df8a 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_hook.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_hook.py @@ -1,4 +1,5 @@ """Test Terraform prepare hook""" + from subprocess import CalledProcessError from unittest.mock import Mock, call, patch, MagicMock, ANY from parameterized import parameterized diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_makefile_generator.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_makefile_generator.py index 3aa4a599325..98cab696128 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_makefile_generator.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_makefile_generator.py @@ -1,4 +1,5 @@ """Test Terraform prepare Makefile""" + from unittest.mock import patch, Mock, call from parameterized import parameterized diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_property_builder.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_property_builder.py index 6e8cbfdb4ad..3278c0224e6 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_property_builder.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_property_builder.py @@ -1,4 +1,5 @@ """Test Terraform property builder""" + import json from unittest.mock import patch, Mock, call from parameterized import parameterized diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_translate.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_translate.py index ea5239f72da..0c664c4697b 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_translate.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_translate.py @@ -1,4 +1,5 @@ """Test Terraform prepare translate""" + import copy from unittest import TestCase from unittest.mock import Mock, call, patch, MagicMock, ANY diff --git a/tests/unit/hook_packages/terraform/hooks/prepare/test_types.py b/tests/unit/hook_packages/terraform/hooks/prepare/test_types.py index 16de4bd21e2..1ac534b5ba3 100644 --- a/tests/unit/hook_packages/terraform/hooks/prepare/test_types.py +++ b/tests/unit/hook_packages/terraform/hooks/prepare/test_types.py @@ -1,4 +1,5 @@ """Test types""" + from unittest import TestCase from unittest.mock import patch, Mock diff --git a/tests/unit/hook_packages/terraform/lib/test_utils.py b/tests/unit/hook_packages/terraform/lib/test_utils.py index bfda8d97ebc..8a7bd9c98d8 100644 --- a/tests/unit/hook_packages/terraform/lib/test_utils.py +++ b/tests/unit/hook_packages/terraform/lib/test_utils.py @@ -1,4 +1,5 @@ """Test Terraform utilities""" + from unittest import TestCase from unittest.mock import patch, Mock, call from parameterized import parameterized diff --git a/tests/unit/lib/build_module/test_build_strategy.py b/tests/unit/lib/build_module/test_build_strategy.py index 5b2f3f7d771..086a67bd787 100644 --- a/tests/unit/lib/build_module/test_build_strategy.py +++ b/tests/unit/lib/build_module/test_build_strategy.py @@ -56,7 +56,9 @@ def setUp(self): self.build_graph.put_function_build_definition(self.function_build_definition2, self.function2) self.layer1 = Mock() + self.layer1.compatible_architectures = None self.layer2 = Mock() + self.layer2.compatible_architectures = None self.layer_build_definition1 = LayerBuildDefinition("layer1", "codeuri", "build_method", [], X86_64) self.layer_build_definition2 = LayerBuildDefinition("layer2", "codeuri", "build_method", [], X86_64) @@ -699,6 +701,7 @@ def test_assert_incremental_build_layer(self, patched_manifest_hash, patched_os, given_layer_build_def = Mock( manifest_hash=build_toml_manifest_hash, functions=[Mock()], dependencies_dir=dependency_dir ) + given_layer_build_def.layer.compatible_architectures = None self.build_graph.get_function_build_definitions.return_value = [] self.build_graph.get_layer_build_definitions.return_value = [given_layer_build_def] diff --git a/tests/unit/lib/cli_validation/test_remote_invoke_options_validations.py b/tests/unit/lib/cli_validation/test_remote_invoke_options_validations.py index 32f9f72860c..1acba0f7f41 100644 --- a/tests/unit/lib/cli_validation/test_remote_invoke_options_validations.py +++ b/tests/unit/lib/cli_validation/test_remote_invoke_options_validations.py @@ -83,8 +83,8 @@ def test_event_and_remote_event_params(self, patched_click_context): mocked_context = Mock() patched_click_context.return_value = mocked_context - mocked_context.params.get.side_effect = ( - lambda key: "event_content" if key in ("event", "test_event_name") else None + mocked_context.params.get.side_effect = lambda key: ( + "event_content" if key in ("event", "test_event_name") else None ) with self.assertRaises(BadOptionUsage) as ex: @@ -102,8 +102,8 @@ def test_event_file_and_remote_event_params(self, patched_click_context): mocked_context = Mock() patched_click_context.return_value = mocked_context - mocked_context.params.get.side_effect = ( - lambda key: "event_content" if key in ("event_file", "test_event_name") else None + mocked_context.params.get.side_effect = lambda key: ( + "event_content" if key in ("event_file", "test_event_name") else None ) with self.assertRaises(BadOptionUsage) as ex: diff --git a/tests/unit/lib/hook/test_hook_config.py b/tests/unit/lib/hook/test_hook_config.py index ef4a05ebd7f..4603b13a03e 100644 --- a/tests/unit/lib/hook/test_hook_config.py +++ b/tests/unit/lib/hook/test_hook_config.py @@ -1,4 +1,5 @@ """Test Hook Package Config""" + import json from copy import deepcopy from unittest import TestCase diff --git a/tests/unit/lib/hook/test_hook_wrapper.py b/tests/unit/lib/hook/test_hook_wrapper.py index 370d9f1dbef..9541c031dc2 100644 --- a/tests/unit/lib/hook/test_hook_wrapper.py +++ b/tests/unit/lib/hook/test_hook_wrapper.py @@ -1,4 +1,5 @@ """Test Hook Warpper""" + from pathlib import Path from unittest import TestCase from unittest.mock import patch, Mock diff --git a/tests/unit/lib/observability/cw_logs/test_cw_log_group_provider.py b/tests/unit/lib/observability/cw_logs/test_cw_log_group_provider.py index ac7cd0843cf..23a753ed193 100644 --- a/tests/unit/lib/observability/cw_logs/test_cw_log_group_provider.py +++ b/tests/unit/lib/observability/cw_logs/test_cw_log_group_provider.py @@ -1,5 +1,5 @@ from unittest import TestCase -from unittest.mock import Mock, ANY +from unittest.mock import Mock, ANY, call from parameterized import parameterized @@ -26,6 +26,9 @@ def test_must_return_custom_log_group_name(self): result = LogGroupProvider.for_lambda_function(given_client_provider, "my_function_name") self.assertEqual(expected, result) + given_client_provider.assert_has_calls( + [call("lambda").get_function_configuration(FunctionName="my_function_name")] + ) def test_must_return_default_log_group_name_with_exception_raised(self): expected = "/aws/lambda/my_function_name" diff --git a/tests/unit/lib/utils/test_path_utils.py b/tests/unit/lib/utils/test_path_utils.py index e15ec8ea65d..c22458269d9 100644 --- a/tests/unit/lib/utils/test_path_utils.py +++ b/tests/unit/lib/utils/test_path_utils.py @@ -1,6 +1,7 @@ """ test path_utils module """ + from unittest import TestCase from parameterized import parameterized diff --git a/tests/unit/lib/utils/test_stream_writer.py b/tests/unit/lib/utils/test_stream_writer.py index 0459a44c0ed..c586e48a428 100644 --- a/tests/unit/lib/utils/test_stream_writer.py +++ b/tests/unit/lib/utils/test_stream_writer.py @@ -1,8 +1,8 @@ """ Tests for StreamWriter """ -import io +from io import BytesIO, TextIOWrapper from unittest import TestCase from samcli.lib.utils.stream_writer import StreamWriter @@ -20,6 +20,35 @@ def test_must_write_to_stream(self): stream_mock.write.assert_called_once_with(buffer.decode("utf-8")) + def test_must_write_to_stream_bytes(self): + img_bytes = b"\xff\xab\x11" + stream_mock = Mock() + byte_stream_mock = Mock(spec=BytesIO) + + writer = StreamWriter(stream_mock, byte_stream_mock) + writer.write_bytes(img_bytes) + + byte_stream_mock.write.assert_called_once_with(img_bytes) + + def test_must_write_to_stream_bytes_for_stdout(self): + img_bytes = b"\xff\xab\x11" + stream_mock = Mock() + byte_stream_mock = Mock(spec=TextIOWrapper) + + writer = StreamWriter(stream_mock, byte_stream_mock) + writer.write_bytes(img_bytes) + + byte_stream_mock.buffer.write.assert_called_once_with(img_bytes) + + def test_must_not_write_to_stream_bytes_if_not_defined(self): + img_bytes = b"\xff\xab\x11" + stream_mock = Mock() + + writer = StreamWriter(stream_mock) + writer.write_bytes(img_bytes) + + stream_mock.write.assert_not_called() + def test_must_flush_underlying_stream(self): stream_mock = Mock() writer = StreamWriter(stream_mock) @@ -44,7 +73,7 @@ def test_when_auto_flush_on_flush_after_each_write(self): lines = ["first", "second", "third"] - writer = StreamWriter(stream_mock, True) + writer = StreamWriter(stream_mock, auto_flush=True) for line in lines: writer.write_str(line) diff --git a/tests/unit/local/apigw/test_local_apigw_service.py b/tests/unit/local/apigw/test_local_apigw_service.py index e77ce996aca..c3442aaf06f 100644 --- a/tests/unit/local/apigw/test_local_apigw_service.py +++ b/tests/unit/local/apigw/test_local_apigw_service.py @@ -123,6 +123,7 @@ def test_api_request_must_invoke_lambda(self, v2_event_mock, v1_event_mock, requ stage_name=ANY, stage_variables=ANY, operation_name="getRestApi", + api_type=Route.API, ) @patch.object(LocalApigwService, "get_request_methods_endpoints") @@ -190,6 +191,7 @@ def test_http_v1_payload_request_must_invoke_lambda(self, v2_event_mock, v1_even stage_name=ANY, stage_variables=ANY, operation_name=None, + api_type=Route.HTTP, ) @patch.object(LocalApigwService, "get_request_methods_endpoints") diff --git a/tests/unit/local/docker/test_container.py b/tests/unit/local/docker/test_container.py index cdcf22c5d96..b181ce33fa0 100644 --- a/tests/unit/local/docker/test_container.py +++ b/tests/unit/local/docker/test_container.py @@ -1,6 +1,8 @@ """ Unit test for Container class """ + +import base64 import json from unittest import TestCase from unittest.mock import MagicMock, Mock, call, patch, ANY @@ -584,22 +586,77 @@ def setUp(self): self.socket_mock = Mock() self.socket_mock.connect_ex.return_value = 0 + @patch("socket.socket") + @patch("samcli.local.docker.container.requests") + def test_wait_for_result_no_error_image_response(self, mock_requests, patched_socket): + self.container.is_created.return_value = True + + rie_response = b"\xff\xab" + resp_headers = { + "Date": "Tue, 02 Jan 2024 21:23:31 GMT", + "Content-Type": "image/jpeg", + "Transfer-Encoding": "chunked", + } + + real_container_mock = Mock() + self.mock_docker_client.containers.get.return_value = real_container_mock + + output_itr = Mock() + real_container_mock.attach.return_value = output_itr + self.container._write_container_output = Mock() + self.container._create_threading_event = Mock() + self.container._create_threading_event.return_value = Mock() + + stdout_mock = Mock() + stdout_mock.write_bytes = Mock() + stderr_mock = Mock() + response = Mock() + response.content = rie_response + response.headers = resp_headers + mock_requests.post.return_value = response + + patched_socket.return_value = self.socket_mock + + start_timer = Mock() + timer = Mock() + start_timer.return_value = timer + + self.container.wait_for_result( + event=self.event, full_path=self.name, stdout=stdout_mock, stderr=stderr_mock, start_timer=start_timer + ) + + # since we passed in a start_timer function, ensure it's called and + # the timer is cancelled once execution is done + start_timer.assert_called() + timer.cancel.assert_called() + + # make sure we wait for the same host+port that we make the post request to + host = self.container._container_host + port = self.container.rapid_port_host + self.socket_mock.connect_ex.assert_called_with((host, port)) + mock_requests.post.assert_called_with( + self.container.URL.format(host=host, port=port, function_name="function"), + data=b"{}", + timeout=(self.container.RAPID_CONNECTION_TIMEOUT, None), + ) + stdout_mock.write_bytes.assert_called_with(rie_response) + @parameterized.expand( [ - ( - True, - b'{"hello":"world"}', - ), + (True, b'{"hello":"world"}', {"Date": "Tue, 02 Jan 2024 21:23:31 GMT", "Content-Type": "text"}), ( False, b"non-json-deserializable", + {"Date": "Tue, 02 Jan 2024 21:23:31 GMT", "Content-Type": "text/plain"}, ), - (False, b""), + (False, b"", {"Date": "Tue, 02 Jan 2024 21:23:31 GMT", "Content-Type": "text/plain"}), ] ) @patch("socket.socket") @patch("samcli.local.docker.container.requests") - def test_wait_for_result_no_error(self, response_deserializable, rie_response, mock_requests, patched_socket): + def test_wait_for_result_no_error( + self, response_deserializable, rie_response, resp_headers, mock_requests, patched_socket + ): self.container.is_created.return_value = True real_container_mock = Mock() @@ -616,6 +673,7 @@ def test_wait_for_result_no_error(self, response_deserializable, rie_response, m stderr_mock = Mock() response = Mock() response.content = rie_response + response.headers = resp_headers mock_requests.post.return_value = response patched_socket.return_value = self.socket_mock @@ -988,7 +1046,7 @@ def test_real_container_is_running_return_true(self): class TestContainer_create_mapped_symlink_files(TestCase): def setUp(self): - self.container = Container(Mock(), Mock(), Mock(), Mock(), docker_client=Mock()) + self.container = Container(Mock(), Mock(), Mock(), "host_dir", docker_client=Mock()) self.mock_symlinked_file = MagicMock() self.mock_symlinked_file.is_symlink.return_value = True @@ -996,12 +1054,21 @@ def setUp(self): self.mock_regular_file = MagicMock() self.mock_regular_file.is_symlink.return_value = False + @patch("samcli.local.docker.container.pathlib.Path.exists") @patch("samcli.local.docker.container.os.scandir") - def test_no_symlinks_returns_empty(self, mock_scandir): + def test_no_symlinks_returns_empty(self, mock_scandir, mock_exists): mock_context = MagicMock() mock_context.__enter__ = Mock(return_value=[self.mock_regular_file]) mock_scandir.return_value = mock_context + mock_exists.return_value = True + + volumes = self.container._create_mapped_symlink_files() + self.assertEqual(volumes, {}) + + @patch("samcli.local.docker.container.pathlib.Path.exists") + def test_host_dir_does_not_exist_returns_empty_symlinks(self, mock_exists): + mock_exists.return_value = False volumes = self.container._create_mapped_symlink_files() self.assertEqual(volumes, {}) diff --git a/tests/unit/local/docker/test_container_analyzer.py b/tests/unit/local/docker/test_container_analyzer.py new file mode 100644 index 00000000000..9832bd83adf --- /dev/null +++ b/tests/unit/local/docker/test_container_analyzer.py @@ -0,0 +1,69 @@ +from unittest import TestCase +from unittest.mock import Mock, patch + +from samcli.lib.utils.packagetype import IMAGE +from samcli.local.docker.container import Container +from samcli.local.docker.container_analyzer import ContainerAnalyzer, ContainerState +from samcli.local.docker.manager import ContainerManager + + +class TestContainerAnalyzer(TestCase): + def setUp(self) -> None: + self.image = IMAGE + self.cmd = "cmd" + self.working_dir = "working_dir" + self.host_dir = "host_dir" + self.memory_mb = 123 + self.exposed_ports = {123: 123} + self.entrypoint = ["a", "b", "c"] + self.env_vars = {"key": "value"} + + self.mock_docker_client = Mock() + + self.container = Container( + self.image, + self.cmd, + self.working_dir, + self.host_dir, + self.memory_mb, + self.exposed_ports, + self.entrypoint, + self.env_vars, + self.mock_docker_client, + ) + + @patch("samcli.local.docker.container_analyzer.LOG") + def test_inspect_returns_container_state(self, mock_log): + self.container.id = "id" + manager = ContainerManager() + manager.inspect = Mock() + manager.inspect.return_value = {"State": {"OOMKilled": True}} + + analyzer = ContainerAnalyzer(container_manager=manager, container=self.container) + state = analyzer.inspect() + + manager.inspect.assert_called_once_with("id") + mock_log.debug.assert_called_once_with("[Container state] OOMKilled %s", True) + self.assertEqual(state, ContainerState(out_of_memory=True)) + + def test_inspect_no_container_id(self): + manager = ContainerManager() + manager.inspect = Mock() + + analyzer = ContainerAnalyzer(container_manager=manager, container=self.container) + state = analyzer.inspect() + + manager.inspect.assert_not_called() + self.assertEqual(state, ContainerState(out_of_memory=False)) + + def test_inspect_docker_call_fails(self): + self.container.id = "id" + manager = ContainerManager() + manager.inspect = Mock() + manager.inspect.return_value = False + + analyzer = ContainerAnalyzer(container_manager=manager, container=self.container) + state = analyzer.inspect() + + manager.inspect.assert_called_once_with("id") + self.assertEqual(state, ContainerState(out_of_memory=False)) diff --git a/tests/unit/local/docker/test_effective_user.py b/tests/unit/local/docker/test_effective_user.py index cdb255bbb58..126cf41ea22 100644 --- a/tests/unit/local/docker/test_effective_user.py +++ b/tests/unit/local/docker/test_effective_user.py @@ -1,6 +1,7 @@ """ Unit test for EffectiveUser class """ + from unittest import TestCase from unittest.mock import patch diff --git a/tests/unit/local/docker/test_lambda_build_container.py b/tests/unit/local/docker/test_lambda_build_container.py index e260a147040..d62c52e8934 100644 --- a/tests/unit/local/docker/test_lambda_build_container.py +++ b/tests/unit/local/docker/test_lambda_build_container.py @@ -1,6 +1,7 @@ """ Unit test for Lambda Build Container management """ + import itertools import json import pathlib diff --git a/tests/unit/local/docker/test_lambda_container.py b/tests/unit/local/docker/test_lambda_container.py index 1307ca87341..e7e47b5f14b 100644 --- a/tests/unit/local/docker/test_lambda_container.py +++ b/tests/unit/local/docker/test_lambda_container.py @@ -1,6 +1,7 @@ """ Unit test for Lambda container management """ + from unittest import TestCase from unittest.mock import patch, Mock diff --git a/tests/unit/local/docker/test_manager.py b/tests/unit/local/docker/test_manager.py index 4cb42bbd02e..84c6f13a6dc 100644 --- a/tests/unit/local/docker/test_manager.py +++ b/tests/unit/local/docker/test_manager.py @@ -1,12 +1,15 @@ """ Tests container manager """ + import importlib from unittest import TestCase from unittest.mock import Mock, patch, MagicMock, ANY, call import requests from docker.errors import APIError, ImageNotFound + +import docker from samcli.local.docker.manager import ContainerManager, DockerImagePullFailedException from samcli.local.docker.lambda_image import RAPID_IMAGE_TAG_PREFIX @@ -384,3 +387,25 @@ def test_must_call_delete_on_container(self): manager.stop(container) container.delete.assert_called_with() + + +class TestContainerManager_inspect(TestCase): + def test_must_call_inspect_on_container(self): + manager = ContainerManager() + manager.docker_client = Mock() + + container = "container_id" + + manager.inspect(container) + manager.docker_client.docker_client.api.inspect_container(container) + + @patch("samcli.local.docker.manager.LOG") + def test_must_fail_with_error_message(self, mock_log): + manager = ContainerManager() + manager.docker_client.api.inspect_container = Mock() + manager.docker_client.api.inspect_container.side_effect = [docker.errors.APIError("Failed")] + + return_val = manager.inspect("container_id") + + self.assertEqual(return_val, False) + mock_log.debug.assert_called_once_with("Failed to call Docker inspect: %s", "Failed") diff --git a/tests/unit/local/events/test_api_event.py b/tests/unit/local/events/test_api_event.py index e4e3d26e65e..6cd3e6c3b0a 100644 --- a/tests/unit/local/events/test_api_event.py +++ b/tests/unit/local/events/test_api_event.py @@ -3,6 +3,7 @@ from time import time from datetime import datetime +from samcli.local.apigw.route import Route from samcli.local.events.api_event import ( ContextIdentity, @@ -335,7 +336,6 @@ def test_to_dict(self): ) expected = { - "version": "1.0", "httpMethod": "request_method", "body": "request_data", "resource": "resource", @@ -355,6 +355,26 @@ def test_to_dict(self): def test_to_dict_with_defaults(self): event = ApiGatewayLambdaEvent() + expected = { + "httpMethod": None, + "body": None, + "resource": None, + "requestContext": {}, + "queryStringParameters": None, + "multiValueQueryStringParameters": None, + "headers": None, + "multiValueHeaders": None, + "pathParameters": None, + "stageVariables": None, + "path": None, + "isBase64Encoded": False, + } + + self.assertEqual(event.to_dict(), expected) + + def test_to_dict_with_http_v1(self): + event = ApiGatewayLambdaEvent(api_type=Route.HTTP) + expected = { "version": "1.0", "httpMethod": None, diff --git a/tests/unit/local/lambda_service/test_local_lambda_invoke_service.py b/tests/unit/local/lambda_service/test_local_lambda_invoke_service.py index 684e72f00c5..e338762db9b 100644 --- a/tests/unit/local/lambda_service/test_local_lambda_invoke_service.py +++ b/tests/unit/local/lambda_service/test_local_lambda_invoke_service.py @@ -135,7 +135,7 @@ def test_request_handler_returns_process_stdout_when_making_response( result = service._invoke_request_handler(function_name="HelloWorld") self.assertEqual(result, "request response") - lambda_output_parser_mock.get_lambda_output.assert_called_with(ANY) + lambda_output_parser_mock.get_lambda_output.assert_called_with(ANY, ANY) @patch("samcli.local.lambda_service.local_lambda_invoke_service.LambdaErrorResponses") def test_construct_error_handling(self, lambda_error_response_mock): diff --git a/tests/unit/local/lambdafn/test_runtime.py b/tests/unit/local/lambdafn/test_runtime.py index 42087ebd000..142ce362086 100644 --- a/tests/unit/local/lambdafn/test_runtime.py +++ b/tests/unit/local/lambdafn/test_runtime.py @@ -91,6 +91,7 @@ def test_must_create_lambda_container(self, LambdaContainerMock, LogMock): memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) # Run the container and get results @@ -161,6 +162,7 @@ def test_must_log_if_template_has_runtime_version(self, LambdaContainerMock, Log memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) # Run the container and get results @@ -310,6 +312,8 @@ def test_must_run_container_and_wait_for_result(self, LambdaContainerMock): self.runtime._configure_interrupt = Mock() self.runtime._configure_interrupt.return_value = start_timer + self.runtime._check_exit_state = Mock() + LambdaContainerMock.return_value = container container.is_running.return_value = False @@ -337,6 +341,7 @@ def test_must_run_container_and_wait_for_result(self, LambdaContainerMock): memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) @@ -369,6 +374,8 @@ def test_exception_from_run_must_trigger_cleanup(self, LambdaContainerMock): self.runtime._configure_interrupt = Mock() self.runtime._configure_interrupt.return_value = start_timer + self.runtime._check_exit_state = Mock() + LambdaContainerMock.return_value = container container.is_running.return_value = False @@ -404,6 +411,7 @@ def test_exception_from_wait_for_result_must_trigger_cleanup(self, LambdaContain self.runtime._get_code_dir.return_value = code_dir self.runtime._configure_interrupt = Mock() self.runtime._configure_interrupt.return_value = timer + self.runtime._check_exit_state = Mock() LambdaContainerMock.return_value = container container.is_running.return_value = False @@ -437,6 +445,7 @@ def test_keyboard_interrupt_must_not_raise(self, LambdaContainerMock): self.runtime._get_code_dir = MagicMock() self.runtime._get_code_dir.return_value = code_dir self.runtime._configure_interrupt = Mock() + self.runtime._check_exit_state = Mock() LambdaContainerMock.return_value = container container.is_running.return_value = False @@ -690,6 +699,7 @@ def test_must_run_container_then_wait_for_result_and_container_not_stopped( memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) @@ -791,6 +801,7 @@ def test_must_create_non_cached_container(self, LambdaContainerMock, LambdaFunct memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) @@ -837,6 +848,7 @@ def test_must_create_incase_function_config_changed(self, LambdaContainerMock, L memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ), call( @@ -854,6 +866,7 @@ def test_must_create_incase_function_config_changed(self, LambdaContainerMock, L memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ), ] @@ -925,6 +938,7 @@ def test_must_ignore_debug_options_if_function_name_is_not_debug_function( memory_mb=self.DEFAULT_MEMORY, container_host=None, container_host_interface=None, + extra_hosts=None, function_full_path=self.full_path, ) self.manager_mock.create.assert_called_with(container) diff --git a/tests/unit/local/services/test_base_local_service.py b/tests/unit/local/services/test_base_local_service.py index 34bc44c193e..0469b592e4c 100644 --- a/tests/unit/local/services/test_base_local_service.py +++ b/tests/unit/local/services/test_base_local_service.py @@ -9,14 +9,14 @@ class TestLocalHostRunner(TestCase): def test_runtime_error_raised_when_app_not_created(self): is_debugging = False - service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1") + service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1", ssl_context=None) with self.assertRaises(RuntimeError): service.run() def test_run_starts_service_multithreaded(self): is_debugging = False # multithreaded - service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1") + service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1", ssl_context=None) service._app = Mock() app_run_mock = Mock() @@ -24,11 +24,11 @@ def test_run_starts_service_multithreaded(self): service.run() - app_run_mock.assert_called_once_with(threaded=True, host="127.0.0.1", port=3000) + app_run_mock.assert_called_once_with(threaded=True, host="127.0.0.1", port=3000, ssl_context=None) def test_run_starts_service_singlethreaded(self): is_debugging = True # singlethreaded - service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1") + service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1", ssl_context=None) service._app = Mock() app_run_mock = Mock() @@ -36,7 +36,7 @@ def test_run_starts_service_singlethreaded(self): service.run() - app_run_mock.assert_called_once_with(threaded=False, host="127.0.0.1", port=3000) + app_run_mock.assert_called_once_with(threaded=False, host="127.0.0.1", port=3000, ssl_context=None) @patch("samcli.local.services.base_local_service.Response") def test_service_response(self, flask_response_patch): @@ -57,7 +57,7 @@ def test_service_response(self, flask_response_patch): def test_create_returns_not_implemented(self): is_debugging = False - service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1") + service = BaseLocalService(is_debugging=is_debugging, port=3000, host="127.0.0.1", ssl_context=None) with self.assertRaises(NotImplementedError): service.create() diff --git a/tests/unit/schema/testdata/passing_tests/local_invokecmd.toml b/tests/unit/schema/testdata/passing_tests/local_invokecmd.toml index d5cd5f24a3e..5acd318938b 100644 --- a/tests/unit/schema/testdata/passing_tests/local_invokecmd.toml +++ b/tests/unit/schema/testdata/passing_tests/local_invokecmd.toml @@ -21,6 +21,7 @@ force_image_build = false shutdown = false container_host = "Container host" container_host_interface = "Container host interface" +add_host = [] invoke_image = "Invoke image" beta_features = false debug = false @@ -35,5 +36,6 @@ debug_port = 20 skip_pull_image = true force_image_build = true shutdown = true +add_host = ["example.com:127.0.0.1"] beta_features = true -debug = true \ No newline at end of file +debug = true diff --git a/tests/unit/schema/testdata/passing_tests/local_start_apicmd.toml b/tests/unit/schema/testdata/passing_tests/local_start_apicmd.toml index bb833a24191..e011c7977b6 100644 --- a/tests/unit/schema/testdata/passing_tests/local_start_apicmd.toml +++ b/tests/unit/schema/testdata/passing_tests/local_start_apicmd.toml @@ -24,6 +24,7 @@ debug_function = "Debug function" shutdown = false container_host = "Container host" container_host_interface = "Container host interface" +add_host = [] invoke_image = "Invoke image" beta_features = false debug = false @@ -39,5 +40,6 @@ skip_pull_image = true force_image_build = true warm_containers = "LAZY" shutdown = true +add_host = ["example.com:127.0.0.1"] beta_features = true -debug = true \ No newline at end of file +debug = true diff --git a/tests/unit/schema/testdata/passing_tests/local_start_lambdacmd.toml b/tests/unit/schema/testdata/passing_tests/local_start_lambdacmd.toml index b738f8639bb..f99641e18ba 100644 --- a/tests/unit/schema/testdata/passing_tests/local_start_lambdacmd.toml +++ b/tests/unit/schema/testdata/passing_tests/local_start_lambdacmd.toml @@ -23,6 +23,7 @@ debug_function = "Debug function" shutdown = false container_host = "Container host" container_host_interface = "Container host interface" +add_host = [] invoke_image = "Invoke image" beta_features = false debug = false @@ -38,5 +39,6 @@ skip_pull_image = true force_image_build = true warm_containers = "LAZY" shutdown = true +add_host = ["example.com:127.0.0.1"] beta_features = true -debug = true \ No newline at end of file +debug = true diff --git a/tests/unit/vendor/serverlessrepo/test_publish.py b/tests/unit/vendor/serverlessrepo/test_publish.py index f0519a84776..78b1ec3a8d4 100644 --- a/tests/unit/vendor/serverlessrepo/test_publish.py +++ b/tests/unit/vendor/serverlessrepo/test_publish.py @@ -10,6 +10,8 @@ S3PermissionsRequired, InvalidS3UriError, ServerlessRepoClientError, + DuplicateSemanticVersionError, + MissingSemanticVersionError, ) from samcli.vendor.serverlessrepo.parser import get_app_metadata, strip_app_metadata from samcli.vendor.serverlessrepo.publish import CREATE_APPLICATION, UPDATE_APPLICATION, CREATE_APPLICATION_VERSION @@ -198,7 +200,11 @@ def test_publish_wrap_client_error_when_update_application(self, wrap_client_err # create_application_version shouldn't be called if update_application fails self.serverlessrepo_mock.create_application_version.assert_not_called() - def test_publish_existing_application_should_update_application_if_version_exists(self): + @patch("samcli.vendor.serverlessrepo.publish.LOG") + @patch("samcli.vendor.serverlessrepo.publish._check_app_with_semantic_version_exists") + def test_publish_existing_application_should_update_application_if_version_exists( + self, _check_app_with_semantic_version_exists_patch, LOG_patch + ): self.serverlessrepo_mock.create_application.side_effect = self.application_exists_error self.serverlessrepo_mock.create_application_version.side_effect = ClientError( {"Error": {"Code": "ConflictException", "Message": "Random"}}, "create_application_version" @@ -222,6 +228,12 @@ def test_publish_existing_application_should_update_application_if_version_exist self.serverlessrepo_mock.create_application.assert_called_once() self.serverlessrepo_mock.update_application.assert_called_once() self.serverlessrepo_mock.create_application_version.assert_called_once() + # If --fail-on-same-version is not specified, warning is printed + LOG_patch.warning.assert_called_once_with( + "WARNING: Publishing with semantic version that already exists. This may cause issues deploying." + ) + + _check_app_with_semantic_version_exists_patch.assert_not_called() def test_publish_new_version_should_create_application_version(self): self.serverlessrepo_mock.create_application.side_effect = self.application_exists_error @@ -332,6 +344,39 @@ def test_update_application_with_readmebody(self): } self.assertEqual(expected_result, actual_result) + def test_semantic_version_publish_succeeds(self): + # If the supplied semantic version does not exist with the --fail-on-same-version flag, + # publish should succeed + sar_client = Mock() + sar_client.create_application.side_effect = self.application_exists_error + sar_client.get_application.side_effect = ClientError( + error_response={"Error": {"Code": "NotFoundException", "Message": "Application does not exist"}}, + operation_name="get_application", + ) + + publish_application(self.template, sar_client, fail_on_same_version=True) + + @patch("samcli.vendor.serverlessrepo.publish._check_app_with_semantic_version_exists") + def test_fail_update_on_same_semantic_version(self, check_app_with_semantic_version_exists_patch): + sar_client = Mock() + sar_client.create_application.side_effect = self.application_exists_error + + check_app_with_semantic_version_exists_patch.return_value = True + + with self.assertRaises(DuplicateSemanticVersionError): + publish_application(self.template, sar_client, fail_on_same_version=True) + + @patch("samcli.vendor.serverlessrepo.publish._check_app_with_semantic_version_exists") + def test_fail_update_on_no_semantic_version(self, check_app_with_semantic_version_exists_patch): + sar_client = Mock() + sar_client.create_application.side_effect = self.application_exists_error + template_without_version = self.template.replace('"SemanticVersion": "1.0.0"', "") + + check_app_with_semantic_version_exists_patch.return_value = True + + with self.assertRaises(MissingSemanticVersionError): + publish_application(template_without_version, sar_client, fail_on_same_version=True) + class TestUpdateApplicationMetadata(TestCase): def setUp(self):