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.0.tar.gz (20.6 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.0-py3-none-any.whl (28.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: projectintel-1.0.0.tar.gz
  • Upload date:
  • Size: 20.6 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.0.tar.gz
Algorithm Hash digest
SHA256 9f5993b084a723e13465dfa52d629afcf207ce96edc41d3132f6ba59bef2f24f
MD5 b5d6647075f2381e1add2e9c90747357
BLAKE2b-256 614d478e8c1a11f5bb5f8af572d665ee7b208542666a69e1f728ee012768f1b9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: projectintel-1.0.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 38b9024c582ce2d7451e35e1c01e6dd1e91248a510d6baf67e4e73f0c2b99a42
MD5 1916bcbab7d3c938223d68a9393b0f8a
BLAKE2b-256 a30a5380fe439c5b6c4a76a2f7e465db865858f6e37bb5f119fa2cb233253b38

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