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.
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 asslow)
Development
Building and Testing
# Use Makefile targets
make help # Show all available targets
make all # Install deps, install pre-commit, run checks, and build
make check # Run linting, formatting, and fast tests
make ci # Run full CI checks with coverage
make pre-commit-install # Install pre-commit hooks
make pre-commit-run # Run pre-commit on all files
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
Pre-commit Hooks
This project uses pre-commit hooks to ensure code quality. The hooks automatically run:
- Code linting and formatting with Ruff
- Trailing whitespace removal
- End-of-file fixes
- YAML and TOML validation
- Tests
To set up pre-commit hooks:
# Install and activate pre-commit hooks
make pre-commit-install
# Run pre-commit on all files manually
make pre-commit-run
Once installed, the hooks will run automatically on every commit. If any hook fails, the commit will be rejected until the issues are fixed.
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
- Fork the repository
- Create a feature branch
- Add tests for your changes
- Run the test suite:
pytest tests/ -v - Run linting:
make lintorruff check src/ tests/ - Format code:
make formatorruff format src/ tests/ - 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 pushesrelease.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
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 bibspire-1.1.2.tar.gz.
File metadata
- Download URL: bibspire-1.1.2.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82039e8269e4267b6d4e83abd2f04e44930a762d395f1ba7e625ab2b502e4811
|
|
| MD5 |
ed67ec8af3630f41f295aa0eef27b46c
|
|
| BLAKE2b-256 |
feb0eae4d7c7f1dd980d1c9712d5aa768bf96ddc40a18087c2aecce3e12a115c
|
File details
Details for the file bibspire-1.1.2-py3-none-any.whl.
File metadata
- Download URL: bibspire-1.1.2-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f13ac1c65504442686f33d438d9522ee9aee6b873b410fb1bb234cd988bd8927
|
|
| MD5 |
3c082363a7c5283e821e57924c6ff81c
|
|
| BLAKE2b-256 |
8e5834b60f191a04a9152d4025d2339df7dff32bbaaf1c7605ffd349daf472d7
|