Gemini Program Platform client.
Project description
GPP Client
Pain-free python/CLI communication with the Gemini Program Platform (GPP).
Documentation: https://gpp-client.readthedocs.io/en/latest/
Source Code: https://github.com/gemini-hlsw/gpp-client
Python client and CLI for the GPP. Key features:
- Type‑safe GraphQL
- Pydantic models from the GPP GraphQL schema, so every query, mutation, and input type is validated.
- Resource Managers
- High‑level
Managerclasses (e.g.GPPClient.program,GPPClient.observation) with convenientget_by_id,get_all,create,update_by_id,delete_by_id,restore_by_idand more methods, no need to write raw GraphQL.
- High‑level
- Flexible payloads
- Create or update via in‑memory Pydantic inputs or
from_jsonfiles.
- Create or update via in‑memory Pydantic inputs or
gppCLI- Full CRUD surface on the command line:
gpp <resource> list|get|create|update|delete, with rich table output and JSON export options.
- Full CRUD surface on the command line:
Requirements
python>=3.10tomltyperariadne-codegen
Development Status
🚧 Alpha: the library is under heavy development. The public API and CLI flags may change between releases.
Installation
pip install gpp-client
Quickstart
from gpp_client import GPPClient
# Initialize with your GraphQL endpoint and credentials.
client = GPPClient(url="YOUR_URL", token="YOUR_TOKEN")
# List the first 5 program notes.
notes = await client.program_note.get_all(limit=5)
for note in notes["matches"]:
print(f"{note['id']}: {note['title']}")
# Create a new note from a JSON file.
new_note = await client.program_note.create(
from_json="path/to/program_note_payload.json",
program_id="p-123"
)
print("Created:", new_note)
# Or create a note from the pydantic model.
from gpp_client.api.enums import Existence
from gpp_client.api.input_types import ProgramNotePropertiesInput
properties = ProgramNotePropertiesInput(
title="Example",
text="This is an example.",
is_private=False,
existence=Existence.PRESENT
)
another_note = await client.program_note.create(properties=properties, program_id="p-123")
print("Created another:", another_note)
As a CLI
# Get help.
gpp --help
# Get observation help.
gpp obs --help
# List observations.
gpp obs list --limit 3
# Get details for one.
gpp obs get o-123
# Create via JSON.
gpp obs create --from-json new_obs.json --program-id p-123
# Update by ID via JSON.
gpp obs update --observation-id o-123 --from-json updated_obs.json
Reporting Bugs and Feature Requests
Jira: https://noirlab.atlassian.net/jira/software/projects/GPC/boards/162
NOIRLab Slack channel: #gpp-client
While in heavy development, please file requests or report bugs via our Jira board or Slack channel.
Developer Notes
To update the GPP GraphQL schema and generate client code, run the scripts from the project’s top-level directory located in scripts/.
This project uses uv to manage dependencies and execute scripts.
When using uv run, a temporary virtual environment is created with only the dependencies required to run the script, based on the groups defined in pyproject.toml.
There’s no need to manually create or activate a virtual environment, uv handles everything.
Set Up pre-commit
To install pre-commit using uv, run:
uv tool install pre-commit --with pre-commit-uv
You may be prompted to add .local/bin to your PATH, uv installs tools there by default.
Next, install the hooks defined in .pre-commit-config.yaml:
pre-commit install
Once installed, pre-commit will automatically run the configured hooks each time you make a commit. This helps catch formatting issues, docstring violations, and other problems before code is committed.
To manually run all pre-commit hooks on the entire codebase:
pre-commit run --all-files
Download the Schema
This script downloads the latest GPP GraphQL schema to schema.graphql. You must have GPP_URL and GPP_TOKEN env variables set for downloading to work.
uv run --group schema python scripts/download_schema.py
Run Codegen
This script regenerates the client code based on the updated schema.
uv run --group codegen python scripts/run_codegen.py
Creating and Deploying a Release
Releases are managed using GitHub Actions. When you’re ready to publish a new version of the package, use the Create Release workflow.
- Go to the Actions tab on GitHub.
- Select the Create Release workflow from the sidebar.
- Click Run workflow.
- Enter the release version (e.g.,
25.6.0). Note: Do not include a leadingvor unnecessary zero padding. - Click Run workflow to trigger the release.
This workflow performs the following steps:
- Updates the
versionfield inpyproject.toml. - Updates the
uv.lockfile to reflect the new version. - Commits and pushes the changes to the repository.
- Creates a Git tag.
- Drafts a GitHub release.
Finalizing the Release
After the workflow completes:
- Go to the Releases section on GitHub.
- Locate the newly created draft release.
- Click Publish release.
Once published, the package will be automatically uploaded to PyPI. It may take a few minutes for the release to appear.
Project details
Release history Release notifications | RSS feed
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 gpp_client-25.7.7.tar.gz.
File metadata
- Download URL: gpp_client-25.7.7.tar.gz
- Upload date:
- Size: 101.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
135277a54769da7b9eb3c13defd8afa0f434dd3e0127648eb91b57e2328a866b
|
|
| MD5 |
921d18bf3184b9a6d4685219ba8a6ae0
|
|
| BLAKE2b-256 |
c7988172e306253bc11d5dd97e19da4aa2e5c0598eed18a3185ae0e9493de5b7
|
Provenance
The following attestation bundles were made for gpp_client-25.7.7.tar.gz:
Publisher:
publish.yaml on gemini-hlsw/gpp-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gpp_client-25.7.7.tar.gz -
Subject digest:
135277a54769da7b9eb3c13defd8afa0f434dd3e0127648eb91b57e2328a866b - Sigstore transparency entry: 300116801
- Sigstore integration time:
-
Permalink:
gemini-hlsw/gpp-client@6a58e5e4026e370a21c4d92250266042ceec4686 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gemini-hlsw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@6a58e5e4026e370a21c4d92250266042ceec4686 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file gpp_client-25.7.7-py3-none-any.whl.
File metadata
- Download URL: gpp_client-25.7.7-py3-none-any.whl
- Upload date:
- Size: 123.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6970750b7e180132ebbba9b2b4224ccc5e9f8962e5ea6a45aca306e6e538e14c
|
|
| MD5 |
c124ab80fcba75e670f4c4a4dd0d450c
|
|
| BLAKE2b-256 |
374f42b78779e24fd4c847e50ec0a6f716e1d5fb75d4abca1bde65a1106b2e88
|
Provenance
The following attestation bundles were made for gpp_client-25.7.7-py3-none-any.whl:
Publisher:
publish.yaml on gemini-hlsw/gpp-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gpp_client-25.7.7-py3-none-any.whl -
Subject digest:
6970750b7e180132ebbba9b2b4224ccc5e9f8962e5ea6a45aca306e6e538e14c - Sigstore transparency entry: 300116809
- Sigstore integration time:
-
Permalink:
gemini-hlsw/gpp-client@6a58e5e4026e370a21c4d92250266042ceec4686 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gemini-hlsw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@6a58e5e4026e370a21c4d92250266042ceec4686 -
Trigger Event:
workflow_dispatch
-
Statement type: