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

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-1.0.1.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

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

projectintel-1.0.1-py3-none-any.whl (28.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: projectintel-1.0.1.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

Hashes for projectintel-1.0.1.tar.gz
Algorithm Hash digest
SHA256 e898feb46ad45d79065805c286e32c18f3f940d918b05f1bead1e54e07d19e2c
MD5 8d1d6dd011f1fc8854edef9d9225dbf1
BLAKE2b-256 dbb3c1976d07691088e9f05a1e1e015d4e06ea2cbf3458508f8d0812ad649418

See more details on using hashes here.

File details

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

File metadata

  • Download URL: projectintel-1.0.1-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

Hashes for projectintel-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8811a6aef1fa316b9a3049bd0fb95e26eb1220ab8dae2c6f009e061e83f9b032
MD5 4f43f1659af0e8fe9d4f4a8fadb6b0a3
BLAKE2b-256 6f0501e55ea0743bc162b33da555005655829a2423fd10078fe817662157d818

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