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-0.1.5.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-0.1.5-py3-none-any.whl (28.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: projectintel-0.1.5.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-0.1.5.tar.gz
Algorithm Hash digest
SHA256 4633fdcd5ab76f764765b4851bdaba7bd7b4bf5a26be93dbf2540cf35a39e355
MD5 3cbd189dd220e7bfc7dae6a28a039d74
BLAKE2b-256 edb0df72e78e25f66ddf598c5aae029ff32eca12855e9feef582d086eb1034a7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: projectintel-0.1.5-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-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 eeeac6ee7db6265289f385a52288ef661fe9fbb15eb92c0f4b30d754a18369dc
MD5 29c7c0c39a7f4c81a9f662757e2a2661
BLAKE2b-256 8af1f5112d418259d65f8a19fc42791acb64a0cd167c084aa7a0020cdc618e0d

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