From 368c4bc44d0b2e260dbfe735367084103fa18d1e Mon Sep 17 00:00:00 2001 From: Daniel Eddie Rollins Date: Mon, 2 Mar 2026 14:52:43 +0000 Subject: [PATCH 1/4] Refactor: rename package to pnanolocz from pnanlocz_lib and update structure. --- .github/ISSUE_TEMPLATE/bug_report.yaml | 100 ++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.yaml | 73 +++++++++++++ .github/workflows/tests.yaml | 2 +- .gitignore | 1 + README.md | 20 ++-- pyproject.toml | 16 +-- src/{pnanolocz_lib => pnanolocz}/__init__.py | 4 +- src/{pnanolocz_lib => pnanolocz}/level.py | 0 .../level_auto.py | 20 ++-- .../level_weighted.py | 0 .../thresholder.py | 0 tests/conftest.py | 2 +- tests/test_level.py | 2 +- tests/test_level_auto.py | 4 +- tests/test_level_weighted.py | 2 +- tests/test_thresholder.py | 2 +- 16 files changed, 211 insertions(+), 37 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml rename src/{pnanolocz_lib => pnanolocz}/__init__.py (69%) rename src/{pnanolocz_lib => pnanolocz}/level.py (100%) rename src/{pnanolocz_lib => pnanolocz}/level_auto.py (97%) rename src/{pnanolocz_lib => pnanolocz}/level_weighted.py (100%) rename src/{pnanolocz_lib => pnanolocz}/thresholder.py (100%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..b40b525 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,100 @@ +name: Bug Report +description: Report a problem to help us improve +title: "[BUG] " +labels: [bug] +body: + - type: markdown + attributes: + value: | + **Thank you for taking the time to report a bug! Please fill out the form below.** + + - type: textarea + id: bug-description + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is. + placeholder: What happened? + validations: + required: true + + - type: checkboxes + id: reproduce-checklist + attributes: + label: To Reproduce + description: Please check all that apply. + options: + - label: I have provided step-by-step instructions below + - label: I have attached or linked the file that caused the issue (if applicable) + - label: I have pasted the exact command used + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to Reproduce + description: Please provide step-by-step instructions. + placeholder: | + 1. + 2. + 3. + validations: + required: true + + - type: input + id: file-link + attributes: + label: File link (if applicable) + description: Paste a link to the file that caused the issue, if possible. + placeholder: https://... + + - type: input + id: command-used + attributes: + label: Command used + description: Paste the exact command that failed. + placeholder: playnano ... + + - type: textarea + id: expected-behaviour + attributes: + label: Expected Behaviour + description: What did you expect to happen? + placeholder: I expected... + validations: + required: true + + - type: checkboxes + id: screenshots + attributes: + label: Screenshots + description: Attach screenshots if applicable. + options: + - label: I have attached screenshots + - type: textarea + id: screenshots-area + attributes: + label: Screenshot details + description: Paste or drag screenshots here. + + - type: dropdown + id: environment-type + attributes: + label: Environment type + description: Select your operating system. + options: + - Windows + - macOS + - Linux + - Other + + - type: textarea + id: environment-details + attributes: + label: Environment details + description: Run `playnano env-info` and paste the output here. + placeholder: Paste output here + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000..b342e61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,73 @@ +--- +name: Feature Request +description: Suggest a new feature or improvement +title: "[Feature] " +labels: [enhancement] + +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to suggest a feature! Please fill out the form below to help us understand your idea. + + - type: input + id: summary + attributes: + label: Feature Summary + description: Provide a short, clear summary of the feature you'd like to see. + placeholder: e.g., Add support for XYZ file format + validations: + required: true + + - type: textarea + id: problem + attributes: + label: What problem does this feature solve? + description: Describe the problem or limitation you're experiencing that this feature would address. + placeholder: I often run into... + validations: + required: true + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: How would you like this feature to work? Be as specific as possible. + placeholder: I'd like it to... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: Have you tried other solutions or workarounds? What were they? + placeholder: I've tried... + validations: + required: false + + - type: dropdown + id: priority + attributes: + label: Priority + description: How important is this feature to you? + options: + - Low - Nice to have + - Medium - Would improve usability + - High - Blocking or critical for my workflow + validations: + required: true + - type: checkboxes + id: context + attributes: + label: Additional Context + description: Check any that apply. + options: + - label: I am willing to help implement this feature + - label: I can provide example data or use cases + - label: This feature is related to a bug I reported + - type: textarea + id: extra + attributes: + label: Anything else? + description: Add any other context, links, or screenshots here. + placeholder: Related issues, references, mockups, etc. diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 5327698..c1d1796 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,7 +35,7 @@ jobs: - name: Run tests with coverage run: | - pytest --maxfail=1 --disable-warnings -q --cov=pnanolocz_lib --cov-report=xml --cov-report=term + pytest --maxfail=1 --disable-warnings -q --cov=pnanolocz --cov-report=xml --cov-report=term - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 diff --git a/.gitignore b/.gitignore index c709e6e..a1fa3b7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ dist/ build/ .eggs/ *.egg +dist/ # Version file _version.py diff --git a/README.md b/README.md index 4a70465..13c5b0b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pnanolocz_lib 📦 +# pnanolocz 📦 [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![pre-commit](https://github.com/derollins/Python-Nanolocz-Library/actions/workflows/pre-commit.yaml/badge.svg)](https://github.com/derollins/Python-Nanolocz-Library/actions/workflows/pre-commit.yaml) @@ -24,7 +24,7 @@ flattening. ## 📦 Installation ```bash -pip install pnanolocz_lib +pip install pnanolocz ``` Or clone & install locally: @@ -59,10 +59,10 @@ easily extensible for AFM workflows. ```python import numpy as np -from pnanolocz_lib.level import apply_level -from pnanolocz_lib.level_auto import apply_level_auto -from pnanolocz_lib.thresholder import apply_thresholder -from pnanolocz_lib.level_weighted import apply_weighted_level +from pnanolocz.level import apply_level +from pnanolocz.level_auto import apply_level_auto +from pnanolocz.thresholder import apply_thresholder +from pnanolocz.level_weighted import apply_weighted_level # 1) Polynomial plane leveling img = np.load("frame.npy") # (H,W) @@ -85,7 +85,7 @@ mask = apply_thresholder(img, method="otsu", limits=None) ## 📖 Modules -- **`pnanolocz_lib.level`** +- **`pnanolocz.level`** Core flattening / leveling (plane, line, median, smoothed, mean, log). Typical usage involves calling the `apply_level()` function with an image (2D) @@ -104,7 +104,7 @@ mask = apply_thresholder(img, method="otsu", limits=None) | `mean_plane` | Global mean subtraction. | | `log_y` | Logarithmic curve subtraction along the Y‑axis. | -- **`pnanolocz_lib.level_weighted`** +- **`pnanolocz.level_weighted`** Weighted-region flattening / leveling (plane, line, median and smoothed). Typical usage involves calling the `apply_weighted_level()` function with an @@ -121,7 +121,7 @@ mask = apply_thresholder(img, method="otsu", limits=None) | `med_line_y` | Region-weighted column-wise median line flattening. | | `smed_line` | Region-weighted smoothed median line subtraction. | -- **`pnanolocz_lib.thresholder`** +- **`pnanolocz.thresholder`** Intensity / edge detection: histogram, Otsu, auto edges, skeleton, step detection. Typical usage involves calling the `apply_thresholder()` function with an image (2D) @@ -142,7 +142,7 @@ mask = apply_thresholder(img, method="otsu", limits=None) | `hist_skel` | Skeletonize regions selected by histogram thresholding. | | `line_step` | Detect step changes along each row using PELT change point detection. | -- **`pnanolocz_lib.level_auto`** +- **`pnanolocz.level_auto`** Pre‑defined multi‑frame routines built from `level` + `thresholder`. | Routine | Description | diff --git a/pyproject.toml b/pyproject.toml index 3cbcbc3..b43d2d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0", "wheel", "setuptools-scm>=8"] build-backend = "setuptools.build_meta" [project] -name = "pnanolocz_lib" +name = "pnanolocz" description = "A Python library for AFM, HS-AFM, and Localization AFM data analysis. Based on NanoLocz" authors = [ { name = "George Heath", email = "G.R.Heath@leeds.ac.uk" }, @@ -88,8 +88,8 @@ dev = [ Homepage = "https://github.com/derollins/Python-Nanolocz-Library" [project.entry-points."playnano.filters"] -pnanolocz_level = "pnanolocz_lib.level:apply_level" -pnanolocz_level_auto = "pnanolocz_lib.level_auto:apply_level_auto" +pnanolocz_level = "pnanolocz.level:apply_level" +pnanolocz_level_auto = "pnanolocz.level_auto:apply_level_auto" [tool.setuptools] package-dir = { "" = "src" } @@ -98,7 +98,7 @@ package-dir = { "" = "src" } where = ["src"] [tool.setuptools_scm] -write_to = "src/pnanolocz_lib/_version.py" +write_to = "src/pnanolocz/_version.py" [tool.black] line-length = 88 @@ -127,7 +127,7 @@ multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 combine_as_imports = true -known_first_party = ["pnanolocz_lib"] +known_first_party = ["pnanolocz"] known_third_party = ["numpy","scipy","matplotlib","skimage","ruptures","sknw"] [tool.ruff] @@ -157,7 +157,7 @@ mypy_path = ["src"] # Only check your library code; do not include tests here. files = ["src"] -# Regular package (you created src/pnanolocz_lib/__init__.py) +# Regular package (you created src/pnanolocz/__init__.py) explicit_package_bases = false namespace_packages = false @@ -178,12 +178,12 @@ module = [ ignore_missing_imports = true [tool.pytest.ini_options] -addopts = "--cov=pnanolocz_lib --cov-report=term-missing --cov-append" +addopts = "--cov=pnanolocz --cov-report=term-missing --cov-append" testpaths = ["tests"] [tool.coverage.run] branch = true -source = ["pnanolocz_lib"] +source = ["pnanolocz"] [tool.coverage.report] exclude_lines = [ diff --git a/src/pnanolocz_lib/__init__.py b/src/pnanolocz/__init__.py similarity index 69% rename from src/pnanolocz_lib/__init__.py rename to src/pnanolocz/__init__.py index 8ab1595..3c328af 100644 --- a/src/pnanolocz_lib/__init__.py +++ b/src/pnanolocz/__init__.py @@ -1,4 +1,4 @@ -"""pnanolocz_lib: AFM and HS-AFM data analysis tools.""" +"""pnanolocz: AFM and HS-AFM data analysis tools.""" from importlib.metadata import PackageNotFoundError, version @@ -6,6 +6,6 @@ from ._version import version as __version__ # type: ignore[import-not-found] except Exception: try: - __version__ = version("pnanolocz_lib") + __version__ = version("pnanolocz") except PackageNotFoundError: __version__ = "0.0.0" diff --git a/src/pnanolocz_lib/level.py b/src/pnanolocz/level.py similarity index 100% rename from src/pnanolocz_lib/level.py rename to src/pnanolocz/level.py diff --git a/src/pnanolocz_lib/level_auto.py b/src/pnanolocz/level_auto.py similarity index 97% rename from src/pnanolocz_lib/level_auto.py rename to src/pnanolocz/level_auto.py index 7e2ac99..c944d98 100644 --- a/src/pnanolocz_lib/level_auto.py +++ b/src/pnanolocz/level_auto.py @@ -8,8 +8,8 @@ to improve background flattening across challenging frames. All routines operate frame-by-frame and reuse the public function contracts of -``pnanolocz_lib.level``, ``pnanolocz_lib.level_weighted``, and -``pnanolocz_lib.thresholder``. Masks follow the *exclusion mask* convention: +``pnanolocz.level``, ``pnanolocz.level_weighted``, and +``pnanolocz.thresholder``. Masks follow the *exclusion mask* convention: ``True`` = excluded, ``False`` = valid. Excluded pixels are omitted from fitting using MATLAB-style NaN-outside semantics (i.e., excluded pixels behave like NaN during fitting) but are preserved in the output arrays. @@ -53,12 +53,12 @@ ----------------- Each step is one of the following: -- A leveling step via :func:`pnanolocz_lib.level.apply_level` +- A leveling step via :func:`pnanolocz.level.apply_level` (e.g., ``plane``, ``line``, ``med_line``, ``mean_plane``). - A region-weighted leveling step via - :func:`pnanolocz_lib.level_weighted.apply_level_weighted` (e.g., weighted + :func:`pnanolocz.level_weighted.apply_level_weighted` (e.g., weighted ``plane`` or weighted ``med_line``). -- A masking step via :func:`pnanolocz_lib.thresholder.apply_thresholder` +- A masking step via :func:`pnanolocz.thresholder.apply_thresholder` which updates the current exclusion mask carried forward to subsequent steps. Some routines compute histogram bounds from a Gaussian fit to the image value @@ -82,7 +82,7 @@ Examples -------- ->>> from pnanolocz_lib.level_auto import apply_level_auto +>>> from pnanolocz.level_auto import apply_level_auto >>> leveled = apply_level_auto(stack, routine="multi-plane-otsu") >>> img_leveled = apply_level_auto(img, routine="plane-line") @@ -102,9 +102,9 @@ from numpy.typing import NDArray from scipy.optimize import curve_fit -from pnanolocz_lib.level import apply_level -from pnanolocz_lib.level_weighted import apply_level_weighted -from pnanolocz_lib.thresholder import apply_thresholder +from pnanolocz.level import apply_level +from pnanolocz.level_weighted import apply_level_weighted +from pnanolocz.thresholder import apply_thresholder FloatArray = NDArray[np.float64] BoolArray = NDArray[np.bool_] @@ -805,7 +805,7 @@ def _maybe_inject_precond( if ratio > factor: fn: Callable[..., FloatArray] if apply_level_fn is None: - from pnanolocz_lib.level import apply_level as _apply_level + from pnanolocz.level import apply_level as _apply_level fn = _apply_level else: diff --git a/src/pnanolocz_lib/level_weighted.py b/src/pnanolocz/level_weighted.py similarity index 100% rename from src/pnanolocz_lib/level_weighted.py rename to src/pnanolocz/level_weighted.py diff --git a/src/pnanolocz_lib/thresholder.py b/src/pnanolocz/thresholder.py similarity index 100% rename from src/pnanolocz_lib/thresholder.py rename to src/pnanolocz/thresholder.py diff --git a/tests/conftest.py b/tests/conftest.py index 77775b7..c46ca4e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -"""Test fixtures for pnanolocz_lib.""" +"""Test fixtures for pnanolocz.""" from __future__ import annotations diff --git a/tests/test_level.py b/tests/test_level.py index 9c0c23f..29b43e3 100644 --- a/tests/test_level.py +++ b/tests/test_level.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from pnanolocz_lib.level import ( +from pnanolocz.level import ( apply_level, get_background, level_line, diff --git a/tests/test_level_auto.py b/tests/test_level_auto.py index f91b46c..2eeb809 100644 --- a/tests/test_level_auto.py +++ b/tests/test_level_auto.py @@ -5,8 +5,8 @@ import numpy as np import pytest -from pnanolocz_lib import level_auto -from pnanolocz_lib.level_auto import ( +from pnanolocz import level_auto +from pnanolocz.level_auto import ( ROUTINES, _compute_anisotropy_ratio, _compute_gauss_limits, diff --git a/tests/test_level_weighted.py b/tests/test_level_weighted.py index 4e2f8f8..9be51d7 100644 --- a/tests/test_level_weighted.py +++ b/tests/test_level_weighted.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from pnanolocz_lib.level_weighted import ( +from pnanolocz.level_weighted import ( _find_regions, _polyfit_centered, _polyval_centered, diff --git a/tests/test_thresholder.py b/tests/test_thresholder.py index 3e93a79..778cb03 100644 --- a/tests/test_thresholder.py +++ b/tests/test_thresholder.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from pnanolocz_lib.thresholder import ( +from pnanolocz.thresholder import ( apply_thresholder, auto_edges, hist_edges, From 8fcab34c391bb234b8bea9c0375ec88492844210 Mon Sep 17 00:00:00 2001 From: Daniel Eddie Rollins Date: Mon, 2 Mar 2026 15:12:02 +0000 Subject: [PATCH 2/4] Add CHANGELOG.md --- CHANGELOG.md | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4846e6f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,198 @@ + +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +## [Unreleased] + +--- + +## [0.1.0] - 2026-03-02 + +### Changed + +- **Major project restructure**: + + - Renamed package from `pnanolocz_lib` → `pnanolocz`. + - Updated source directory structure to `src/pnanolocz/`. + - Updated all import references and entry points. + +### Added + +- Initial public packaging setup for PyPI using `setuptools` + `setuptools_scm`. +- Comprehensive project metadata, classifiers, dependencies, and dev tools. +- Version writing via `src/pnanolocz/_version.py`. +- Entry point integration for `playnano` filters. + +--- + +## [0.0.4] - 2026-03-02 + +### Added + +- (none) + +### Changed + +- Updated project metadata: corrected author name to "Daniel E. Rollins". +- Standardised suppression of polynomial fitting warnings using + `RuntimeWarning` and rank-related filters, replacing direct `RankWarning` + references across leveling modules. +- Improved consistency in author attribution within `thresholder.py`. + +### Fixed + +- Eliminated dependency on `numpy.polynomial.polyutils.RankWarning` to avoid + type-checking issues and NumPy internals. + +### Infrastructure + +- `.markdownlint.yaml` now ignores `LICENSE` and `LICENSE.md`. +- `.pre-commit-config.yaml` now excludes the `build/` directory from Black. + +## [0.0.3] - 2026-01-14 + +### Summary + +This release moves the Python NanoLocz implementation from being functionally similar to the MATLAB reference to being +**algorithmically aligned**. It standardizes mask semantics, improves numerical parity, completes several automated +routines, and clarifies public API behavior. These changes significantly improve reproducibility, validation, and ease +of extension. + +### Breaking Changes + +- **Minimum Python version** is now **3.11** (3.10 support removed). +- **Thresholding & mask polarity**: + - New public API: `apply_thresholder(img, method, limits=None, invert=False)`. + - All thresholders now return **boolean exclusion masks** (`True = excluded`). + - Removes prior NaN-mask and mixed-polarity behavior. +- **Leveling functions now expect exclusion masks**: + - Leveling internally converts exclusion ↔ validity masks. + - Fitting uses **NaN-outside** semantics. +- **MATLAB behavioral alignment changes**: + - `level_line` only runs the *column* stage when `polyy > 0`. + - `med_line` interprets `polyx` as a **gain** when `polyx > 0`, matching MATLAB. + +### Added / Improved + +#### Mask Semantics (All Modules) + +- Unified boolean exclusion masks across thresholding and leveling. +- Introduced `_validity_mask` to convert public exclusion masks to internal validity masks. +- All fits and summaries use NaN-outside semantics while preserving excluded pixels. + +#### Core Leveling (`level.py`) + +- Polynomial fits now use **1‑based indices** and **population standard deviation (`ddof=0`)**, + matching MATLAB `polyfit(..., mu)`. +- Reworked methods (`plane`, `line`, `med_line`, `med_line_y`, `smed_line`, `mean_plane`, `log_y`) for: + - alignment with MATLAB gating rules, + - explicit low-sample fallbacks, + - validity-mask‑only fitting. +- Guarantees: `background = input - leveled` under consistent semantics. + +#### Automated Routines (`level_auto.py`) + +- Implemented: + - `multi-plane-edges` + - `multi-plane-otsu` +- Restored missing histogram passes after plane leveling. +- Added anisotropy‑gated one‑off `med_line` preconditioning. +- MATLAB‑style Gaussian histogram (`gauss1`) fitting: + - `gauss_fit`, `gauss_peaks`, `gauss_holes` + - Adaptive bounds computed **per frame** (documented MATLAB deviation). + +#### Thresholding (`thresholder.py`) + +- New dispatcher: `apply_thresholder` (returns exclusion masks). +- Expanded & clarified methods (e.g., histogram, selection, otsu, edge masks, skel masks). +- Added advanced methods: + - `line_step` (PELT change‑point) + - `adaptive` (Sobel + morphology + inclusive gating) + +#### Region‑Weighted Leveling (`level_weighted.py`) + +- Region detection uses **8‑connectivity** and **min area = floor(1% of H×W)** (MATLAB rule). +- Weights ≤2% are zeroed (not renormalized), matching MATLAB. +- Evaluations use **1‑based coordinate grids**. +- Expanded documentation and edge‑case behavior notes. + +#### Documentation + +- Added `CITATION.cff` for formal citation. +- Updated README with: + - Python 3.11+ requirement, + - new APIs, + - improved examples. +- Updated example notebook accordingly. + +#### Tooling & CI + +- CI now tests Python **3.11, 3.12, 3.13**. +- Pinned `scikit-image >= 0.26, < 0.27` for stability. +- Improved pre‑commit configuration and ignore rules. +- Standardized tooling (Black, Ruff, Mypy) to **py311**. + +#### Tests & Resources + +- Added `tests/conftest.py` with NPZ loader fixture. +- Added AFM resource data under `tests/resources/`. + +### Migration Notes + +#### Thresholding + +Before: + +```python +mask = thresholder(img, method="otsu") # mixed polarity, NaN masks +``` + +After: + +```python +mask_excl = apply_thresholder(img, method="otsu") # True = excluded +valid = ~mask_excl +``` + +#### Leveling + +Before: + +```python +leveled = apply_level_weighted(img, 1, 1, method="line", mask=valid_mask) +``` + +After: + +```python +leveled = apply_level_weighted(img, 1, 1, method="line", mask=mask_excl) +``` + +#### Automated Routines + +```python +out = apply_level_auto(stack, routine="multi-plane-otsu") +``` + +### CI Note + +To ensure setuptools-scm sees tags: + +```yaml +- uses: actions/checkout@v4 + with: + fetch-depth: 0 +``` + +--- + +[Unreleased]: https://github.com/derollins/Python-Nanolocz-Library/compare/v0.1.0...HEAD +[0.1.0]: https://github.com/derollins/Python-Nanolocz-Library/releases/tag/v0.1.0 +[0.0.4]: https://github.com/derollins/Python-Nanolocz-Library/releases/tag/v0.0.4 +[0.0.3]: https://github.com/derollins/Python-Nanolocz-Library/releases/tag/v0.0.3 From 3254f6690255e981bf2c8304e67da5750317db42 Mon Sep 17 00:00:00 2001 From: Daniel Eddie Rollins Date: Mon, 2 Mar 2026 15:22:33 +0000 Subject: [PATCH 3/4] Add CHNAGELOG and issues to pyproject.toml --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b43d2d9..86adda8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,6 +86,8 @@ dev = [ [project.urls] Homepage = "https://github.com/derollins/Python-Nanolocz-Library" +Issues = "https://github.com/derollins/Python-Nanolocz-Library/issues" +Changelog = "https://github.com/derollins/Python-Nanolocz-Library/blob/main/CHANGELOG.md" [project.entry-points."playnano.filters"] pnanolocz_level = "pnanolocz.level:apply_level" From 06a464cc9d3daf8df147f6ae90b719d16eb5951a Mon Sep 17 00:00:00 2001 From: Daniel Eddie Rollins Date: Mon, 2 Mar 2026 15:28:27 +0000 Subject: [PATCH 4/4] Fix typo in citation and clarify readme in pyproject.toml --- CITATION.cff | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index a1da58e..0191f4f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -10,7 +10,7 @@ type: software authors: - given-names: Daniel E family-names: Rollins - email: d.e.rollins@leed.ac.uk + email: d.e.rollins@leeds.ac.uk affiliation: University of Leeds - given-names: George R family-names: Heath diff --git a/pyproject.toml b/pyproject.toml index 86adda8..fbd43cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ authors = [ { name = "Daniel E. Rollins", email = "d.e.rollins@leeds.ac.uk" } ] dynamic = ["version"] -readme = "README.md" +readme = { file = "README.md", content-type = "text/markdown" } license = { text = "GPL-3.0-or-later" } requires-python = ">=3.11" dependencies = [