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.
Files changed (58) hide show
  1. {shellsafe-0.3.3 → shellsafe-0.3.4}/CHANGELOG.md +8 -0
  2. {shellsafe-0.3.3 → shellsafe-0.3.4}/PKG-INFO +14 -1
  3. {shellsafe-0.3.3 → shellsafe-0.3.4}/README.md +13 -0
  4. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/__init__.py +3 -2
  5. shellsafe-0.3.4/src/shellsafe/_version.py +1 -0
  6. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_public_surface.py +2 -1
  7. shellsafe-0.3.3/src/shellsafe/_version.py +0 -1
  8. {shellsafe-0.3.3 → shellsafe-0.3.4}/.github/workflows/ci.yml +0 -0
  9. {shellsafe-0.3.3 → shellsafe-0.3.4}/.github/workflows/release.yml +0 -0
  10. {shellsafe-0.3.3 → shellsafe-0.3.4}/.gitignore +0 -0
  11. {shellsafe-0.3.3 → shellsafe-0.3.4}/CONTRIBUTING.md +0 -0
  12. {shellsafe-0.3.3 → shellsafe-0.3.4}/LICENSE +0 -0
  13. {shellsafe-0.3.3 → shellsafe-0.3.4}/examples/demo.py +0 -0
  14. {shellsafe-0.3.3 → shellsafe-0.3.4}/pyproject.toml +0 -0
  15. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/__main__.py +0 -0
  16. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/audit/__init__.py +0 -0
  17. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/audit/scanner.py +0 -0
  18. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/cli.py +0 -0
  19. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/errors.py +0 -0
  20. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/execute.py +0 -0
  21. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/exitcodes.py +0 -0
  22. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/platforms.py +0 -0
  23. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/py.typed +0 -0
  24. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/raw.py +0 -0
  25. {shellsafe-0.3.3 → shellsafe-0.3.4}/src/shellsafe/render.py +0 -0
  26. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au001_sample.py +0 -0
  27. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au002_sample.py +0 -0
  28. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au003_sample.py +0 -0
  29. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/au004_sample.py +0 -0
  30. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/fixtures/audit/suppress_sample.py +0 -0
  31. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/golden/.gitkeep +0 -0
  32. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/.gitkeep +0 -0
  33. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/test_cli_audit.py +0 -0
  34. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/integration/test_exec_posix.py +0 -0
  35. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/README.md +0 -0
  36. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_01_semicolon.txt +0 -0
  37. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_02_substitution.txt +0 -0
  38. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_03_backticks.txt +0 -0
  39. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_04_background_chain.txt +0 -0
  40. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_05_or_chain.txt +0 -0
  41. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_06_redirect_out.txt +0 -0
  42. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_07_redirect_in.txt +0 -0
  43. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_08_pipe_out.txt +0 -0
  44. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_09_quote_smuggle.txt +0 -0
  45. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_10_quote_storm.txt +0 -0
  46. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_11_globs_expansions.txt +0 -0
  47. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_12_newline.txt +0 -0
  48. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_13_fullwidth_semicolon.txt +0 -0
  49. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_14_whitespace.txt +0 -0
  50. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/payloads/cases/case_15_unicode_dashes.txt +0 -0
  51. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/property/.gitkeep +0 -0
  52. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/property/test_invariants.py +0 -0
  53. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_audit.py +0 -0
  54. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_cli.py +0 -0
  55. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_errors.py +0 -0
  56. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_payload_corpus.py +0 -0
  57. {shellsafe-0.3.3 → shellsafe-0.3.4}/tests/unit/test_raw.py +0 -0
  58. {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
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