diff --git a/.github/ISSUE_TEMPLATE/release_checklist.md b/.github/ISSUE_TEMPLATE/release_checklist.md
index 6107962..56c5fca 100644
--- a/.github/ISSUE_TEMPLATE/release_checklist.md
+++ b/.github/ISSUE_TEMPLATE/release_checklist.md
@@ -11,12 +11,13 @@ assignees: ""
- [ ] All PRs/issues attached to the release are merged.
- [ ] All the badges on the README are passing.
- [ ] License information is verified as correct. If you are unsure, please comment below.
-- [ ] Locally rendered documentation contains all appropriate pages, including API references (check no modules are
- missing), tutorials, and other human-written text is up-to-date with any changes in the code.
+- [ ] Locally rendered documentation contains all appropriate pages, tutorials, and other human-written text is up-to-date with any changes in the code.
+- [ ] All API references are included. To check this, run `conda install scikit-package` and then `package build api-doc`. Review any edits made by rerendering the docs locally.
- [ ] Installation instructions in the README, documentation, and the website are updated.
- [ ] Successfully run any tutorial examples or do functional testing with the latest Python version.
- [ ] Grammar and writing quality are checked (no typos).
- [ ] Install `pip install build twine`, run `python -m build` and `twine check dist/*` to ensure that the package can be built and is correctly formatted for PyPI release.
+- [ ] Dispatch matrix testing to test the release on all Python versions and systems. If you do not have permission to run this workflow, tag the maintainer and say `@maintainer, please dispatch matrix testing workflow`.
Please tag the maintainer (e.g., @username) in the comment here when you are ready for the PyPI/GitHub release. Include any additional comments necessary, such as version information and details about the pre-release here:
@@ -34,7 +35,7 @@ Please let the maintainer know that all checks are done and the package is ready
- [ ] Ensure that the full release has appeared on PyPI successfully.
-- [ ] New package dependencies listed in `conda.txt` and `test.txt` are added to `meta.yaml` in the feedstock.
+- [ ] New package dependencies listed in `conda.txt` and `tests.txt` are added to `meta.yaml` in the feedstock.
- [ ] Close any open issues on the feedstock. Reach out to the maintainer if you have questions.
- [ ] Tag the maintainer for conda-forge release.
diff --git a/.github/workflows/build-and-publish-docs-on-dispatch.yml b/.github/workflows/build-and-publish-docs-on-dispatch.yml
new file mode 100644
index 0000000..d5e1193
--- /dev/null
+++ b/.github/workflows/build-and-publish-docs-on-dispatch.yml
@@ -0,0 +1,18 @@
+name: Build and Publish Docs on Dispatch
+
+on:
+ workflow_dispatch:
+
+jobs:
+ get-python-version:
+ uses: scikit-package/release-scripts/.github/workflows/_get-python-version-latest.yml@v0
+ with:
+ python_version: 0
+
+ docs:
+ uses: scikit-package/release-scripts/.github/workflows/_release-docs.yml@v0
+ with:
+ project: diffpy.srreal
+ c_extension: true
+ headless: false
+ python_version: ${{ fromJSON(needs.get-python-version.outputs.latest_python_version) }}
diff --git a/.github/workflows/build-wheel-release-upload.yml b/.github/workflows/build-wheel-release-upload.yml
index caaf5a0..98e78b0 100644
--- a/.github/workflows/build-wheel-release-upload.yml
+++ b/.github/workflows/build-wheel-release-upload.yml
@@ -1,18 +1,76 @@
-name: Release (GitHub/PyPI) and Deploy Docs
+name: Build Wheel and Release
+# Trigger on tag push or manual dispatch.
+# Tag and release privilege are verified inside the reusable workflow.
on:
workflow_dispatch:
push:
tags:
- - "*" # Trigger on all tags initially, but tag and release privilege are verified in _build-wheel-release-upload.yml
+ - "*"
+
+# ── Release modality ──────────────────────────────────────────────────────────
+# Three options are provided below. Only ONE job should be active at a time.
+# To switch: comment out the active job and uncomment your preferred option,
+# then commit the change to main before tagging a release.
+# ─────────────────────────────────────────────────────────────────────────────
jobs:
- release:
+ # Option 1 (default): Release to GitHub, publish to PyPI, and deploy docs.
+ #
+ # The wheel is uploaded to PyPI so users can install with `pip install`.
+ # A GitHub release is created with the changelog as the release body, and
+ # the Sphinx documentation is rebuilt and deployed to GitHub Pages.
+ #
+ # Choose this for open-source packages distributed via PyPI and/or
+ # conda-forge where broad public availability is the goal.
+ build-release:
uses: scikit-package/release-scripts/.github/workflows/_build-wheel-release-upload.yml@v0
with:
project: diffpy.srreal
c_extension: true
- maintainer_GITHUB_username: sbillinge
+ maintainer_github_username: sbillinge
secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
+
+ # Option 2: Release to GitHub and deploy docs, without publishing to PyPI.
+ #
+ # A GitHub release is created and the Sphinx docs are deployed, but the
+ # wheel is not uploaded to PyPI. The source code remains publicly visible
+ # on GitHub and can be installed directly from there.
+ #
+ # Choose this when the package is public but you prefer to keep it off the
+ # default pip index — for example, if you distribute via conda-forge only,
+ # or if the package is not yet ready for a permanent PyPI presence.
+ #
+ # To use: comment out Option 1 above and uncomment the lines below.
+ # build-release-no-pypi:
+ # uses: scikit-package/release-scripts/.github/workflows/_build-release-github-no-pypi.yml@v0
+ # with:
+ # project: diffpy.srreal
+ # c_extension: true
+ # maintainer_github_username: sbillinge
+ # secrets:
+ # PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
+
+ # Option 3: Release to GitHub with wheel, license, and instructions bundled
+ # as a downloadable zip attached to the GitHub release asset.
+ #
+ # The wheel is built and packaged together with INSTRUCTIONS.txt and the
+ # LICENSE file into a zip that is attached directly to the GitHub release.
+ # Users with access to the (private) repo download the zip, follow the
+ # instructions inside, and install locally with pip. No PyPI or conda-forge
+ # upload occurs, and no docs are deployed.
+ #
+ # Choose this for private or restricted packages where distribution must be
+ # controlled: only users with repo access can download the release asset,
+ # making the GitHub release itself the distribution channel.
+ #
+ # To use: comment out Option 1 above and uncomment the lines below.
+ # build-release-private:
+ # uses: scikit-package/release-scripts/.github/workflows/_build-release-github-private-pure.yml@v0
+ # with:
+ # project: diffpy.srreal
+ # maintainer_github_username: sbillinge
+ # secrets:
+ # PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
diff --git a/.github/workflows/check-news-item.yml b/.github/workflows/check-news-item.yml
index 88908d6..2ac3c85 100644
--- a/.github/workflows/check-news-item.yml
+++ b/.github/workflows/check-news-item.yml
@@ -3,7 +3,7 @@ name: Check for News
on:
pull_request_target:
branches:
- - main
+ - main # GitHub does not evaluate expressions in trigger filters; edit this value if your base branch is not main
jobs:
check-news-item:
diff --git a/.github/workflows/matrix-and-codecov-on-merge-to-main.yml b/.github/workflows/matrix-and-codecov.yml
similarity index 84%
rename from .github/workflows/matrix-and-codecov-on-merge-to-main.yml
rename to .github/workflows/matrix-and-codecov.yml
index 9d2881b..45171c6 100644
--- a/.github/workflows/matrix-and-codecov-on-merge-to-main.yml
+++ b/.github/workflows/matrix-and-codecov.yml
@@ -1,9 +1,9 @@
-name: CI
+name: Matrix and Codecov
on:
- push:
- branches:
- - main
+ # push:
+ # branches:
+ # - main
release:
types:
- prereleased
diff --git a/.github/workflows/publish-docs-on-release.yml b/.github/workflows/publish-docs-on-release.yml
deleted file mode 100644
index 108cc18..0000000
--- a/.github/workflows/publish-docs-on-release.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: Deploy Documentation on Release
-
-on:
- workflow_dispatch:
-
-jobs:
- docs:
- uses: scikit-package/release-scripts/.github/workflows/_publish-docs-on-release.yml@v0
- with:
- project: diffpy.srreal
- c_extension: true
- headless: false
diff --git a/CODE-OF-CONDUCT.rst b/CODE-OF-CONDUCT.rst
index e8199ca..25fafe2 100644
--- a/CODE-OF-CONDUCT.rst
+++ b/CODE-OF-CONDUCT.rst
@@ -67,7 +67,7 @@ Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
-sb2896@columbia.edu. All complaints will be reviewed and investigated promptly and fairly.
+sbillinge@ucsb.edu. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
diff --git a/README.rst b/README.rst
index e73ac14..40a2f61 100644
--- a/README.rst
+++ b/README.rst
@@ -25,6 +25,7 @@
:target: https://anaconda.org/conda-forge/diffpy.srreal
.. |PR| image:: https://img.shields.io/badge/PR-Welcome-29ab47ff
+ :target: https://github.com/diffpy/diffpy.srreal/pulls
.. |PyPI| image:: https://img.shields.io/pypi/v/diffpy.srreal
:target: https://pypi.org/project/diffpy.srreal/
@@ -111,6 +112,19 @@ and run the following ::
pip install .
+This package also provides command-line utilities. To check the software has been installed correctly, type ::
+
+ diffpy.srreal --version
+
+You can also type the following command to verify the installation. ::
+
+ python -c "import diffpy.srreal; print(diffpy.srreal.__version__)"
+
+
+To view the basic usage and available commands, type ::
+
+ diffpy.srreal -h
+
Getting Started
---------------
@@ -149,7 +163,7 @@ Before contributing, please read our `Code of Conduct `_ or email Simon Billinge at sb2896@columbia.edu.
+For more information on diffpy.srreal please visit the project `web-page `_ or email the maintainers ``Simon Billinge(sbillinge@ucsb.edu)``.
Acknowledgements
----------------
diff --git a/cookiecutter.json b/cookiecutter.json
new file mode 100644
index 0000000..aa768a6
--- /dev/null
+++ b/cookiecutter.json
@@ -0,0 +1,20 @@
+{
+ "author_names": "Simon Billinge",
+ "author_emails": "sbillinge@ucsb.edu",
+ "maintainer_names": "Simon Billinge",
+ "maintainer_emails": "sbillinge@ucsb.edu",
+ "maintainer_github_usernames": "sbillinge",
+ "contributors": "Billinge Group members and community contributors",
+ "license_holders": "The Trustees of Columbia University in the City of New York",
+ "project_name": "diffpy.srreal",
+ "github_username_or_orgname": "diffpy",
+ "github_repo_name": "diffpy.srreal",
+ "conda_pypi_package_dist_name": "diffpy.srreal",
+ "package_dir_name": "diffpy.srreal",
+ "project_short_description": "Calculators for PDF, bond valence sum, and other quantities based on atom pair interaction.",
+ "project_keywords": "PDF, BVS, atom, overlap, calculator, real-space",
+ "minimum_supported_python_version": "3.12",
+ "maximum_supported_python_version": "3.14",
+ "project_needs_c_code_compiled": "Yes",
+ "project_has_gui_tests": "No"
+}
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 6ac5e09..c8bd549 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
-# diffpy.srreal documentation build configuration file, created by
+# diffpy.srreal documentation build configuration file, created by # noqa: E501
# sphinx-quickstart on Thu Jan 30 15:49:41 2014.
#
# This file is execfile()d with the current directory set to its
@@ -26,7 +26,7 @@
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use Path().resolve() to make it absolute, like shown here.
+# documentation root, use Path().resolve() to make it absolute, like shown here. # noqa: E501
# sys.path.insert(0, str(Path(".").resolve()))
sys.path.insert(0, str(Path("../..").resolve()))
sys.path.insert(0, str(Path("../../src").resolve()))
@@ -50,7 +50,7 @@
"sphinx.ext.intersphinx",
"sphinx_rtd_theme",
"sphinx_copybutton",
- "m2r",
+ "m2r2",
]
# Add any paths that contain templates here, relative to this directory.
@@ -319,7 +319,4 @@
# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {
- "numpy": ("https://numpy.org/doc/stable/", None),
- "python": ("https://docs.python.org/3", None),
-}
+# intersphinx_mapping = {'http://docs.python.org/': None}
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 71cc54f..c35a56a 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -9,6 +9,12 @@
| Software version |release|
| Last updated |today|.
+===============
+Getting started
+===============
+
+Welcome to the ``diffpy.srreal`` documentation!
+
The diffpy.srreal package provides calculators for atomic pair distribution
function (PDF), bond valence sums (BVS), atom overlaps for a hard-sphere
model, bond distances and directions up to specified maximum distance. The
@@ -43,11 +49,11 @@ pairs, by defining only the function that processes atom-pair contributions.
Authors
=======
-diffpy.srreal is developed by members of the Billinge Group at
+``diffpy.srreal`` is developed by members of the Billinge Group at
Columbia University and at Brookhaven National Laboratory including
Pavol Juhás, Christopher L. Farrow, Simon J.L. Billinge.
-For a detailed list of contributors see
+This project is maintained by Simon Billinge. For a detailed list of contributors see
https://github.com/diffpy/diffpy.srreal/graphs/contributors.
Reference
@@ -76,12 +82,12 @@ Acknowledgements
Table of contents
=================
.. toctree::
- :titlesonly:
+ :maxdepth: 2
- license
- release
examples
Package API
+ release
+ license
=======
Indices
diff --git a/docs/source/license.rst b/docs/source/license.rst
index 03c1eae..d94cb52 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -22,7 +22,7 @@ Copyright (c) 2008-2012, The Trustees of Columbia University in the City of New
Copyright (c) 2014-2019, Brookhaven Science Associates, Brookhaven National Laboratory
-Copyright (c) 2025, The Trustees of Columbia University in the City of New York.
+Copyright (c) 2025-2026, The Trustees of Columbia University in the City of New York.
All rights reserved.
The "DiffPy-CMI" is distributed subject to the following license conditions:
diff --git a/news/package-update.rst b/news/package-update.rst
new file mode 100644
index 0000000..a7fb5a9
--- /dev/null
+++ b/news/package-update.rst
@@ -0,0 +1,23 @@
+**Added:**
+
+*
+
+**Changed:**
+
+* Add support for python 3.14 and remove support for python 3.11
+
+**Deprecated:**
+
+*
+
+**Removed:**
+
+*
+
+**Fixed:**
+
+*
+
+**Security:**
+
+*
diff --git a/pyproject.toml b/pyproject.toml
index 840710d..1aa4de1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,20 +1,20 @@
[build-system]
-requires = ["setuptools>=62.0", "setuptools-git-versioning>=2.0", "numpy"]
+requires = ["setuptools>=62.0", "setuptools-git-versioning>=2.0"]
build-backend = "setuptools.build_meta"
[project]
name = "diffpy.srreal"
dynamic=['version', 'dependencies']
authors = [
- { name="Simon Billinge", email="sb2896@columbia.edu" },
+ {name='Simon Billinge', email='sbillinge@ucsb.edu'},
]
maintainers = [
- { name="Simon Billinge", email="sb2896@columbia.edu" },
+ {name='Simon Billinge', email='sbillinge@ucsb.edu'},
]
description = "Calculators for PDF, bond valence sum, and other quantities based on atom pair interaction."
keywords = ['PDF', 'BVS', 'atom', 'overlap', 'calculator', 'real-space']
readme = "README.rst"
-requires-python = ">=3.11, <3.14"
+requires-python = ">=3.12, <3.15"
classifiers = [
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
@@ -25,9 +25,9 @@ classifiers = [
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX',
'Operating System :: Unix',
- 'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
'Programming Language :: Python :: 3.13',
+ 'Programming Language :: Python :: 3.14',
'Topic :: Scientific/Engineering :: Physics',
'Topic :: Scientific/Engineering :: Chemistry',
]
@@ -48,6 +48,9 @@ include = ["*"] # package names should match these glob patterns (["*"] by defa
exclude = [] # exclude packages matching these glob patterns (empty by default)
namespaces = false # to disable scanning PEP 420 namespaces (true by default)
+[project.scripts]
+diffpy-srreal = "diffpy.srreal.srreal_app:main"
+
[tool.setuptools.dynamic]
dependencies = {file = ["requirements/pip.txt"]}
diff --git a/requirements/docs.txt b/requirements/docs.txt
index 5f34c6e..1de813f 100644
--- a/requirements/docs.txt
+++ b/requirements/docs.txt
@@ -2,4 +2,4 @@ sphinx
sphinx_rtd_theme
sphinx-copybutton
doctr
-m2r
+m2r2
diff --git a/src/diffpy/__init__.py b/src/diffpy/__init__.py
index 67de525..de4f90e 100644
--- a/src/diffpy/__init__.py
+++ b/src/diffpy/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
##############################################################################
#
-# (c) 2025 The Trustees of Columbia University in the City of New York.
+# (c) 2025-2026 The Trustees of Columbia University in the City of New York.
# All rights reserved.
#
# File coded by: Billinge Group members and community contributors.
@@ -12,11 +12,3 @@
# See LICENSE.rst for license information.
#
##############################################################################
-"""Blank namespace package for module diffpy."""
-
-
-from pkgutil import extend_path
-
-__path__ = extend_path(__path__, __name__)
-
-# End of file
diff --git a/src/diffpy/srreal/__init__.py b/src/diffpy/srreal/__init__.py
index 2beff97..793ebb2 100644
--- a/src/diffpy/srreal/__init__.py
+++ b/src/diffpy/srreal/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
##############################################################################
#
-# (c) 2025 The Trustees of Columbia University in the City of New York.
+# (c) 2025-2026 The Trustees of Columbia University in the City of New York.
# All rights reserved.
#
# File coded by: Billinge Group members and community contributors.
@@ -12,10 +12,11 @@
# See LICENSE.rst for license information.
#
##############################################################################
-"""Tools for real space structure analysis."""
+"""Calculators for PDF, bond valence sum, and other quantities based on
+atom pair interaction."""
# package version
-from diffpy.srreal.version import __version__
+from diffpy.srreal.version import __version__ # noqa
# silence the pyflakes syntax checker
assert __version__ or True
diff --git a/src/diffpy/srreal/srreal_app.py b/src/diffpy/srreal/srreal_app.py
new file mode 100644
index 0000000..030cb3b
--- /dev/null
+++ b/src/diffpy/srreal/srreal_app.py
@@ -0,0 +1,34 @@
+import argparse
+
+from diffpy.srreal.version import __version__ # noqa
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ prog="diffpy.srreal",
+ description=(
+ "Calculators for PDF, bond valence sum, and other quantities "
+ "based on atom pair interaction.\n\n"
+ "For more information, visit: "
+ "https://github.com/diffpy/diffpy.srreal/"
+ ),
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
+
+ parser.add_argument(
+ "--version",
+ action="store_true",
+ help="Show the program's version number and exit",
+ )
+
+ args = parser.parse_args()
+
+ if args.version:
+ print(f"diffpy.srreal {__version__}")
+ else:
+ # Default behavior when no arguments are given
+ parser.print_help()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/diffpy/srreal/version.py b/src/diffpy/srreal/version.py
index a988772..2150ebf 100644
--- a/src/diffpy/srreal/version.py
+++ b/src/diffpy/srreal/version.py
@@ -1,13 +1,13 @@
#!/usr/bin/env python
##############################################################################
#
-# (c) 2025 The Trustees of Columbia University in the City of New York.
+# (c) 2025-2026 The Trustees of Columbia University in the City of New York.
# All rights reserved.
#
# File coded by: Billinge Group members and community contributors.
#
# See GitHub contributions for a more detailed list of contributors.
-# https://github.com/diffpy/diffpy.srreal/graphs/contributors
+# https://github.com/diffpy/diffpy.srreal/graphs/contributors # noqa: E501
#
# See LICENSE.rst for license information.
#
@@ -20,12 +20,7 @@
# obtain version information
from importlib.metadata import PackageNotFoundError, version
-FALLBACK_VERSION = "1.3.0"
-
try:
__version__ = version("diffpy.srreal")
except PackageNotFoundError:
- __version__ = FALLBACK_VERSION
-
-
-# End of file
+ __version__ = "unknown"
diff --git a/tests/test_version.py b/tests/test_version.py
index d50b30d..92fee87 100644
--- a/tests/test_version.py
+++ b/tests/test_version.py
@@ -1,6 +1,6 @@
"""Unit tests for __version__.py."""
-import diffpy.srreal
+import diffpy.srreal # noqa
def test_package_version():