pysentry-rs 0.3.5__tar.gz → 0.3.6__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.

Potentially problematic release.


This version of pysentry-rs might be problematic. Click here for more details.

Files changed (75) hide show
  1. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.github/dependabot.yml +0 -6
  2. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.github/workflows/ci.yml +2 -0
  3. pysentry_rs-0.3.6/.pre-commit-hooks.yaml +10 -0
  4. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/Cargo.lock +1 -1
  5. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/Cargo.toml +1 -1
  6. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/PKG-INFO +6 -3
  7. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/README.md +5 -2
  8. pysentry_rs-0.3.6/benchmarks/results/0.3.5.md +141 -0
  9. pysentry_rs-0.3.6/benchmarks/results/latest.md +141 -0
  10. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/cli.rs +80 -71
  11. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/dependency/scanner.rs +92 -39
  12. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/lib.rs +5 -2
  13. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/lock.rs +245 -6
  14. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/mod.rs +59 -12
  15. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/pipfile.rs +9 -7
  16. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/pipfile_lock.rs +4 -4
  17. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/poetry_lock.rs +4 -4
  18. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/pyproject.rs +13 -10
  19. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/parsers/requirements.rs +3 -3
  20. pysentry_rs-0.3.5/.pre-commit-hooks.yaml +0 -10
  21. pysentry_rs-0.3.5/benchmarks/results/latest.md +0 -141
  22. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.github/FUNDING.yml +0 -0
  23. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.github/workflows/benchmark.yml +0 -0
  24. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.github/workflows/release.yml +0 -0
  25. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.gitignore +0 -0
  26. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/.pre-commit-config.yaml +0 -0
  27. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/LICENSE +0 -0
  28. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/.gitignore +0 -0
  29. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/.python-version +0 -0
  30. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/README.md +0 -0
  31. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/main.py +0 -0
  32. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/pyproject.toml +0 -0
  33. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/results/0.2.3.md +0 -0
  34. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/results/0.3.1.md +0 -0
  35. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/results/0.3.2.md +0 -0
  36. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/results/0.3.3.md +0 -0
  37. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/results/0.3.4.md +0 -0
  38. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/src/benchmark_runner.py +0 -0
  39. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/src/performance_monitor.py +0 -0
  40. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/src/report_generator.py +0 -0
  41. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/src/tool_wrapper.py +0 -0
  42. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/test_data/large_requirements.txt +0 -0
  43. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/test_data/small_requirements.txt +0 -0
  44. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/test_data/uv.lock +0 -0
  45. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/benchmarks/uv.lock +0 -0
  46. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/pipfile-tests/Pipfile +0 -0
  47. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/pipfile-tests/Pipfile.lock +0 -0
  48. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/pipfile-vulnerable-tests/Pipfile +0 -0
  49. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/requirements-tests/requirements-dev.txt +0 -0
  50. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/requirements-tests/requirements.txt +0 -0
  51. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/fixtures/requirements-tests-vulnerable/requirements.txt +0 -0
  52. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/pyproject.toml +0 -0
  53. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/python/pysentry/__init__.py +0 -0
  54. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/cache/audit.rs +0 -0
  55. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/cache/mod.rs +0 -0
  56. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/cache/storage.rs +0 -0
  57. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/config.rs +0 -0
  58. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/dependency/mod.rs +0 -0
  59. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/dependency/resolvers/mod.rs +0 -0
  60. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/dependency/resolvers/pip_tools.rs +0 -0
  61. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/dependency/resolvers/uv.rs +0 -0
  62. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/error.rs +0 -0
  63. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/main.rs +0 -0
  64. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/output/mod.rs +0 -0
  65. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/output/report.rs +0 -0
  66. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/output/sarif.rs +0 -0
  67. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/providers/mod.rs +0 -0
  68. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/providers/osv.rs +0 -0
  69. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/providers/pypa.rs +0 -0
  70. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/providers/pypi.rs +0 -0
  71. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/python.rs +0 -0
  72. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/types.rs +0 -0
  73. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/vulnerability/database.rs +0 -0
  74. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/vulnerability/matcher.rs +0 -0
  75. {pysentry_rs-0.3.5 → pysentry_rs-0.3.6}/src/vulnerability/mod.rs +0 -0
@@ -11,16 +11,10 @@ updates:
11
11
  patterns:
12
12
  - "*"
13
13
 
14
- # Python dependencies (pyproject.toml only)
15
14
  - package-ecosystem: "pip"
16
15
  directory: "/"
17
16
  schedule:
18
17
  interval: "weekly"
19
- open-pull-requests-limit: 10
20
- allow:
21
- - dependency-type: "all"
22
- ignore:
23
- - dependency-name: "*"
24
18
  groups:
25
19
  python-dependencies:
26
20
  patterns:
@@ -10,6 +10,7 @@ on:
10
10
  - ".editorconfig"
11
11
  - ".github/dependabot.yml"
12
12
  - ".github/FUNDING.yml"
13
+ - ".pre-commit-hooks.yaml"
13
14
  pull_request:
14
15
  branches: [main]
15
16
  paths-ignore:
@@ -19,6 +20,7 @@ on:
19
20
  - ".editorconfig"
20
21
  - ".github/dependabot.yml"
21
22
  - ".github/FUNDING.yml"
23
+ - ".pre-commit-hooks.yaml"
22
24
 
23
25
  env:
24
26
  CARGO_TERM_COLOR: always
@@ -0,0 +1,10 @@
1
+ - id: pysentry
2
+ name: pysentry (DEPRECATED - moved to nyudenkov/pysentry-pre-commit)
3
+ description: "⚠️ DEPRECATED - See github.com/nyudenkov/pysentry-pre-commit"
4
+ entry: pysentry-rs
5
+ language: python
6
+ always_run: true
7
+ additional_dependencies:
8
+ ["pysentry-rs==0.3.5", "uv==0.8.9", "pip-tools==7.5.0"]
9
+ minimum_pre_commit_version: "2.9.2"
10
+ types: [python]
@@ -1137,7 +1137,7 @@ dependencies = [
1137
1137
 
1138
1138
  [[package]]
1139
1139
  name = "pysentry"
1140
- version = "0.3.5"
1140
+ version = "0.3.6"
1141
1141
  dependencies = [
1142
1142
  "anyhow",
1143
1143
  "async-trait",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pysentry"
3
- version = "0.3.5"
3
+ version = "0.3.6"
4
4
  edition = "2021"
5
5
  rust-version = "1.79"
6
6
  description = "Security vulnerability auditing for Python packages"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysentry-rs
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -27,6 +27,7 @@ Project-URL: Issues, https://github.com/nyudenkov/pysentry/issues
27
27
  # 🐍 PySentry
28
28
 
29
29
  [![OSV Integration](https://img.shields.io/badge/OSV-Integrated-blue)](https://google.github.io/osv.dev/)
30
+ [![PyPI Downloads](https://static.pepy.tech/badge/pysentry-rs/week)](https://pepy.tech/projects/pysentry-rs)
30
31
 
31
32
  [Help to test and improve](https://github.com/nyudenkov/pysentry/issues/12) | [Latest PySentry - pip-audit benchmark](benchmarks/results/latest.md)
32
33
 
@@ -299,7 +300,8 @@ Add PySentry to your `.pre-commit-config.yaml`:
299
300
 
300
301
  ```yaml
301
302
  repos:
302
- - repo: https://github.com/nyudenkov/pysentry
303
+ - repo: https://github.com/pysentry/pysentry-pre-commit
304
+ rev: v0.3.5
303
305
  hooks:
304
306
  - id: pysentry # default pysentry settings
305
307
  ```
@@ -308,7 +310,8 @@ repos:
308
310
 
309
311
  ```yaml
310
312
  repos:
311
- - repo: https://github.com/nyudenkov/pysentry
313
+ - repo: https://github.com/pysentry/pysentry-pre-commit
314
+ rev: v0.3.5
312
315
  hooks:
313
316
  - id: pysentry
314
317
  args: ["--sources", "pypa,osv", "--fail-on", "high"]
@@ -1,6 +1,7 @@
1
1
  # 🐍 PySentry
2
2
 
3
3
  [![OSV Integration](https://img.shields.io/badge/OSV-Integrated-blue)](https://google.github.io/osv.dev/)
4
+ [![PyPI Downloads](https://static.pepy.tech/badge/pysentry-rs/week)](https://pepy.tech/projects/pysentry-rs)
4
5
 
5
6
  [Help to test and improve](https://github.com/nyudenkov/pysentry/issues/12) | [Latest PySentry - pip-audit benchmark](benchmarks/results/latest.md)
6
7
 
@@ -273,7 +274,8 @@ Add PySentry to your `.pre-commit-config.yaml`:
273
274
 
274
275
  ```yaml
275
276
  repos:
276
- - repo: https://github.com/nyudenkov/pysentry
277
+ - repo: https://github.com/pysentry/pysentry-pre-commit
278
+ rev: v0.3.5
277
279
  hooks:
278
280
  - id: pysentry # default pysentry settings
279
281
  ```
@@ -282,7 +284,8 @@ repos:
282
284
 
283
285
  ```yaml
284
286
  repos:
285
- - repo: https://github.com/nyudenkov/pysentry
287
+ - repo: https://github.com/pysentry/pysentry-pre-commit
288
+ rev: v0.3.5
286
289
  hooks:
287
290
  - id: pysentry
288
291
  args: ["--sources", "pypa,osv", "--fail-on", "high"]
@@ -0,0 +1,141 @@
1
+ # PySentry - pip-audit Benchmark Report
2
+
3
+ **Generated:** 2025-08-18 17:01:27
4
+ **Duration:** 1m 57.61s
5
+ **Total Tests:** 20
6
+
7
+ ## Executive Summary
8
+
9
+ **Overall Success Rate:** 100.0% (20/20 successful runs)
10
+
11
+ ### Small_Requirements Dataset - Cold Cache
12
+ - **Fastest:** pysentry-pypi (0.326s) - 27.96x faster than slowest
13
+ - **Memory Efficient:** pysentry-osv (11.90 MB) - 7.77x less memory than highest
14
+
15
+ ### Small_Requirements Dataset - Hot Cache
16
+ - **Fastest:** pysentry-pypi (0.227s) - 34.73x faster than slowest
17
+ - **Memory Efficient:** pysentry-pypi (9.57 MB) - 10.54x less memory than highest
18
+
19
+ ### Large_Requirements Dataset - Cold Cache
20
+ - **Fastest:** pysentry-pypi (0.810s) - 25.84x faster than slowest
21
+ - **Memory Efficient:** pysentry-osv (11.85 MB) - 7.91x less memory than highest
22
+
23
+ ### Large_Requirements Dataset - Hot Cache
24
+ - **Fastest:** pysentry-pypi (0.667s) - 23.10x faster than slowest
25
+ - **Memory Efficient:** pysentry-pypi (9.42 MB) - 10.74x less memory than highest
26
+
27
+ ## Test Environment
28
+
29
+ - **Platform:** Linux-6.11.0-1018-azure-x86_64-with-glibc2.39
30
+ - **Python Version:** 3.11.13
31
+ - **CPU Cores:** 4
32
+ - **Total Memory:** 15.62 GB
33
+ - **Available Memory:** 14.63 GB
34
+
35
+ ## Performance Comparison
36
+
37
+ ### Small_Requirements Dataset - Cold Cache
38
+
39
+ #### Execution Time Comparison
40
+
41
+ | Tool Configuration | Execution Time | Relative Performance |
42
+ |---------------------|---------------------|---------------------|
43
+ | 🥇 pysentry-pypi | 0.326s | 1.00x |
44
+ | 🥈 pysentry-osv | 1.027s | 3.15x |
45
+ | pysentry-all-sources | 1.188s | 3.65x |
46
+ | pysentry-pypa | 1.232s | 3.78x |
47
+ | pip-audit-default | 9.108s | 27.96x |
48
+
49
+ #### Memory Usage Comparison
50
+
51
+ | Tool Configuration | Peak Memory | Relative Performance |
52
+ |---------------------|---------------------|---------------------|
53
+ | 🥇 pysentry-osv | 11.90 MB | 1.00x |
54
+ | 🥈 pysentry-pypi | 13.23 MB | 1.11x |
55
+ | pip-audit-default | 45.44 MB | 3.82x |
56
+ | pysentry-pypa | 75.45 MB | 6.34x |
57
+ | pysentry-all-sources | 92.43 MB | 7.77x |
58
+
59
+ ### Small_Requirements Dataset - Hot Cache
60
+
61
+ #### Execution Time Comparison
62
+
63
+ | Tool Configuration | Execution Time | Relative Performance |
64
+ |---------------------|---------------------|---------------------|
65
+ | 🥇 pysentry-pypi | 0.227s | 1.00x |
66
+ | 🥈 pysentry-osv | 0.917s | 4.04x |
67
+ | pysentry-all-sources | 1.036s | 4.57x |
68
+ | pysentry-pypa | 1.107s | 4.88x |
69
+ | pip-audit-default | 7.881s | 34.73x |
70
+
71
+ #### Memory Usage Comparison
72
+
73
+ | Tool Configuration | Peak Memory | Relative Performance |
74
+ |---------------------|---------------------|---------------------|
75
+ | 🥇 pysentry-pypi | 9.57 MB | 1.00x |
76
+ | 🥈 pysentry-osv | 10.85 MB | 1.13x |
77
+ | pip-audit-default | 44.36 MB | 4.63x |
78
+ | pysentry-pypa | 53.60 MB | 5.60x |
79
+ | pysentry-all-sources | 100.87 MB | 10.54x |
80
+
81
+ ### Large_Requirements Dataset - Cold Cache
82
+
83
+ #### Execution Time Comparison
84
+
85
+ | Tool Configuration | Execution Time | Relative Performance |
86
+ |---------------------|---------------------|---------------------|
87
+ | 🥇 pysentry-pypi | 0.810s | 1.00x |
88
+ | 🥈 pysentry-pypa | 1.324s | 1.63x |
89
+ | pysentry-osv | 3.834s | 4.73x |
90
+ | pysentry-all-sources | 3.965s | 4.89x |
91
+ | pip-audit-default | 20.942s | 25.84x |
92
+
93
+ #### Memory Usage Comparison
94
+
95
+ | Tool Configuration | Peak Memory | Relative Performance |
96
+ |---------------------|---------------------|---------------------|
97
+ | 🥇 pysentry-osv | 11.85 MB | 1.00x |
98
+ | 🥈 pysentry-pypi | 13.98 MB | 1.18x |
99
+ | pip-audit-default | 47.18 MB | 3.98x |
100
+ | pysentry-pypa | 71.19 MB | 6.01x |
101
+ | pysentry-all-sources | 93.71 MB | 7.91x |
102
+
103
+ ### Large_Requirements Dataset - Hot Cache
104
+
105
+ #### Execution Time Comparison
106
+
107
+ | Tool Configuration | Execution Time | Relative Performance |
108
+ |---------------------|---------------------|---------------------|
109
+ | 🥇 pysentry-pypi | 0.667s | 1.00x |
110
+ | 🥈 pysentry-pypa | 1.321s | 1.98x |
111
+ | pysentry-all-sources | 3.341s | 5.01x |
112
+ | pysentry-osv | 3.600s | 5.40x |
113
+ | pip-audit-default | 15.406s | 23.10x |
114
+
115
+ #### Memory Usage Comparison
116
+
117
+ | Tool Configuration | Peak Memory | Relative Performance |
118
+ |---------------------|---------------------|---------------------|
119
+ | 🥇 pysentry-pypi | 9.42 MB | 1.00x |
120
+ | 🥈 pysentry-osv | 10.72 MB | 1.14x |
121
+ | pip-audit-default | 47.33 MB | 5.02x |
122
+ | pysentry-pypa | 72.12 MB | 7.65x |
123
+ | pysentry-all-sources | 101.22 MB | 10.74x |
124
+
125
+ ## Detailed Analysis
126
+
127
+ ### Pysentry Performance
128
+
129
+ - **Execution Time:** Avg: 1.620s, Min: 0.227s, Max: 3.965s
130
+
131
+ - **Memory Usage:** Avg: 47.01 MB, Min: 9.42 MB, Max: 101.22 MB
132
+
133
+ - **Success Rate:** 100.0% (16/16)
134
+
135
+ ### Pip-Audit Performance
136
+
137
+ - **Execution Time:** Avg: 13.334s, Min: 7.881s, Max: 20.942s
138
+
139
+ - **Memory Usage:** Avg: 46.08 MB, Min: 44.36 MB, Max: 47.33 MB
140
+
141
+ - **Success Rate:** 100.0% (4/4)
@@ -0,0 +1,141 @@
1
+ # PySentry - pip-audit Benchmark Report
2
+
3
+ **Generated:** 2025-08-18 17:01:27
4
+ **Duration:** 1m 57.61s
5
+ **Total Tests:** 20
6
+
7
+ ## Executive Summary
8
+
9
+ **Overall Success Rate:** 100.0% (20/20 successful runs)
10
+
11
+ ### Small_Requirements Dataset - Cold Cache
12
+ - **Fastest:** pysentry-pypi (0.326s) - 27.96x faster than slowest
13
+ - **Memory Efficient:** pysentry-osv (11.90 MB) - 7.77x less memory than highest
14
+
15
+ ### Small_Requirements Dataset - Hot Cache
16
+ - **Fastest:** pysentry-pypi (0.227s) - 34.73x faster than slowest
17
+ - **Memory Efficient:** pysentry-pypi (9.57 MB) - 10.54x less memory than highest
18
+
19
+ ### Large_Requirements Dataset - Cold Cache
20
+ - **Fastest:** pysentry-pypi (0.810s) - 25.84x faster than slowest
21
+ - **Memory Efficient:** pysentry-osv (11.85 MB) - 7.91x less memory than highest
22
+
23
+ ### Large_Requirements Dataset - Hot Cache
24
+ - **Fastest:** pysentry-pypi (0.667s) - 23.10x faster than slowest
25
+ - **Memory Efficient:** pysentry-pypi (9.42 MB) - 10.74x less memory than highest
26
+
27
+ ## Test Environment
28
+
29
+ - **Platform:** Linux-6.11.0-1018-azure-x86_64-with-glibc2.39
30
+ - **Python Version:** 3.11.13
31
+ - **CPU Cores:** 4
32
+ - **Total Memory:** 15.62 GB
33
+ - **Available Memory:** 14.63 GB
34
+
35
+ ## Performance Comparison
36
+
37
+ ### Small_Requirements Dataset - Cold Cache
38
+
39
+ #### Execution Time Comparison
40
+
41
+ | Tool Configuration | Execution Time | Relative Performance |
42
+ |---------------------|---------------------|---------------------|
43
+ | 🥇 pysentry-pypi | 0.326s | 1.00x |
44
+ | 🥈 pysentry-osv | 1.027s | 3.15x |
45
+ | pysentry-all-sources | 1.188s | 3.65x |
46
+ | pysentry-pypa | 1.232s | 3.78x |
47
+ | pip-audit-default | 9.108s | 27.96x |
48
+
49
+ #### Memory Usage Comparison
50
+
51
+ | Tool Configuration | Peak Memory | Relative Performance |
52
+ |---------------------|---------------------|---------------------|
53
+ | 🥇 pysentry-osv | 11.90 MB | 1.00x |
54
+ | 🥈 pysentry-pypi | 13.23 MB | 1.11x |
55
+ | pip-audit-default | 45.44 MB | 3.82x |
56
+ | pysentry-pypa | 75.45 MB | 6.34x |
57
+ | pysentry-all-sources | 92.43 MB | 7.77x |
58
+
59
+ ### Small_Requirements Dataset - Hot Cache
60
+
61
+ #### Execution Time Comparison
62
+
63
+ | Tool Configuration | Execution Time | Relative Performance |
64
+ |---------------------|---------------------|---------------------|
65
+ | 🥇 pysentry-pypi | 0.227s | 1.00x |
66
+ | 🥈 pysentry-osv | 0.917s | 4.04x |
67
+ | pysentry-all-sources | 1.036s | 4.57x |
68
+ | pysentry-pypa | 1.107s | 4.88x |
69
+ | pip-audit-default | 7.881s | 34.73x |
70
+
71
+ #### Memory Usage Comparison
72
+
73
+ | Tool Configuration | Peak Memory | Relative Performance |
74
+ |---------------------|---------------------|---------------------|
75
+ | 🥇 pysentry-pypi | 9.57 MB | 1.00x |
76
+ | 🥈 pysentry-osv | 10.85 MB | 1.13x |
77
+ | pip-audit-default | 44.36 MB | 4.63x |
78
+ | pysentry-pypa | 53.60 MB | 5.60x |
79
+ | pysentry-all-sources | 100.87 MB | 10.54x |
80
+
81
+ ### Large_Requirements Dataset - Cold Cache
82
+
83
+ #### Execution Time Comparison
84
+
85
+ | Tool Configuration | Execution Time | Relative Performance |
86
+ |---------------------|---------------------|---------------------|
87
+ | 🥇 pysentry-pypi | 0.810s | 1.00x |
88
+ | 🥈 pysentry-pypa | 1.324s | 1.63x |
89
+ | pysentry-osv | 3.834s | 4.73x |
90
+ | pysentry-all-sources | 3.965s | 4.89x |
91
+ | pip-audit-default | 20.942s | 25.84x |
92
+
93
+ #### Memory Usage Comparison
94
+
95
+ | Tool Configuration | Peak Memory | Relative Performance |
96
+ |---------------------|---------------------|---------------------|
97
+ | 🥇 pysentry-osv | 11.85 MB | 1.00x |
98
+ | 🥈 pysentry-pypi | 13.98 MB | 1.18x |
99
+ | pip-audit-default | 47.18 MB | 3.98x |
100
+ | pysentry-pypa | 71.19 MB | 6.01x |
101
+ | pysentry-all-sources | 93.71 MB | 7.91x |
102
+
103
+ ### Large_Requirements Dataset - Hot Cache
104
+
105
+ #### Execution Time Comparison
106
+
107
+ | Tool Configuration | Execution Time | Relative Performance |
108
+ |---------------------|---------------------|---------------------|
109
+ | 🥇 pysentry-pypi | 0.667s | 1.00x |
110
+ | 🥈 pysentry-pypa | 1.321s | 1.98x |
111
+ | pysentry-all-sources | 3.341s | 5.01x |
112
+ | pysentry-osv | 3.600s | 5.40x |
113
+ | pip-audit-default | 15.406s | 23.10x |
114
+
115
+ #### Memory Usage Comparison
116
+
117
+ | Tool Configuration | Peak Memory | Relative Performance |
118
+ |---------------------|---------------------|---------------------|
119
+ | 🥇 pysentry-pypi | 9.42 MB | 1.00x |
120
+ | 🥈 pysentry-osv | 10.72 MB | 1.14x |
121
+ | pip-audit-default | 47.33 MB | 5.02x |
122
+ | pysentry-pypa | 72.12 MB | 7.65x |
123
+ | pysentry-all-sources | 101.22 MB | 10.74x |
124
+
125
+ ## Detailed Analysis
126
+
127
+ ### Pysentry Performance
128
+
129
+ - **Execution Time:** Avg: 1.620s, Min: 0.227s, Max: 3.965s
130
+
131
+ - **Memory Usage:** Avg: 47.01 MB, Min: 9.42 MB, Max: 101.22 MB
132
+
133
+ - **Success Rate:** 100.0% (16/16)
134
+
135
+ ### Pip-Audit Performance
136
+
137
+ - **Execution Time:** Avg: 13.334s, Min: 7.881s, Max: 20.942s
138
+
139
+ - **Memory Usage:** Avg: 46.08 MB, Min: 44.36 MB, Max: 47.33 MB
140
+
141
+ - **Success Rate:** 100.0% (4/4)
@@ -841,80 +841,89 @@ async fn perform_audit(audit_args: &AuditArgs, cache_dir: &Path) -> Result<Audit
841
841
  eprintln!("Scanning project dependencies...");
842
842
  }
843
843
 
844
- let dependencies = if !audit_args.requirements_files.is_empty() {
845
- if !audit_args.quiet {
846
- eprintln!(
847
- "Using explicit requirements files: {}",
848
- audit_args
849
- .requirements_files
850
- .iter()
851
- .map(|p| p.display().to_string())
852
- .collect::<Vec<_>>()
853
- .join(", ")
854
- );
855
- }
856
- scan_explicit_requirements(
857
- &audit_args.requirements_files,
858
- audit_args.include_dev(),
859
- audit_args.include_optional(),
860
- audit_args.direct_only,
861
- audit_args.resolver.clone(),
862
- )
863
- .await?
864
- } else {
865
- let resolver_type: ResolverType = audit_args.resolver.clone().into();
866
-
867
- let parse_dev = audit_args.include_dev();
868
- let parse_optional = audit_args.include_optional();
869
-
870
- use crate::parsers::{DependencyType, ParserRegistry};
871
- let parser_registry = ParserRegistry::new(Some(resolver_type));
872
- let (raw_parsed_deps, parser_name) = parser_registry
873
- .parse_project(
874
- &audit_args.path,
875
- parse_dev,
876
- parse_optional,
877
- audit_args.direct_only,
844
+ let (dependencies, skipped_packages, detected_parser_name) =
845
+ if !audit_args.requirements_files.is_empty() {
846
+ if !audit_args.quiet {
847
+ eprintln!(
848
+ "Using explicit requirements files: {}",
849
+ audit_args
850
+ .requirements_files
851
+ .iter()
852
+ .map(|p| p.display().to_string())
853
+ .collect::<Vec<_>>()
854
+ .join(", ")
855
+ );
856
+ }
857
+ (
858
+ scan_explicit_requirements(
859
+ &audit_args.requirements_files,
860
+ audit_args.include_dev(),
861
+ audit_args.include_optional(),
862
+ audit_args.direct_only,
863
+ audit_args.resolver.clone(),
864
+ )
865
+ .await?,
866
+ Vec::new(), // No skipped packages for explicit requirements files
867
+ "requirements.txt".to_string(),
878
868
  )
879
- .await?;
880
-
881
- if audit_args.verbose {
882
- eprintln!(
883
- "Raw parsed dependencies before filtering: {} (from {})",
884
- raw_parsed_deps.len(),
885
- parser_name
886
- );
887
- let (main_count, optional_count) =
888
- raw_parsed_deps
889
- .iter()
890
- .fold((0, 0), |(m, o), dep| match dep.dependency_type {
891
- DependencyType::Main => (m + 1, o),
892
- DependencyType::Optional => (m, o + 1),
893
- });
894
- eprintln!(" Main: {main_count}, Optional: {optional_count}");
895
- }
869
+ } else {
870
+ let resolver_type: ResolverType = audit_args.resolver.clone().into();
871
+
872
+ let parse_dev = audit_args.include_dev();
873
+ let parse_optional = audit_args.include_optional();
874
+
875
+ use crate::parsers::{DependencyType, ParserRegistry};
876
+ let parser_registry = ParserRegistry::new(Some(resolver_type));
877
+ let (raw_parsed_deps, skipped_packages, parser_name) = parser_registry
878
+ .parse_project(
879
+ &audit_args.path,
880
+ parse_dev,
881
+ parse_optional,
882
+ audit_args.direct_only,
883
+ )
884
+ .await?;
885
+
886
+ if audit_args.verbose {
887
+ eprintln!(
888
+ "Raw parsed dependencies before filtering: {} (from {})",
889
+ raw_parsed_deps.len(),
890
+ parser_name
891
+ );
892
+ let (main_count, optional_count) =
893
+ raw_parsed_deps
894
+ .iter()
895
+ .fold((0, 0), |(m, o), dep| match dep.dependency_type {
896
+ DependencyType::Main => (m + 1, o),
897
+ DependencyType::Optional => (m, o + 1),
898
+ });
899
+ eprintln!(" Main: {main_count}, Optional: {optional_count}");
900
+ }
896
901
 
897
- let filtered_parsed_deps = audit_args.filter_dependencies(raw_parsed_deps);
902
+ let filtered_parsed_deps = audit_args.filter_dependencies(raw_parsed_deps);
898
903
 
899
- if audit_args.verbose {
900
- eprintln!(
901
- "Filtered dependencies after scope filtering: {}",
902
- filtered_parsed_deps.len()
903
- );
904
- eprintln!(" Scope: {}", audit_args.scope_description());
905
- }
904
+ if audit_args.verbose {
905
+ eprintln!(
906
+ "Filtered dependencies after scope filtering: {}",
907
+ filtered_parsed_deps.len()
908
+ );
909
+ eprintln!(" Scope: {}", audit_args.scope_description());
910
+ }
906
911
 
907
- filtered_parsed_deps
908
- .into_iter()
909
- .map(|dep| crate::dependency::scanner::ScannedDependency {
910
- name: dep.name,
911
- version: dep.version,
912
- is_direct: dep.is_direct,
913
- source: dep.source.into(),
914
- path: dep.path,
915
- })
916
- .collect()
917
- };
912
+ (
913
+ filtered_parsed_deps
914
+ .into_iter()
915
+ .map(|dep| crate::dependency::scanner::ScannedDependency {
916
+ name: dep.name,
917
+ version: dep.version,
918
+ is_direct: dep.is_direct,
919
+ source: dep.source.into(),
920
+ path: dep.path,
921
+ })
922
+ .collect(),
923
+ skipped_packages,
924
+ parser_name.to_string(),
925
+ )
926
+ };
918
927
 
919
928
  let dependency_stats = if !audit_args.requirements_files.is_empty() {
920
929
  calculate_dependency_stats(&dependencies)
@@ -945,7 +954,7 @@ async fn perform_audit(audit_args: &AuditArgs, cache_dir: &Path) -> Result<Audit
945
954
  audit_args.direct_only,
946
955
  None,
947
956
  );
948
- scanner.validate_dependencies(&dependencies)
957
+ scanner.validate_dependencies(&dependencies, &skipped_packages, &detected_parser_name)
949
958
  };
950
959
 
951
960
  for warning in &warnings {