depdetect API Reference¶
Auto-generated API reference for the depdetect module.
depdetect
¶
Dependency detection and verification — zero dependencies, stdlib only, Python 3.10+.
Part of zerodep: https://github.com/Oaklight/zerodep Copyright (c) 2026 Peng Ding. MIT License.
Parse dependency information from Python source code, requirements files, and free-text compatibility strings. Verify that binaries, Python packages, and environment variables are present on the current system.
Analyze imports in Python source::
from depdetect import parse_imports, analyze_source
# Raw import names (third-party only, stdlib filtered out)
imports = parse_imports("import requests\nimport os\n")
# → {"requests"}
# Resolved to pip-installable names
pip_names = analyze_source("import yaml\nimport PIL\n")
# → {"pyyaml", "pillow"}
Check system dependencies::
from depdetect import check_binary, check_python_package, get_binary_version
path = check_binary("git") # "/usr/bin/git" or None
ver = get_binary_version("git") # "2.43.0" or None
ok = check_python_package("requests") # True / False
Parse and verify requirements::
from depdetect import parse_requirements, check_requirements
reqs = parse_requirements("requests>=2.28\npillow>=10.0\n")
report = check_requirements(reqs)
print(report.summary())
Requires Python 3.10+.
DepdetectError
¶
Requirement
dataclass
¶
A parsed dependency requirement.
Attributes:
| Name | Type | Description |
|---|---|---|
name |
str
|
Package or binary name. |
category |
str
|
One of |
op |
str | None
|
Version comparison operator ( |
version |
str | None
|
Required version string, or |
extras |
str | None
|
Extras specifier for Python packages (e.g. |
Source code in depdetect/depdetect.py
DependencyStatus
dataclass
¶
Result of checking a single dependency.
Attributes:
| Name | Type | Description |
|---|---|---|
name |
str
|
Dependency name. |
category |
str
|
One of |
required |
str | None
|
Version constraint string (e.g. |
found |
bool
|
Whether the dependency was found. |
found_version |
str | None
|
Detected version string, or |
path |
str | None
|
Binary path for |
message |
str
|
Human-readable status description. |
Source code in depdetect/depdetect.py
DependencyReport
dataclass
¶
Aggregated results for multiple dependency checks.
Attributes:
| Name | Type | Description |
|---|---|---|
dependencies |
list[DependencyStatus]
|
List of individual dependency check results. |
Source code in depdetect/depdetect.py
satisfied
property
¶
Whether all dependencies are found and version-compatible.
missing
property
¶
Dependencies that were not found or version-incompatible.
summary()
¶
Human-readable summary of all dependency checks.
Source code in depdetect/depdetect.py
parse_imports(source, *, file_path=None)
¶
Extract third-party import names from Python source code.
Parses the source with :mod:ast and collects all import and
from ... import statements. Standard library modules (detected
via sys.stdlib_module_names) are filtered out, and only top-level
package names are returned.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
str
|
Python source code string. |
required |
file_path
|
str | None
|
Optional file path for error messages. |
None
|
Returns:
| Type | Description |
|---|---|
set[str]
|
Set of top-level third-party package names (import names, not |
set[str]
|
pip names). Use :func: |
Raises:
| Type | Description |
|---|---|
DepdetectError
|
If the source cannot be parsed. |
Example::
parse_imports("import requests\nfrom os.path import join\n")
# → {"requests"}
Source code in depdetect/depdetect.py
parse_requirements(text)
¶
Parse pip requirements.txt format into :class:Requirement objects.
Handles version constraints (>=, ==, ~=, etc.), extras
(package[extra]), comments, blank lines, and skips -r/-e
directives.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
Contents of a requirements.txt file. |
required |
Returns:
| Type | Description |
|---|---|
list[Requirement]
|
List of parsed requirements with |
Example::
parse_requirements("requests>=2.28.0\npillow>=10.0\n")
# → [Requirement("requests", "python", ">=", "2.28.0"),
# Requirement("pillow", "python", ">=", "10.0")]
Source code in depdetect/depdetect.py
parse_compatibility(text)
¶
Parse free-text compatibility notes into structured requirements.
Best-effort extraction from strings like
"Python 3.10+, Node.js >= 18, pandoc >= 3.0". Noise words
("or", "and", "requires", etc.) are filtered out.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
Compatibility string (typically from SKILL.md frontmatter). |
required |
Returns:
| Type | Description |
|---|---|
list[Requirement]
|
List of parsed requirements. May be incomplete for ambiguous input. |
Example::
parse_compatibility("Python 3.10+, pandoc >= 3.0")
# → [Requirement("Python", "runtime", ">=", "3.10"),
# Requirement("pandoc", "binary", ">=", "3.0")]
Source code in depdetect/depdetect.py
parse_tool_hints(allowed_tools)
¶
Extract binary name hints from an allowed-tools string.
Parses parenthesized parameters like Bash(git:* npm:*) to extract
["git", "npm"] as binaries the skill expects to use via the shell.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
allowed_tools
|
str
|
The |
required |
Returns:
| Type | Description |
|---|---|
list[str]
|
List of binary names found in tool parameters. |
Example::
parse_tool_hints("Bash(git:* docker:*) Read Write")
# → ["git", "docker"]
Source code in depdetect/depdetect.py
resolve_pip_name(import_name)
¶
Resolve a Python import name to its pip distribution name.
Uses a three-level fallback strategy:
- Installed metadata — queries
importlib.metadatafor the exact mapping from installed packages (cached after first call). - Static mapping — covers ~30 high-frequency mismatches
(e.g.
PIL→pillow,yaml→pyyaml). - Heuristic — replaces underscores with hyphens, which covers the majority of conventional packages.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
import_name
|
str
|
The name used in |
required |
Returns:
| Type | Description |
|---|---|
str
|
The pip-installable package name. |
Example::
resolve_pip_name("PIL") # → "pillow"
resolve_pip_name("yaml") # → "pyyaml"
resolve_pip_name("dotenv") # → "python-dotenv"
Source code in depdetect/depdetect.py
check_binary(name)
¶
Check if a binary is available on the system PATH.
Resolves aliases (e.g. "node.js" → "node") and returns
the first matching path. Uses :func:shutil.which which handles
Windows PATHEXT automatically.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Binary name or alias. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Absolute path to the binary, or |
Source code in depdetect/depdetect.py
check_python_package(name)
¶
Check if a Python package is importable in the current environment.
Uses :func:importlib.util.find_spec to check availability without
triggering the actual import. Handles pip-to-import name mapping
(e.g. "pillow" → "PIL").
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Package name (pip distribution name or import name). |
required |
Returns:
| Type | Description |
|---|---|
bool
|
|
Source code in depdetect/depdetect.py
check_env_var(name)
¶
Check if an environment variable is set and non-empty.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Environment variable name. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
|
Source code in depdetect/depdetect.py
get_binary_version(name)
¶
Get the version string of an installed binary.
Runs the binary with --version (or an appropriate flag) and
extracts a dotted version number from the output.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Binary name or alias. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Version string (e.g. |
str | None
|
is not found or the version cannot be determined. |
Source code in depdetect/depdetect.py
check_requirements(requirements)
¶
Check a list of requirements against the current system.
Dispatches each requirement to the appropriate detection function
based on its :attr:~Requirement.category, performs version comparison
if a constraint is specified, and aggregates results into a report.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
requirements
|
list[Requirement]
|
List of requirements to check. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
A |
DependencyReport
|
class: |
DependencyReport
|
per requirement. |
Example::
reqs = [
Requirement("git", "binary"),
Requirement("requests", "python", ">=", "2.28"),
]
report = check_requirements(reqs)
if not report.satisfied:
print(report.summary())
Source code in depdetect/depdetect.py
analyze_source(source, *, file_path=None)
¶
Analyze Python source code for third-party dependencies.
Combines :func:parse_imports (AST-based import extraction) with
:func:resolve_pip_name (import→pip name resolution) to produce
a set of pip-installable package names.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
str
|
Python source code string. |
required |
file_path
|
str | None
|
Optional path for error messages. |
None
|
Returns:
| Type | Description |
|---|---|
set[str]
|
Set of pip-installable package names. |
Raises:
| Type | Description |
|---|---|
DepdetectError
|
If the source cannot be parsed. |
Example::
analyze_source("import yaml\nfrom PIL import Image\n")
# → {"pyyaml", "pillow"}