OpenCollective API helper (OpsDev.nz), staging-first with 1Password token resolution
Project description
oc_opsdevnz
Staging-first OpenCollective client and CLI for OpsDev.nz. Resolves tokens from 1Password via op-opsdevnz and defaults to the staging API unless you explicitly opt into prod.
Features
- httpx GraphQL client with retries/backoff and redacted error messages.
- Environment guardrails: staging by default,
for_prod()/--prodrequired for production. - Token resolution via
OC_SECRET_REF/OC_TOKENusingop-opsdevnz. - CLI helpers for whoami, host organization upserts, collective creation/apply-to-host flows, and project creation from YAML/JSON.
Install
pip install oc-opsdevnz op-opsdevnz
# or editable while hacking in this repo
pip install -e modules/oc_opsdevnz[dev]
CLI (staging by default)
export OC_SECRET_REF="op://startmeup.nz/api-staging.opencollective.com/credential" # or set OC_TOKEN
# Fetch an account/collective by slug
oc-opsdevnz whoami opsdevnz
# Create/update host orgs from YAML
oc-opsdevnz hosts --file hosts.yaml
# Create/update collectives and optionally apply to a host
oc-opsdevnz collectives --file collectives.yaml
# Create/update projects under a parent collective
oc-opsdevnz projects --file projects.yaml
Use --prod to target production (only when you mean it), or --api-url to override explicitly.
Example YAML shapes
hosts.yaml (real staging values):
- name: StartMeUp.NZ
slug: startmeup-nz
description: Fiscal sponsor for OpsDev.NZ and NZ startups (staging)
website: https://startmeup.nz
currency: nzd
tags: [fiscal-host, newzealand, aotearoa]
collectives.yaml (real staging values):
- name: OpsDev.NZ
slug: opsdev-nz
description: OpsDev.NZ community and projects.
tags: [opsdev, operations, engineering, nz]
host_slug: startmeup-nz
apply_to_host: true
host_apply_message: Please host OpsDev.NZ on staging.
projects.yaml:
- name: GetJJobs.NZ
slug: getjjobs-nz
parent_slug: opsdev-nz
description: Pilot job-matching project under OpsDev.NZ.
tags: [jobs, pilot]
Python API
from oc_opsdevnz import OpenCollectiveClient
client = OpenCollectiveClient.for_staging()
data = client.graphql("query { account(slug:\"opsdevnz\") { id slug name } }")
prod_client = OpenCollectiveClient.for_prod() # explicit opt-in
Helpers for YAML-driven workflows:
from oc_opsdevnz import load_items, upsert_collective, upsert_host, upsert_project
from pathlib import Path
client = OpenCollectiveClient.for_staging()
for host in load_items(Path("hosts.yaml")):
upsert_host(client, host)
for project in load_items(Path("projects.yaml")):
upsert_project(client, project)
Development
cd modules/oc_opsdevnz
python -m venv .venv && source .venv/bin/activate
pip install -e .[dev]
pytest
License
Apache-2.0 © OpsDev.nz
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 oc_opsdevnz-0.1.1.tar.gz.
File metadata
- Download URL: oc_opsdevnz-0.1.1.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10297effb1fadc2a277803664277d5fadd4f5e421531f5474f1b2707830111cb
|
|
| MD5 |
acfac1209215b8647ec9b0c8dbc6609e
|
|
| BLAKE2b-256 |
0d48d0d670d2d9be8d2cd78dadd1bd2bd0fe36e7665d70a062b88f7985f83b43
|
File details
Details for the file oc_opsdevnz-0.1.1-py3-none-any.whl.
File metadata
- Download URL: oc_opsdevnz-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93c3bc130a61caaddb5fa8cf2277ad973e3541aff02a9337b2d1844d4193f0ce
|
|
| MD5 |
402907e3ba487d5c81d5a7e50e1b8f2e
|
|
| BLAKE2b-256 |
4a354e09fbd744c4839b7068ac091366b3d3b068776d42a58c377dcc4e6f2b47
|