socketsecurity 2.7.0__tar.gz → 2.7.2__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 (162) hide show
  1. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/python-tests.yml +20 -0
  2. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/CHANGELOG.md +16 -0
  3. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/PKG-INFO +1 -1
  4. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/cli-reference.md +2 -3
  5. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/pyproject.toml +1 -1
  6. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/__init__.py +1 -1
  7. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/config.py +7 -5
  8. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/cli_client.py +1 -0
  9. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/helper/__init__.py +2 -1
  10. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/helper/socket_facts_loader.py +3 -3
  11. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/lazy_file_loader.py +1 -3
  12. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/messages.py +1 -0
  13. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/resource_utils.py +0 -1
  14. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/client.py +1 -0
  15. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/gitlab.py +4 -3
  16. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/socket_config.py +3 -4
  17. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/tools/reachability.py +13 -21
  18. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/output.py +9 -6
  19. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/slack.py +1 -1
  20. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/jira.py +6 -3
  21. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/manager.py +1 -1
  22. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/slack.py +8 -5
  23. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/teams.py +3 -1
  24. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/webhook.py +3 -1
  25. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/socketcli.py +6 -9
  26. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_alerts.py +0 -1
  27. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_cli_config.py +1 -0
  28. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_client.py +7 -5
  29. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_config.py +5 -3
  30. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_disable_ignore.py +0 -2
  31. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth.py +2 -1
  32. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth_fallback.py +6 -5
  33. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_commit_status.py +1 -3
  34. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_format.py +1 -2
  35. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_include_dirs.py +0 -2
  36. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_reachability.py +8 -8
  37. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_socketcli.py +5 -3
  38. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/uv.lock +1 -1
  39. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/CODEOWNERS +0 -0
  40. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
  41. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
  42. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
  43. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  44. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-docker/action.yml +0 -0
  45. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-hatch/action.yml +0 -0
  46. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-sfw/action.yml +0 -0
  47. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/dependabot.yml +0 -0
  48. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/dependency-review.yml +0 -0
  49. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/docker-stable.yml +0 -0
  50. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/e2e-test.yml +0 -0
  51. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/package-check.yml +0 -0
  52. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/pr-preview.yml +0 -0
  53. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/release.yml +0 -0
  54. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/version-check.yml +0 -0
  55. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/zizmor.yml +0 -0
  56. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.gitignore +0 -0
  57. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.hooks/sync_version.py +0 -0
  58. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.pre-commit-config.yaml +0 -0
  59. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.python-version +0 -0
  60. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/CONTRIBUTING.md +0 -0
  61. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Dockerfile +0 -0
  62. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Dockerfile.preview +0 -0
  63. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/LICENSE +0 -0
  64. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Makefile +0 -0
  65. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/README.md +0 -0
  66. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/benchmarks/manifest_discovery.py +0 -0
  67. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/ci-cd.md +0 -0
  68. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/development.md +0 -0
  69. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/troubleshooting.md +0 -0
  70. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.json +0 -0
  71. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.toml +0 -0
  72. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.json +0 -0
  73. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.toml +0 -0
  74. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.json +0 -0
  75. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.toml +0 -0
  76. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/instructions/gitlab-commit-status/uat.md +0 -0
  77. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/pytest.ini +0 -0
  78. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/build_container.sh +0 -0
  79. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/build_container_flexible.sh +0 -0
  80. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/deploy-test-docker.sh +0 -0
  81. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/deploy-test-pypi.sh +0 -0
  82. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/docker-entrypoint.sh +0 -0
  83. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/run.sh +0 -0
  84. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/session.md +0 -0
  85. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socket.yml +0 -0
  86. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/__init__.py +0 -0
  87. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/alert_selection.py +0 -0
  88. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/classes.py +0 -0
  89. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/cli_run.py +0 -0
  90. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/exceptions.py +0 -0
  91. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/git_interface.py +0 -0
  92. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/log_uploader.py +0 -0
  93. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/logging.py +0 -0
  94. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/__init__.py +0 -0
  95. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/base.py +0 -0
  96. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/github.py +0 -0
  97. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm_comments.py +0 -0
  98. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/streaming.py +0 -0
  99. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/utils.py +0 -0
  100. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/fossa_compat.py +0 -0
  101. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/__init__.py +0 -0
  102. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/base.py +0 -0
  103. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/__init__.py +0 -0
  104. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/__init__.py +0 -0
  105. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/conftest.py +0 -0
  106. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/create_diff_input.json +0 -0
  107. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_generation.py +0 -0
  108. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_scan_polling.py +0 -0
  109. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_facts_compression.py +0 -0
  110. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_has_manifest_files.py +0 -0
  111. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_invalid_facts_marker.py +0 -0
  112. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_package_and_alerts.py +0 -0
  113. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_sdk_methods.py +0 -0
  114. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_supporting_methods.py +0 -0
  115. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/create_response.json +0 -0
  116. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff.json +0 -0
  117. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
  118. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/metadata.json +0 -0
  119. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
  120. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
  121. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/metadata.json +0 -0
  122. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
  123. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_error.json +0 -0
  124. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_no_head.json +0 -0
  125. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_success.json +0 -0
  126. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/settings/security-policy.json +0 -0
  127. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/index.js +0 -0
  128. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/package.json +0 -0
  129. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
  130. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/reach-facts-probe.sh +0 -0
  131. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-gitlab.sh +0 -0
  132. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-json.sh +0 -0
  133. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-reachability.sh +0 -0
  134. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-sarif.sh +0 -0
  135. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-scan.sh +0 -0
  136. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/README.md +0 -0
  137. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
  138. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
  139. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
  140. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
  141. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/__init__.py +0 -0
  142. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_alert_selection.py +0 -0
  143. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_cli_run.py +0 -0
  144. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_dependency_overview.py +0 -0
  145. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_exclude_paths.py +0 -0
  146. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_fossa_compat.py +0 -0
  147. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_fossa_parity.py +0 -0
  148. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_full_scan_retry.py +0 -0
  149. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_git_interface.py +0 -0
  150. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_github_buildkite_config.py +0 -0
  151. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
  152. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_log_uploader.py +0 -0
  153. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_manifest_discovery.py +0 -0
  154. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_output.py +0 -0
  155. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_pr_comment_rendering.py +0 -0
  156. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_slack_plugin.py +0 -0
  157. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_streaming.py +0 -0
  158. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_tier1_finalize.py +0 -0
  159. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/bitbucket-pipelines.yml +0 -0
  160. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/buildkite.yml +0 -0
  161. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/github-actions.yml +0 -0
  162. {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/gitlab-ci.yml +0 -0
@@ -67,6 +67,26 @@ jobs:
67
67
  uv export --no-hashes --no-emit-project --format requirements-txt > /tmp/req-audit.txt
68
68
  uvx pip-audit --strict --progress-spinner off --disable-pip --no-deps -r /tmp/req-audit.txt
69
69
 
70
+ ruff:
71
+ runs-on: ubuntu-latest
72
+ timeout-minutes: 10
73
+ steps:
74
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
75
+ with:
76
+ fetch-depth: 1
77
+ persist-credentials: false
78
+ - name: 🐍 setup python
79
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
80
+ with:
81
+ python-version: ${{ env.PYTHON_VERSION }}
82
+ - name: 🛠️ install deps
83
+ run: |
84
+ python -m pip install --upgrade pip
85
+ pip install uv
86
+ uv sync --extra dev
87
+ - name: 🧹 run ruff
88
+ run: uv run ruff check
89
+
70
90
  unsupported-python-install:
71
91
  runs-on: ubuntu-latest
72
92
  timeout-minutes: 10
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.7.2
4
+
5
+ ### Changed: bump pinned @coana-tech/cli to 15.10.39
6
+
7
+ - Bumped the pinned reachability engine (`@coana-tech/cli`) from `15.10.36` to
8
+ `15.10.39`. See the [Coana changelogs](https://docs.coana.tech/changelogs) for
9
+ engine changes.
10
+
11
+ ## 2.7.1
12
+
13
+ ### Changed: bump pinned @coana-tech/cli to 15.10.36
14
+
15
+ - Bumped the pinned reachability engine (`@coana-tech/cli`) from `15.10.32` to
16
+ `15.10.36`. See the [Coana changelogs](https://docs.coana.tech/changelogs) for
17
+ engine changes.
18
+
3
19
  ## 2.7.0
4
20
 
5
21
  ### Fixed: unreadable reachability facts no longer report a blocking package
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: socketsecurity
3
- Version: 2.7.0
3
+ Version: 2.7.2
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>
@@ -156,7 +156,7 @@ socketcli [-h] [--api-token API_TOKEN] [--repo REPO] [--workspace WORKSPACE] [--
156
156
  [--reach] [--reach-version REACH_VERSION] [--reach-analysis-timeout REACH_ANALYSIS_TIMEOUT]
157
157
  [--reach-analysis-memory-limit REACH_ANALYSIS_MEMORY_LIMIT] [--reach-concurrency REACH_CONCURRENCY] [--reach-ecosystems REACH_ECOSYSTEMS]
158
158
  [--reach-min-severity <level>] [--reach-skip-cache] [--reach-disable-analytics] [--reach-enable-analysis-splitting] [--reach-detailed-analysis-log-file]
159
- [--reach-lazy-mode] [--reach-use-only-pregenerated-sboms] [--reach-debug] [--reach-disable-external-tool-checks]
159
+ [--reach-use-only-pregenerated-sboms] [--reach-debug] [--reach-disable-external-tool-checks]
160
160
  [--reach-output-file REACH_OUTPUT_FILE] [--only-facts-file] [--version]
161
161
  ````
162
162
 
@@ -275,7 +275,7 @@ If you don't want to provide the Socket API Token every time then you can use th
275
275
  | Parameter | Required | Default | Description |
276
276
  |:---------------------------------|:---------|:--------|:---------------------------------------------------------------------------------------------------------------------------|
277
277
  | `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code. Creates a full application reachability scan (`scan_type=socket_tier1`). |
278
- | `--reach-version` | False | 15.10.32 | 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. |
278
+ | `--reach-version` | False | 15.10.39 | 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. |
279
279
  | `--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` |
280
280
  | `--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` |
281
281
  | `--reach-concurrency` | False | 1 | Control parallel analysis execution (must be >= 1). Omitted by default, so coana applies its own default. |
@@ -286,7 +286,6 @@ If you don't want to provide the Socket API Token every time then you can use th
286
286
  | `--reach-disable-analytics` | False | False | Disable analytics collection during reachability analysis |
287
287
  | `--reach-enable-analysis-splitting` | False | False | Enable analysis splitting/bucketing (a legacy performance feature). Splitting is disabled by default. |
288
288
  | `--reach-detailed-analysis-log-file` | False | False | Write a detailed analysis log file; its path is printed to stdout |
289
- | `--reach-lazy-mode` | False | False | Enable lazy mode (experimental performance feature) |
290
289
  | `--reach-use-only-pregenerated-sboms` | False | False | Build the scan only from pre-generated CycloneDX (CDX) and SPDX files in your project (requires --reach) |
291
290
  | `--reach-debug` | False | False | Enable coana debug output (`--debug`) for the analysis, independent of the global `--enable-debug` |
292
291
  | `--reach-disable-external-tool-checks` | False | False | Disable coana's external tool availability checks (passes `--disable-external-tool-checks`) |
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "socketsecurity"
9
- version = "2.7.0"
9
+ version = "2.7.2"
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.7.0'
2
+ __version__ = '2.7.2'
3
3
  USER_AGENT = f'SocketPythonCLI/{__version__}'
@@ -1,12 +1,14 @@
1
1
  import argparse
2
+ import json
2
3
  import logging
3
4
  import os
5
+ import tomllib
4
6
  from dataclasses import asdict, dataclass, field
5
7
  from typing import List, Optional
6
- from socketsecurity import __version__
8
+
7
9
  from socketdev import INTEGRATION_TYPES, IntegrationType
8
- import json
9
- import tomllib
10
+
11
+ from socketsecurity import __version__
10
12
 
11
13
 
12
14
  def get_plugin_config_from_env(prefix: str) -> dict:
@@ -176,7 +178,7 @@ class CliConfig:
176
178
  reach_disable_analysis_splitting: bool = False # Deprecated, kept for backwards compatibility
177
179
  reach_enable_analysis_splitting: bool = False
178
180
  reach_detailed_analysis_log_file: bool = False
179
- reach_lazy_mode: bool = False
181
+ reach_lazy_mode: bool = False # Deprecated, kept for backwards compatibility
180
182
  reach_ecosystems: Optional[List[str]] = None
181
183
  reach_exclude_paths: Optional[List[str]] = None
182
184
  reach_skip_cache: bool = False
@@ -1091,7 +1093,7 @@ def create_argument_parser() -> argparse.ArgumentParser:
1091
1093
  "--reach-lazy-mode",
1092
1094
  dest="reach_lazy_mode",
1093
1095
  action="store_true",
1094
- help="Enable lazy mode for reachability analysis. This is an experimental feature for improving performance"
1096
+ help=argparse.SUPPRESS # Deprecated, kept for backwards compatibility (no-op)
1095
1097
  )
1096
1098
  reachability_group.add_argument(
1097
1099
  "--reach-output-file",
@@ -6,6 +6,7 @@ from typing import Dict, List, Optional, Union
6
6
  import requests
7
7
 
8
8
  from socketsecurity import USER_AGENT
9
+
9
10
  from .exceptions import APIFailure
10
11
  from .socket_config import SocketConfig
11
12
 
@@ -1,7 +1,8 @@
1
+ import string
2
+
1
3
  import markdown
2
4
  from bs4 import BeautifulSoup, Tag
3
5
  from bs4.element import NavigableString
4
- import string
5
6
 
6
7
 
7
8
  class Helper:
@@ -2,9 +2,9 @@
2
2
 
3
3
  import json
4
4
  import logging
5
- from pathlib import Path
6
- from typing import Dict, Any, Optional, List
7
5
  from copy import deepcopy
6
+ from pathlib import Path
7
+ from typing import Any, Dict, List, Optional
8
8
 
9
9
  logger = logging.getLogger(__name__)
10
10
 
@@ -65,7 +65,7 @@ def load_socket_facts(file_path: str = ".socket.facts.json") -> Optional[Dict[st
65
65
  return None
66
66
 
67
67
  if 'components' not in data:
68
- logger.warning(f"Socket facts file missing 'components' key")
68
+ logger.warning("Socket facts file missing 'components' key")
69
69
 
70
70
  return data
71
71
 
@@ -2,9 +2,7 @@
2
2
  Lazy file loading utilities for efficient manifest file processing.
3
3
  """
4
4
  import logging
5
- from typing import List, Tuple, Union, BinaryIO
6
- from io import BytesIO
7
- import os
5
+ from typing import List, Tuple
8
6
 
9
7
  log = logging.getLogger("socketdev")
10
8
 
@@ -5,6 +5,7 @@ import re
5
5
  import uuid
6
6
  from datetime import datetime, timezone
7
7
  from pathlib import Path
8
+
8
9
  from mdutils import MdUtils
9
10
  from prettytable import PrettyTable
10
11
 
@@ -2,7 +2,6 @@
2
2
  System resource utilities for the Socket Security CLI.
3
3
  """
4
4
  import logging
5
- import sys
6
5
 
7
6
  # The resource module is only available on Unix-like systems
8
7
  resource_available = False
@@ -2,6 +2,7 @@ from abc import abstractmethod
2
2
  from typing import Dict
3
3
 
4
4
  from socketsecurity import USER_AGENT
5
+
5
6
  from ..cli_client import CliClient
6
7
 
7
8
 
@@ -2,9 +2,10 @@ import json
2
2
  import os
3
3
  import sys
4
4
  from dataclasses import dataclass
5
- from typing import Optional, Union
5
+ from typing import Optional
6
6
 
7
7
  import requests
8
+
8
9
  from socketsecurity import USER_AGENT
9
10
  from socketsecurity.core import log
10
11
  from socketsecurity.core.classes import Comment
@@ -140,7 +141,7 @@ class Gitlab:
140
141
  except requests.exceptions.HTTPError as e:
141
142
  # Check if this is an authentication error (401)
142
143
  if e.response and e.response.status_code == 401:
143
- log.debug(f"Authentication failed with initial headers, trying fallback method")
144
+ log.debug("Authentication failed with initial headers, trying fallback method")
144
145
 
145
146
  # Determine the fallback headers
146
147
  original_headers = kwargs.get('headers', self.config.headers)
@@ -153,7 +154,7 @@ class Gitlab:
153
154
 
154
155
  # Re-raise the original exception if it's not an auth error or fallback failed
155
156
  raise
156
- except Exception as e:
157
+ except Exception:
157
158
  # Handle other types of exceptions that don't have response attribute
158
159
  raise
159
160
 
@@ -1,12 +1,11 @@
1
+ import os
1
2
  from dataclasses import dataclass, field
2
- from typing import Dict, Optional
3
+ from typing import List, Optional, Set
3
4
  from urllib.parse import urlparse
4
- from typing import Set, List
5
- import os
6
5
 
7
6
  from socketdev.core.issues import AllIssues
8
- from socketsecurity import __version__
9
7
 
8
+ from socketsecurity import __version__
10
9
 
11
10
  default_exclude_dirs = {
12
11
  "node_modules", "bower_components", "jspm_packages", # JS/TS
@@ -1,15 +1,16 @@
1
- from socketdev import socketdev
2
- from typing import List, Optional, Dict, Any, Final
3
1
  import atexit
2
+ import json
3
+ import logging
4
4
  import os
5
+ import pathlib
5
6
  import platform
6
7
  import shutil
7
8
  import subprocess
8
- import json
9
- import pathlib
10
- import logging
11
9
  import sys
12
10
  import tempfile
11
+ from typing import Any, Dict, Final, List, Optional
12
+
13
+ from socketdev import socketdev
13
14
 
14
15
  from socketsecurity import __version__
15
16
 
@@ -18,7 +19,7 @@ log = logging.getLogger(__name__)
18
19
  # Pinned @coana-tech/cli version. Bumped deliberately per Python CLI release so the
19
20
  # reachability engine version only changes through a standard pip upgrade (advance notice).
20
21
  # Pass --reach-version latest to opt into the newest published version instead.
21
- DEFAULT_COANA_CLI_VERSION: Final = "15.10.32"
22
+ DEFAULT_COANA_CLI_VERSION: Final = "15.10.39"
22
23
 
23
24
  # Resolved @coana-tech/cli script paths from the npm-install fallback, keyed by version.
24
25
  # Lives for the process lifetime so repeated fallback invocations install only once
@@ -55,7 +56,7 @@ class ReachabilityAnalyzer:
55
56
 
56
57
  def _resolve_coana_package_spec(self, version: Optional[str] = None) -> str:
57
58
  """
58
- Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.10.32').
59
+ Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.10.39').
59
60
 
60
61
  Args:
61
62
  version: Coana CLI version to use.
@@ -64,7 +65,7 @@ class ReachabilityAnalyzer:
64
65
  - '<semver>': that exact version.
65
66
 
66
67
  Returns:
67
- str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.10.32').
68
+ str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.10.39').
68
69
  """
69
70
  return f"@coana-tech/cli@{self._resolve_coana_version(version)}"
70
71
 
@@ -77,7 +78,7 @@ class ReachabilityAnalyzer:
77
78
  self,
78
79
  org_slug: str,
79
80
  target_directory: str,
80
- tar_hash: Optional[str] = None,
81
+ tar_hash: str,
81
82
  output_path: str = ".socket.facts.json",
82
83
  timeout: Optional[str] = None,
83
84
  memory_limit: Optional[str] = None,
@@ -88,7 +89,6 @@ class ReachabilityAnalyzer:
88
89
  disable_analytics: bool = False,
89
90
  enable_analysis_splitting: bool = False,
90
91
  detailed_analysis_log_file: bool = False,
91
- lazy_mode: bool = False,
92
92
  repo_name: Optional[str] = None,
93
93
  branch_name: Optional[str] = None,
94
94
  version: Optional[str] = None,
@@ -123,7 +123,6 @@ class ReachabilityAnalyzer:
123
123
  disable_analytics: Disable analytics sharing
124
124
  enable_analysis_splitting: Enable analysis splitting (disabled by default)
125
125
  detailed_analysis_log_file: Print detailed analysis log file path
126
- lazy_mode: Enable lazy mode for analysis
127
126
  repo_name: Repository name
128
127
  branch_name: Branch name
129
128
  version: @coana-tech/cli version to use. None uses the pinned
@@ -153,9 +152,7 @@ class ReachabilityAnalyzer:
153
152
 
154
153
  # Add conditional arguments. timeout/memory_limit are forwarded verbatim; coana owns
155
154
  # 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.
155
+ # safety — config-file values can arrive as ints via argparse set_defaults.
159
156
  if timeout is not None:
160
157
  coana_args.extend(["--analysis-timeout", str(timeout)])
161
158
 
@@ -172,12 +169,7 @@ class ReachabilityAnalyzer:
172
169
  if detailed_analysis_log_file:
173
170
  coana_args.append("--print-analysis-log-file")
174
171
 
175
- if lazy_mode:
176
- coana_args.append("--lazy-mode")
177
-
178
- # KEY POINT: Only add manifest tar hash if we have one
179
- if tar_hash:
180
- coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
172
+ coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
181
173
 
182
174
  if ecosystems:
183
175
  coana_args.extend(["--purl-types"] + ecosystems)
@@ -267,7 +259,7 @@ class ReachabilityAnalyzer:
267
259
  # Extract scan ID from output file
268
260
  scan_id = self._extract_scan_id(output_path)
269
261
 
270
- log.info(f"Reachability analysis completed successfully")
262
+ log.info("Reachability analysis completed successfully")
271
263
  if scan_id:
272
264
  log.info(f"Scan ID: {scan_id}")
273
265
 
@@ -2,18 +2,21 @@ import json
2
2
  import logging
3
3
  from pathlib import Path
4
4
  from typing import Any, Dict, Optional
5
- from .core.messages import Messages
6
- from .core.classes import Diff, Issue
7
- from .config import CliConfig
8
- from .fossa_compat import build_fossa_report_payload
9
- from socketsecurity.plugins.manager import PluginManager
5
+
6
+ from socketdev import socketdev
7
+
10
8
  from socketsecurity.core.alert_selection import (
11
9
  clone_diff_with_selected_alerts,
12
10
  filter_alerts_by_reachability,
13
11
  load_components_with_alerts,
14
12
  select_diff_alerts,
15
13
  )
16
- from socketdev import socketdev
14
+ from socketsecurity.plugins.manager import PluginManager
15
+
16
+ from .config import CliConfig
17
+ from .core.classes import Diff, Issue
18
+ from .core.messages import Messages
19
+ from .fossa_compat import build_fossa_report_payload
17
20
 
18
21
 
19
22
  class OutputHandler:
@@ -1,8 +1,8 @@
1
1
  """Slack formatter for Socket Facts (reachability analysis) data."""
2
2
 
3
3
  import logging
4
- from typing import Dict, Any, List
5
4
  from collections import defaultdict
5
+ from typing import Any, Dict, List
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
8
 
@@ -1,9 +1,12 @@
1
- from .base import Plugin
2
- import requests
3
1
  import base64
4
- from socketsecurity.core.classes import Diff
2
+
3
+ import requests
4
+
5
5
  from socketsecurity.config import CliConfig
6
6
  from socketsecurity.core import log
7
+ from socketsecurity.core.classes import Diff
8
+
9
+ from .base import Plugin
7
10
 
8
11
 
9
12
  class JiraPlugin(Plugin):
@@ -1,4 +1,4 @@
1
- from . import jira, webhook, slack, teams
1
+ from . import jira, slack, teams, webhook
2
2
 
3
3
  PLUGIN_CLASSES = {
4
4
  "jira": jira.JiraPlugin,
@@ -1,22 +1,25 @@
1
1
  import logging
2
2
  import os
3
+
3
4
  import requests
5
+
4
6
  from socketsecurity.config import CliConfig
5
- from .base import Plugin
6
- from socketsecurity.core.classes import Diff
7
- from socketsecurity.core.messages import Messages
8
7
  from socketsecurity.core.alert_selection import (
9
8
  clone_diff_with_selected_alerts,
10
9
  filter_alerts_by_reachability,
11
10
  select_diff_alerts,
12
11
  )
12
+ from socketsecurity.core.classes import Diff
13
13
  from socketsecurity.core.helper.socket_facts_loader import (
14
- load_socket_facts,
14
+ convert_to_alerts,
15
15
  get_components_with_vulnerabilities,
16
- convert_to_alerts
16
+ load_socket_facts,
17
17
  )
18
+ from socketsecurity.core.messages import Messages
18
19
  from socketsecurity.plugins.formatters.slack import format_socket_facts_for_slack
19
20
 
21
+ from .base import Plugin
22
+
20
23
  logger = logging.getLogger(__name__)
21
24
 
22
25
 
@@ -1,6 +1,8 @@
1
- from .base import Plugin
2
1
  import requests
3
2
 
3
+ from .base import Plugin
4
+
5
+
4
6
  class TeamsPlugin(Plugin):
5
7
  def send(self, message, level):
6
8
  if not self.config.get("enabled", False):
@@ -1,6 +1,8 @@
1
- from .base import Plugin
2
1
  import requests
3
2
 
3
+ from .base import Plugin
4
+
5
+
4
6
  class WebhookPlugin(Plugin):
5
7
  def send(self, message, level):
6
8
  if not self.config.get("enabled", False):
@@ -391,14 +391,11 @@ def main_code():
391
391
 
392
392
  # Find manifest files in scan paths (excluding .socket.facts.json to avoid circular dependency)
393
393
  log.info("Finding manifest files for reachability analysis...")
394
- manifest_files = []
395
-
396
- # Always find all manifest files for the tar hash upload
397
- for scan_path in scan_paths:
398
- scan_manifests = core.find_files(scan_path)
399
- # Filter out .socket.facts.json files from manifest upload
400
- scan_manifests = [f for f in scan_manifests if not f.endswith('.socket.facts.json')]
401
- manifest_files.extend(scan_manifests)
394
+ manifest_files = [
395
+ # Always find all manifest files for the tar hash upload
396
+ f for scan_path in scan_paths for f in core.find_files(scan_path)
397
+ if not f.endswith('.socket.facts.json')
398
+ ]
402
399
 
403
400
  if not manifest_files:
404
401
  log.warning("No manifest files found for reachability analysis")
@@ -410,6 +407,7 @@ def main_code():
410
407
  try:
411
408
  # Get org_slug early (we'll need it)
412
409
  org_slug = core.config.org_slug
410
+ assert org_slug
413
411
 
414
412
  # Upload manifest files
415
413
  tar_hash = sdk.uploadmanifests.upload_manifest_files(
@@ -450,7 +448,6 @@ def main_code():
450
448
  disable_analytics=config.reach_disable_analytics or False,
451
449
  enable_analysis_splitting=config.reach_enable_analysis_splitting or False,
452
450
  detailed_analysis_log_file=config.reach_detailed_analysis_log_file or False,
453
- lazy_mode=config.reach_lazy_mode or False,
454
451
  repo_name=None if repo_defaulted else config.repo,
455
452
  branch_name=None if branch_defaulted else config.branch,
456
453
  version=config.reach_version,
@@ -1,4 +1,3 @@
1
- import pytest
2
1
  from socketsecurity.core import Core
3
2
  from socketsecurity.core.classes import Issue
4
3
 
@@ -1,4 +1,5 @@
1
1
  import pytest
2
+
2
3
  from socketsecurity.config import CliConfig
3
4
 
4
5
 
@@ -1,9 +1,12 @@
1
- import pytest
2
1
  from unittest.mock import Mock, patch
2
+
3
+ import pytest
3
4
  import requests
5
+
4
6
  from socketsecurity.core.cli_client import CliClient
5
- from socketsecurity.core.socket_config import SocketConfig
6
7
  from socketsecurity.core.exceptions import APIFailure
8
+ from socketsecurity.core.socket_config import SocketConfig
9
+
7
10
 
8
11
  @pytest.fixture
9
12
  def config():
@@ -100,14 +103,14 @@ def test_request_ssl_verification(client):
100
103
  client.request("test/path")
101
104
 
102
105
  args, kwargs = mock_request.call_args
103
- assert kwargs['verify'] == True # Default is True
106
+ assert kwargs['verify'] # Default is True
104
107
 
105
108
  # Test with SSL verification disabled
106
109
  client.config.allow_unverified_ssl = True
107
110
  client.request("test/path")
108
111
 
109
112
  args, kwargs = mock_request.call_args
110
- assert kwargs['verify'] == False
113
+ assert not kwargs['verify']
111
114
 
112
115
  def test_request_with_payload(client):
113
116
  """Test request with payload data"""
@@ -154,7 +157,6 @@ def test_post_telemetry_events_sends_individually(client):
154
157
 
155
158
  def test_post_telemetry_events_continues_on_failure(client):
156
159
  """Test that a failed event does not prevent subsequent events from being sent"""
157
- import json
158
160
 
159
161
  events = [
160
162
  {"event_kind": "user-action", "artifact_purl": "pkg:npm/foo@1.0.0"},
@@ -1,9 +1,11 @@
1
+ import tomllib
1
2
  from pathlib import Path
3
+
2
4
  import pytest
3
- from unittest.mock import patch
4
- import tomllib
5
- from socketsecurity.core.socket_config import SocketConfig
5
+
6
6
  from socketsecurity.config import CliConfig
7
+ from socketsecurity.core.socket_config import SocketConfig
8
+
7
9
 
8
10
  def test_config_default_values():
9
11
  """Test that config initializes with correct default values"""
@@ -1,6 +1,5 @@
1
1
  """Tests for the --disable-ignore flag."""
2
2
 
3
- import pytest
4
3
  from dataclasses import dataclass
5
4
 
6
5
  from socketsecurity.config import CliConfig
@@ -8,7 +7,6 @@ from socketsecurity.core.classes import Comment, Diff, Issue
8
7
  from socketsecurity.core.messages import Messages
9
8
  from socketsecurity.core.scm_comments import Comments
10
9
 
11
-
12
10
  # --- CLI flag parsing tests ---
13
11
 
14
12
  class TestDisableIgnoreFlag:
@@ -1,7 +1,8 @@
1
1
  """Tests for GitLab authentication patterns"""
2
2
  import os
3
+ from unittest.mock import patch
4
+
3
5
  import pytest
4
- from unittest.mock import patch, MagicMock
5
6
 
6
7
  from socketsecurity import USER_AGENT
7
8
  from socketsecurity.core.scm.gitlab import GitlabConfig