Skip to main content

A Python toolkit for static analysis, project understanding, and automated code insights.

Project description

ProjectIntel

Python Version License: MIT PyPI Version PyPI Downloads

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

Roadmap

  • Phase 4: export graphs to Graphviz (DOT) and interactive HTML
  • Framework-specific entry point detection (FastAPI, Flask, Django)
  • Call resolution using PEP 484 type hints
  • Cyclomatic complexity (McCabe) per function

Contributing

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature/your-feature.
  3. Commit your changes: git commit -m 'Add your feature'.
  4. Push the branch: git push origin feature/your-feature.
  5. Open a pull request.

License

MIT. See LICENSE.

Author

Kishore Stalin — GitHub

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

projectintel-0.1.4.tar.gz (20.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

projectintel-0.1.4-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

Details for the file projectintel-0.1.4.tar.gz.

File metadata

  • Download URL: projectintel-0.1.4.tar.gz
  • Upload date:
  • Size: 20.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for projectintel-0.1.4.tar.gz
Algorithm Hash digest
SHA256 139202834795e8c1bead46623dc717627ab21db15056bd8906058e637c39ab83
MD5 539d05c2d319a2618750d2b4b9d1019d
BLAKE2b-256 cbcdbc72a509dff06abf5582f8c5560817fc0a8138b1cbcc1ed6f52a8beb8222

See more details on using hashes here.

File details

Details for the file projectintel-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: projectintel-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 28.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for projectintel-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 802095f657f80dd52cd255055cd14790abec9eb47cee4a4e9853ebb29a053b6b
MD5 9363101e5164978ad86f10bfbf042ce4
BLAKE2b-256 b9ef099f9102119e6c80b3821d3165483db5437adcbd7767f677bdd493c62d5d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page