pybinaryguard 1.0.0__tar.gz → 1.0.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.
- {pybinaryguard-1.0.0/src/pybinaryguard.egg-info → pybinaryguard-1.0.2}/PKG-INFO +46 -15
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/README.md +39 -9
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/pyproject.toml +9 -6
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/__init__.py +1 -1
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/cli/formatters.py +6 -6
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/cli/main.py +1 -1
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/python_probe.py +25 -16
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2/src/pybinaryguard.egg-info}/PKG-INFO +46 -15
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_cli.py +1 -1
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_diagnostics.py +1 -1
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_rules.py +7 -7
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_scanner.py +1 -1
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/LICENSE +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/setup.cfg +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/__main__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/_compat/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/guard.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/recommender.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/schema.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/simulator.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/agent/tool_interface.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/base.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/dependency_analyzer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/elf_analyzer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/symbol_analyzer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/wheel_analyzer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/cli/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/cli/commands.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/diagnostics/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/diagnostics/explainer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/diagnostics/findings.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/diagnostics/suggestions.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/frameworks/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/frameworks/onnxruntime.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/frameworks/pytorch.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/frameworks/tensorflow.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/frameworks/tensorrt.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/models/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/models/enums.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/models/finding.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/models/package.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/models/system.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/contrib/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/contrib/gstreamer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/contrib/jetson.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/contrib/opencv.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/contrib/tensorrt.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/hooks.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/plugins/loader.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/predictor/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/predictor/dependency_graph.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/predictor/linker_simulator.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/predictor/predictor.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/predictor/resolver.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/base.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/board_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/cpu_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/glibc_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/gpu_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/library_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/os_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/toolchain_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/probes/venv_probe.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/profiles/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/profiles/engine.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/base.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/arch_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/board_profile_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/container_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/cpu_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/cuda_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/dependency_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/framework_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/glibc_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/numpy_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/predictive_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/python_abi_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/source_build_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/venv_rules.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/engine.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/scanner.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/scoring/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/scoring/engine.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/snapshot/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/snapshot/generator.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/snapshot/lockfile.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/snapshot/verifier.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/validators/__init__.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/validators/import_validator.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard.egg-info/SOURCES.txt +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard.egg-info/dependency_links.txt +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard.egg-info/entry_points.txt +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard.egg-info/requires.txt +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard.egg-info/top_level.txt +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_agent_sdk.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_elf_analyzer.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_gap_features.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_models.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_plugins.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_probes.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_rule_engine.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_scan_modes.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_scoring.py +0 -0
- {pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/tests/test_wheel_analyzer.py +0 -0
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pybinaryguard
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Binary Compatibility Intelligence for Python — detect incompatibilities before they crash your program
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Pothihai Selvan <po@nuvai.dev>
|
|
6
|
+
Maintainer-email: "Pothihai Selvan (@po-nuvai) — Nuvai AI Solutions" <po@nuvai.dev>
|
|
6
7
|
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
10
|
-
Project-URL: Changelog, https://github.com/
|
|
8
|
+
Project-URL: Homepage, https://github.com/po-nuvai/pybinaryguard
|
|
9
|
+
Project-URL: Repository, https://github.com/po-nuvai/pybinaryguard
|
|
10
|
+
Project-URL: Issues, https://github.com/po-nuvai/pybinaryguard/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/po-nuvai/pybinaryguard/blob/main/CHANGELOG.md
|
|
11
12
|
Keywords: binary,compatibility,elf,glibc,cuda,diagnostics
|
|
12
13
|
Classifier: Development Status :: 4 - Beta
|
|
13
14
|
Classifier: Intended Audience :: Developers
|
|
@@ -33,10 +34,12 @@ Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
|
33
34
|
Dynamic: license-file
|
|
34
35
|
|
|
35
36
|
<p align="center">
|
|
37
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/v/pybinaryguard?style=for-the-badge&logo=pypi&logoColor=white&color=purple" alt="PyPI"></a>
|
|
38
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/dm/pybinaryguard?style=for-the-badge&color=blue" alt="Downloads"></a>
|
|
39
|
+
<a href="https://github.com/po-nuvai/pybinaryguard/stargazers"><img src="https://img.shields.io/github/stars/po-nuvai/pybinaryguard?style=for-the-badge&logo=github&color=yellow" alt="Stars"></a>
|
|
36
40
|
<img src="https://img.shields.io/badge/python-3.9%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.9+">
|
|
37
41
|
<img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT License">
|
|
38
42
|
<img src="https://img.shields.io/badge/platform-linux-orange?style=for-the-badge&logo=linux&logoColor=white" alt="Linux">
|
|
39
|
-
<img src="https://img.shields.io/badge/version-1.0.0-purple?style=for-the-badge" alt="v1.0.0">
|
|
40
43
|
<img src="https://img.shields.io/badge/tests-505%20passing-brightgreen?style=for-the-badge" alt="505 Tests">
|
|
41
44
|
</p>
|
|
42
45
|
|
|
@@ -125,12 +128,25 @@ PyBinaryGuard is the **first tool** that correlates your Python version, CPU arc
|
|
|
125
128
|
|
|
126
129
|
## Quick Start
|
|
127
130
|
|
|
131
|
+
### Install
|
|
132
|
+
|
|
128
133
|
```bash
|
|
129
|
-
#
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
134
|
+
# Recommended — isolated CLI install (Ubuntu 24.04+, Debian 12+, etc.)
|
|
135
|
+
pipx install pybinaryguard
|
|
136
|
+
|
|
137
|
+
# Or per-user install
|
|
138
|
+
pip install --user pybinaryguard
|
|
139
|
+
|
|
140
|
+
# Or classic pip (inside a venv)
|
|
141
|
+
pip install pybinaryguard
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> **Note:** On modern Linux distros (Ubuntu 24.04+, Debian 12+), system-wide
|
|
145
|
+
> `pip install` is blocked by PEP 668. Use `pipx` or a virtual environment.
|
|
133
146
|
|
|
147
|
+
### Use
|
|
148
|
+
|
|
149
|
+
```bash
|
|
134
150
|
# Run a full scan
|
|
135
151
|
pybinaryguard scan
|
|
136
152
|
|
|
@@ -144,6 +160,15 @@ pybinaryguard scan --fast
|
|
|
144
160
|
pybinaryguard scan --deep
|
|
145
161
|
```
|
|
146
162
|
|
|
163
|
+
### Install from source (for development)
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
git clone https://github.com/po-nuvai/pybinaryguard.git
|
|
167
|
+
cd pybinaryguard
|
|
168
|
+
python -m venv .venv && source .venv/bin/activate
|
|
169
|
+
pip install -e ".[dev]"
|
|
170
|
+
```
|
|
171
|
+
|
|
147
172
|
---
|
|
148
173
|
|
|
149
174
|
## Features
|
|
@@ -813,7 +838,7 @@ pybinaryguard/
|
|
|
813
838
|
| |-- commands.py # Command handlers
|
|
814
839
|
| +-- formatters.py # Output formatting (table/json/minimal)
|
|
815
840
|
|
|
|
816
|
-
|-- tests/ #
|
|
841
|
+
|-- tests/ # 505 tests
|
|
817
842
|
|-- docs/ # Documentation
|
|
818
843
|
+-- examples/ # Usage examples
|
|
819
844
|
```
|
|
@@ -850,7 +875,7 @@ pybinaryguard/
|
|
|
850
875
|
## Testing
|
|
851
876
|
|
|
852
877
|
```bash
|
|
853
|
-
# Run all tests (
|
|
878
|
+
# Run all tests (505 tests)
|
|
854
879
|
python -m pytest tests/ -v
|
|
855
880
|
|
|
856
881
|
# Run with coverage
|
|
@@ -866,8 +891,14 @@ python -m pytest tests/test_agent_sdk.py -v # Agent SDK
|
|
|
866
891
|
|
|
867
892
|
## Author
|
|
868
893
|
|
|
869
|
-
**
|
|
870
|
-
Applied Research Scientist
|
|
894
|
+
**Pothihai Selvan** — [@po-nuvai](https://github.com/po-nuvai)
|
|
895
|
+
Applied Research Scientist at [Nuvai AI Solutions](https://nuvai.dev)
|
|
896
|
+
|
|
897
|
+
Built PyBinaryGuard to solve the bug that once cost him weeks of debugging on an NVIDIA Jetson TX2 — see the [Origin Story](#origin-story) at the top of this README for the full backstory.
|
|
898
|
+
|
|
899
|
+
- **GitHub:** [github.com/po-nuvai](https://github.com/po-nuvai)
|
|
900
|
+
- **Email:** [po@nuvai.dev](mailto:po@nuvai.dev)
|
|
901
|
+
- **Company:** [Nuvai AI Solutions](https://nuvai.dev) — Applied AI research and developer tooling
|
|
871
902
|
|
|
872
903
|
---
|
|
873
904
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/v/pybinaryguard?style=for-the-badge&logo=pypi&logoColor=white&color=purple" alt="PyPI"></a>
|
|
3
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/dm/pybinaryguard?style=for-the-badge&color=blue" alt="Downloads"></a>
|
|
4
|
+
<a href="https://github.com/po-nuvai/pybinaryguard/stargazers"><img src="https://img.shields.io/github/stars/po-nuvai/pybinaryguard?style=for-the-badge&logo=github&color=yellow" alt="Stars"></a>
|
|
2
5
|
<img src="https://img.shields.io/badge/python-3.9%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.9+">
|
|
3
6
|
<img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT License">
|
|
4
7
|
<img src="https://img.shields.io/badge/platform-linux-orange?style=for-the-badge&logo=linux&logoColor=white" alt="Linux">
|
|
5
|
-
<img src="https://img.shields.io/badge/version-1.0.0-purple?style=for-the-badge" alt="v1.0.0">
|
|
6
8
|
<img src="https://img.shields.io/badge/tests-505%20passing-brightgreen?style=for-the-badge" alt="505 Tests">
|
|
7
9
|
</p>
|
|
8
10
|
|
|
@@ -91,12 +93,25 @@ PyBinaryGuard is the **first tool** that correlates your Python version, CPU arc
|
|
|
91
93
|
|
|
92
94
|
## Quick Start
|
|
93
95
|
|
|
96
|
+
### Install
|
|
97
|
+
|
|
94
98
|
```bash
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
# Recommended — isolated CLI install (Ubuntu 24.04+, Debian 12+, etc.)
|
|
100
|
+
pipx install pybinaryguard
|
|
101
|
+
|
|
102
|
+
# Or per-user install
|
|
103
|
+
pip install --user pybinaryguard
|
|
104
|
+
|
|
105
|
+
# Or classic pip (inside a venv)
|
|
106
|
+
pip install pybinaryguard
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> **Note:** On modern Linux distros (Ubuntu 24.04+, Debian 12+), system-wide
|
|
110
|
+
> `pip install` is blocked by PEP 668. Use `pipx` or a virtual environment.
|
|
99
111
|
|
|
112
|
+
### Use
|
|
113
|
+
|
|
114
|
+
```bash
|
|
100
115
|
# Run a full scan
|
|
101
116
|
pybinaryguard scan
|
|
102
117
|
|
|
@@ -110,6 +125,15 @@ pybinaryguard scan --fast
|
|
|
110
125
|
pybinaryguard scan --deep
|
|
111
126
|
```
|
|
112
127
|
|
|
128
|
+
### Install from source (for development)
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
git clone https://github.com/po-nuvai/pybinaryguard.git
|
|
132
|
+
cd pybinaryguard
|
|
133
|
+
python -m venv .venv && source .venv/bin/activate
|
|
134
|
+
pip install -e ".[dev]"
|
|
135
|
+
```
|
|
136
|
+
|
|
113
137
|
---
|
|
114
138
|
|
|
115
139
|
## Features
|
|
@@ -779,7 +803,7 @@ pybinaryguard/
|
|
|
779
803
|
| |-- commands.py # Command handlers
|
|
780
804
|
| +-- formatters.py # Output formatting (table/json/minimal)
|
|
781
805
|
|
|
|
782
|
-
|-- tests/ #
|
|
806
|
+
|-- tests/ # 505 tests
|
|
783
807
|
|-- docs/ # Documentation
|
|
784
808
|
+-- examples/ # Usage examples
|
|
785
809
|
```
|
|
@@ -816,7 +840,7 @@ pybinaryguard/
|
|
|
816
840
|
## Testing
|
|
817
841
|
|
|
818
842
|
```bash
|
|
819
|
-
# Run all tests (
|
|
843
|
+
# Run all tests (505 tests)
|
|
820
844
|
python -m pytest tests/ -v
|
|
821
845
|
|
|
822
846
|
# Run with coverage
|
|
@@ -832,8 +856,14 @@ python -m pytest tests/test_agent_sdk.py -v # Agent SDK
|
|
|
832
856
|
|
|
833
857
|
## Author
|
|
834
858
|
|
|
835
|
-
**
|
|
836
|
-
Applied Research Scientist
|
|
859
|
+
**Pothihai Selvan** — [@po-nuvai](https://github.com/po-nuvai)
|
|
860
|
+
Applied Research Scientist at [Nuvai AI Solutions](https://nuvai.dev)
|
|
861
|
+
|
|
862
|
+
Built PyBinaryGuard to solve the bug that once cost him weeks of debugging on an NVIDIA Jetson TX2 — see the [Origin Story](#origin-story) at the top of this README for the full backstory.
|
|
863
|
+
|
|
864
|
+
- **GitHub:** [github.com/po-nuvai](https://github.com/po-nuvai)
|
|
865
|
+
- **Email:** [po@nuvai.dev](mailto:po@nuvai.dev)
|
|
866
|
+
- **Company:** [Nuvai AI Solutions](https://nuvai.dev) — Applied AI research and developer tooling
|
|
837
867
|
|
|
838
868
|
---
|
|
839
869
|
|
|
@@ -4,14 +4,17 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pybinaryguard"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.2"
|
|
8
8
|
description = "Binary Compatibility Intelligence for Python — detect incompatibilities before they crash your program"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
11
11
|
requires-python = ">=3.9"
|
|
12
12
|
dependencies = []
|
|
13
13
|
authors = [
|
|
14
|
-
{name = "
|
|
14
|
+
{name = "Pothihai Selvan", email = "po@nuvai.dev"},
|
|
15
|
+
]
|
|
16
|
+
maintainers = [
|
|
17
|
+
{name = "Pothihai Selvan (@po-nuvai) — Nuvai AI Solutions", email = "po@nuvai.dev"},
|
|
15
18
|
]
|
|
16
19
|
classifiers = [
|
|
17
20
|
"Development Status :: 4 - Beta",
|
|
@@ -29,10 +32,10 @@ classifiers = [
|
|
|
29
32
|
keywords = ["binary", "compatibility", "elf", "glibc", "cuda", "diagnostics"]
|
|
30
33
|
|
|
31
34
|
[project.urls]
|
|
32
|
-
Homepage = "https://github.com/
|
|
33
|
-
Repository = "https://github.com/
|
|
34
|
-
Issues = "https://github.com/
|
|
35
|
-
Changelog = "https://github.com/
|
|
35
|
+
Homepage = "https://github.com/po-nuvai/pybinaryguard"
|
|
36
|
+
Repository = "https://github.com/po-nuvai/pybinaryguard"
|
|
37
|
+
Issues = "https://github.com/po-nuvai/pybinaryguard/issues"
|
|
38
|
+
Changelog = "https://github.com/po-nuvai/pybinaryguard/blob/main/CHANGELOG.md"
|
|
36
39
|
|
|
37
40
|
[project.optional-dependencies]
|
|
38
41
|
full = ["pyelftools>=0.29"]
|
|
@@ -208,7 +208,7 @@ class TableFormatter(FormatterBase):
|
|
|
208
208
|
|
|
209
209
|
# Header
|
|
210
210
|
lines.append(
|
|
211
|
-
f"{c.BOLD}PyBinaryGuard v1.0.
|
|
211
|
+
f"{c.BOLD}PyBinaryGuard v1.0.2 \u2014 Binary Compatibility Scanner{c.RESET}"
|
|
212
212
|
)
|
|
213
213
|
lines.append(f"{c.DIM}{_HEADER_LINE}{c.RESET}")
|
|
214
214
|
lines.append("")
|
|
@@ -350,7 +350,7 @@ class TableFormatter(FormatterBase):
|
|
|
350
350
|
lines: List[str] = []
|
|
351
351
|
|
|
352
352
|
lines.append(
|
|
353
|
-
f"{c.BOLD}PyBinaryGuard v1.0.
|
|
353
|
+
f"{c.BOLD}PyBinaryGuard v1.0.2 \u2014 System Profile{c.RESET}"
|
|
354
354
|
)
|
|
355
355
|
lines.append(f"{c.DIM}{_HEADER_LINE}{c.RESET}")
|
|
356
356
|
lines.append("")
|
|
@@ -505,7 +505,7 @@ class JSONFormatter(FormatterBase):
|
|
|
505
505
|
scan_data["score_breakdown"] = report.score_breakdown.as_dict()
|
|
506
506
|
|
|
507
507
|
output: Dict[str, Any] = {
|
|
508
|
-
"version": "1.0.
|
|
508
|
+
"version": "1.0.2",
|
|
509
509
|
"profile": self._profile_dict(profile),
|
|
510
510
|
"scan": scan_data,
|
|
511
511
|
"findings": [f.as_dict() for f in report.findings],
|
|
@@ -521,7 +521,7 @@ class JSONFormatter(FormatterBase):
|
|
|
521
521
|
) -> str:
|
|
522
522
|
"""Format check findings as JSON."""
|
|
523
523
|
output: Dict[str, Any] = {
|
|
524
|
-
"version": "1.0.
|
|
524
|
+
"version": "1.0.2",
|
|
525
525
|
"package": package,
|
|
526
526
|
"findings": [f.as_dict() for f in findings],
|
|
527
527
|
"summary": {
|
|
@@ -536,7 +536,7 @@ class JSONFormatter(FormatterBase):
|
|
|
536
536
|
def format_profile(self, profile: SystemProfile) -> str:
|
|
537
537
|
"""Format a system profile as JSON."""
|
|
538
538
|
output: Dict[str, Any] = {
|
|
539
|
-
"version": "1.0.
|
|
539
|
+
"version": "1.0.2",
|
|
540
540
|
"profile": self._profile_dict(profile),
|
|
541
541
|
}
|
|
542
542
|
return json.dumps(output, indent=2, default=str)
|
|
@@ -544,7 +544,7 @@ class JSONFormatter(FormatterBase):
|
|
|
544
544
|
def format_doctor(self, diagnosis: Dict[str, Any]) -> str:
|
|
545
545
|
"""Format a doctor result as JSON."""
|
|
546
546
|
output: Dict[str, Any] = {
|
|
547
|
-
"version": "1.0.
|
|
547
|
+
"version": "1.0.2",
|
|
548
548
|
"diagnosis": {},
|
|
549
549
|
}
|
|
550
550
|
if "error" in diagnosis:
|
|
@@ -14,7 +14,9 @@ class PythonProbe(ProbeBase):
|
|
|
14
14
|
|
|
15
15
|
Gathered fields:
|
|
16
16
|
- ``python_version``: 3-tuple of (major, minor, micro)
|
|
17
|
-
- ``python_abi_tag``: e.g. ``"cp312
|
|
17
|
+
- ``python_abi_tag``: PEP 425 wheel-style tag, e.g. ``"cp312"``, ``"cp312d"``
|
|
18
|
+
(debug), ``"pypy39_pp73"``. This is the value compared against a wheel's
|
|
19
|
+
ABI tag from its ``WHEEL`` metadata — *not* the raw ``SOABI``.
|
|
18
20
|
- ``python_implementation``: e.g. ``"cpython"``, ``"pypy"``
|
|
19
21
|
- ``python_executable``: absolute path to the interpreter
|
|
20
22
|
- ``stable_abi_supported``: whether the stable ABI (abi3) is supported
|
|
@@ -50,27 +52,34 @@ class PythonProbe(ProbeBase):
|
|
|
50
52
|
|
|
51
53
|
@staticmethod
|
|
52
54
|
def _get_abi_tag() -> str:
|
|
53
|
-
"""
|
|
55
|
+
"""Return the PEP 425 wheel-style ABI tag.
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
Examples: ``"cp312"``, ``"cp312d"`` (debug), ``"pypy39_pp73"``.
|
|
58
|
+
|
|
59
|
+
This intentionally does NOT return ``sysconfig.SOABI``
|
|
60
|
+
(``"cpython-312-x86_64-linux-gnu"``) — that string lives in a different
|
|
61
|
+
namespace than the ABI tag inside a wheel's ``WHEEL`` metadata, and
|
|
62
|
+
comparing them directly produces false-positive mismatches on every
|
|
63
|
+
real wheel.
|
|
57
64
|
"""
|
|
58
65
|
try:
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
impl = sys.implementation.name
|
|
67
|
+
major = sys.version_info.major
|
|
68
|
+
minor = sys.version_info.minor
|
|
69
|
+
abiflags = sysconfig.get_config_var("abiflags") or ""
|
|
62
70
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
ver = f"{sys.version_info.major}{sys.version_info.minor}"
|
|
66
|
-
tag = f"{impl}{ver}"
|
|
71
|
+
if impl == "cpython":
|
|
72
|
+
return f"cp{major}{minor}{abiflags}"
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
if impl == "pypy":
|
|
75
|
+
pypy_ver = getattr(sys, "pypy_version_info", None)
|
|
76
|
+
if pypy_ver is not None:
|
|
77
|
+
return f"pypy{major}{minor}_pp{pypy_ver[0]}{pypy_ver[1]}"
|
|
78
|
+
return f"pp{major}{minor}"
|
|
72
79
|
|
|
73
|
-
|
|
80
|
+
# Other implementations (graalpy, ironpython, jython, ...)
|
|
81
|
+
prefix = impl[:2] if impl else "xx"
|
|
82
|
+
return f"{prefix}{major}{minor}{abiflags}"
|
|
74
83
|
except Exception:
|
|
75
84
|
return ""
|
|
76
85
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pybinaryguard
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Binary Compatibility Intelligence for Python — detect incompatibilities before they crash your program
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Pothihai Selvan <po@nuvai.dev>
|
|
6
|
+
Maintainer-email: "Pothihai Selvan (@po-nuvai) — Nuvai AI Solutions" <po@nuvai.dev>
|
|
6
7
|
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Repository, https://github.com/
|
|
9
|
-
Project-URL: Issues, https://github.com/
|
|
10
|
-
Project-URL: Changelog, https://github.com/
|
|
8
|
+
Project-URL: Homepage, https://github.com/po-nuvai/pybinaryguard
|
|
9
|
+
Project-URL: Repository, https://github.com/po-nuvai/pybinaryguard
|
|
10
|
+
Project-URL: Issues, https://github.com/po-nuvai/pybinaryguard/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/po-nuvai/pybinaryguard/blob/main/CHANGELOG.md
|
|
11
12
|
Keywords: binary,compatibility,elf,glibc,cuda,diagnostics
|
|
12
13
|
Classifier: Development Status :: 4 - Beta
|
|
13
14
|
Classifier: Intended Audience :: Developers
|
|
@@ -33,10 +34,12 @@ Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
|
33
34
|
Dynamic: license-file
|
|
34
35
|
|
|
35
36
|
<p align="center">
|
|
37
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/v/pybinaryguard?style=for-the-badge&logo=pypi&logoColor=white&color=purple" alt="PyPI"></a>
|
|
38
|
+
<a href="https://pypi.org/project/pybinaryguard/"><img src="https://img.shields.io/pypi/dm/pybinaryguard?style=for-the-badge&color=blue" alt="Downloads"></a>
|
|
39
|
+
<a href="https://github.com/po-nuvai/pybinaryguard/stargazers"><img src="https://img.shields.io/github/stars/po-nuvai/pybinaryguard?style=for-the-badge&logo=github&color=yellow" alt="Stars"></a>
|
|
36
40
|
<img src="https://img.shields.io/badge/python-3.9%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.9+">
|
|
37
41
|
<img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT License">
|
|
38
42
|
<img src="https://img.shields.io/badge/platform-linux-orange?style=for-the-badge&logo=linux&logoColor=white" alt="Linux">
|
|
39
|
-
<img src="https://img.shields.io/badge/version-1.0.0-purple?style=for-the-badge" alt="v1.0.0">
|
|
40
43
|
<img src="https://img.shields.io/badge/tests-505%20passing-brightgreen?style=for-the-badge" alt="505 Tests">
|
|
41
44
|
</p>
|
|
42
45
|
|
|
@@ -125,12 +128,25 @@ PyBinaryGuard is the **first tool** that correlates your Python version, CPU arc
|
|
|
125
128
|
|
|
126
129
|
## Quick Start
|
|
127
130
|
|
|
131
|
+
### Install
|
|
132
|
+
|
|
128
133
|
```bash
|
|
129
|
-
#
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
134
|
+
# Recommended — isolated CLI install (Ubuntu 24.04+, Debian 12+, etc.)
|
|
135
|
+
pipx install pybinaryguard
|
|
136
|
+
|
|
137
|
+
# Or per-user install
|
|
138
|
+
pip install --user pybinaryguard
|
|
139
|
+
|
|
140
|
+
# Or classic pip (inside a venv)
|
|
141
|
+
pip install pybinaryguard
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> **Note:** On modern Linux distros (Ubuntu 24.04+, Debian 12+), system-wide
|
|
145
|
+
> `pip install` is blocked by PEP 668. Use `pipx` or a virtual environment.
|
|
133
146
|
|
|
147
|
+
### Use
|
|
148
|
+
|
|
149
|
+
```bash
|
|
134
150
|
# Run a full scan
|
|
135
151
|
pybinaryguard scan
|
|
136
152
|
|
|
@@ -144,6 +160,15 @@ pybinaryguard scan --fast
|
|
|
144
160
|
pybinaryguard scan --deep
|
|
145
161
|
```
|
|
146
162
|
|
|
163
|
+
### Install from source (for development)
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
git clone https://github.com/po-nuvai/pybinaryguard.git
|
|
167
|
+
cd pybinaryguard
|
|
168
|
+
python -m venv .venv && source .venv/bin/activate
|
|
169
|
+
pip install -e ".[dev]"
|
|
170
|
+
```
|
|
171
|
+
|
|
147
172
|
---
|
|
148
173
|
|
|
149
174
|
## Features
|
|
@@ -813,7 +838,7 @@ pybinaryguard/
|
|
|
813
838
|
| |-- commands.py # Command handlers
|
|
814
839
|
| +-- formatters.py # Output formatting (table/json/minimal)
|
|
815
840
|
|
|
|
816
|
-
|-- tests/ #
|
|
841
|
+
|-- tests/ # 505 tests
|
|
817
842
|
|-- docs/ # Documentation
|
|
818
843
|
+-- examples/ # Usage examples
|
|
819
844
|
```
|
|
@@ -850,7 +875,7 @@ pybinaryguard/
|
|
|
850
875
|
## Testing
|
|
851
876
|
|
|
852
877
|
```bash
|
|
853
|
-
# Run all tests (
|
|
878
|
+
# Run all tests (505 tests)
|
|
854
879
|
python -m pytest tests/ -v
|
|
855
880
|
|
|
856
881
|
# Run with coverage
|
|
@@ -866,8 +891,14 @@ python -m pytest tests/test_agent_sdk.py -v # Agent SDK
|
|
|
866
891
|
|
|
867
892
|
## Author
|
|
868
893
|
|
|
869
|
-
**
|
|
870
|
-
Applied Research Scientist
|
|
894
|
+
**Pothihai Selvan** — [@po-nuvai](https://github.com/po-nuvai)
|
|
895
|
+
Applied Research Scientist at [Nuvai AI Solutions](https://nuvai.dev)
|
|
896
|
+
|
|
897
|
+
Built PyBinaryGuard to solve the bug that once cost him weeks of debugging on an NVIDIA Jetson TX2 — see the [Origin Story](#origin-story) at the top of this README for the full backstory.
|
|
898
|
+
|
|
899
|
+
- **GitHub:** [github.com/po-nuvai](https://github.com/po-nuvai)
|
|
900
|
+
- **Email:** [po@nuvai.dev](mailto:po@nuvai.dev)
|
|
901
|
+
- **Company:** [Nuvai AI Solutions](https://nuvai.dev) — Applied AI research and developer tooling
|
|
871
902
|
|
|
872
903
|
---
|
|
873
904
|
|
|
@@ -216,7 +216,7 @@ class TestFormatterOutput:
|
|
|
216
216
|
import json
|
|
217
217
|
data = json.loads(output)
|
|
218
218
|
assert "profile" in data
|
|
219
|
-
assert data["version"] == "1.0.
|
|
219
|
+
assert data["version"] == "1.0.2"
|
|
220
220
|
|
|
221
221
|
def test_json_formatter_format_check_no_findings(self) -> None:
|
|
222
222
|
from pybinaryguard.models.system import SystemProfile
|
|
@@ -48,7 +48,7 @@ def _finding(
|
|
|
48
48
|
def _make_profile(**kwargs: object) -> SystemProfile:
|
|
49
49
|
defaults = dict(
|
|
50
50
|
python_version=(3, 12, 0),
|
|
51
|
-
python_abi_tag="
|
|
51
|
+
python_abi_tag="cp312",
|
|
52
52
|
python_implementation="cpython",
|
|
53
53
|
python_executable="/usr/bin/python3",
|
|
54
54
|
os_name="Ubuntu",
|
|
@@ -42,7 +42,7 @@ def _make_profile(**kwargs: object) -> SystemProfile:
|
|
|
42
42
|
"""Create a SystemProfile with defaults that can be overridden."""
|
|
43
43
|
defaults = dict(
|
|
44
44
|
python_version=(3, 12, 0),
|
|
45
|
-
python_abi_tag="
|
|
45
|
+
python_abi_tag="cp312",
|
|
46
46
|
python_implementation="cpython",
|
|
47
47
|
python_executable="/usr/bin/python3",
|
|
48
48
|
stable_abi_supported=True,
|
|
@@ -211,7 +211,7 @@ class TestManylinuxTagViolationRule:
|
|
|
211
211
|
class TestPythonABIMismatchRule:
|
|
212
212
|
def test_finding_when_abi_mismatch(self) -> None:
|
|
213
213
|
rule = PythonABIMismatchRule()
|
|
214
|
-
profile = _make_profile(python_abi_tag="
|
|
214
|
+
profile = _make_profile(python_abi_tag="cp312")
|
|
215
215
|
pkg = _make_package(
|
|
216
216
|
package_name="scipy",
|
|
217
217
|
wheel_tags=[WheelTag("cp310", "cp310", "manylinux_2_17_x86_64")],
|
|
@@ -223,16 +223,16 @@ class TestPythonABIMismatchRule:
|
|
|
223
223
|
|
|
224
224
|
def test_no_finding_when_abi_matches(self) -> None:
|
|
225
225
|
rule = PythonABIMismatchRule()
|
|
226
|
-
profile = _make_profile(python_abi_tag="
|
|
226
|
+
profile = _make_profile(python_abi_tag="cp312")
|
|
227
227
|
pkg = _make_package(
|
|
228
|
-
wheel_tags=[WheelTag("cp312", "
|
|
228
|
+
wheel_tags=[WheelTag("cp312", "cp312", "manylinux_2_17_x86_64")],
|
|
229
229
|
)
|
|
230
230
|
findings = rule.evaluate(profile, [pkg])
|
|
231
231
|
assert len(findings) == 0
|
|
232
232
|
|
|
233
233
|
def test_skips_abi3_tags(self) -> None:
|
|
234
234
|
rule = PythonABIMismatchRule()
|
|
235
|
-
profile = _make_profile(python_abi_tag="
|
|
235
|
+
profile = _make_profile(python_abi_tag="cp312")
|
|
236
236
|
pkg = _make_package(
|
|
237
237
|
wheel_tags=[WheelTag("cp312", "abi3", "manylinux_2_17_x86_64")],
|
|
238
238
|
)
|
|
@@ -241,7 +241,7 @@ class TestPythonABIMismatchRule:
|
|
|
241
241
|
|
|
242
242
|
def test_skips_none_abi(self) -> None:
|
|
243
243
|
rule = PythonABIMismatchRule()
|
|
244
|
-
profile = _make_profile(python_abi_tag="
|
|
244
|
+
profile = _make_profile(python_abi_tag="cp312")
|
|
245
245
|
pkg = _make_package(
|
|
246
246
|
wheel_tags=[WheelTag("py3", "none", "any")],
|
|
247
247
|
)
|
|
@@ -250,7 +250,7 @@ class TestPythonABIMismatchRule:
|
|
|
250
250
|
|
|
251
251
|
def test_skips_pure_python(self) -> None:
|
|
252
252
|
rule = PythonABIMismatchRule()
|
|
253
|
-
profile = _make_profile(python_abi_tag="
|
|
253
|
+
profile = _make_profile(python_abi_tag="cp312")
|
|
254
254
|
pkg = _make_package(is_pure_python=True)
|
|
255
255
|
findings = rule.evaluate(profile, [pkg])
|
|
256
256
|
assert len(findings) == 0
|
|
@@ -32,7 +32,7 @@ class StubProbe:
|
|
|
32
32
|
def collect(self) -> Dict[str, Any]:
|
|
33
33
|
return {
|
|
34
34
|
"python_version": (3, 12, 0),
|
|
35
|
-
"python_abi_tag": "
|
|
35
|
+
"python_abi_tag": "cp312",
|
|
36
36
|
"python_implementation": "cpython",
|
|
37
37
|
"python_executable": "/usr/bin/python3",
|
|
38
38
|
"architecture": Architecture.X86_64,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/analyzers/dependency_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/board_profile_rules.py
RENAMED
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/container_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/dependency_rules.py
RENAMED
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/framework_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/predictive_rules.py
RENAMED
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/python_abi_rules.py
RENAMED
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/rules/builtin/source_build_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pybinaryguard-1.0.0 → pybinaryguard-1.0.2}/src/pybinaryguard/validators/import_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|