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
4 changes: 2 additions & 2 deletions .copyright.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Copyright (c) 2026 UChicago Argonne, LLC
SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
Copyright (c) 2026-2026 UChicago Argonne, LLC
SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
16 changes: 16 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,22 @@ repos:
- --license-filepath=.copyright.txt
- --comment-style=#
- --no-extra-eol
- id: insert-license
name: insert-license (scripts)
files: ^scripts/.*\.py$
args:
- --license-filepath=.copyright.txt
- --comment-style=#
- --no-extra-eol

- repo: local
hooks:
- id: update-copyright-year
name: Update copyright end year
language: python
entry: python scripts/update_copyright_year.py
pass_filenames: false
always_run: true

- repo: https://github.com/PyCQA/isort
rev: 5.13.2
Expand Down
67 changes: 67 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,73 @@ python3 -m pre_commit run --all-files

---

## Copyright handling

The repo uses three coordinated mechanisms to keep copyright text
consistent. All three are wired into pre-commit and run automatically.

### 1. Per-file headers — `.copyright.txt` + `insert-license`

`.copyright.txt` is the single source of truth for the per-file header
text:

```text
Copyright (c) 2026-2026 UChicago Argonne, LLC
SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
```

The `Lucas-C/insert-license` pre-commit hook propagates that header to
every covered Python file on each commit. Three hook instances cover:

* `src/ad_hoc_diffractometer/*.py` (excluding `_version.py`)
* `tests/test_*.py`
* `scripts/*.py`

To change the per-file header text project-wide, edit only
`.copyright.txt` and run `pre-commit run --all-files`.

### 2. Year-range bump — `scripts/update_copyright_year.py`

A **local** pre-commit hook (`update-copyright-year`) runs the
`scripts/update_copyright_year.py` script on every commit. The script
rewrites the pattern `<START>-<OLD_END>` → `<START>-<CURRENT_YEAR>` in
each file listed in its `TARGET_FILES`:

* `.copyright.txt`
* `LICENSE` (line 1 only — the licence body is verbatim per ANL legal
and is never edited)
* `docs/source/conf.py`

The script exits non-zero when it changes anything, so pre-commit fails
and the developer stages the rewrite before retrying the commit. On
January 1 of any year, the next commit on any branch will bring every
year span forward.

### 3. Sphinx docs — static year range in `conf.py`

`docs/source/conf.py` declares `copyright` as a static year-range string,
not a build-time-dynamic `datetime.now().year` expression. This is
intentional: the bump script is the single mechanism that keeps
`LICENSE`, `.copyright.txt`, and the rendered docs aligned, and a
dynamic expression would hide drift between them.

### What NOT to edit by hand

* The `Copyright (c) YYYY-YYYY ...` line on individual `.py` files —
edit `.copyright.txt` and re-run pre-commit instead.
* The end year in `LICENSE` line 1, `docs/source/conf.py`, or
`.copyright.txt` on January 1 — the bump script handles it.
* The body of `LICENSE` — verbatim per ANL legal.

### What to edit by hand

* The **start** year in any year range (project inception year);
the script never touches it.
* Adding new files to `TARGET_FILES` if a new file legitimately
contains a year range.

---

## Benchmark tests

The benchmark test suite (`tests/test_benchmark.py`) includes slow tests
Expand Down
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ Note any unreleased items inside the comment here. Not visible until release.

- Kappa equivalent-Eulerian chi axis now matches fourcv/fourch/psic. (#284)

### Maintenance

- Unify copyright automation across hklpy2 family. (#290)

-->

## Release v0.11.0
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2026, UChicago Argonne, LLC
Copyright (c) 2026-2026, UChicago Argonne, LLC

All Rights Reserved

Expand Down
4 changes: 3 additions & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
project = "ad_hoc_diffractometer"
# author = _metadata["authors"][0]["name"]
author = "UChicago Argonne, LLC"
copyright = f"2026, {author}"
# Static year range; kept in sync with .copyright.txt and LICENSE by
# scripts/update_copyright_year.py (registered as a pre-commit hook).
copyright = "2026-2026, UChicago Argonne, LLC"
description = _metadata["description"]

release = _version("ad_hoc_diffractometer")
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ maintainers = [{ name = "Pete Jemian", email = "prjemian+ad_hoc@gmail.com" }]
readme = "README.md"
requires-python = ">=3.10"
keywords = ["diffraction", "geometry", "crystallography", "x-ray", "neutron"]
license = "LicenseRef-ANL-Open-Source-License"
license = "LicenseRef-UChicago-Argonne-LLC-License"
license-files = ["LICEN[CS]E*"]
# https://pypi.org/classifiers/
classifiers = [
Expand Down
113 changes: 113 additions & 0 deletions scripts/update_copyright_year.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/usr/bin/env python3
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
Update the copyright end year in tracked source files to the current year.

Designed to be used as a pre-commit hook (local repo hook). Exit codes follow
the pre-commit convention:

* 0 - nothing changed (all files already have the correct year).
* 1 - one or more files were modified; pre-commit will mark the hook as
"failed" so the developer sees the diff and stages the updated files
before retrying the commit.

The script rewrites the pattern ``<START_YEAR>-<OLD_YEAR>`` ->
``<START_YEAR>-<CURRENT_YEAR>`` wherever it appears in each target file,
leaving everything else untouched.

Files checked (paths relative to the repository root):

* ``.copyright.txt`` - per-file header template
* ``LICENSE`` - line-1 copyright statement (only the year
range is rewritten; the licence body is
verbatim per ANL legal and is never touched
by this script)
* ``docs/source/conf.py`` - Sphinx ``copyright`` value

To add a new target, append to :data:`TARGET_FILES` below.
"""

from __future__ import annotations

import pathlib
import re
import sys
from datetime import datetime

# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------

REPO_ROOT = pathlib.Path(__file__).parent.parent

# Files that contain the copyright year span, relative to the repo root.
TARGET_FILES: list[pathlib.Path] = [
REPO_ROOT / ".copyright.txt",
REPO_ROOT / "LICENSE",
REPO_ROOT / "docs" / "source" / "conf.py",
]

# Matches e.g. "2026-2026" and captures the start year and old end year.
YEAR_RANGE_PATTERN = re.compile(r"(\d{4})-(\d{4})")

CURRENT_YEAR = str(datetime.now().year)

# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------


def update_file(path: pathlib.Path, current_year: str) -> bool:
"""
Replace stale end-years in *path* with *current_year*.

Returns True if the file was modified.
"""
original = path.read_text(encoding="utf-8")

def _replace(match: re.Match) -> str:
start, end = match.group(1), match.group(2)
if end == current_year:
return match.group(0) # already up to date
return f"{start}-{current_year}"

updated = YEAR_RANGE_PATTERN.sub(_replace, original)

if updated == original:
return False

path.write_text(updated, encoding="utf-8")
return True


# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------


def main() -> int:
changed: list[pathlib.Path] = []

for filepath in TARGET_FILES:
if not filepath.exists():
print(f"WARNING: {filepath} not found - skipping.", file=sys.stderr)
continue
if update_file(filepath, CURRENT_YEAR):
changed.append(filepath)
print(
f"Updated copyright end year to {CURRENT_YEAR} in: {filepath.relative_to(REPO_ROOT)}"
)

if changed:
print(
"\nCopyright year(s) updated. Stage the changed file(s) and re-run the commit.",
file=sys.stderr,
)
return 1 # signal pre-commit that something changed

return 0


if __name__ == "__main__":
sys.exit(main())
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
ad_hoc_diffractometer — Multi-circle diffractometer geometry and related calculations.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/axes.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
axes.py — caller-facing axis notation and physical direction mapping.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/benchmark.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
benchmark.py — forward/inverse performance measurement.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/constants.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
constants.py — shared Cartesian basis vectors.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/conversions.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
r"""
conversions.py — Alternative calculation engines.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/diffractometer.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
diffractometer.py — AdHocDiffractometer class.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/display.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
display.py — display precision settings and numeric comparison helper.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/drawing.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
drawing.py — geometry visualization helpers.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/factories.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
factories.py — geometry registry and shared definitions.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/forward.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
r"""
forward.py — Forward diffraction calculation: (h, k, l) → motor angles.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/geometries/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
Declarative geometry definitions (issue #267).

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/geometry_loader.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
geometry_loader.py — declarative-YAML geometry loader (issue #267).

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/kappa.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
kappa.py — Kappa-to-Eulerian angle conversion.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/lattice.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
lattice.py — crystallographic lattice calculations.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/mode.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
mode.py — Diffraction mode / operating constraints.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/orientation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
r"""
orientation.py — U and UB matrix computation from orienting reflections.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/radiation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
radiation.py — Wavelength, energy, and wave-number conversions.

Expand Down
4 changes: 2 additions & 2 deletions src/ad_hoc_diffractometer/reference.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-ANL-Open-Source-License
# Copyright (c) 2026-2026 UChicago Argonne, LLC
# SPDX-License-Identifier: LicenseRef-UChicago-Argonne-LLC-License
"""
reference.py — Reference pseudo-angle computations for diffraction modes.

Expand Down
Loading