Find unused functions in Python codebases - perfect for CLI usage and CI/CD pipelines
Project description
pyan-unused-functions
A Python static analysis tool to find unused functions in your codebase using AST (Abstract Syntax Tree) parsing. Perfect for CLI usage and CI/CD pipelines with GitHub Actions.
Features
- 🔍 Accurate Detection: Uses Python's built-in AST module for reliable parsing
- 🚀 Fast Analysis: Efficiently scans entire codebases
- 📊 Detailed Reports: Shows all defined functions and their usage
- 🎯 Smart Filtering: Automatically skips private functions (starting with
_) - 🔄 Class-Aware: Handles both module-level functions and class methods
- ⚡ Async Support: Recognizes async functions and methods
- 🤖 CI/CD Ready: Easy integration with GitHub Actions and other CI systems
- 🛠️ Lightweight: Minimal dependencies (requires pyan3 for enhanced analysis)
Installation
Install from PyPI:
pip install pyan-unused-functions
This will automatically install the required dependency: pyan3==1.1.1
Or install from source:
git clone https://github.com/yourusername/pyan-unused-functions.git
cd pyan-unused-functions
pip install -e .
Usage
💡 Quick Start: Check the
examples/directory for ready-to-use GitHub Actions workflows and Git hooks!
Command Line
Analyze a directory:
pyan-unused-functions /path/to/your/code
Analyze current directory:
pyan-unused-functions .
As a Python Module
from pathlib import Path
from pyan_unused_functions import analyze_codebase, find_unused_functions
# Analyze a codebase
root_path = Path("./my_project")
defined_functions, called_functions = analyze_codebase(root_path)
# Find unused functions
unused = find_unused_functions(defined_functions, called_functions)
print(f"Found {len(unused)} unused functions:")
for func in sorted(unused):
print(f" {func}")
Example Output
Analyzing Python code in: ./my_project
Analyzing 45 Python files...
=== Analysis Results ===
Total functions defined: 127
Total function calls found: 98
Potentially unused functions: 12
=== Potentially Unused Functions ===
module_a.helper_function
module_b.old_implementation
utils.deprecated_method
...
Note: This analysis may have false positives for:
- Functions called dynamically (getattr, exec, etc.)
- Functions used in decorators or metaclasses
- Functions called from other modules not analyzed
- Entry points, CLI commands, or framework callbacks
How It Works
- Discovery: Recursively finds all Python files in the specified directory
- Parsing: Uses AST to parse each file and extract function definitions and calls
- Analysis: Compares defined functions against called functions
- Reporting: Identifies functions that are defined but never called
Limitations
This tool provides static analysis and may report false positives in the following cases:
- Dynamic calls: Functions invoked via
getattr(),exec(),eval(), etc. - Decorator usage: Functions used as decorators or in metaclasses
- External calls: Functions called from modules outside the analyzed directory
- Framework callbacks: Entry points, CLI commands, or framework-specific callbacks
- String-based invocation: Functions referenced by name strings
Always review the results and verify before removing any function!
GitHub Actions Integration
Basic Workflow
Create .github/workflows/check-unused-functions.yml:
name: Check Unused Functions
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install pyan-unused-functions
run: pip install pyan-unused-functions
- name: Check for unused functions
run: pyan-unused-functions .
Advanced Workflow with Failure on Unused Functions
name: Code Quality Check
on: [push, pull_request]
jobs:
check-unused-functions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install pyan-unused-functions
run: pip install pyan-unused-functions
- name: Analyze codebase
id: analyze
run: |
OUTPUT=$(pyan-unused-functions . 2>&1)
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "Potentially unused functions: 0" || exit 1
continue-on-error: false
- name: Comment on PR (if unused functions found)
if: failure() && github.event_name == 'pull_request'
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '⚠️ Unused functions detected! Please review the workflow logs.'
})
Multi-Project Workflow
name: Check Multiple Projects
on: [push]
jobs:
analyze:
runs-on: ubuntu-latest
strategy:
matrix:
directory: ['./backend', './frontend-utils', './scripts']
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install pyan-unused-functions
run: pip install pyan-unused-functions
- name: Check ${{ matrix.directory }}
run: pyan-unused-functions ${{ matrix.directory }}
📖 More Examples: See
examples/for more GitHub Actions workflows including:
- Strict mode (fail on unused functions)
- Scheduled weekly checks with issue creation
- Multi-project/monorepo setups
- Pre-commit Git hooks
Configuration
The tool automatically skips common directories:
.venv,venv(virtual environments)__pycache__(Python cache).git(version control)node_modules(JavaScript dependencies).pytest_cache(pytest cache)
CI/CD Best Practices
Recommended Usage
- Pre-commit hooks: Run as a pre-commit check
- Pull request checks: Automatically analyze PRs
- Scheduled scans: Weekly cron jobs to catch accumulating unused code
- Release gates: Ensure no unused functions before releases
Exit Codes
The tool returns:
0- Success (analysis completed)1- Error (invalid path, no files found, etc.)
Note: The tool doesn't fail on finding unused functions by default. Wrap with custom logic to enforce policies.
Development
Setup Development Environment
git clone https://github.com/yourusername/pyan-unused-functions.git
cd pyan-unused-functions
pip install -e .
Build Package
python -m build
Local Testing
# Test on your own codebase
pyan-unused-functions ./your-project
# Test on current directory
pyan-unused-functions .
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Documentation
- CLI Usage Guide - Complete command-line reference
- Examples Directory - Ready-to-use GitHub Actions workflows and Git hooks
- Publishing Guide - How to publish to PyPI
License
This project is licensed under the MIT License - see the LICENSE file for details.
Changelog
Version 0.1.0 (Initial Release)
- Basic unused function detection
- AST-based parsing
- Command-line interface
- Class method support
- Async function support
Author
mhs - mohammedhs404@gmail.com
Acknowledgments
- Built with Python's
astmodule - Inspired by the need for better code quality tools
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 pyan_unused_functions-0.1.0.tar.gz.
File metadata
- Download URL: pyan_unused_functions-0.1.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ae928e0fd3a4d9833c15d625d827fc8e069b73a7db72511433f44a51c8c3f09
|
|
| MD5 |
faec4f865987b0c77e930894f9e68eeb
|
|
| BLAKE2b-256 |
9b9b2f35230f31ad5f9c8648c89ace13df7c7ce580383c91f415a2d655fb07cd
|
File details
Details for the file pyan_unused_functions-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyan_unused_functions-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a68488aadd842a5f256e7dd70d41d27272032ac1771f8af741b365cdd0a375e
|
|
| MD5 |
a9fdeafbb8cc685a0a26c74e9807aa46
|
|
| BLAKE2b-256 |
6cf247278d798967da5de5a8f15b9966e87148324a67c9b8d573b109e9c41fdd
|