socketsecurity 2.7.1__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.1 → socketsecurity-2.7.2}/.github/workflows/python-tests.yml +20 -0
  2. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/CHANGELOG.md +8 -0
  3. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/PKG-INFO +1 -1
  4. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/docs/cli-reference.md +1 -1
  5. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/pyproject.toml +1 -1
  6. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/__init__.py +1 -1
  7. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/config.py +5 -3
  8. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/cli_client.py +1 -0
  9. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/helper/__init__.py +2 -1
  10. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/helper/socket_facts_loader.py +3 -3
  11. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/lazy_file_loader.py +1 -3
  12. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/messages.py +1 -0
  13. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/resource_utils.py +0 -1
  14. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm/client.py +1 -0
  15. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm/gitlab.py +4 -3
  16. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/socket_config.py +3 -4
  17. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/tools/reachability.py +13 -16
  18. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/output.py +9 -6
  19. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/slack.py +1 -1
  20. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/jira.py +6 -3
  21. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/manager.py +1 -1
  22. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/slack.py +8 -5
  23. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/teams.py +3 -1
  24. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/webhook.py +3 -1
  25. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/socketcli.py +6 -8
  26. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_diff_alerts.py +0 -1
  27. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_cli_config.py +1 -0
  28. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_client.py +7 -5
  29. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_config.py +5 -3
  30. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_disable_ignore.py +0 -2
  31. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth.py +2 -1
  32. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth_fallback.py +6 -5
  33. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_gitlab_commit_status.py +1 -3
  34. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_gitlab_format.py +1 -2
  35. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_include_dirs.py +0 -2
  36. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_reachability.py +8 -8
  37. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_socketcli.py +5 -3
  38. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/uv.lock +1 -1
  39. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/CODEOWNERS +0 -0
  40. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
  41. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
  42. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
  43. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  44. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/actions/setup-docker/action.yml +0 -0
  45. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/actions/setup-hatch/action.yml +0 -0
  46. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/actions/setup-sfw/action.yml +0 -0
  47. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/dependabot.yml +0 -0
  48. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/dependency-review.yml +0 -0
  49. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/docker-stable.yml +0 -0
  50. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/e2e-test.yml +0 -0
  51. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/package-check.yml +0 -0
  52. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/pr-preview.yml +0 -0
  53. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/release.yml +0 -0
  54. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/workflows/version-check.yml +0 -0
  55. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.github/zizmor.yml +0 -0
  56. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.gitignore +0 -0
  57. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.hooks/sync_version.py +0 -0
  58. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.pre-commit-config.yaml +0 -0
  59. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/.python-version +0 -0
  60. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/CONTRIBUTING.md +0 -0
  61. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/Dockerfile +0 -0
  62. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/Dockerfile.preview +0 -0
  63. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/LICENSE +0 -0
  64. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/Makefile +0 -0
  65. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/README.md +0 -0
  66. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/benchmarks/manifest_discovery.py +0 -0
  67. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/docs/ci-cd.md +0 -0
  68. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/docs/development.md +0 -0
  69. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/docs/troubleshooting.md +0 -0
  70. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.json +0 -0
  71. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.toml +0 -0
  72. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.json +0 -0
  73. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.toml +0 -0
  74. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.json +0 -0
  75. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.toml +0 -0
  76. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/instructions/gitlab-commit-status/uat.md +0 -0
  77. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/pytest.ini +0 -0
  78. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/build_container.sh +0 -0
  79. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/build_container_flexible.sh +0 -0
  80. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/deploy-test-docker.sh +0 -0
  81. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/deploy-test-pypi.sh +0 -0
  82. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/docker-entrypoint.sh +0 -0
  83. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/scripts/run.sh +0 -0
  84. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/session.md +0 -0
  85. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socket.yml +0 -0
  86. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/__init__.py +0 -0
  87. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/alert_selection.py +0 -0
  88. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/classes.py +0 -0
  89. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/cli_run.py +0 -0
  90. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/exceptions.py +0 -0
  91. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/git_interface.py +0 -0
  92. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/log_uploader.py +0 -0
  93. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/logging.py +0 -0
  94. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm/__init__.py +0 -0
  95. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm/base.py +0 -0
  96. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm/github.py +0 -0
  97. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/scm_comments.py +0 -0
  98. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/streaming.py +0 -0
  99. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/core/utils.py +0 -0
  100. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/fossa_compat.py +0 -0
  101. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/__init__.py +0 -0
  102. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/base.py +0 -0
  103. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/__init__.py +0 -0
  104. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/__init__.py +0 -0
  105. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/conftest.py +0 -0
  106. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/create_diff_input.json +0 -0
  107. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_diff_generation.py +0 -0
  108. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_diff_scan_polling.py +0 -0
  109. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_facts_compression.py +0 -0
  110. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_has_manifest_files.py +0 -0
  111. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_invalid_facts_marker.py +0 -0
  112. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_package_and_alerts.py +0 -0
  113. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_sdk_methods.py +0 -0
  114. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/core/test_supporting_methods.py +0 -0
  115. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/create_response.json +0 -0
  116. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff.json +0 -0
  117. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
  118. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/metadata.json +0 -0
  119. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
  120. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
  121. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/metadata.json +0 -0
  122. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
  123. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/repos/repo_info_error.json +0 -0
  124. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/repos/repo_info_no_head.json +0 -0
  125. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/repos/repo_info_success.json +0 -0
  126. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/data/settings/security-policy.json +0 -0
  127. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/index.js +0 -0
  128. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/package.json +0 -0
  129. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
  130. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/reach-facts-probe.sh +0 -0
  131. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/validate-gitlab.sh +0 -0
  132. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/validate-json.sh +0 -0
  133. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/validate-reachability.sh +0 -0
  134. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/validate-sarif.sh +0 -0
  135. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/e2e/validate-scan.sh +0 -0
  136. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/fixtures/fossa/README.md +0 -0
  137. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
  138. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
  139. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
  140. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
  141. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/__init__.py +0 -0
  142. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_alert_selection.py +0 -0
  143. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_cli_run.py +0 -0
  144. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_dependency_overview.py +0 -0
  145. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_exclude_paths.py +0 -0
  146. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_fossa_compat.py +0 -0
  147. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_fossa_parity.py +0 -0
  148. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_full_scan_retry.py +0 -0
  149. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_git_interface.py +0 -0
  150. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_github_buildkite_config.py +0 -0
  151. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
  152. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_log_uploader.py +0 -0
  153. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_manifest_discovery.py +0 -0
  154. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_output.py +0 -0
  155. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_pr_comment_rendering.py +0 -0
  156. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_slack_plugin.py +0 -0
  157. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_streaming.py +0 -0
  158. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/tests/unit/test_tier1_finalize.py +0 -0
  159. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/workflows/bitbucket-pipelines.yml +0 -0
  160. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/workflows/buildkite.yml +0 -0
  161. {socketsecurity-2.7.1 → socketsecurity-2.7.2}/workflows/github-actions.yml +0 -0
  162. {socketsecurity-2.7.1 → 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,13 @@
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
+
3
11
  ## 2.7.1
4
12
 
5
13
  ### Changed: bump pinned @coana-tech/cli to 15.10.36
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: socketsecurity
3
- Version: 2.7.1
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>
@@ -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.36 | 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. |
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "socketsecurity"
9
- version = "2.7.1"
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.1'
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:
@@ -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.36"
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.36').
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.36').
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,
@@ -151,9 +152,7 @@ class ReachabilityAnalyzer:
151
152
 
152
153
  # Add conditional arguments. timeout/memory_limit are forwarded verbatim; coana owns
153
154
  # unit parsing/validation (e.g. '90s', '8GB'). We coerce to str only for subprocess
154
- # safety — config-file values can arrive as ints via argparse set_defaults — and use
155
- # `is not None` (not truthiness) so an explicit empty string still reaches coana and
156
- # triggers coana's own error, rather than being silently dropped.
155
+ # safety — config-file values can arrive as ints via argparse set_defaults.
157
156
  if timeout is not None:
158
157
  coana_args.extend(["--analysis-timeout", str(timeout)])
159
158
 
@@ -170,9 +169,7 @@ class ReachabilityAnalyzer:
170
169
  if detailed_analysis_log_file:
171
170
  coana_args.append("--print-analysis-log-file")
172
171
 
173
- # KEY POINT: Only add manifest tar hash if we have one
174
- if tar_hash:
175
- coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
172
+ coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
176
173
 
177
174
  if ecosystems:
178
175
  coana_args.extend(["--purl-types"] + ecosystems)
@@ -262,7 +259,7 @@ class ReachabilityAnalyzer:
262
259
  # Extract scan ID from output file
263
260
  scan_id = self._extract_scan_id(output_path)
264
261
 
265
- log.info(f"Reachability analysis completed successfully")
262
+ log.info("Reachability analysis completed successfully")
266
263
  if scan_id:
267
264
  log.info(f"Scan ID: {scan_id}")
268
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(
@@ -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
@@ -1,9 +1,10 @@
1
1
  """Integration test demonstrating GitLab authentication fallback"""
2
2
  import os
3
- from unittest.mock import patch, MagicMock
3
+ from unittest.mock import MagicMock, patch
4
+
4
5
  import pytest
5
6
 
6
- from socketsecurity.core.scm.gitlab import Gitlab, GitlabConfig
7
+ from socketsecurity.core.scm.gitlab import Gitlab
7
8
  from socketsecurity.socketcli import CliClient
8
9
 
9
10
 
@@ -37,7 +38,7 @@ class TestGitlabAuthFallback:
37
38
  gitlab = Gitlab(client=mock_client)
38
39
 
39
40
  # This should trigger the fallback mechanism
40
- result = gitlab.get_comments_for_pr()
41
+ gitlab.get_comments_for_pr()
41
42
 
42
43
  # Verify two requests were made
43
44
  assert mock_client.request.call_count == 2
@@ -79,7 +80,7 @@ class TestGitlabAuthFallback:
79
80
  gitlab = Gitlab(client=mock_client)
80
81
 
81
82
  # This should trigger the fallback mechanism
82
- result = gitlab.get_comments_for_pr()
83
+ gitlab.get_comments_for_pr()
83
84
 
84
85
  # Verify two requests were made
85
86
  assert mock_client.request.call_count == 2
@@ -140,7 +141,7 @@ class TestGitlabAuthFallback:
140
141
  gitlab = Gitlab(client=mock_client)
141
142
 
142
143
  # This should succeed on first try
143
- result = gitlab.get_comments_for_pr()
144
+ gitlab.get_comments_for_pr()
144
145
 
145
146
  # Verify only one request was made
146
147
  assert mock_client.request.call_count == 1
@@ -1,7 +1,5 @@
1
1
  """Tests for GitLab commit status integration"""
2
- import os
3
- import pytest
4
- from unittest.mock import patch, MagicMock, call
2
+ from unittest.mock import MagicMock, patch
5
3
 
6
4
  from socketsecurity.core.scm.gitlab import Gitlab, GitlabConfig
7
5
 
@@ -1,8 +1,7 @@
1
1
  import re
2
2
 
3
- import pytest
4
- from socketsecurity.core.messages import Messages
5
3
  from socketsecurity.core.classes import Diff, Issue
4
+ from socketsecurity.core.messages import Messages
6
5
 
7
6
 
8
7
  class TestGitLabFormat:
@@ -6,8 +6,6 @@ normally-excluded directory (e.g. build) lets Core.find_files discover manifests
6
6
  import types
7
7
  from unittest.mock import MagicMock
8
8
 
9
- import pytest
10
-
11
9
  from socketsecurity.config import CliConfig
12
10
  from socketsecurity.core import Core
13
11
  from socketsecurity.core.socket_config import (