shellsafe 0.3.3__tar.gz → 0.3.4__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.
- {shellsafe-0.3.3 → shellsafe-0.3.4}/CHANGELOG.md +8 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/PKG-INFO +14 -1
- {shellsafe-0.3.3 → shellsafe-0.3.4}/README.md +13 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/__init__.py +3 -2
- shellsafe-0.3.4/src/shellsafe/_version.py +1 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_public_surface.py +2 -1
- shellsafe-0.3.3/src/shellsafe/_version.py +0 -1
- {shellsafe-0.3.3 → shellsafe-0.3.4}/.github/workflows/ci.yml +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/.github/workflows/release.yml +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/.gitignore +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/CONTRIBUTING.md +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/LICENSE +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/examples/demo.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/pyproject.toml +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/__main__.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/audit/__init__.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/audit/scanner.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/cli.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/errors.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/execute.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/exitcodes.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/platforms.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/py.typed +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/raw.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/render.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au001_sample.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au002_sample.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au003_sample.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au004_sample.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/suppress_sample.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/golden/.gitkeep +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/.gitkeep +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/test_cli_audit.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/test_exec_posix.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/README.md +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_01_semicolon.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_02_substitution.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_03_backticks.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_04_background_chain.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_05_or_chain.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_06_redirect_out.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_07_redirect_in.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_08_pipe_out.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_09_quote_smuggle.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_10_quote_storm.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_11_globs_expansions.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_12_newline.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_13_fullwidth_semicolon.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_14_whitespace.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_15_unicode_dashes.txt +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/property/.gitkeep +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/property/test_invariants.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_audit.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_cli.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_errors.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_payload_corpus.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_raw.py +0 -0
- {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_render.py +0 -0
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project are documented here. Format follows
|
|
4
4
|
Keep a Changelog; versioning follows SemVer.
|
|
5
5
|
|
|
6
|
+
## [0.3.4] - 2026-09-03
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- Export `plan()` from public surface (`__init__.py`); was defined in
|
|
11
|
+
`execute.py` but not listed in `__all__`, causing `ImportError` on
|
|
12
|
+
`from shellsafe import plan`
|
|
13
|
+
|
|
6
14
|
## [0.3.3] - 2026-09-01
|
|
7
15
|
|
|
8
16
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: shellsafe
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: Run shell commands safely using Python 3.14 template strings. Values can never turn into commands.
|
|
5
5
|
Project-URL: Homepage, https://github.com/rahulXs/shellsafe
|
|
6
6
|
Project-URL: Repository, https://github.com/rahulXs/shellsafe
|
|
@@ -131,6 +131,19 @@ Filter by severity:
|
|
|
131
131
|
shellsafe audit src/ --severity warning
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
+
Suppress known-safe findings inline:
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
# shellsafe: ignore AU001 reason: tested, value is constant
|
|
138
|
+
os.system(f"echo {safe_value}")
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Suppress from the command line:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
shellsafe audit src/ --ignore AU004
|
|
145
|
+
```
|
|
146
|
+
|
|
134
147
|
## Limits
|
|
135
148
|
|
|
136
149
|
- Shell features (pipes, redirections) work on Linux and macOS only. Windows
|
|
@@ -108,6 +108,19 @@ Filter by severity:
|
|
|
108
108
|
shellsafe audit src/ --severity warning
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
+
Suppress known-safe findings inline:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
# shellsafe: ignore AU001 reason: tested, value is constant
|
|
115
|
+
os.system(f"echo {safe_value}")
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Suppress from the command line:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
shellsafe audit src/ --ignore AU004
|
|
122
|
+
```
|
|
123
|
+
|
|
111
124
|
## Limits
|
|
112
125
|
|
|
113
126
|
- Shell features (pipes, redirections) work on Linux and macOS only. Windows
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"""shellsafe: safe shell commands via Python 3.14 template strings.
|
|
2
2
|
|
|
3
3
|
Public surface (stable names, additive only through 1.0):
|
|
4
|
-
run, capture, shx, RAW, CaptureResult.
|
|
4
|
+
run, capture, shx, plan, RAW, CaptureResult.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from ._version import __version__
|
|
8
|
-
from .execute import CaptureResult, capture, run, shx
|
|
8
|
+
from .execute import CaptureResult, capture, plan, run, shx
|
|
9
9
|
from .raw import RAW
|
|
10
10
|
|
|
11
11
|
__all__ = [
|
|
@@ -13,6 +13,7 @@ __all__ = [
|
|
|
13
13
|
"CaptureResult",
|
|
14
14
|
"__version__",
|
|
15
15
|
"capture",
|
|
16
|
+
"plan",
|
|
16
17
|
"run",
|
|
17
18
|
"shx",
|
|
18
19
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.4"
|
|
@@ -4,7 +4,7 @@ import shellsafe
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
def test_public_names_exist():
|
|
7
|
-
for name in ("run", "capture", "shx", "RAW", "CaptureResult", "__version__"):
|
|
7
|
+
for name in ("run", "capture", "shx", "plan", "RAW", "CaptureResult", "__version__"):
|
|
8
8
|
assert hasattr(shellsafe, name), name
|
|
9
9
|
|
|
10
10
|
|
|
@@ -13,6 +13,7 @@ def test_all_is_exact():
|
|
|
13
13
|
"run",
|
|
14
14
|
"capture",
|
|
15
15
|
"shx",
|
|
16
|
+
"plan",
|
|
16
17
|
"RAW",
|
|
17
18
|
"CaptureResult",
|
|
18
19
|
"__version__",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.3.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|