Skip to main content

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

  1. Discovery: Recursively finds all Python files in the specified directory
  2. Parsing: Uses AST to parse each file and extract function definitions and calls
  3. Analysis: Compares defined functions against called functions
  4. 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.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Documentation

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 ast module
  • Inspired by the need for better code quality tools

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

pyan_unused_functions-0.1.1.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

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

pyan_unused_functions-0.1.1-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

Details for the file pyan_unused_functions-0.1.1.tar.gz.

File metadata

  • Download URL: pyan_unused_functions-0.1.1.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for pyan_unused_functions-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b058a82410fecf32f66d58de6fb91015ddddff71e28e47525702d9a6d967ae7b
MD5 de6c482a52c4ad8c1c13bc4e4fab4a75
BLAKE2b-256 dcb386b83768a3f6df80824b6ddbd802818c0f9eec8d50ae75ead5bb525fd985

See more details on using hashes here.

File details

Details for the file pyan_unused_functions-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pyan_unused_functions-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dafa676f5d5b758a76322d188b974254b59ac927db6db8954075dda980d67656
MD5 70f119ea9fcbba6f5182ed634410a979
BLAKE2b-256 12e6833db15f854b69e2d56f57a6b583a6f8f46078543916010f2e485848ff78

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