A Python toolkit for static analysis, project understanding, and automated code insights.
Project description
ProjectIntel
Static analysis toolkit for Python codebases. ProjectIntel parses a project with the ast module, builds its dependency and call graphs, and reports on structural issues: circular imports, orphan files, dead code, and critical functions.
Contents
Features
- Recursive project scanning that skips
venv,__pycache__, and.git - Import resolution, separating local and external dependencies
- Circular dependency detection
- Orphan file detection (files not imported anywhere in the project)
- Project-wide function call graph
- Entry point detection (
if __name__ == "__main__":) - Execution flow tracing from each entry point
- Function criticality ranking, by in-degree/out-degree in the call graph
- Unused function detection
- Reporting to the terminal or via the Python API
Installation
Requires Python 3.10+.
pip install projectintel
The CLI script (run.py) is not part of the PyPI distribution. To use the CLI, clone the repository instead:
git clone https://github.com/Kishorestalin-AIML/ProjectIntel.git
cd ProjectIntel
pip install -e .
Usage
CLI
python run.py /path/to/your/project
Python API
from projectintel.scanner.project_scanner import ProjectScanner
from projectintel.analyzer.dependency import DependencyBuilder, ReverseDependency, CycleDetector, OrphanDetector
from projectintel.analyzer.semantic import SemanticAnalyzer
# 1. Scan the project structure
scanner = ProjectScanner("./my_project")
project = scanner.scan_project()
# 2. Dependency analysis
DependencyBuilder(project).build()
ReverseDependency(project).build()
CycleDetector(project).detect()
OrphanDetector(project).detect()
# 3. Semantic analysis (call graph, entry points, critical/unused functions)
SemanticAnalyzer(project).analyze()
# 4. Read the results
print(f"Total functions: {project.total_functions}")
print(f"Circular dependencies: {project.cycles}")
print(f"Orphan files: {project.orphan_files}")
for func, score in project.critical_functions[:5]:
print(f"{func}: {score}")
Architecture
Analysis runs in four phases:
| Phase | Name | Responsibility |
|---|---|---|
| 1 | Discovery | Recursively finds .py files; extracts classes, functions, and imports. |
| 2 | Dependency | Resolves imports; builds the file-level dependency graph; detects cycles and orphan files. |
| 3 | Semantics | Extracts function calls; builds the call graph; detects entry points and unused functions. |
| 4 | Intelligence | In progress. Graph visualization and HTML report generation. |
API Reference
ProjectScanner
Entry point for scanning a directory (Phase 1).
__init__(root_path: str)scan_project() -> ProjectMetadata
DependencyBuilder, ReverseDependency, CycleDetector, OrphanDetector
Phase 2 analyzers. Each takes a ProjectMetadata instance and writes into it.
| Class | Method | Populates |
|---|---|---|
DependencyBuilder |
build() |
dependency_graph |
ReverseDependency |
build() |
reverse_dependencies |
CycleDetector |
detect() |
cycles (requires dependency_graph) |
OrphanDetector |
detect() |
orphan_files (requires reverse_dependencies) |
SemanticAnalyzer
Runs the full Phase 3 pipeline in one call: CallGraphBuilder, ReverseCallGraph, EntryPointDetector, ExecutionFlow, CriticalFunctionAnalyzer, UnusedFunctionDetector.
__init__(project: ProjectMetadata)analyze()
ProjectMetadata (model)
| Attribute | Type | Description |
|---|---|---|
files |
List[FileMetadata] |
Metadata for every scanned file. |
dependency_graph |
Dict[str, List[str]] |
file -> [dependencies] |
reverse_dependencies |
Dict[str, List[str]] |
file -> [dependents] |
orphan_files |
List[str] |
Files not imported anywhere in the project. |
cycles |
List[List[str]] |
Files forming circular imports. |
call_graph |
Dict[str, List[str]] |
function -> [called_functions] |
critical_functions |
List[Tuple[str, int]] |
Functions ranked by call graph centrality. |
unused_functions |
List[str] |
Functions with no detected callers. |
total_files, total_classes, total_functions |
int |
Project-level counts. |
Output Examples
Cycle detection. If A.py imports B.py and B.py imports A.py:
# project.cycles
[['A.py', 'B.py', 'A.py']]
Critical functions. Scored by incoming_calls + outgoing_calls:
Auth.login Score: 8
Database.connect Score: 5
utils.hash_password Score: 3
Contributing
- Fork the repository.
- Create a feature branch:
git checkout -b feature/your-feature. - Commit your changes:
git commit -m 'Add your feature'. - Push the branch:
git push origin feature/your-feature. - Open a pull request.
License
MIT. See LICENSE.
Author
Kishore Stalin — GitHub
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file projectintel-1.0.2.tar.gz.
File metadata
- Download URL: projectintel-1.0.2.tar.gz
- Upload date:
- Size: 20.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd560891efe4984c190f7d96cd9aaca6d81660750c08fe7fe0d5ca1aacd3f576
|
|
| MD5 |
daa400307e3e5f4b34e90fb60bbd47d4
|
|
| BLAKE2b-256 |
013585991ffc5d7e92824167fbf119f629180f66223f1918e36e8c5a7cd31fb9
|
File details
Details for the file projectintel-1.0.2-py3-none-any.whl.
File metadata
- Download URL: projectintel-1.0.2-py3-none-any.whl
- Upload date:
- Size: 28.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bb2c0c977134f118ec606a7d2b67f8ff27170682caa36d35e2c135030cfc3d9
|
|
| MD5 |
370165e008a158786c6f856a4cecc252
|
|
| BLAKE2b-256 |
f9a2b5e3539d033b57ac73e850c296e99d25dc84932bf5178839b9e4f5be8301
|