A comprehensive Python client library for interacting with the LNPI Grid API, providing type-safe, intuitive access to research studies, medical imaging data, and workflow management.
- 🚀 Type-safe interactions with all Grid API endpoints
- 🏗️ Intuitive resource management with proper abstractions
- 📊 Comprehensive CRUD operations for all data models
- 🔍 Advanced querying and filtering capabilities
- 🔐 Robust authentication handling
- ⚡ Async support for high-performance applications
- 📚 Excellent developer experience with proper error handling
pip install lnpi_gridapigit clone https://github.com/kelvinlim/gridapi.git
cd gridapi
pip install -e .# For CLI functionality
pip install lnpi_gridapi[cli]
# For async support
pip install lnpi_gridapi[async]
# For development
pip install lnpi_gridapi[dev]
# All features
pip install lnpi_gridapi[all]For users who don't want to install Python:
- Download: Get the pre-built executable from releases
- Windows:
gridapi-windows.exe - macOS:
gridapi-macos - Linux:
gridapi-linux
- Windows:
- Configure: Create a
grid_tokenfile with your API credentials - Run: Execute the executable directly from command line
See WINDOWS_BUILD.md for detailed instructions on building cross-platform executables. See DEPLOYMENT.md for information about automated releases and deployment.
Download the latest release from GitHub Releases:
- Windows:
gridapi-windows.exe - macOS:
gridapi-macos - Linux:
gridapi-linux
Releases are automatically created when version tags are pushed:
git tag v1.0.0
git push origin v1.0.0This triggers GitHub Actions to:
- Build executables for all platforms
- Create a GitHub release with downloadable assets
- Generate checksums for verification
Create a grid_token file in your project directory (or place a ~/.grid_token file in your home directory to act as a global default):
grid_token=your-api-token-here
base_url=https://api.grid.example.com
Then use it in your code:
from pathlib import Path
from gridapi import GridAPIClient
# Load config from grid_token file
config_path = Path("grid_token")
config = {}
if config_path.exists():
with open(config_path, 'r') as f:
for line in f:
if '=' in line:
key, value = line.strip().split('=', 1)
config[key] = value
# Initialize client
client = GridAPIClient(
base_url=config.get('base_url', 'https://api.grid.example.com'),
token=config.get('grid_token')
)
# Create a study
study = client.grid.studies.create({
"description": "Clinical Trial Study",
"investigator": "Dr. Jane Smith",
"status": 1
})
# List studies with filtering
studies = client.grid.studies.list(
investigator="Dr. Smith",
status=1
)
# Access nested resources
events = client.grid.studies(study.id).events.list()- Studies: Research study management
- Datatypes: Data type definitions
- Subjects: Study participants
- Events: Study events and details
- Procedures: Study procedures
- Acquisitions: Image acquisition data
- Actions: Image processing actions
- Scanner Types: Scanner configurations
- Raw Data: Raw image data management
- Measures: Study measures
- Participants: Workflow participants
# Advanced querying
studies = client.grid.studies.list(
search="clinical trial",
ordering="-created_at",
status__gte=1
)
# Nested resource operations
subject = client.grid.studies(123).subjects(456).get()
contacts = client.grid.studies(123).subjects(456).contacts.list()import asyncio
from gridapi import AsyncGridAPIClient
async def main():
client = AsyncGridAPIClient(
base_url="https://api.grid.example.com",
token="your-api-token"
)
studies = await client.grid.studies.list()
return studies
# Run async code
studies = asyncio.run(main())Check out the examples directory for comprehensive usage examples:
examples/simple_example.py- Basic usage with grid_token fileexamples/basic_usage.py- Common operations and patternsexamples/advanced_usage.py- Complex queries and advanced featuresexamples/cli_usage.py- Command-line interface examplesexamples/event_details_example.py- Event details functionality examples
All examples use the grid_token file for configuration by default. If a local grid_token isn't found the CLI and examples will fall back to ~/.grid_token in your home directory. Passing --config-file to the CLI will use that explicit path instead.
The CLI automatically reads configuration from a grid_token file in the current directory and provides comprehensive access to all GridAPI resources. If no local grid_token is present, it will fall back to ~/.grid_token in the user's home directory. Use --config-file to specify an explicit file path.
# Create configuration file
echo "grid_token=your-api-token-here" > grid_token
echo "base_url=https://your-api-url.com" >> grid_token
# Study management
gridapi studies list # List all studies
gridapi studies get 100 # Get study details
gridapi studies create --description "Test Study" --investigator "Dr. Test"
# Study resources
gridapi studies subjects 100 # List subjects for study 100
gridapi studies procedures 100 # List procedures for study 100
gridapi studies events 100 # List events for study 100
gridapi studies event-details 100 10000 # List details for event 10000
gridapi studies subject-contacts 100 1000 # List contacts for subject 1000
# Image management
gridapi actions list # List all image actions
gridapi actions list --status completed # List completed actions
# Output formats
gridapi studies subjects 100 --format json # JSON output
gridapi studies subjects 100 --format table # Table output (default)
# Configuration
gridapi config # Show current configuration
gridapi --help # Show help- Automatic Configuration: Reads from
grid_tokenfile by default - Multiple Output Formats: Table (default) and JSON output
- Comprehensive Coverage: Access to all study resources and nested data
- Command Overrides: Override config file with command-line options
- Rich Output: Beautiful tables with colors and formatting
- Error Handling: Clear error messages and validation
The GridAPI client supports multiple authentication methods:
# Token authentication
client = GridAPIClient(
base_url="https://api.grid.example.com",
token="your-api-token"
)
# Cookie authentication
client = GridAPIClient(
base_url="https://api.grid.example.com",
session_id="your-session-id"
)from gridapi.exceptions import GridAPIError, ValidationError
try:
study = client.grid.studies.create(invalid_data)
except ValidationError as e:
print(f"Validation error: {e}")
except GridAPIError as e:
print(f"API error: {e}")Contributions are welcome! Please read our contributing guidelines and submit pull requests to our GitHub repository.
This project is licensed under the MIT License - see the LICENSE file for details.