Skip to main content

Python bindings for Cymbal code indexing and symbol discovery

Project description

py-cymbal: Python Bindings for Cymbal

Python bindings for the Cymbal code indexing and symbol discovery tool, wrapping the standalone binaries via a clean Python API.

Overview

Cymbal is a Go-based tool that uses tree-sitter for multi-language AST parsing and SQLite for indexed storage, providing fast symbol search, cross-references, impact analysis, and scoped diffs. These Python bindings allow Python developers to programmatically access Cymbal's powerful code analysis capabilities.

Features

  • Repository Indexing: Index code repositories for fast symbol lookup
  • Symbol Search: Search for functions, classes, variables, and other symbols
  • Symbol Investigation: Get detailed information about specific symbols including definitions and references
  • Reference Finding: Find all references to a particular symbol
  • Multi-language Support: Works with all languages supported by Cymbal (via tree-sitter)
  • Clean Python API: Pythonic interface with context managers and convenience functions

Installation

Prerequisites

  1. Bash/Curl/Unzip: Used by the build script to download binaries.
  2. Cymbal: The Go library being wrapped

Building from Source

# Clone the repository
git clone <repository-url>
cd py-cymbal

# Download the Cymbal binaries and create the Python package
./build.sh

# Install in development mode
pip install -e .

Build Script

The build.sh script automates the entire build process:

  1. Downloads the appropriate pre-compiled Cymbal binaries for Linux, macOS, and Windows.
  2. Places the binaries in the python/cymbal/bin/ directory.
  3. Creates a setup.py for pip installation that bundles the correct binary for your platform.

Usage

Basic Example

import cymbal

# Create a Cymbal instance
with cymbal.Cymbal() as c:
    # Index a repository
    stats = c.index("/path/to/your/repository")
    print(f"Indexing result: {stats}")
    
    # Search for symbols
    results = c.search("handleAuth", limit=10)
    for symbol in results:
        print(f"{symbol['name']} ({symbol['kind']}) at {symbol['file']}:{symbol['start_line']}")
    
    # Investigate a specific symbol
    investigation = c.investigate("UserModel")
    print(f"Symbol: {investigation['symbol']['name']}")
    print(f"References: {len(investigation['refs'])}")
    
    # Find references to a symbol
    references = c.find_references("DatabaseConnection", limit=20)
    for ref in references:
        print(f"Reference at {ref['file']}:{ref['line']}")

Convenience Functions

import cymbal

# Index a repository (one-liner)
stats = cymbal.index_repository("/path/to/repo")

# Search with existing database path
results = cymbal.search_symbols("config", limit=15, db_path="/path/to/index.db")

# Investigate a symbol
investigation = cymbal.investigate_symbol("ApiClient", db_path="/path/to/index.db")

Advanced Usage

import cymbal

# Reuse an existing index
try:
    c = cymbal.Cymbal()
    c.db_path = "/path/to/existing/index.db"  # Set path to existing database
    
    # Perform searches
    results = c.search("test", limit=5)
    
    # Process results
    for symbol in results:
        print(f"Found: {symbol['name']} in {symbol['file']}")
        
except Exception as e:
    print(f"Error: {e}")
finally:
    c.close()

API Reference

cymbal.Cymbal Class

__init__(repo_path=None)

Create a new Cymbal instance. Optionally index a repository immediately.

index(repo_path)

Index a repository. Returns statistics about the indexing operation.

search(query, limit=20)

Search for symbols matching the query. Returns a list of symbol results.

investigate(symbol_name)

Investigate a specific symbol. Returns an investigation result with definition and references.

find_references(symbol_name, limit=50)

Find references to a symbol. Returns a list of reference results.

db_path (property)

Get or set the current database path.

close()

Close the Cymbal instance and release resources.

Convenience Functions

index_repository(repo_path)

Convenience function to index a repository.

search_symbols(query, limit=20, db_path=None)

Convenience function to search for symbols.

investigate_symbol(symbol_name, db_path=None)

Convenience function to investigate a symbol.

Architecture

The Python package uses a subprocess-based architecture to wrap the standalone Cymbal binaries:

  1. Pre-compiled Binaries: Downloaded directly from the upstream Cymbal releases.
  2. Subprocess Wrapper: The Python API executes the binary with the appropriate flags (e.g., --json) and parses the output.
  3. Python API Layer (python/cymbal/__init__.py): Pythonic wrapper that provides a clean, intuitive interface.

File Structure

py-cymbal/
├── python/              # Python bindings
│   └── cymbal/          # Python module
│       ├── __init__.py  # Python API layer
│       └── bin/         # Downloaded Cymbal binaries
├── examples/            # Usage examples
│   └── basic_usage.py  # Basic usage demonstration
├── build.sh            # Build automation script
├── setup.py            # pip installation configuration
└── README.md           # This file

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Acknowledgments

  • Cymbal for the excellent code indexing tool
  • gopy for making Go-Python bindings possible
  • tree-sitter for robust parsing of multiple languages

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

py_cymbal-0.1.19-cp311-cp311-win_amd64.whl (18.5 MB view details)

Uploaded CPython 3.11Windows x86-64

py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

py_cymbal-0.1.19-cp311-cp311-macosx_11_0_arm64.whl (12.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

py_cymbal-0.1.19-cp311-cp311-macosx_10_9_x86_64.whl (12.1 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file py_cymbal-0.1.19-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: py_cymbal-0.1.19-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 18.5 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for py_cymbal-0.1.19-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b9fc03022b7a7910edea94a41de85331a646ada50563303090f43019c9622c39
MD5 577728fc625957f08dba77a74eb51ff1
BLAKE2b-256 c1ecdfe61d738398b36be35529bed74e92b6168089f7ca98034689b5c212f4fd

See more details on using hashes here.

File details

Details for the file py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 ab539d62cdf205eef8c8c802e95ceb2e8ffe578b7330ea46a31e70de9fe447a1
MD5 0c9e1e6e2609399300f420fa48d1db73
BLAKE2b-256 be1bb7995c22b7b5f7716919f81a5e9a206539a837650961a66b0eb11deaad0c

See more details on using hashes here.

File details

Details for the file py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for py_cymbal-0.1.19-cp311-cp311-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 489908fff0ad89b6862f9eb163cc7ff9fde1ba2cff8c45fb487af2ce5fbd0efa
MD5 9289c4c2559f8a6784ab3220826afc64
BLAKE2b-256 10b036708cdea2df74b4fcdd2080bfef7394ad7d771d0f49418de1672d0accf1

See more details on using hashes here.

File details

Details for the file py_cymbal-0.1.19-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for py_cymbal-0.1.19-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 949c202b4c251161c8310533a68d77c875dd81cbc202ef4dfc73ccbf6cfd6b96
MD5 db0a53e6134661c9e05d9e423ac4d193
BLAKE2b-256 2dfa492b6b4f90bae9e656589d41363e81c7cf98303b72e3cf10e54015e6bf24

See more details on using hashes here.

File details

Details for the file py_cymbal-0.1.19-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for py_cymbal-0.1.19-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 efeb26baa689341b4c01609dd105a7bb1b5104cbc6a9637fe7cdad99bb947cd7
MD5 5b068c0633390f4dc9afb2477eb20dcc
BLAKE2b-256 223bceec3de16df6881e9bcbffaa445aa87a3896ad886f46d7af36a69dda99b2

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