Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
cff-version: 1.2.0
message: "If you use this software, please cite it as below."
title: "ClusterTool: Single Umbrella CLI Centralizing HPC/AI Cluster Tools"
abstract: >-
A single umbrella CLI that centralizes the Slurm cluster scripts used by
researchers and admins, so common tasks live in one place with consistent help
and behavior, and adapts to other clusters through a site config.
type: software
authors:
- name: "Research Engineering Team, Kempner Institute, Harvard University"
website: "https://kempnerinstitute.harvard.edu"
version: 0.1.1
date-released: "2026-08-05"
license: MIT
repository-code: "https://github.com/KempnerInstitute/clustertool"
url: "https://pypi.org/project/clustertool/"
keywords:
- slurm
- hpc
- gpu
- cluster
- command-line tool
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ behavior, help text, and tests before merging.

Uploads to PyPI are manual.

1. Raise `version` in `pyproject.toml`, run `uv lock`, and merge that.
1. Raise `version` in `pyproject.toml` and `CITATION.cff`, run `uv lock`, and
merge that.
2. Draft a GitHub release with tag `vX.Y.Z` targeting `main`, and publish it.
The release check verifies the tag against the version, runs the tests,
builds, and attaches both artifacts to the release.
Expand Down
27 changes: 27 additions & 0 deletions tests/test_citation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Tests for the citation file."""

import pathlib
import re

ROOT = pathlib.Path(__file__).resolve().parent.parent
CITATION = ROOT / "CITATION.cff"
PYPROJECT = ROOT / "pyproject.toml"


def _cited_version() -> str:
return re.search(r"^version: (\S+)$", CITATION.read_text(), re.M).group(1)


def _package_version() -> str:
return re.search(r'^version = "(\S+)"$', PYPROJECT.read_text(), re.M).group(1)


def test_the_cited_version_is_the_package_version():
"""A release raises both, since the citation names the version it is for."""
assert _cited_version() == _package_version()


def test_the_citation_names_the_author_and_the_license():
text = CITATION.read_text()
assert "Research Engineering Team, Kempner Institute, Harvard University" in text
assert "license: MIT" in text