socketsecurity 2.4.10__tar.gz → 2.4.11__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 (151) hide show
  1. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/CHANGELOG.md +13 -0
  2. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/PKG-INFO +1 -1
  3. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/docs/cli-reference.md +3 -3
  4. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/pyproject.toml +1 -1
  5. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/__init__.py +1 -1
  6. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/config.py +6 -10
  7. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/tools/reachability.py +17 -11
  8. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_config.py +15 -5
  9. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_reachability.py +16 -1
  10. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/uv.lock +1 -1
  11. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/CODEOWNERS +0 -0
  12. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
  13. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
  14. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
  15. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/actions/setup-docker/action.yml +0 -0
  17. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/actions/setup-hatch/action.yml +0 -0
  18. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/actions/setup-sfw/action.yml +0 -0
  19. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/dependabot.yml +0 -0
  20. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/dependency-review.yml +0 -0
  21. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/docker-stable.yml +0 -0
  22. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/e2e-test.yml +0 -0
  23. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/pr-preview.yml +0 -0
  24. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/python-tests.yml +0 -0
  25. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/release.yml +0 -0
  26. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/workflows/version-check.yml +0 -0
  27. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.github/zizmor.yml +0 -0
  28. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.gitignore +0 -0
  29. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.hooks/sync_version.py +0 -0
  30. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.pre-commit-config.yaml +0 -0
  31. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/.python-version +0 -0
  32. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/Dockerfile +0 -0
  33. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/LICENSE +0 -0
  34. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/Makefile +0 -0
  35. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/README.md +0 -0
  36. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/docs/ci-cd.md +0 -0
  37. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/docs/development.md +0 -0
  38. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/docs/troubleshooting.md +0 -0
  39. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-dashboard-parity.json +0 -0
  40. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-dashboard-parity.toml +0 -0
  41. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-diff-ci-cd.json +0 -0
  42. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-diff-ci-cd.toml +0 -0
  43. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-instance-detail.json +0 -0
  44. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/examples/config/sarif-instance-detail.toml +0 -0
  45. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/instructions/gitlab-commit-status/uat.md +0 -0
  46. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/pytest.ini +0 -0
  47. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/build_container.sh +0 -0
  48. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/build_container_flexible.sh +0 -0
  49. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/deploy-test-docker.sh +0 -0
  50. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/deploy-test-pypi.sh +0 -0
  51. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/docker-entrypoint.sh +0 -0
  52. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/scripts/run.sh +0 -0
  53. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/session.md +0 -0
  54. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socket.yml +0 -0
  55. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/__init__.py +0 -0
  56. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/alert_selection.py +0 -0
  57. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/classes.py +0 -0
  58. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/cli_client.py +0 -0
  59. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/cli_run.py +0 -0
  60. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/exceptions.py +0 -0
  61. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/git_interface.py +0 -0
  62. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/helper/__init__.py +0 -0
  63. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/helper/socket_facts_loader.py +0 -0
  64. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/lazy_file_loader.py +0 -0
  65. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/log_uploader.py +0 -0
  66. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/logging.py +0 -0
  67. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/messages.py +0 -0
  68. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/resource_utils.py +0 -0
  69. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm/__init__.py +0 -0
  70. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm/base.py +0 -0
  71. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm/client.py +0 -0
  72. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm/github.py +0 -0
  73. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm/gitlab.py +0 -0
  74. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/scm_comments.py +0 -0
  75. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/socket_config.py +0 -0
  76. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/streaming.py +0 -0
  77. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/core/utils.py +0 -0
  78. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/fossa_compat.py +0 -0
  79. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/output.py +0 -0
  80. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/__init__.py +0 -0
  81. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/base.py +0 -0
  82. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/formatters/__init__.py +0 -0
  83. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/formatters/slack.py +0 -0
  84. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/jira.py +0 -0
  85. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/manager.py +0 -0
  86. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/slack.py +0 -0
  87. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/teams.py +0 -0
  88. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/plugins/webhook.py +0 -0
  89. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/socketsecurity/socketcli.py +0 -0
  90. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/__init__.py +0 -0
  91. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/conftest.py +0 -0
  92. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/create_diff_input.json +0 -0
  93. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_diff_alerts.py +0 -0
  94. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_diff_generation.py +0 -0
  95. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_facts_compression.py +0 -0
  96. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_has_manifest_files.py +0 -0
  97. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_package_and_alerts.py +0 -0
  98. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_sdk_methods.py +0 -0
  99. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/core/test_supporting_methods.py +0 -0
  100. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/create_response.json +0 -0
  101. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/diff/stream_diff.json +0 -0
  102. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
  103. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/head_scan/metadata.json +0 -0
  104. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
  105. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
  106. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/new_scan/metadata.json +0 -0
  107. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
  108. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/repos/repo_info_error.json +0 -0
  109. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/repos/repo_info_no_head.json +0 -0
  110. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/repos/repo_info_success.json +0 -0
  111. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/data/settings/security-policy.json +0 -0
  112. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/fixtures/simple-npm/index.js +0 -0
  113. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/fixtures/simple-npm/package.json +0 -0
  114. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
  115. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/validate-gitlab.sh +0 -0
  116. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/validate-json.sh +0 -0
  117. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/validate-reachability.sh +0 -0
  118. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/validate-sarif.sh +0 -0
  119. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/e2e/validate-scan.sh +0 -0
  120. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/fixtures/fossa/README.md +0 -0
  121. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
  122. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
  123. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
  124. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
  125. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/__init__.py +0 -0
  126. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_alert_selection.py +0 -0
  127. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_cli_config.py +0 -0
  128. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_cli_run.py +0 -0
  129. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_client.py +0 -0
  130. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_dependency_overview.py +0 -0
  131. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_disable_ignore.py +0 -0
  132. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_exclude_paths.py +0 -0
  133. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_fossa_compat.py +0 -0
  134. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_fossa_parity.py +0 -0
  135. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_full_scan_retry.py +0 -0
  136. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_gitlab_auth.py +0 -0
  137. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_gitlab_auth_fallback.py +0 -0
  138. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_gitlab_commit_status.py +0 -0
  139. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_gitlab_format.py +0 -0
  140. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
  141. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_include_dirs.py +0 -0
  142. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_log_uploader.py +0 -0
  143. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_output.py +0 -0
  144. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_slack_plugin.py +0 -0
  145. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_socketcli.py +0 -0
  146. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_streaming.py +0 -0
  147. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/tests/unit/test_tier1_finalize.py +0 -0
  148. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/workflows/bitbucket-pipelines.yml +0 -0
  149. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/workflows/buildkite.yml +0 -0
  150. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/workflows/github-actions.yml +0 -0
  151. {socketsecurity-2.4.10 → socketsecurity-2.4.11}/workflows/gitlab-ci.yml +0 -0
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.4.11
4
+
5
+ ### Changed: units for `--reach-analysis-timeout` and `--reach-analysis-memory-limit`
6
+
7
+ - `--reach-analysis-timeout` now accepts a duration with an optional unit suffix — `s`, `m`
8
+ or `h` (e.g. `90s`, `10m`, `1h`). `--reach-analysis-memory-limit` now accepts a size with an
9
+ optional unit suffix — `MB` or `GB`, case-insensitive (e.g. `512MB`, `8GB`). The value is
10
+ passed through verbatim to the reachability engine (`@coana-tech/cli`), which owns parsing
11
+ and validation, so error messages come from a single source of truth.
12
+ - Backward compatible: a bare number is still accepted (seconds for the timeout, MB for the
13
+ memory limit), exactly as before. This legacy form is no longer documented but keeps working.
14
+ - Bumped the pinned `@coana-tech/cli` version to `15.5.0`, which ships the unit parser.
15
+
3
16
  ## 2.4.10
4
17
 
5
18
  ### Added: opt directories back into manifest discovery via `--include-dirs`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: socketsecurity
3
- Version: 2.4.10
3
+ Version: 2.4.11
4
4
  Summary: Socket Security CLI for CI/CD
5
5
  Project-URL: Homepage, https://socket.dev
6
6
  Author-email: Douglas Coburn <douglas@socket.dev>
@@ -241,9 +241,9 @@ If you don't want to provide the Socket API Token every time then you can use th
241
241
  | Parameter | Required | Default | Description |
242
242
  |:---------------------------------|:---------|:--------|:---------------------------------------------------------------------------------------------------------------------------|
243
243
  | `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code. Creates a tier-1 full-application reachability scan (`scan_type=socket_tier1`). |
244
- | `--reach-version` | False | 15.3.24 | Version of @coana-tech/cli to use. Defaults to the pinned version that ships with this CLI release, so the engine only changes when you upgrade the Socket CLI. Pass `latest` to always use the newest published version (opt-in auto-update), or an explicit version (e.g. `1.2.3`) to pin it. |
245
- | `--reach-analysis-timeout` | False | 600 | Timeout in seconds for the reachability analysis. Omitted by default, so coana applies its own default. Alias: `--reach-timeout` |
246
- | `--reach-analysis-memory-limit` | False | 8192 | Memory limit in MB for the reachability analysis. Omitted by default, so coana applies its own default. Alias: `--reach-memory-limit` |
244
+ | `--reach-version` | False | 15.5.0 | Version of @coana-tech/cli to use. Defaults to the pinned version that ships with this CLI release, so the engine only changes when you upgrade the Socket CLI. Pass `latest` to always use the newest published version (opt-in auto-update), or an explicit version (e.g. `1.2.3`) to pin it. |
245
+ | `--reach-analysis-timeout` | False | 10m | Timeout for each reachability analysis run, e.g. `90s`, `10m` or `1h`. Omitted by default, so coana applies its own default (`10m`). Alias: `--reach-timeout` |
246
+ | `--reach-analysis-memory-limit` | False | 8GB | Memory limit for each reachability analysis run, e.g. `512MB` or `8GB`. Omitted by default, so coana applies its own default (`8GB`). Alias: `--reach-memory-limit` |
247
247
  | `--reach-concurrency` | False | 1 | Control parallel analysis execution (must be >= 1). Omitted by default, so coana applies its own default. |
248
248
  | `--reach-additional-params` | False | | Pass custom parameters to the coana CLI tool |
249
249
  | `--reach-ecosystems` | False | | Comma-separated list of ecosystems to analyze (e.g., "npm,pypi"). If not specified, all supported ecosystems are analyzed |
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "socketsecurity"
9
- version = "2.4.10"
9
+ version = "2.4.11"
10
10
  requires-python = ">= 3.11"
11
11
  license = {"file" = "LICENSE"}
12
12
  dependencies = [
@@ -1,3 +1,3 @@
1
1
  __author__ = 'socket.dev'
2
- __version__ = '2.4.10'
2
+ __version__ = '2.4.11'
3
3
  USER_AGENT = f'SocketPythonCLI/{__version__}'
@@ -168,8 +168,8 @@ class CliConfig:
168
168
  # Reachability Flags
169
169
  reach: bool = False
170
170
  reach_version: Optional[str] = None
171
- reach_analysis_memory_limit: Optional[int] = None
172
- reach_analysis_timeout: Optional[int] = None
171
+ reach_analysis_memory_limit: Optional[str] = None
172
+ reach_analysis_timeout: Optional[str] = None
173
173
  reach_disable_analytics: bool = False
174
174
  reach_disable_analysis_splitting: bool = False # Deprecated, kept for backwards compatibility
175
175
  reach_enable_analysis_splitting: bool = False
@@ -988,29 +988,25 @@ def create_argument_parser() -> argparse.ArgumentParser:
988
988
  reachability_group.add_argument(
989
989
  "--reach-analysis-timeout",
990
990
  dest="reach_analysis_timeout",
991
- type=int,
992
- metavar="<seconds>",
993
- help="Timeout for reachability analysis in seconds"
991
+ metavar="<duration>",
992
+ help="Set the timeout for each reachability analysis run, e.g. 90s, 10m or 1h. (default: 10m)"
994
993
  )
995
994
  # Backwards-compatible alias for the pre-alignment name. Kept working, hidden from help.
996
995
  reachability_group.add_argument(
997
996
  "--reach-timeout",
998
997
  dest="reach_analysis_timeout",
999
- type=int,
1000
998
  help=argparse.SUPPRESS
1001
999
  )
1002
1000
  reachability_group.add_argument(
1003
1001
  "--reach-analysis-memory-limit",
1004
1002
  dest="reach_analysis_memory_limit",
1005
- type=int,
1006
- metavar="<mb>",
1007
- help="Memory limit for reachability analysis in MB (defaults to the coana CLI's own default, currently 8192)"
1003
+ metavar="<size>",
1004
+ help="Set the memory limit for each reachability analysis run, e.g. 512MB or 8GB. (default: 8GB)"
1008
1005
  )
1009
1006
  # Backwards-compatible alias for the pre-alignment name. Kept working, hidden from help.
1010
1007
  reachability_group.add_argument(
1011
1008
  "--reach-memory-limit",
1012
1009
  dest="reach_analysis_memory_limit",
1013
- type=int,
1014
1010
  help=argparse.SUPPRESS
1015
1011
  )
1016
1012
  reachability_group.add_argument(
@@ -18,7 +18,7 @@ log = logging.getLogger(__name__)
18
18
  # Pinned @coana-tech/cli version. Bumped deliberately per Python CLI release so the
19
19
  # reachability engine version only changes through a standard pip upgrade (advance notice).
20
20
  # Pass --reach-version latest to opt into the newest published version instead.
21
- DEFAULT_COANA_CLI_VERSION: Final = "15.3.24"
21
+ DEFAULT_COANA_CLI_VERSION: Final = "15.5.0"
22
22
 
23
23
  # Resolved @coana-tech/cli script paths from the npm-install fallback, keyed by version.
24
24
  # Lives for the process lifetime so repeated fallback invocations install only once
@@ -55,7 +55,7 @@ class ReachabilityAnalyzer:
55
55
 
56
56
  def _resolve_coana_package_spec(self, version: Optional[str] = None) -> str:
57
57
  """
58
- Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.3.24').
58
+ Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.5.0').
59
59
 
60
60
  Args:
61
61
  version: Coana CLI version to use.
@@ -64,7 +64,7 @@ class ReachabilityAnalyzer:
64
64
  - '<semver>': that exact version.
65
65
 
66
66
  Returns:
67
- str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.3.24').
67
+ str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.5.0').
68
68
  """
69
69
  return f"@coana-tech/cli@{self._resolve_coana_version(version)}"
70
70
 
@@ -79,8 +79,8 @@ class ReachabilityAnalyzer:
79
79
  target_directory: str,
80
80
  tar_hash: Optional[str] = None,
81
81
  output_path: str = ".socket.facts.json",
82
- timeout: Optional[int] = None,
83
- memory_limit: Optional[int] = None,
82
+ timeout: Optional[str] = None,
83
+ memory_limit: Optional[str] = None,
84
84
  ecosystems: Optional[List[str]] = None,
85
85
  exclude_paths: Optional[List[str]] = None,
86
86
  min_severity: Optional[str] = None,
@@ -112,8 +112,10 @@ class ReachabilityAnalyzer:
112
112
  target_directory: Directory to analyze
113
113
  tar_hash: Tar hash from manifest upload or existing scan (optional)
114
114
  output_path: Output file path for results
115
- timeout: Analysis timeout in seconds
116
- memory_limit: Memory limit in MB
115
+ timeout: Analysis timeout, forwarded verbatim to coana --analysis-timeout
116
+ (coana parses the units, e.g. '90s', '10m', '1h'; a bare number is seconds)
117
+ memory_limit: Memory limit, forwarded verbatim to coana --memory-limit
118
+ (coana parses the units, e.g. '512MB', '8GB'; a bare number is MB)
117
119
  ecosystems: List of ecosystems to analyze (e.g., ['npm', 'pypi'])
118
120
  exclude_paths: Paths to exclude from analysis
119
121
  min_severity: Minimum severity level (info, low, moderate, high, critical)
@@ -149,11 +151,15 @@ class ReachabilityAnalyzer:
149
151
  "--disable-report-submission"
150
152
  ])
151
153
 
152
- # Add conditional arguments
153
- if timeout:
154
+ # Add conditional arguments. timeout/memory_limit are forwarded verbatim; coana owns
155
+ # unit parsing/validation (e.g. '90s', '8GB'). We coerce to str only for subprocess
156
+ # safety — config-file values can arrive as ints via argparse set_defaults — and use
157
+ # `is not None` (not truthiness) so an explicit empty string still reaches coana and
158
+ # triggers coana's own error, rather than being silently dropped.
159
+ if timeout is not None:
154
160
  coana_args.extend(["--analysis-timeout", str(timeout)])
155
-
156
- if memory_limit:
161
+
162
+ if memory_limit is not None:
157
163
  coana_args.extend(["--memory-limit", str(memory_limit)])
158
164
 
159
165
  if disable_analytics:
@@ -180,21 +180,31 @@ class TestReachAlignmentFlags:
180
180
  assert config.reach_analysis_timeout is None
181
181
 
182
182
  def test_reach_node_style_name_aliases(self):
183
- """G8: Node-style primary names map to the same dests."""
183
+ """G8: Node-style primary names map to the same dests. Values are kept as raw
184
+ strings and forwarded verbatim to coana (coana owns unit parsing)."""
184
185
  config = CliConfig.from_args(
185
186
  self.BASE_ARGS
186
187
  + ["--reach", "--reach-analysis-timeout", "300", "--reach-analysis-memory-limit", "2048"]
187
188
  )
188
- assert config.reach_analysis_timeout == 300
189
- assert config.reach_analysis_memory_limit == 2048
189
+ assert config.reach_analysis_timeout == "300"
190
+ assert config.reach_analysis_memory_limit == "2048"
190
191
 
191
192
  def test_reach_legacy_name_aliases_still_work(self):
192
193
  """G8: pre-alignment names keep working (hidden aliases)."""
193
194
  config = CliConfig.from_args(
194
195
  self.BASE_ARGS + ["--reach", "--reach-timeout", "111", "--reach-memory-limit", "512"]
195
196
  )
196
- assert config.reach_analysis_timeout == 111
197
- assert config.reach_analysis_memory_limit == 512
197
+ assert config.reach_analysis_timeout == "111"
198
+ assert config.reach_analysis_memory_limit == "512"
199
+
200
+ def test_reach_unit_suffixes_are_passed_through_verbatim(self):
201
+ """Unit-bearing values (parsed/validated by coana) are stored as-is, not coerced."""
202
+ config = CliConfig.from_args(
203
+ self.BASE_ARGS
204
+ + ["--reach", "--reach-analysis-timeout", "10m", "--reach-analysis-memory-limit", "8GB"]
205
+ )
206
+ assert config.reach_analysis_timeout == "10m"
207
+ assert config.reach_analysis_memory_limit == "8GB"
198
208
 
199
209
  def test_reach_debug_flag(self):
200
210
  """G9: dedicated --reach-debug flag, independent of --enable-debug."""
@@ -87,11 +87,26 @@ def test_disable_external_tool_checks(analyzer, mocker):
87
87
 
88
88
  def test_concurrency_and_memory_args(analyzer, mocker):
89
89
  """G7: explicit concurrency/memory propagate as coana args."""
90
- cmd, _ = _run(analyzer, mocker, concurrency=1, memory_limit=8192)
90
+ cmd, _ = _run(analyzer, mocker, concurrency=1, memory_limit="8192")
91
91
  assert "--concurrency" in cmd and cmd[cmd.index("--concurrency") + 1] == "1"
92
92
  assert "--memory-limit" in cmd and cmd[cmd.index("--memory-limit") + 1] == "8192"
93
93
 
94
94
 
95
+ def test_timeout_and_memory_units_forwarded_verbatim(analyzer, mocker):
96
+ """Unit-bearing timeout/memory strings are forwarded to coana untouched (coana parses them)."""
97
+ cmd, _ = _run(analyzer, mocker, timeout="10m", memory_limit="8GB")
98
+ assert cmd[cmd.index("--analysis-timeout") + 1] == "10m"
99
+ assert cmd[cmd.index("--memory-limit") + 1] == "8GB"
100
+
101
+
102
+ def test_timeout_and_memory_int_values_coerced_to_str(analyzer, mocker):
103
+ """Config-file values can arrive as ints (set_defaults bypasses argparse type=); they must
104
+ still reach subprocess as strings, not raw ints."""
105
+ cmd, _ = _run(analyzer, mocker, timeout=300, memory_limit=2048)
106
+ assert cmd[cmd.index("--analysis-timeout") + 1] == "300"
107
+ assert cmd[cmd.index("--memory-limit") + 1] == "2048"
108
+
109
+
95
110
  def test_env_identifies_python_cli(analyzer, mocker):
96
111
  """G5: SOCKET_CLI_VERSION + SOCKET_CALLER_USER_AGENT forwarded to coana."""
97
112
  _, env = _run(analyzer, mocker)
@@ -1283,7 +1283,7 @@ wheels = [
1283
1283
 
1284
1284
  [[package]]
1285
1285
  name = "socketsecurity"
1286
- version = "2.4.10"
1286
+ version = "2.4.11"
1287
1287
  source = { editable = "." }
1288
1288
  dependencies = [
1289
1289
  { name = "brotli", marker = "platform_python_implementation == 'CPython'" },
File without changes