aws-annoying 0.8.1__tar.gz → 0.8.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/devcontainer.json +1 -2
  2. aws_annoying-0.8.3/.github/workflows/devcf_ci.yaml +101 -0
  3. aws_annoying-0.8.3/.github/workflows/devcf_release.yaml +46 -0
  4. aws_annoying-0.8.1/.github/workflows/ci.yaml → aws_annoying-0.8.3/.github/workflows/main_ci.yaml +12 -17
  5. aws_annoying-0.8.3/.github/workflows/main_docs.yaml +41 -0
  6. aws_annoying-0.8.3/.github/workflows/main_prepare-release.yaml +51 -0
  7. aws_annoying-0.8.1/.github/workflows/release.yaml → aws_annoying-0.8.3/.github/workflows/main_release.yaml +21 -16
  8. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.pre-commit-config.yaml +8 -21
  9. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.vscode/extensions.json +0 -1
  10. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.vscode/settings.json +3 -1
  11. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/Makefile +5 -0
  12. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/PKG-INFO +7 -39
  13. aws_annoying-0.8.3/README.md +41 -0
  14. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/app.py +1 -1
  15. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/ecs/task_definition_lifecycle.py +15 -1
  16. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/ecs/wait_for_deployment.py +36 -1
  17. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/mfa/configure.py +21 -1
  18. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/port_forward.py +8 -1
  19. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/start.py +5 -1
  20. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/session_manager/session_manager.py +1 -1
  21. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/variable_loader.py +0 -1
  22. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/console/ecs-exec/ecs-exec.user.js +1 -1
  23. aws_annoying-0.8.3/devcontainer-features/src/session-manager-plugin/README.md +20 -0
  24. aws_annoying-0.8.3/devcontainer-features/src/session-manager-plugin/devcontainer-feature.json +6 -0
  25. aws_annoying-0.8.3/devcontainer-features/src/session-manager-plugin/install.sh +30 -0
  26. aws_annoying-0.8.3/devcontainer-features/test/_global/scenarios.json +1 -0
  27. aws_annoying-0.8.3/devcontainer-features/test/session-manager-plugin/scenarios.json +1 -0
  28. aws_annoying-0.8.3/devcontainer-features/test/session-manager-plugin/test.sh +10 -0
  29. aws_annoying-0.8.3/docs/cli-references/ecs.md +11 -0
  30. aws_annoying-0.8.3/docs/cli-references/mfa.md +5 -0
  31. aws_annoying-0.8.3/docs/cli-references/misc.md +5 -0
  32. aws_annoying-0.8.3/docs/cli-references/session-manager.md +23 -0
  33. aws_annoying-0.8.3/docs/index.md +1 -0
  34. aws_annoying-0.8.3/mkdocs.yaml +38 -0
  35. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/pyproject.toml +13 -13
  36. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/uv.lock +807 -265
  37. aws_annoying-0.8.1/README.md +0 -73
  38. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/.env.example +0 -0
  39. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/Dockerfile +0 -0
  40. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/docker-compose.devcontainer.yaml +0 -0
  41. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/onCreateCommand.sh +0 -0
  42. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.devcontainer/postAttachCommand.sh +0 -0
  43. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.editorconfig +0 -0
  44. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.gitattributes +0 -0
  45. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.github/dependabot.yaml +0 -0
  46. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.gitignore +0 -0
  47. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.python-version +0 -0
  48. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/.vscode/launch.json +0 -0
  49. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/LICENSE +0 -0
  50. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/__init__.py +0 -0
  51. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/__init__.py +0 -0
  52. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/ecs/__init__.py +0 -0
  53. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/ecs/_app.py +0 -0
  54. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/load_variables.py +0 -0
  55. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/logging_handler.py +0 -0
  56. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/main.py +0 -0
  57. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/mfa/__init__.py +0 -0
  58. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/mfa/_app.py +0 -0
  59. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/__init__.py +0 -0
  60. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/_app.py +0 -0
  61. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/_common.py +0 -0
  62. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/install.py +0 -0
  63. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/cli/session_manager/stop.py +0 -0
  64. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/ecs/__init__.py +0 -0
  65. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/ecs/check.py +0 -0
  66. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/ecs/common.py +0 -0
  67. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/ecs/errors.py +0 -0
  68. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/ecs/wait_for.py +0 -0
  69. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/mfa_config.py +0 -0
  70. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/session_manager/__init__.py +0 -0
  71. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/session_manager/errors.py +0 -0
  72. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/session_manager/shortcuts.py +0 -0
  73. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/__init__.py +0 -0
  74. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/debugger.py +0 -0
  75. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/downloader.py +0 -0
  76. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/ec2.py +0 -0
  77. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/platform.py +0 -0
  78. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/aws_annoying/utils/timeout.py +0 -0
  79. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/console/ecs-exec/README.md +0 -0
  80. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/console/ecs-exec/ecs-console.png +0 -0
  81. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/console/ecs-exec/session-manager.png +0 -0
  82. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/examples/dbeaver/README.md +0 -0
  83. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/examples/dbeaver/after-disconnect.png +0 -0
  84. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/examples/dbeaver/before-connect.png +0 -0
  85. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/examples/dbeaver/new-connection.png +0 -0
  86. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/examples/dbeaver/test-connection.png +0 -0
  87. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/__init__.py +0 -0
  88. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/_helpers.py +0 -0
  89. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/__init__.py +0 -0
  90. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/__init__.py +0 -0
  91. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/boto3.py +0 -0
  92. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/command_builder.py +0 -0
  93. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/invoke.py +0 -0
  94. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/scripts/printenv.py +0 -0
  95. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/_helpers/string_.py +0 -0
  96. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/__init__.py +0 -0
  97. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/snapshots/test_task_definition_lifecycle/test_basic/stdout.txt +0 -0
  98. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/snapshots/test_task_definition_lifecycle/test_delete/stdout.txt +0 -0
  99. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/snapshots/test_task_definition_lifecycle/test_dry_run/stdout.txt +0 -0
  100. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/test_task_definition_lifecycle.py +0 -0
  101. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/ecs/test_wait_for_deployment.py +0 -0
  102. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/__init__.py +0 -0
  103. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_basic/persist/aws_config.ini +0 -0
  104. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_basic/persist/stdout.txt +0 -0
  105. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_basic/skip_persist/stdout.txt +0 -0
  106. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_dry_run/stdout.txt +0 -0
  107. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_load_existing_config/aws_config.ini +0 -0
  108. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/snapshots/test_configure/test_load_existing_config/stdout.txt +0 -0
  109. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/mfa/test_configure.py +0 -0
  110. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/session_manager/__init__.py +0 -0
  111. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/session_manager/test_install.py +0 -0
  112. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/session_manager/test_port_forward.py +0 -0
  113. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/session_manager/test_start.py +0 -0
  114. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/session_manager/test_stop.py +0 -0
  115. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_basic/stdout.txt +0 -0
  116. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_env_prefix/stdout.txt +0 -0
  117. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_nothing/stdout.txt +0 -0
  118. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_overwrite_env/stdout.txt +0 -0
  119. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_replace_quiet/stdout.txt +0 -0
  120. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_resource_not_found/ssm/stdout.txt +0 -0
  121. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/snapshots/test_load_variables/test_unsupported_resource/stdout.txt +0 -0
  122. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/test_app.py +0 -0
  123. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/test_load_variables.py +0 -0
  124. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/test_logging_handler.py +0 -0
  125. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/cli/test_main.py +0 -0
  126. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/conftest.py +0 -0
  127. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/ecs/__init__.py +0 -0
  128. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/ecs/test_check.py +0 -0
  129. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/ecs/test_common.py +0 -0
  130. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/ecs/test_errors.py +0 -0
  131. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/ecs/test_wait_for.py +0 -0
  132. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/session_manager/__init__.py +0 -0
  133. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/session_manager/test_errors.py +0 -0
  134. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/session_manager/test_session_manager.py +0 -0
  135. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/session_manager/test_shortcuts.py +0 -0
  136. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/test_mfa_config.py +0 -0
  137. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/test_variable_loader.py +0 -0
  138. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/utils/__init__.py +0 -0
  139. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/utils/test_downloader.py +0 -0
  140. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/utils/test_ec2.py +0 -0
  141. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/utils/test_platform.py +0 -0
  142. {aws_annoying-0.8.1 → aws_annoying-0.8.3}/tests/utils/test_timeout.py +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "lasuillard/aws-annoying",
2
+ "name": "lasuillard-s/aws-annoying",
3
3
  "dockerComposeFile": [
4
4
  "./docker-compose.devcontainer.yaml"
5
5
  ],
@@ -23,7 +23,6 @@
23
23
  "tamasfe.even-better-toml",
24
24
  "streetsidesoftware.code-spell-checker",
25
25
  "EditorConfig.EditorConfig",
26
- "VisualStudioExptTeam.vscodeintellicode",
27
26
  "charliermarsh.ruff",
28
27
  "ms-python.mypy-type-checker",
29
28
  "njpwerner.autodocstring",
@@ -0,0 +1,101 @@
1
+ name: Dev Container Features - CI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags: [v*]
7
+ paths:
8
+ - devcontainer-features/**
9
+
10
+ pull_request:
11
+ paths:
12
+ - devcontainer-features/**
13
+
14
+ jobs:
15
+ validate:
16
+ runs-on: ubuntu-latest
17
+ timeout-minutes: 5
18
+ permissions:
19
+ contents: read
20
+ steps:
21
+ - uses: actions/checkout@v6
22
+ - uses: devcontainers/action@v1
23
+ with:
24
+ validate-only: true
25
+ base-path-to-features: ./devcontainer-features/src
26
+
27
+ test-autogenerated:
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 10
30
+ permissions:
31
+ contents: read
32
+ strategy:
33
+ fail-fast: false
34
+ matrix:
35
+ base-image:
36
+ - debian:latest
37
+ features:
38
+ - session-manager-plugin
39
+ steps:
40
+ - uses: actions/checkout@v6
41
+
42
+ - name: Install Dev Containers CLI
43
+ run: npm install --global @devcontainers/cli
44
+
45
+ - name: Run autogenerated tests
46
+ run: |
47
+ devcontainer features test \
48
+ --skip-scenarios \
49
+ --features '${{ matrix.features }}' \
50
+ --base-image '${{ matrix.base-image }}' \
51
+ ./devcontainer-features
52
+
53
+ test-scenarios:
54
+ runs-on: ubuntu-latest
55
+ timeout-minutes: 10
56
+ permissions:
57
+ contents: read
58
+ strategy:
59
+ fail-fast: false
60
+ matrix:
61
+ base-image:
62
+ - debian:latest
63
+ features:
64
+ - session-manager-plugin
65
+ steps:
66
+ - uses: actions/checkout@v6
67
+
68
+ - name: Install Dev Containers CLI
69
+ run: npm install --global @devcontainers/cli
70
+
71
+ - name: Run scenario tests
72
+ run: |
73
+ devcontainer features test \
74
+ --skip-autogenerated \
75
+ --skip-duplicated \
76
+ --features '${{ matrix.features }}' \
77
+ --base-image '${{ matrix.base-image }}' \
78
+ ./devcontainer-features
79
+
80
+ test-global:
81
+ runs-on: ubuntu-latest
82
+ timeout-minutes: 10
83
+ permissions:
84
+ contents: read
85
+ strategy:
86
+ fail-fast: false
87
+ matrix:
88
+ base-image:
89
+ - debian:latest
90
+ steps:
91
+ - uses: actions/checkout@v6
92
+
93
+ - name: Install Dev Containers CLI
94
+ run: npm install --global @devcontainers/cli
95
+
96
+ - name: Run global tests
97
+ run: |
98
+ devcontainer features test \
99
+ --global-scenarios-only \
100
+ --base-image '${{ matrix.base-image }}' \
101
+ ./devcontainer-features
@@ -0,0 +1,46 @@
1
+ name: Dev Container Features - Release & Docs
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ # Every time when push changes to target directory, it will trigger release
7
+ # but the CLI won't overwrite existing published features unless the version is updated
8
+ push:
9
+ branches: [main]
10
+ paths:
11
+ - devcontainer-features/**
12
+
13
+ jobs:
14
+ release:
15
+ if: ${{ (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') || github.event_name == 'push' }}
16
+ runs-on: ubuntu-latest
17
+ timeout-minutes: 10
18
+ permissions:
19
+ contents: write
20
+ pull-requests: write
21
+ packages: write
22
+ steps:
23
+ - uses: actions/checkout@v6
24
+ - uses: devcontainers/action@v1
25
+ env:
26
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
+ with:
28
+ publish-features: true
29
+ base-path-to-features: ./devcontainer-features/src
30
+ generate-docs: true
31
+
32
+ - name: Generate GitHub App token
33
+ uses: actions/create-github-app-token@v2
34
+ id: generate-token
35
+ with:
36
+ app-id: ${{ vars.GH_APP_ID }}
37
+ private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
38
+
39
+ - name: Create PR for generated docs
40
+ uses: peter-evans/create-pull-request@v8.0.0
41
+ with:
42
+ token: ${{ steps.generate-token.outputs.token }}
43
+ sign-commits: true
44
+ title: Automated documentation update
45
+ branch: automated-documentation-update-${{ github.run_id }}
46
+ delete-branch: true
@@ -6,21 +6,18 @@ on:
6
6
  pull_request:
7
7
  branches: [main]
8
8
 
9
- permissions: read-all
10
-
11
9
  env:
12
10
  UV_FROZEN: 1
13
11
 
14
12
  jobs:
15
13
  lint:
16
- name: Lint
17
14
  runs-on: ubuntu-latest
15
+ timeout-minutes: 5
16
+ permissions:
17
+ contents: read
18
18
  steps:
19
- - name: Checkout
20
- uses: actions/checkout@v5
21
-
22
- - name: Set up uv
23
- uses: astral-sh/setup-uv@v6
19
+ - uses: actions/checkout@v6
20
+ - uses: astral-sh/setup-uv@v7
24
21
  with:
25
22
  version: latest
26
23
  enable-cache: true
@@ -36,8 +33,9 @@ jobs:
36
33
  if: always()
37
34
 
38
35
  test:
39
- name: Test (${{ matrix.os }}, Python ${{ matrix.python-version }})
36
+ name: test (${{ matrix.os }}, py${{ matrix.python-version }})
40
37
  runs-on: ${{ matrix.os }}
38
+ timeout-minutes: 10
41
39
  permissions:
42
40
  contents: read
43
41
  id-token: write
@@ -48,11 +46,8 @@ jobs:
48
46
  python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
49
47
 
50
48
  steps:
51
- - name: Checkout
52
- uses: actions/checkout@v5
53
-
54
- - name: Set up uv
55
- uses: astral-sh/setup-uv@v6
49
+ - uses: actions/checkout@v6
50
+ - uses: astral-sh/setup-uv@v7
56
51
  with:
57
52
  version: latest
58
53
  enable-cache: true
@@ -82,10 +77,10 @@ jobs:
82
77
  run: |
83
78
  Get-Command session-manager-plugin | Out-String -Width 2000
84
79
 
85
- $uri = 'https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe'
86
- $outFile = 'C:\Windows\Temp\SessionManagerPluginSetup.exe'
80
+ $uri = 'https://raw.githubusercontent.com/aws/session-manager-plugin/refs/heads/mainline/Tools/src/update/windows/uninstall.bat'
81
+ $outFile = 'C:\Windows\Temp\uninstall.bat'
87
82
  Invoke-WebRequest -Uri "$uri" -OutFile "$outFile"
88
- & "$outFile" /uninstall /quiet
83
+ & "$outFile"
89
84
 
90
85
  uv run pytest -m 'not docker'
91
86
 
@@ -0,0 +1,41 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ tags: [v*]
7
+
8
+ concurrency:
9
+ group: docs
10
+ cancel-in-progress: false
11
+
12
+ env:
13
+ UV_FROZEN: 1
14
+
15
+ jobs:
16
+ docs:
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 10
19
+ permissions:
20
+ contents: write
21
+ steps:
22
+ - uses: actions/checkout@v6
23
+ with:
24
+ fetch-depth: 0
25
+
26
+ - uses: astral-sh/setup-uv@v7
27
+ with:
28
+ version: latest
29
+ enable-cache: true
30
+
31
+ - name: Install deps
32
+ run: uv sync
33
+
34
+ - name: Configure Git user
35
+ run: |
36
+ git config --local user.email "github-actions[bot]@github.com"
37
+ git config --local user.name "GitHub Action"
38
+
39
+ - name: Build docs
40
+ run: |
41
+ uv run mike deploy --push "${{ github.ref_name }}"
@@ -0,0 +1,51 @@
1
+ name: Prepare Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag:
7
+ description: Semver-style tag for release (e.g., v1.0.0)
8
+ required: true
9
+
10
+ jobs:
11
+ create-pr:
12
+ runs-on: ubuntu-latest
13
+ timeout-minutes: 5
14
+ permissions:
15
+ contents: write
16
+ pull-requests: write
17
+ steps:
18
+ - name: Check tag format
19
+ run: |
20
+ if [[ ! "${{ inputs.tag }}" =~ ^v ]]; then
21
+ echo "Tag must start with 'v'"
22
+ exit 1
23
+ fi
24
+
25
+ - uses: actions/checkout@v6
26
+ - uses: astral-sh/setup-uv@v7
27
+ with:
28
+ version: latest
29
+ enable-cache: true
30
+
31
+ - name: Set version
32
+ run: |
33
+ tag="${{ inputs.tag }}"
34
+ tag_no_v="${tag#v}"
35
+ uv version "${tag#v}"
36
+
37
+ - name: Generate GitHub App token
38
+ uses: actions/create-github-app-token@v2
39
+ id: generate-token
40
+ with:
41
+ app-id: ${{ vars.GH_APP_ID }}
42
+ private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
43
+
44
+ - name: Create pull request
45
+ uses: peter-evans/create-pull-request@v8.0.0
46
+ with:
47
+ token: ${{ steps.generate-token.outputs.token }}
48
+ sign-commits: true
49
+ title: Release ${{ inputs.tag }}
50
+ branch: release/${{ inputs.tag }}
51
+ delete-branch: true
@@ -1,24 +1,21 @@
1
1
  name: Release
2
2
 
3
3
  on:
4
- push:
5
- tags: [v*]
4
+ release:
5
+ types: [published]
6
6
 
7
7
  env:
8
8
  UV_FROZEN: 1
9
9
 
10
10
  jobs:
11
11
  release:
12
- name: Release
13
12
  runs-on: ubuntu-latest
13
+ timeout-minutes: 5
14
14
  permissions:
15
15
  contents: write
16
16
  steps:
17
- - name: Checkout
18
- uses: actions/checkout@v5
19
-
20
- - name: Set up uv
21
- uses: astral-sh/setup-uv@v6
17
+ - uses: actions/checkout@v6
18
+ - uses: astral-sh/setup-uv@v7
22
19
  with:
23
20
  version: latest
24
21
  enable-cache: true
@@ -30,31 +27,39 @@ jobs:
30
27
  run: uv build
31
28
 
32
29
  - name: Create release
33
- uses: softprops/action-gh-release@v2
30
+ uses: softprops/action-gh-release@v2.5.0
34
31
  with:
32
+ tag_name: ${{ github.event.release.tag_name }}
35
33
  generate_release_notes: true
36
34
  files: dist/*
37
35
 
36
+ - name: Show files
37
+ run: ls -l --all --recursive dist
38
+
38
39
  - name: Upload release distributions
39
- uses: actions/upload-artifact@v4
40
+ uses: actions/upload-artifact@v6
40
41
  with:
41
42
  name: release-dists
42
43
  path: dist/
43
44
 
44
45
  publish-pypi:
45
- name: Publish to PyPI
46
+ needs: release
46
47
  runs-on: ubuntu-latest
47
- needs:
48
- - release
48
+ environment: pypi
49
+ timeout-minutes: 5
49
50
  permissions:
50
51
  id-token: write
51
- environment: pypi
52
52
  steps:
53
- - name: Retrieve release distributions
54
- uses: actions/download-artifact@v5
53
+ - name: Download release distributions
54
+ uses: actions/download-artifact@v7
55
55
  with:
56
56
  name: release-dists
57
57
  path: dist/
58
58
 
59
+ - name: Show artifacts
60
+ run: ls -l --all --recursive dist
61
+
59
62
  - name: Publish release distributions to PyPI
60
63
  uses: pypa/gh-action-pypi-publish@release/v1
64
+ with:
65
+ skip-existing: true
@@ -8,30 +8,17 @@ repos:
8
8
  - id: trailing-whitespace
9
9
  - id: end-of-file-fixer
10
10
 
11
- - repo: https://github.com/lasuillard/pre-commit-hooks
12
- rev: v0.4.1
11
+ - repo: https://github.com/lasuillard-s/devobs
12
+ rev: v0.2.1
13
13
  hooks:
14
- - id: source-matching-test
14
+ - id: check-file-pair
15
15
  args:
16
- - --source
17
- - aws_annoying
16
+ - --from=pulumi_extra
17
+ - --to=tests
18
+ - --include=*.py
19
+ - --exclude=utils/debugger.py,_*.py
20
+ - --expect={to}/{relative_from}/test_{filename}
18
21
  - --create-if-not-exists
19
- - --extend-exclude
20
- - utils/debugger.py
21
- - --extend-exclude
22
- - "**/_*.py"
23
- - id: test-matching-source
24
- args:
25
- - --target
26
- - aws_annoying
27
- - --extend-exclude
28
- - "**/conftest.py"
29
- - --extend-exclude
30
- - "**/_*/**/*.py"
31
- - --extend-exclude
32
- - "**/_*.py"
33
- - id: preferred-suffix
34
- args: [--rename]
35
22
 
36
23
  - repo: local
37
24
  hooks:
@@ -4,7 +4,6 @@
4
4
  "ms-python.vscode-pylance",
5
5
  "streetsidesoftware.code-spell-checker",
6
6
  "editorconfig.editorconfig",
7
- "visualstudioexptteam.vscodeintellicode",
8
7
  "charliermarsh.ruff",
9
8
  "ms-python.mypy-type-checker",
10
9
  "ms-python.debugpy"
@@ -9,10 +9,12 @@
9
9
  "cSpell.words": [
10
10
  "Deregistering",
11
11
  "localstack",
12
+ "pydantic",
12
13
  "pytestmark",
13
14
  "sessionmanagerplugin",
14
15
  "Stubber",
15
- "Tampermonkey"
16
+ "Tampermonkey",
17
+ "Typer"
16
18
  ],
17
19
  "editor.formatOnSave": true,
18
20
  "files.eol": "\n",
@@ -28,6 +28,11 @@ update: ## Update deps and tools
28
28
  pre-commit autoupdate
29
29
  .PHONY: update
30
30
 
31
+ serve-docs: ## Serve documentation with live reload
32
+ uv run mkdocs serve \
33
+ --dev-addr "$$([ -n "$${CONTAINER:-}" ] && echo '0.0.0.0:8000' || echo '127.0.0.1:8000')"
34
+ .PHONY: serve-docs
35
+
31
36
 
32
37
  # =============================================================================
33
38
  # CI
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aws-annoying
3
- Version: 0.8.1
3
+ Version: 0.8.3
4
4
  Summary: Utils to handle some annoying AWS tasks.
5
- Project-URL: Homepage, https://github.com/lasuillard/aws-annoying
6
- Project-URL: Repository, https://github.com/lasuillard/aws-annoying.git
7
- Project-URL: Issues, https://github.com/lasuillard/aws-annoying/issues
5
+ Project-URL: Homepage, https://github.com/lasuillard-s/aws-annoying
6
+ Project-URL: Repository, https://github.com/lasuillard-s/aws-annoying.git
7
+ Project-URL: Issues, https://github.com/lasuillard-s/aws-annoying/issues
8
8
  Author-email: Yuchan Lee <lasuillard@gmail.com>
9
9
  License-Expression: MIT
10
10
  License-File: LICENSE
@@ -19,8 +19,7 @@ Description-Content-Type: text/markdown
19
19
  # aws-annoying
20
20
 
21
21
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
22
- [![CI](https://github.com/lasuillard/aws-annoying/actions/workflows/ci.yaml/badge.svg)](https://github.com/lasuillard/aws-annoying/actions/workflows/ci.yaml)
23
- [![codecov](https://codecov.io/gh/lasuillard/aws-annoying/graph/badge.svg?token=gbcHMVVz2k)](https://codecov.io/gh/lasuillard/aws-annoying)
22
+ [![codecov](https://codecov.io/gh/lasuillard-s/aws-annoying/graph/badge.svg?token=gbcHMVVz2k)](https://codecov.io/gh/lasuillard-s/aws-annoying)
24
23
  [![PyPI - Version](https://img.shields.io/pypi/v/aws-annoying)](https://pypi.org/project/aws-annoying/)
25
24
 
26
25
  Utils to handle some annoying AWS tasks.
@@ -34,6 +33,7 @@ Major directories of the project:
34
33
  - **aws_annoying** Python package containing CLI and utility functions.
35
34
  - **console** Utilities to help working with AWS Console.
36
35
  - **examples** Examples of how to use the package.
36
+ - **devcontainer-features** Devcontainer features to help set up development environment.
37
37
 
38
38
  ## 🚀 Installation
39
39
 
@@ -52,39 +52,7 @@ As the package also provides some utility functions, you can install `aws-annoyi
52
52
 
53
53
  ## 💡 Usage
54
54
 
55
- Below are brief explanation of available commands. For more detailed information about commands, please refer to the CLI help.
56
-
57
- ### `ecs task-definition-lifecycle`
58
-
59
- Expire and delete ECS task definitions based on criteria.
60
-
61
- ### `ecs wait-for-deployment`
62
-
63
- Wait for ECS deployment to start, complete or fail, and stabilize.
64
-
65
- ### `load-variables`
66
-
67
- Wrapper command to run command with variables from various AWS resources (SSM Parameter Store, Secrets Manager, etc.) injected as environment variables.
68
-
69
- ### `mfa configure`
70
-
71
- Configure AWS profile or refresh session for MFA.
72
-
73
- ### `session-manager install`
74
-
75
- Install AWS Session Manager plugin.
76
-
77
- ### `session-manager port-forward`
78
-
79
- Start a port forwarding session using AWS Session Manager.
80
-
81
- ### `session-manager start`
82
-
83
- Start new session via Session Manager.
84
-
85
- ### `session-manager stop`
86
-
87
- Stop running port forwarding session for PID file.
55
+ Refer to the CLI help or documentation for detailed information on how to use each command.
88
56
 
89
57
  ## 💖 Contributing
90
58
 
@@ -0,0 +1,41 @@
1
+ # aws-annoying
2
+
3
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
+ [![codecov](https://codecov.io/gh/lasuillard-s/aws-annoying/graph/badge.svg?token=gbcHMVVz2k)](https://codecov.io/gh/lasuillard-s/aws-annoying)
5
+ [![PyPI - Version](https://img.shields.io/pypi/v/aws-annoying)](https://pypi.org/project/aws-annoying/)
6
+
7
+ Utils to handle some annoying AWS tasks.
8
+
9
+ ## ❓ About
10
+
11
+ This project aims to provide a set of utilities and examples to help with some annoying tasks when working with AWS.
12
+
13
+ Major directories of the project:
14
+
15
+ - **aws_annoying** Python package containing CLI and utility functions.
16
+ - **console** Utilities to help working with AWS Console.
17
+ - **examples** Examples of how to use the package.
18
+ - **devcontainer-features** Devcontainer features to help set up development environment.
19
+
20
+ ## 🚀 Installation
21
+
22
+ It is recommended to use [pipx](https://pipx.pypa.io/stable/) to install `aws-annoying` CLI:
23
+
24
+ ```bash
25
+ $ pipx install aws-annoying
26
+ $ aws-annoying --help
27
+
28
+ Usage: aws-annoying [OPTIONS] COMMAND [ARGS]...
29
+
30
+ ...
31
+ ```
32
+
33
+ As the package also provides some utility functions, you can install `aws-annoying` via pip, if you are going to use those utils.
34
+
35
+ ## 💡 Usage
36
+
37
+ Refer to the CLI help or documentation for detailed information on how to use each command.
38
+
39
+ ## 💖 Contributing
40
+
41
+ Any feedback, suggestions or contributions are welcome! Feel free to open an issue or a pull request.
@@ -21,7 +21,7 @@ app = typer.Typer(
21
21
  )
22
22
 
23
23
 
24
- def show_version(value: Optional[bool]) -> None:
24
+ def show_version(value: Optional[bool]) -> None: # noqa: FBT001
25
25
  """Show the version of the application."""
26
26
  if not value:
27
27
  return
@@ -38,7 +38,21 @@ def task_definition_lifecycle(
38
38
  help="Delete the task definition after deregistering it.",
39
39
  ),
40
40
  ) -> None:
41
- """Execute ECS task definition lifecycle."""
41
+ r"""Expire and delete ECS task definitions.
42
+
43
+ Expire and delete ECS task definitions for a given family, keeping revisions adhering to
44
+ the given constraint. You can use this command to clean up old task definitions that are no
45
+ longer needed.
46
+
47
+ Example usage:
48
+
49
+ ```shell
50
+ aws-annoying ecs task-definition-lifecycle \
51
+ --family <task-definition-family> \
52
+ --keep-latest 5 \
53
+ --delete
54
+ ```
55
+ """
42
56
  dry_run = ctx.meta["dry_run"]
43
57
  ecs = boto3.client("ecs")
44
58
 
@@ -69,7 +69,42 @@ def wait_for_deployment( # noqa: PLR0913
69
69
  help="Whether to wait for the service to be stable after the deployment.",
70
70
  ),
71
71
  ) -> None:
72
- """Wait for ECS deployment to complete."""
72
+ r"""Wait for ECS deployment for a specific service to start, complete and stabilize.
73
+
74
+ It's designed to be used after triggering a deployment (e.g., updating service, deploying new task definition),
75
+ in conjunction with CI/CD pipelines or deployment scripts.
76
+
77
+ Below is an example of using this command in GitHub Actions workflow:
78
+
79
+ ```yaml
80
+ ...
81
+
82
+ - name: Deploy to ECS service
83
+ id: deploy-ecs
84
+ uses: aws-actions/amazon-ecs-deploy-task-definition@v2
85
+ with:
86
+ task-definition: ${{ steps.render-task-definition.outputs.task-definition }}
87
+ cluster: ${{ vars.AWS_ECS_CLUSTER }}
88
+ service: ${{ vars.AWS_ECS_SERVICE }}
89
+ wait-for-service-stability: false
90
+
91
+ - name: Wait for deployment complete
92
+ run: |
93
+ pipx run aws-annoying \
94
+ --verbose \
95
+ ecs wait-for-deployment \
96
+ --cluster '${{ vars.AWS_ECS_CLUSTER }}' \
97
+ --service '${{ vars.AWS_ECS_SERVICE }}' \
98
+ --wait-for-start \
99
+ --wait-for-stability \
100
+ --timeout-seconds 600 \
101
+ --expected-task-definition '${{ steps.deploy-ecs.outputs.task-definition-arn }}'
102
+
103
+ ...
104
+ ```
105
+
106
+ `--wait-for-start` is necessary because there could be no deployment right after the deploy action.
107
+ """
73
108
  start = datetime.now(tz=timezone.utc)
74
109
  try:
75
110
  with Timeout(timeout_seconds):