pysentry-rs 0.3.3__tar.gz → 0.3.5__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 (73) hide show
  1. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.pre-commit-hooks.yaml +2 -2
  2. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/Cargo.lock +71 -20
  3. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/Cargo.toml +4 -4
  4. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/PKG-INFO +47 -5
  5. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/README.md +46 -4
  6. pysentry_rs-0.3.5/benchmarks/results/0.3.3.md +141 -0
  7. pysentry_rs-0.3.5/benchmarks/results/0.3.4.md +141 -0
  8. pysentry_rs-0.3.5/benchmarks/results/latest.md +141 -0
  9. pysentry_rs-0.3.5/benchmarks/test_data/uv.lock +2972 -0
  10. pysentry_rs-0.3.5/fixtures/pipfile-tests/Pipfile +27 -0
  11. pysentry_rs-0.3.5/fixtures/pipfile-tests/Pipfile.lock +259 -0
  12. pysentry_rs-0.3.5/fixtures/pipfile-vulnerable-tests/Pipfile +20 -0
  13. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/cache/audit.rs +48 -0
  14. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/cache/storage.rs +2 -0
  15. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/cli.rs +87 -0
  16. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/parsers/mod.rs +6 -0
  17. pysentry_rs-0.3.5/src/parsers/pipfile.rs +596 -0
  18. pysentry_rs-0.3.5/src/parsers/pipfile_lock.rs +342 -0
  19. pysentry_rs-0.3.3/benchmarks/results/latest.md +0 -141
  20. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.github/FUNDING.yml +0 -0
  21. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.github/dependabot.yml +0 -0
  22. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.github/workflows/benchmark.yml +0 -0
  23. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.github/workflows/ci.yml +0 -0
  24. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.github/workflows/release.yml +0 -0
  25. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.gitignore +0 -0
  26. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/.pre-commit-config.yaml +0 -0
  27. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/LICENSE +0 -0
  28. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/.gitignore +0 -0
  29. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/.python-version +0 -0
  30. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/README.md +0 -0
  31. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/main.py +0 -0
  32. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/pyproject.toml +0 -0
  33. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/results/0.2.3.md +0 -0
  34. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/results/0.3.1.md +0 -0
  35. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/results/0.3.2.md +0 -0
  36. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/src/benchmark_runner.py +0 -0
  37. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/src/performance_monitor.py +0 -0
  38. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/src/report_generator.py +0 -0
  39. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/src/tool_wrapper.py +0 -0
  40. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/test_data/large_requirements.txt +0 -0
  41. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/test_data/small_requirements.txt +0 -0
  42. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/benchmarks/uv.lock +0 -0
  43. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/fixtures/requirements-tests/requirements-dev.txt +0 -0
  44. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/fixtures/requirements-tests/requirements.txt +0 -0
  45. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/fixtures/requirements-tests-vulnerable/requirements.txt +0 -0
  46. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/pyproject.toml +0 -0
  47. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/python/pysentry/__init__.py +0 -0
  48. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/cache/mod.rs +0 -0
  49. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/config.rs +0 -0
  50. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/dependency/mod.rs +0 -0
  51. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/dependency/resolvers/mod.rs +0 -0
  52. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/dependency/resolvers/pip_tools.rs +0 -0
  53. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/dependency/resolvers/uv.rs +0 -0
  54. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/dependency/scanner.rs +0 -0
  55. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/error.rs +0 -0
  56. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/lib.rs +0 -0
  57. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/main.rs +0 -0
  58. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/output/mod.rs +0 -0
  59. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/output/report.rs +0 -0
  60. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/output/sarif.rs +0 -0
  61. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/parsers/lock.rs +0 -0
  62. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/parsers/poetry_lock.rs +0 -0
  63. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/parsers/pyproject.rs +0 -0
  64. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/parsers/requirements.rs +0 -0
  65. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/providers/mod.rs +0 -0
  66. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/providers/osv.rs +0 -0
  67. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/providers/pypa.rs +0 -0
  68. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/providers/pypi.rs +0 -0
  69. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/python.rs +0 -0
  70. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/types.rs +0 -0
  71. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/vulnerability/database.rs +0 -0
  72. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/vulnerability/matcher.rs +0 -0
  73. {pysentry_rs-0.3.3 → pysentry_rs-0.3.5}/src/vulnerability/mod.rs +0 -0
@@ -1,10 +1,10 @@
1
1
  - id: pysentry
2
2
  name: pysentry
3
3
  description: "Fast security vulnerability scanner for Python dependencies"
4
- entry: pysentry
4
+ entry: pysentry-rs
5
5
  language: python
6
6
  always_run: true
7
7
  additional_dependencies:
8
- ["pysentry-rs==0.3.3", "uv==0.8.9", "pip-tools==7.5.0"]
8
+ ["pysentry-rs==0.3.4", "uv==0.8.9", "pip-tools==7.5.0"]
9
9
  minimum_pre_commit_version: "2.9.2"
10
10
  types: [python]
@@ -108,9 +108,9 @@ dependencies = [
108
108
 
109
109
  [[package]]
110
110
  name = "async-trait"
111
- version = "0.1.88"
111
+ version = "0.1.89"
112
112
  source = "registry+https://github.com/rust-lang/crates.io-index"
113
- checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
113
+ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
114
114
  dependencies = [
115
115
  "proc-macro2",
116
116
  "quote",
@@ -253,6 +253,16 @@ version = "1.0.4"
253
253
  source = "registry+https://github.com/rust-lang/crates.io-index"
254
254
  checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
255
255
 
256
+ [[package]]
257
+ name = "core-foundation"
258
+ version = "0.10.1"
259
+ source = "registry+https://github.com/rust-lang/crates.io-index"
260
+ checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
261
+ dependencies = [
262
+ "core-foundation-sys",
263
+ "libc",
264
+ ]
265
+
256
266
  [[package]]
257
267
  name = "core-foundation-sys"
258
268
  version = "0.8.7"
@@ -610,11 +620,11 @@ dependencies = [
610
620
  "hyper",
611
621
  "hyper-util",
612
622
  "rustls",
623
+ "rustls-native-certs",
613
624
  "rustls-pki-types",
614
625
  "tokio",
615
626
  "tokio-rustls",
616
627
  "tower-service",
617
- "webpki-roots",
618
628
  ]
619
629
 
620
630
  [[package]]
@@ -976,6 +986,12 @@ version = "1.70.1"
976
986
  source = "registry+https://github.com/rust-lang/crates.io-index"
977
987
  checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
978
988
 
989
+ [[package]]
990
+ name = "openssl-probe"
991
+ version = "0.1.6"
992
+ source = "registry+https://github.com/rust-lang/crates.io-index"
993
+ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
994
+
979
995
  [[package]]
980
996
  name = "option-ext"
981
997
  version = "0.2.0"
@@ -1121,7 +1137,7 @@ dependencies = [
1121
1137
 
1122
1138
  [[package]]
1123
1139
  name = "pysentry"
1124
- version = "0.3.3"
1140
+ version = "0.3.5"
1125
1141
  dependencies = [
1126
1142
  "anyhow",
1127
1143
  "async-trait",
@@ -1305,9 +1321,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1305
1321
 
1306
1322
  [[package]]
1307
1323
  name = "reqwest"
1308
- version = "0.12.22"
1324
+ version = "0.12.23"
1309
1325
  source = "registry+https://github.com/rust-lang/crates.io-index"
1310
- checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
1326
+ checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb"
1311
1327
  dependencies = [
1312
1328
  "base64",
1313
1329
  "bytes",
@@ -1325,6 +1341,7 @@ dependencies = [
1325
1341
  "pin-project-lite",
1326
1342
  "quinn",
1327
1343
  "rustls",
1344
+ "rustls-native-certs",
1328
1345
  "rustls-pki-types",
1329
1346
  "serde",
1330
1347
  "serde_json",
@@ -1341,7 +1358,6 @@ dependencies = [
1341
1358
  "wasm-bindgen-futures",
1342
1359
  "wasm-streams",
1343
1360
  "web-sys",
1344
- "webpki-roots",
1345
1361
  ]
1346
1362
 
1347
1363
  [[package]]
@@ -1397,6 +1413,18 @@ dependencies = [
1397
1413
  "zeroize",
1398
1414
  ]
1399
1415
 
1416
+ [[package]]
1417
+ name = "rustls-native-certs"
1418
+ version = "0.8.1"
1419
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1420
+ checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
1421
+ dependencies = [
1422
+ "openssl-probe",
1423
+ "rustls-pki-types",
1424
+ "schannel",
1425
+ "security-framework",
1426
+ ]
1427
+
1400
1428
  [[package]]
1401
1429
  name = "rustls-pki-types"
1402
1430
  version = "1.12.0"
@@ -1430,6 +1458,38 @@ version = "1.0.20"
1430
1458
  source = "registry+https://github.com/rust-lang/crates.io-index"
1431
1459
  checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1432
1460
 
1461
+ [[package]]
1462
+ name = "schannel"
1463
+ version = "0.1.27"
1464
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1465
+ checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1466
+ dependencies = [
1467
+ "windows-sys 0.59.0",
1468
+ ]
1469
+
1470
+ [[package]]
1471
+ name = "security-framework"
1472
+ version = "3.3.0"
1473
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1474
+ checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c"
1475
+ dependencies = [
1476
+ "bitflags",
1477
+ "core-foundation",
1478
+ "core-foundation-sys",
1479
+ "libc",
1480
+ "security-framework-sys",
1481
+ ]
1482
+
1483
+ [[package]]
1484
+ name = "security-framework-sys"
1485
+ version = "2.14.0"
1486
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1487
+ checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1488
+ dependencies = [
1489
+ "core-foundation-sys",
1490
+ "libc",
1491
+ ]
1492
+
1433
1493
  [[package]]
1434
1494
  name = "serde"
1435
1495
  version = "1.0.219"
@@ -1639,18 +1699,18 @@ dependencies = [
1639
1699
 
1640
1700
  [[package]]
1641
1701
  name = "thiserror"
1642
- version = "2.0.12"
1702
+ version = "2.0.15"
1643
1703
  source = "registry+https://github.com/rust-lang/crates.io-index"
1644
- checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
1704
+ checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850"
1645
1705
  dependencies = [
1646
1706
  "thiserror-impl",
1647
1707
  ]
1648
1708
 
1649
1709
  [[package]]
1650
1710
  name = "thiserror-impl"
1651
- version = "2.0.12"
1711
+ version = "2.0.15"
1652
1712
  source = "registry+https://github.com/rust-lang/crates.io-index"
1653
- checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
1713
+ checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0"
1654
1714
  dependencies = [
1655
1715
  "proc-macro2",
1656
1716
  "quote",
@@ -2100,15 +2160,6 @@ dependencies = [
2100
2160
  "wasm-bindgen",
2101
2161
  ]
2102
2162
 
2103
- [[package]]
2104
- name = "webpki-roots"
2105
- version = "1.0.2"
2106
- source = "registry+https://github.com/rust-lang/crates.io-index"
2107
- checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2"
2108
- dependencies = [
2109
- "rustls-pki-types",
2110
- ]
2111
-
2112
2163
  [[package]]
2113
2164
  name = "winapi"
2114
2165
  version = "0.3.9"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pysentry"
3
- version = "0.3.3"
3
+ version = "0.3.5"
4
4
  edition = "2021"
5
5
  rust-version = "1.79"
6
6
  description = "Security vulnerability auditing for Python packages"
@@ -23,7 +23,7 @@ python = ["pyo3"]
23
23
 
24
24
  [dependencies]
25
25
  anyhow = "1.0.99"
26
- async-trait = "0.1.88"
26
+ async-trait = "0.1.89"
27
27
  chrono = { version = "0.4.41", features = ["serde"] }
28
28
  clap = { version = "4.5.45", features = ["derive"] }
29
29
  dirs = "6.0.0"
@@ -33,14 +33,14 @@ owo-colors = "4.2.2"
33
33
  pep440_rs = "0.7.3"
34
34
  pyo3 = { version = "0.25.1", features = ["extension-module"], optional = true }
35
35
  regex = "1.11.1"
36
- reqwest = { version = "0.12.22", features = ["json", "stream", "rustls-tls"], default-features = false }
36
+ reqwest = { version = "0.12.23", features = ["json", "stream", "rustls-tls-native-roots"], default-features = false }
37
37
  rustc-hash = "2.1.1"
38
38
  serde = { version = "1.0.219", features = ["derive"] }
39
39
  serde_json = "1.0.142"
40
40
  serde_yaml = "0.9.34"
41
41
  sha2 = "0.10.9"
42
42
  tempfile = "3.20.0"
43
- thiserror = "2.0.12"
43
+ thiserror = "2.0.15"
44
44
  tokio = { version = "1.47.1", features = ["fs", "io-util", "rt-multi-thread", "macros", "process"] }
45
45
  toml = "0.9.5"
46
46
  tracing = "0.1.41"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysentry-rs
3
- Version: 0.3.3
3
+ Version: 0.3.5
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)
@@ -30,15 +30,17 @@ Project-URL: Issues, https://github.com/nyudenkov/pysentry/issues
30
30
 
31
31
  [Help to test and improve](https://github.com/nyudenkov/pysentry/issues/12) | [Latest PySentry - pip-audit benchmark](benchmarks/results/latest.md)
32
32
 
33
+ Please, send feedback to nikita@pysentry.com
34
+
33
35
  A fast, reliable security vulnerability scanner for Python projects, written in Rust.
34
36
 
35
37
  ## Overview
36
38
 
37
- PySentry audits Python projects for known security vulnerabilities by analyzing dependency files (`uv.lock`, `poetry.lock`, `pyproject.toml`, `requirements.txt`) and cross-referencing them against multiple vulnerability databases. It provides comprehensive reporting with support for various output formats and filtering options.
39
+ PySentry audits Python projects for known security vulnerabilities by analyzing dependency files (`uv.lock`, `poetry.lock`, `Pipfile.lock`, `pyproject.toml`, `Pipfile`, `requirements.txt`) and cross-referencing them against multiple vulnerability databases. It provides comprehensive reporting with support for various output formats and filtering options.
38
40
 
39
41
  ## Key Features
40
42
 
41
- - **Multiple Project Formats**: Supports `uv.lock`, `poetry.lock`, `pyproject.toml`, and `requirements.txt` files
43
+ - **Multiple Project Formats**: Supports `uv.lock`, `poetry.lock`, `Pipfile.lock`, `pyproject.toml`, `Pipfile`, and `requirements.txt` files
42
44
  - **External Resolver Integration**: Leverages `uv` and `pip-tools` for accurate requirements.txt constraint solving
43
45
  - **Multiple Data Sources**:
44
46
  - PyPA Advisory Database (default)
@@ -191,7 +193,7 @@ uvx pysentry-rs /path/to/python/project
191
193
  pysentry
192
194
  pysentry /path/to/python/project
193
195
 
194
- # Automatically detects project type (uv.lock, poetry.lock, pyproject.toml, requirements.txt)
196
+ # Automatically detects project type (uv.lock, poetry.lock, Pipfile.lock, pyproject.toml, Pipfile, requirements.txt)
195
197
  pysentry /path/to/project
196
198
 
197
199
  # Force specific resolver
@@ -494,6 +496,46 @@ Full support for Poetry lock files:
494
496
  - Handles Poetry's dependency groups and optional dependencies
495
497
  - Perfect for Poetry-managed projects with established lock files
496
498
 
499
+ ### Pipfile.lock Files
500
+
501
+ Full support for Pipenv lock files with exact version resolution:
502
+
503
+ - **Exact Version Resolution**: Scans exact dependency versions locked by Pipenv
504
+ - **Lock-File Only Analysis**: Relies purely on the lock file structure, no Pipfile parsing needed
505
+ - **Complete Dependency Tree**: Analyzes all resolved dependencies including transitive ones
506
+ - **Dependency Classification**: Distinguishes between default dependencies and development groups
507
+
508
+ **Key Features:**
509
+
510
+ - No external tools required
511
+ - Fast parsing with exact version information
512
+ - Handles Pipenv's dependency groups (default and develop)
513
+ - Perfect for Pipenv-managed projects with established lock files
514
+
515
+ ### Pipfile Files (External Resolution)
516
+
517
+ Support for Pipfile specification files using external dependency resolvers:
518
+
519
+ **Key Features:**
520
+
521
+ - **Dependencies Resolution**: Converts version constraints from Pipfile to exact versions using mature external tools
522
+ - **Multiple Resolver Support**:
523
+ - **uv**: Rust-based resolver, extremely fast and reliable (recommended)
524
+ - **pip-tools**: Python-based resolver using `pip-compile`, widely compatible
525
+ - **Auto-detection**: Automatically detects and uses the best available resolver in your environment
526
+ - **Dependency Groups**: Supports both default packages and dev-packages sections
527
+ - **Complex Constraint Handling**: Supports version ranges, Git dependencies, and environment markers
528
+
529
+ **Resolution Workflow:**
530
+
531
+ 1. Detects `Pipfile` in your project (when `Pipfile.lock` is not present)
532
+ 2. Auto-detects available resolver (`uv` or `pip-tools`) in current environment
533
+ 3. Resolves version constraints to exact dependency versions
534
+ 4. Scans resolved dependencies for vulnerabilities
535
+ 5. Reports findings with dependency group classification
536
+
537
+ **Note**: When both `Pipfile` and `Pipfile.lock` are present, PySentry prioritizes the lock file for better accuracy. Consider using `pipenv lock` to generate a lock file for the most precise vulnerability scanning.
538
+
497
539
  ### requirements.txt Files (External Resolution)
498
540
 
499
541
  Advanced support for `requirements.txt` files using external dependency resolvers:
@@ -732,7 +774,7 @@ pysentry /path/to/python/project
732
774
  pysentry --requirements requirements-dev.txt --requirements requirements-test.txt
733
775
 
734
776
  # Check if higher-priority files exist (they take precedence)
735
- ls uv.lock poetry.lock pyproject.toml
777
+ ls uv.lock poetry.lock Pipfile.lock pyproject.toml Pipfile requirements.txt
736
778
  ```
737
779
 
738
780
  **Performance Issues**
@@ -4,15 +4,17 @@
4
4
 
5
5
  [Help to test and improve](https://github.com/nyudenkov/pysentry/issues/12) | [Latest PySentry - pip-audit benchmark](benchmarks/results/latest.md)
6
6
 
7
+ Please, send feedback to nikita@pysentry.com
8
+
7
9
  A fast, reliable security vulnerability scanner for Python projects, written in Rust.
8
10
 
9
11
  ## Overview
10
12
 
11
- PySentry audits Python projects for known security vulnerabilities by analyzing dependency files (`uv.lock`, `poetry.lock`, `pyproject.toml`, `requirements.txt`) and cross-referencing them against multiple vulnerability databases. It provides comprehensive reporting with support for various output formats and filtering options.
13
+ PySentry audits Python projects for known security vulnerabilities by analyzing dependency files (`uv.lock`, `poetry.lock`, `Pipfile.lock`, `pyproject.toml`, `Pipfile`, `requirements.txt`) and cross-referencing them against multiple vulnerability databases. It provides comprehensive reporting with support for various output formats and filtering options.
12
14
 
13
15
  ## Key Features
14
16
 
15
- - **Multiple Project Formats**: Supports `uv.lock`, `poetry.lock`, `pyproject.toml`, and `requirements.txt` files
17
+ - **Multiple Project Formats**: Supports `uv.lock`, `poetry.lock`, `Pipfile.lock`, `pyproject.toml`, `Pipfile`, and `requirements.txt` files
16
18
  - **External Resolver Integration**: Leverages `uv` and `pip-tools` for accurate requirements.txt constraint solving
17
19
  - **Multiple Data Sources**:
18
20
  - PyPA Advisory Database (default)
@@ -165,7 +167,7 @@ uvx pysentry-rs /path/to/python/project
165
167
  pysentry
166
168
  pysentry /path/to/python/project
167
169
 
168
- # Automatically detects project type (uv.lock, poetry.lock, pyproject.toml, requirements.txt)
170
+ # Automatically detects project type (uv.lock, poetry.lock, Pipfile.lock, pyproject.toml, Pipfile, requirements.txt)
169
171
  pysentry /path/to/project
170
172
 
171
173
  # Force specific resolver
@@ -468,6 +470,46 @@ Full support for Poetry lock files:
468
470
  - Handles Poetry's dependency groups and optional dependencies
469
471
  - Perfect for Poetry-managed projects with established lock files
470
472
 
473
+ ### Pipfile.lock Files
474
+
475
+ Full support for Pipenv lock files with exact version resolution:
476
+
477
+ - **Exact Version Resolution**: Scans exact dependency versions locked by Pipenv
478
+ - **Lock-File Only Analysis**: Relies purely on the lock file structure, no Pipfile parsing needed
479
+ - **Complete Dependency Tree**: Analyzes all resolved dependencies including transitive ones
480
+ - **Dependency Classification**: Distinguishes between default dependencies and development groups
481
+
482
+ **Key Features:**
483
+
484
+ - No external tools required
485
+ - Fast parsing with exact version information
486
+ - Handles Pipenv's dependency groups (default and develop)
487
+ - Perfect for Pipenv-managed projects with established lock files
488
+
489
+ ### Pipfile Files (External Resolution)
490
+
491
+ Support for Pipfile specification files using external dependency resolvers:
492
+
493
+ **Key Features:**
494
+
495
+ - **Dependencies Resolution**: Converts version constraints from Pipfile to exact versions using mature external tools
496
+ - **Multiple Resolver Support**:
497
+ - **uv**: Rust-based resolver, extremely fast and reliable (recommended)
498
+ - **pip-tools**: Python-based resolver using `pip-compile`, widely compatible
499
+ - **Auto-detection**: Automatically detects and uses the best available resolver in your environment
500
+ - **Dependency Groups**: Supports both default packages and dev-packages sections
501
+ - **Complex Constraint Handling**: Supports version ranges, Git dependencies, and environment markers
502
+
503
+ **Resolution Workflow:**
504
+
505
+ 1. Detects `Pipfile` in your project (when `Pipfile.lock` is not present)
506
+ 2. Auto-detects available resolver (`uv` or `pip-tools`) in current environment
507
+ 3. Resolves version constraints to exact dependency versions
508
+ 4. Scans resolved dependencies for vulnerabilities
509
+ 5. Reports findings with dependency group classification
510
+
511
+ **Note**: When both `Pipfile` and `Pipfile.lock` are present, PySentry prioritizes the lock file for better accuracy. Consider using `pipenv lock` to generate a lock file for the most precise vulnerability scanning.
512
+
471
513
  ### requirements.txt Files (External Resolution)
472
514
 
473
515
  Advanced support for `requirements.txt` files using external dependency resolvers:
@@ -706,7 +748,7 @@ pysentry /path/to/python/project
706
748
  pysentry --requirements requirements-dev.txt --requirements requirements-test.txt
707
749
 
708
750
  # Check if higher-priority files exist (they take precedence)
709
- ls uv.lock poetry.lock pyproject.toml
751
+ ls uv.lock poetry.lock Pipfile.lock pyproject.toml Pipfile requirements.txt
710
752
  ```
711
753
 
712
754
  **Performance Issues**
@@ -0,0 +1,141 @@
1
+ # PySentry - pip-audit Benchmark Report
2
+
3
+ **Generated:** 2025-08-13 19:15:14
4
+ **Duration:** 2m 31.44s
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.256s) - 36.61x faster than slowest
13
+ - **Memory Efficient:** pysentry-osv (10.62 MB) - 10.00x less memory than highest
14
+
15
+ ### Small_Requirements Dataset - Hot Cache
16
+ - **Fastest:** pysentry-pypi (0.294s) - 26.45x faster than slowest
17
+ - **Memory Efficient:** pysentry-pypi (8.86 MB) - 12.13x less memory than highest
18
+
19
+ ### Large_Requirements Dataset - Cold Cache
20
+ - **Fastest:** pysentry-pypi (0.761s) - 50.91x faster than slowest
21
+ - **Memory Efficient:** pysentry-osv (10.78 MB) - 10.57x less memory than highest
22
+
23
+ ### Large_Requirements Dataset - Hot Cache
24
+ - **Fastest:** pysentry-pypi (0.693s) - 22.77x faster than slowest
25
+ - **Memory Efficient:** pysentry-pypi (8.71 MB) - 11.50x 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.64 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.256s | 1.00x |
44
+ | 🥈 pysentry-osv | 0.959s | 3.74x |
45
+ | pysentry-pypa | 1.096s | 4.28x |
46
+ | pysentry-all-sources | 4.783s | 18.65x |
47
+ | pip-audit-default | 9.387s | 36.61x |
48
+
49
+ #### Memory Usage Comparison
50
+
51
+ | Tool Configuration | Peak Memory | Relative Performance |
52
+ |---------------------|---------------------|---------------------|
53
+ | 🥇 pysentry-osv | 10.62 MB | 1.00x |
54
+ | 🥈 pysentry-pypi | 10.90 MB | 1.03x |
55
+ | pip-audit-default | 45.28 MB | 4.26x |
56
+ | pysentry-pypa | 55.32 MB | 5.21x |
57
+ | pysentry-all-sources | 106.14 MB | 10.00x |
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.294s | 1.00x |
66
+ | 🥈 pysentry-pypa | 0.854s | 2.90x |
67
+ | pysentry-all-sources | 1.012s | 3.44x |
68
+ | pysentry-osv | 1.217s | 4.13x |
69
+ | pip-audit-default | 7.785s | 26.45x |
70
+
71
+ #### Memory Usage Comparison
72
+
73
+ | Tool Configuration | Peak Memory | Relative Performance |
74
+ |---------------------|---------------------|---------------------|
75
+ | 🥇 pysentry-pypi | 8.86 MB | 1.00x |
76
+ | 🥈 pysentry-osv | 10.52 MB | 1.19x |
77
+ | pip-audit-default | 44.48 MB | 5.02x |
78
+ | pysentry-pypa | 67.44 MB | 7.61x |
79
+ | pysentry-all-sources | 107.53 MB | 12.13x |
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.761s | 1.00x |
88
+ | 🥈 pysentry-pypa | 1.276s | 1.68x |
89
+ | pysentry-osv | 3.144s | 4.13x |
90
+ | pip-audit-default | 17.817s | 23.41x |
91
+ | pysentry-all-sources | 38.757s | 50.91x |
92
+
93
+ #### Memory Usage Comparison
94
+
95
+ | Tool Configuration | Peak Memory | Relative Performance |
96
+ |---------------------|---------------------|---------------------|
97
+ | 🥇 pysentry-osv | 10.78 MB | 1.00x |
98
+ | 🥈 pysentry-pypi | 12.95 MB | 1.20x |
99
+ | pip-audit-default | 47.48 MB | 4.40x |
100
+ | pysentry-pypa | 62.62 MB | 5.81x |
101
+ | pysentry-all-sources | 113.92 MB | 10.57x |
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.693s | 1.00x |
110
+ | 🥈 pysentry-pypa | 1.308s | 1.89x |
111
+ | pysentry-all-sources | 3.079s | 4.44x |
112
+ | pysentry-osv | 3.115s | 4.50x |
113
+ | pip-audit-default | 15.778s | 22.77x |
114
+
115
+ #### Memory Usage Comparison
116
+
117
+ | Tool Configuration | Peak Memory | Relative Performance |
118
+ |---------------------|---------------------|---------------------|
119
+ | 🥇 pysentry-pypi | 8.71 MB | 1.00x |
120
+ | 🥈 pysentry-osv | 10.64 MB | 1.22x |
121
+ | pip-audit-default | 46.98 MB | 5.39x |
122
+ | pysentry-pypa | 53.95 MB | 6.19x |
123
+ | pysentry-all-sources | 100.21 MB | 11.50x |
124
+
125
+ ## Detailed Analysis
126
+
127
+ ### Pysentry Performance
128
+
129
+ - **Execution Time:** Avg: 3.913s, Min: 0.256s, Max: 38.757s
130
+
131
+ - **Memory Usage:** Avg: 46.95 MB, Min: 8.71 MB, Max: 113.92 MB
132
+
133
+ - **Success Rate:** 100.0% (16/16)
134
+
135
+ ### Pip-Audit Performance
136
+
137
+ - **Execution Time:** Avg: 12.692s, Min: 7.785s, Max: 17.817s
138
+
139
+ - **Memory Usage:** Avg: 46.05 MB, Min: 44.48 MB, Max: 47.48 MB
140
+
141
+ - **Success Rate:** 100.0% (4/4)
@@ -0,0 +1,141 @@
1
+ # PySentry - pip-audit Benchmark Report
2
+
3
+ **Generated:** 2025-08-14 15:42:52
4
+ **Duration:** 1m 55.57s
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.306s) - 28.70x faster than slowest
13
+ - **Memory Efficient:** pysentry-osv (10.63 MB) - 10.15x less memory than highest
14
+
15
+ ### Small_Requirements Dataset - Hot Cache
16
+ - **Fastest:** pysentry-pypi (0.224s) - 36.53x faster than slowest
17
+ - **Memory Efficient:** pysentry-osv (10.78 MB) - 9.89x less memory than highest
18
+
19
+ ### Large_Requirements Dataset - Cold Cache
20
+ - **Fastest:** pysentry-pypi (0.996s) - 18.56x faster than slowest
21
+ - **Memory Efficient:** pysentry-osv (10.98 MB) - 9.40x less memory than highest
22
+
23
+ ### Large_Requirements Dataset - Hot Cache
24
+ - **Fastest:** pysentry-pypi (0.657s) - 24.63x faster than slowest
25
+ - **Memory Efficient:** pysentry-osv (10.68 MB) - 10.06x 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.62 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.306s | 1.00x |
44
+ | 🥈 pysentry-osv | 0.992s | 3.24x |
45
+ | pysentry-pypa | 1.225s | 4.00x |
46
+ | pysentry-all-sources | 1.238s | 4.04x |
47
+ | pip-audit-default | 8.785s | 28.70x |
48
+
49
+ #### Memory Usage Comparison
50
+
51
+ | Tool Configuration | Peak Memory | Relative Performance |
52
+ |---------------------|---------------------|---------------------|
53
+ | 🥇 pysentry-osv | 10.63 MB | 1.00x |
54
+ | 🥈 pysentry-pypi | 12.06 MB | 1.13x |
55
+ | pip-audit-default | 45.50 MB | 4.28x |
56
+ | pysentry-pypa | 73.88 MB | 6.95x |
57
+ | pysentry-all-sources | 107.95 MB | 10.15x |
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.224s | 1.00x |
66
+ | 🥈 pysentry-pypa | 1.027s | 4.59x |
67
+ | pysentry-all-sources | 1.136s | 5.08x |
68
+ | pysentry-osv | 1.142s | 5.11x |
69
+ | pip-audit-default | 8.165s | 36.53x |
70
+
71
+ #### Memory Usage Comparison
72
+
73
+ | Tool Configuration | Peak Memory | Relative Performance |
74
+ |---------------------|---------------------|---------------------|
75
+ | 🥇 pysentry-osv | 10.78 MB | 1.00x |
76
+ | 🥈 pysentry-pypi | 12.29 MB | 1.14x |
77
+ | pip-audit-default | 44.93 MB | 4.17x |
78
+ | pysentry-pypa | 74.12 MB | 6.88x |
79
+ | pysentry-all-sources | 106.62 MB | 9.89x |
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.996s | 1.00x |
88
+ | 🥈 pysentry-pypa | 1.328s | 1.33x |
89
+ | pysentry-osv | 3.112s | 3.13x |
90
+ | pysentry-all-sources | 3.483s | 3.50x |
91
+ | pip-audit-default | 18.476s | 18.56x |
92
+
93
+ #### Memory Usage Comparison
94
+
95
+ | Tool Configuration | Peak Memory | Relative Performance |
96
+ |---------------------|---------------------|---------------------|
97
+ | 🥇 pysentry-osv | 10.98 MB | 1.00x |
98
+ | 🥈 pysentry-pypi | 13.16 MB | 1.20x |
99
+ | pip-audit-default | 47.48 MB | 4.32x |
100
+ | pysentry-pypa | 72.94 MB | 6.64x |
101
+ | pysentry-all-sources | 103.27 MB | 9.40x |
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.657s | 1.00x |
110
+ | 🥈 pysentry-pypa | 1.518s | 2.31x |
111
+ | pysentry-all-sources | 3.055s | 4.65x |
112
+ | pysentry-osv | 3.429s | 5.22x |
113
+ | pip-audit-default | 16.172s | 24.63x |
114
+
115
+ #### Memory Usage Comparison
116
+
117
+ | Tool Configuration | Peak Memory | Relative Performance |
118
+ |---------------------|---------------------|---------------------|
119
+ | 🥇 pysentry-osv | 10.68 MB | 1.00x |
120
+ | 🥈 pysentry-pypi | 13.18 MB | 1.23x |
121
+ | pip-audit-default | 48.80 MB | 4.57x |
122
+ | pysentry-pypa | 72.41 MB | 6.78x |
123
+ | pysentry-all-sources | 107.36 MB | 10.06x |
124
+
125
+ ## Detailed Analysis
126
+
127
+ ### Pysentry Performance
128
+
129
+ - **Execution Time:** Avg: 1.554s, Min: 0.224s, Max: 3.483s
130
+
131
+ - **Memory Usage:** Avg: 50.77 MB, Min: 10.63 MB, Max: 107.95 MB
132
+
133
+ - **Success Rate:** 100.0% (16/16)
134
+
135
+ ### Pip-Audit Performance
136
+
137
+ - **Execution Time:** Avg: 12.899s, Min: 8.165s, Max: 18.476s
138
+
139
+ - **Memory Usage:** Avg: 46.68 MB, Min: 44.93 MB, Max: 48.80 MB
140
+
141
+ - **Success Rate:** 100.0% (4/4)