Skip to main content

A tool to update .bib entries with INSPIRE-HEP citations

Project description

BibSpire

A Python tool to update .bib file entries with INSPIRE-HEP citations while preserving reference keys.

Tests Python License Coverage

Overview

BibSpire reads a .bib file, searches each entry on inspire-hep.net, and replaces the entries with the official INSPIRE citations while keeping the same reference keys. This ensures your bibliography has the most accurate and complete citation information from INSPIRE-HEP.

Features

  • Automatic INSPIRE Search: Searches INSPIRE-HEP for each bibliography entry
  • Key Preservation: Keeps original reference keys while updating content
  • Multiple Search Strategies: Uses title, author, eprint, and DOI for matching
  • Robust Parsing: Handles complex BibTeX formats with nested braces
  • Error Handling: Gracefully handles missing entries and API errors
  • Rate Limiting: Configurable delays between API requests
  • Code Quality: Enforced with Ruff linting and formatting
  • Comprehensive Testing: Full test suite with unit and integration tests

Installation

From PyPI (Recommended)

pip install bibspire

From Source (Development)

# Clone the repository
git clone https://github.com/lorenzennio/bibspire.git
cd bibspire

# Install in development mode with dev dependencies
pip install -e ".[dev]"

From Built Package

# Build and install
python -m build
pip install dist/bibspire-1.0.0-py3-none-any.whl

Usage

Command Line Interface

# Basic usage - update file in place
bibspire input.bib

# Save to different file
bibspire input.bib -o output.bib

# Verbose output
bibspire input.bib -v

# Custom delay between API requests
bibspire input.bib -d 2.0

# Show help
bibspire --help

Run as Python Module

python -m bibspire input.bib -o output.bib -v

Programmatic Usage

from bibspire import BibSpire, BibParser

# Create BibSpire instance
bibspire = BibSpire(delay=1.0, verbose=True)

# Update a bibliography file
bibspire.update_bib_file("input.bib", "output.bib")

# Or work with entries directly
entries = BibParser.parse_bib_file("input.bib")
updated_entries = bibspire.update_entries(entries)

Testing

The project includes a comprehensive test suite:

# Run fast unit and integration tests
pytest tests/ -v -m "not slow"

# Run all tests including slow real API tests
pytest tests/ -v

# Run only slow tests (real API calls)
pytest tests/ -v -m "slow"

# Run tests with coverage
pytest tests/ --cov=bibspire --cov-report=html

Test Categories

  • Unit Tests (test_core.py, test_cli.py): Fast tests with mocked dependencies
  • Integration Tests (test_integration.py): Tests with mocked HTTP responses
  • Slow Tests (test_slow.py): Real API calls to INSPIRE-HEP (marked as slow)

Development

Building and Testing

# Use Makefile targets
make help                   # Show all available targets
make all                    # Install deps, run checks, and build
make check                  # Run linting, formatting, and fast tests
make ci                     # Run full CI checks with coverage
make all                    # Install deps, run checks, and build
make test                   # Run fast tests only
make test-cov               # Run fast tests with coverage
make lint                   # Run linting
make format                 # Format code

# Manual commands
pip install -e ".[dev]"    # Install with dev dependencies
pytest tests/ -v           # Run tests
pytest tests/ -v --cov=bibspire  # Run tests with coverage
ruff check src/ tests/     # Run linting
ruff format src/ tests/    # Format code
python -m build            # Build package

Publishing

Manual Publishing

# Install twine for uploading
pip install twine

# Check package integrity
twine check dist/*

# Upload to PyPI (requires account and authentication)
python -m twine upload dist/*

Automatic Publishing

The package is automatically published to PyPI when a new version tag is pushed:

git tag v1.0.1
git push origin v1.0.1

This triggers the release workflow which:

  • Builds the package
  • Checks package integrity
  • Publishes to PyPI
  • Creates a GitHub release

Project Structure

bibspire/
├── .github/workflows/         # CI/CD workflows
├── src/bibspire/              # Main package
│   ├── __init__.py           # Package exports
│   ├── __main__.py           # Module entry point
│   ├── cli.py                # Command-line interface
│   └── core.py               # Core functionality
├── tests/                     # Test suite
│   ├── conftest.py           # Test fixtures
│   ├── test_core.py          # Core functionality tests
│   ├── test_cli.py           # CLI tests
│   ├── test_integration.py   # Integration tests
│   └── test_slow.py          # Slow API tests
├── pyproject.toml            # Package configuration
├── Makefile                  # Development commands
└── README.md                 # This file

Example

Given an input .bib file:

@article{mykey2023,
  title = {Observation of a new particle in the search for the Standard Model Higgs boson},
  author = {Aad, G. and others},
  year = {2012}
}

BibSpire will search INSPIRE, find the official record, and replace it with:

@article{mykey2023,
  author = {Aad, Georges and others},
  collaboration = {ATLAS},
  title = {{Observation of a new particle in the search for the Standard Model Higgs boson with the ATLAS detector at the LHC}},
  eprint = {1207.7214},
  archivePrefix = {arXiv},
  primaryClass = {hep-ex},
  doi = {10.1016/j.physletb.2012.08.020},
  journal = {Phys. Lett. B},
  volume = {716},
  pages = {1--29},
  year = {2012}
}

Note how the reference key mykey2023 is preserved while all other fields are updated with official INSPIRE data.

Dependencies

  • Python ≥ 3.8
  • requests ≥ 2.25.0

Development Dependencies

  • pytest ≥ 6.0.0
  • pytest-mock ≥ 3.6.0
  • responses ≥ 0.21.0
  • ruff ≥ 0.1.0 (linting and formatting)
  • build ≥ 0.8.0 (package building)

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for your changes
  4. Run the test suite: pytest tests/ -v
  5. Run linting: make lint or ruff check src/ tests/
  6. Format code: make format or ruff format src/ tests/
  7. Submit a pull request

Code Quality

This project uses Ruff for linting and code formatting. The configuration includes:

  • Linting: Enforces Python best practices, code style, and catches common errors
  • Formatting: Consistent code style with 88-character line length
  • Import sorting: Automatic import organization and cleanup
  • Type checking: Basic type hint validation

Run make check to run all quality checks before submitting changes.

Continuous Integration

This project uses GitHub Actions for automated testing and quality assurance:

CI Workflow

  • Linting: Ruff checks for code quality and style
  • Multi-Python Testing: Tests run on Python 3.8-3.12
  • Coverage: Code coverage reporting with Codecov integration
  • Integration Tests: Slow tests run on main branch and when labeled
  • Package Building: Validates package can be built locally

Workflows

  • ci.yml: Main CI pipeline for PRs and pushes
  • release.yml: Automated publishing on version tags

Quality Gates

All PRs must pass:

  • Ruff linting (no violations)
  • Code formatting check
  • Test suite (35+ tests)
  • Package build validation

To trigger slow integration tests, add the run-slow-tests label to your PR.

License

MIT License - see LICENSE file for details.

Troubleshooting

Command Not Found

If bibspire command is not found:

# Use full path or activate virtual environment
/path/to/venv/bin/bibspire input.bib

# Or run as module
python -m bibspire input.bib

API Rate Limiting

If you encounter rate limiting:

# Increase delay between requests
bibspire input.bib -d 2.0

Test Failures

If tests fail:

# Check dependencies
pip install -e ".[test]"

# Run specific test
pytest tests/test_core.py::TestBibEntry::test_init -v

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

bibspire-1.1.1.tar.gz (20.5 kB view details)

Uploaded Source

Built Distribution

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

bibspire-1.1.1-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file bibspire-1.1.1.tar.gz.

File metadata

  • Download URL: bibspire-1.1.1.tar.gz
  • Upload date:
  • Size: 20.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bibspire-1.1.1.tar.gz
Algorithm Hash digest
SHA256 4567f174f7f33d150593d2aae4ddaaa058338ef5b326007118fc82ce79dacea2
MD5 69f68ece65d255da9946f1c0ef759ca5
BLAKE2b-256 8a0f10017bb9668376519ba9797e88a564c095e67c9d53ca3a319867498dad18

See more details on using hashes here.

File details

Details for the file bibspire-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: bibspire-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bibspire-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c738c722b54a5b63a21cba3e077e20ff7a3596ccce6b71809cb4a25c4f1dc096
MD5 baf87ea062402583ec5b4b0589131c2d
BLAKE2b-256 bebd17c5e70ed712814c564b348b5f4dc65550b84cc530a223ada880e45a4499

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