diff --git a/.github/workflows/build-wheel-release-upload.yml b/.github/workflows/build-wheel-release-upload.yml new file mode 100644 index 0000000..489111e --- /dev/null +++ b/.github/workflows/build-wheel-release-upload.yml @@ -0,0 +1,18 @@ +name: Release (GitHub/PyPI) and Deploy Docs + +on: + workflow_dispatch: + push: + tags: + - "*" # Trigger on all tags initially, but tag and release privilege are verified in _build-wheel-release-upload.yml + +jobs: + build-release: + uses: scikit-package/release-scripts/.github/workflows/_build-wheel-release-upload.yml@v0 + with: + project: diffpy.srxconfutils + c_extension: false + maintainer_GITHUB_username: sbillinge + secrets: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + PAT_TOKEN: ${{ secrets.PAT_TOKEN }} diff --git a/.github/workflows/build-wheel-release.yml b/.github/workflows/build-wheel-release.yml deleted file mode 100644 index 8409857..0000000 --- a/.github/workflows/build-wheel-release.yml +++ /dev/null @@ -1,230 +0,0 @@ -name: Build Wheels and Release - -on: - workflow_dispatch: - push: - tags: - - "*" - -env: - PYTHON_VERSIONS: '["3.11","3.12","3.13"]' - -permissions: - contents: write - actions: read - packages: write - -concurrency: - group: build-wheels-${{ github.ref }} - cancel-in-progress: true - -defaults: - run: - shell: bash {0} - -jobs: - get-python-versions: - runs-on: ubuntu-latest - outputs: - py_ver: ${{ steps.set.outputs.py_ver }} - py_last: ${{ steps.set.outputs.py_last }} - steps: - - id: set - run: | - echo py_ver=$PYTHON_VERSIONS >> $GITHUB_OUTPUT - echo "py_last=${{ fromJson(env.PYTHON_VERSIONS)[0] }}" >> $GITHUB_OUTPUT - - check-tag-on-main: - runs-on: ubuntu-latest - steps: - - name: Checkout repository with full history - uses: actions/checkout@v4 - with: - token: ${{ secrets.PAT_TOKEN }} - fetch-depth: 0 - - - name: Verify tag - run: | - git fetch origin main - TAG_COMMIT=$(git rev-parse ${{ github.ref_name }}) - if git merge-base --is-ancestor "$TAG_COMMIT" origin/main; then - echo "Tag ${{ github.ref_name }} ($TAG_COMMIT) is contained in main" - else - echo "::error::Tag ${{ github.ref_name }} ($TAG_COMMIT) is not found in main. Please release from the main branch." - exit 1 - fi - - check-tag-privilege: - # No third party actions used - uses: scikit-package/release-scripts/.github/workflows/_check-tag-privilege.yml@v0 - with: - maintainer_github_username: sbillinge - - build-sdist: - needs: [check-tag-privilege, get-python-versions, check-tag-on-main] - runs-on: ubuntu-latest - - steps: - - name: Checkout - # GitHub officially-maintained actions - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Python - # GitHub officially-maintained actions - uses: actions/setup-python@v5 - with: - python-version: ${{ needs.get-python-versions.outputs.py_last }} - - - name: Build docs and remove fonts that blow up the wheel size - run: | - python -m pip install Sphinx sphinx-rtd-theme sphinx-copybutton m2r - cd docs - make html - cd build/html/_static/css/fonts - find . -type f ! -name '*.ttf' -delete - cd ../.. - rm -rf fonts - cd .. - rm -rf _sources - cd .. - rm -rf doctrees - cd ../.. - - - name: Make sdist - run: | - python -m pip install --upgrade pip build cython setuptools setuptools-git-versioning - python -m build --sdist --no-isolation - - - name: Strip source codes - run: | - set -euo pipefail - tar xf dist/diffpy_srxconfutils-*.tar.gz - SRC_DIR=$(find . -maxdepth 1 -type d -name 'diffpy_srxconfutils-*' | head -n1) - find "$SRC_DIR" -type f -name '*.c' -print0 \ - | xargs -0 perl -i.bak -0777 -pe 's{/\*.*?\*/}{}gs' - find "$SRC_DIR" -type f -name '*.c.bak' -delete - tar czf dist/"${SRC_DIR#./}".tar.gz "$SRC_DIR" - rm -rf "$SRC_DIR" - - - name: Upload sdist - # GitHub officially-maintained actions - uses: actions/upload-artifact@v4 - with: - name: sdist - path: dist/ - retention-days: 1 - - - name: Upload INSTRUCTIONS.txt - uses: actions/upload-artifact@v4 - with: - name: instructions - path: INSTRUCTIONS.txt - - build-wheels: - needs: [build-sdist, get-python-versions] - - name: Build wheels ${{ matrix.python }}-${{ matrix.buildplat }} - runs-on: ${{ matrix.buildplat }} - strategy: - fail-fast: false - matrix: - buildplat: - - ubuntu-latest - - macos-14 - - windows-latest - python: ${{ fromJSON(needs.get-python-versions.outputs.py_ver) }} - steps: - - name: Download sdist - # GitHub officially-maintained actions - uses: actions/download-artifact@v4 - with: - name: sdist - path: dist/ - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - - name: Build wheels - run: | - # setuptools-git-versioning only look into .git and PKG-INFO in the top directory - which python; python --version - which pip; pip --version - python -m pip install --upgrade pip build cython setuptools setuptools-git-versioning - tar xf dist/diffpy_srxconfutils-*.tar.gz - cd diffpy_srxconfutils-* - python -m pip wheel . --no-deps --no-build-isolation --wheel-dir ./../dist - - - name: Upload wheels - uses: actions/upload-artifact@v4 - with: - name: wheels-${{ matrix.python }}-${{ matrix.buildplat }} - path: dist/*.whl - - test-wheels: - needs: [build-wheels, get-python-versions] - - name: Test wheels ${{ matrix.python }}-${{ matrix.buildplat }} - runs-on: ${{ matrix.buildplat }} - strategy: - fail-fast: false - matrix: - buildplat: - - ubuntu-latest - - macos-14 - - windows-latest - python: ${{ fromJson(needs.get-python-versions.outputs.py_ver) }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Download wheels - uses: actions/download-artifact@v4 - with: - name: wheels-${{ matrix.python }}-${{ matrix.buildplat }} - path: dist/ - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - - name: Install wheels - run: | - python -m pip install --upgrade pip pytest setuptools-git-versioning - python -m pip install dist/*.whl - - - name: Assert no source files in installed package - run: | - # For debugging - # touch $(python -c "import sysconfig, os; print(os.path.join(sysconfig.get_paths()['purelib'], 'diffpy/srxconfutils', 'fake.py'))") - python - << 'EOF' - import os, glob, sys, sysconfig - sp = sysconfig.get_paths()['purelib'] - pkg = os.path.join(sp, 'diffpy', 'srxconfutils') - patterns = [os.path.join(pkg, '*.py'), - os.path.join(pkg, '*.c')] - bad = [] - for p in patterns: - bad.extend(glob.glob(p)) - - if bad: - print("Found leftover source files in installed package:") - for f in bad: - print(" -", f) - sys.exit(1) - - print("No .py or .c files present in diffpy/srxconfutils/") - EOF - - - name: Run tests - run: python -m pytest - - release: - needs: [test-wheels] - uses: ./.github/workflows/release-github.yml - secrets: - PAT_TOKEN: ${{ secrets.PAT_TOKEN }} diff --git a/.github/workflows/matrix-and-codecov-on-merge-to-main.yml b/.github/workflows/matrix-and-codecov-on-merge-to-main.yml index 4745dc9..9917abf 100644 --- a/.github/workflows/matrix-and-codecov-on-merge-to-main.yml +++ b/.github/workflows/matrix-and-codecov-on-merge-to-main.yml @@ -12,8 +12,10 @@ on: jobs: matrix-coverage: - uses: scikit-package/release-scripts/.github/workflows/_matrix-no-codecov-on-merge-to-main.yml@v0 + uses: scikit-package/release-scripts/.github/workflows/_matrix-and-codecov-on-merge-to-main.yml@v0 with: project: diffpy.srxconfutils c_extension: false headless: false + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/publish-docs-on-release.yml b/.github/workflows/publish-docs-on-release.yml new file mode 100644 index 0000000..7dc7d93 --- /dev/null +++ b/.github/workflows/publish-docs-on-release.yml @@ -0,0 +1,12 @@ +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.srxconfutils + c_extension: false + headless: false diff --git a/.github/workflows/release-github.yml b/.github/workflows/release-github.yml deleted file mode 100644 index 3e78d1d..0000000 --- a/.github/workflows/release-github.yml +++ /dev/null @@ -1,163 +0,0 @@ -name: Release on GitHub - -on: - workflow_call: - secrets: - PAT_TOKEN: - description: "GitHub Personal Access Token" - required: true - -env: - TAG: ${{ github.ref_name }} - -defaults: - run: - shell: bash {0} - -jobs: - prepare-release: - if: ${{ ! contains(github.ref, 'rc') }} - runs-on: ubuntu-latest - steps: - - name: Checkout the repository - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - fetch-depth: 0 - ref: main - - - name: Update CHANGELOG - run: | - wget https://raw.githubusercontent.com/scikit-package/release-scripts/v0/.github/workflows/update-changelog.py - python update-changelog.py "$TAG" - rm update-changelog.py - - - name: Commit updated CHANGELOG.rst - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add . - if ! git diff --cached --quiet; then - git commit -m "update changelog for $TAG" - git push origin main - else - echo "No CHANGELOG.rst changes" - fi - - - name: New tag - run: | - git fetch --tags - git tag -d "$TAG" 2>/dev/null || true - git push origin ":$TAG" 2>/dev/null || true - git tag "$TAG" - git push origin "$TAG" - - - name: Get CHANGELOG.txt - run: | - wget https://raw.githubusercontent.com/scikit-package/release-scripts/v0/.github/workflows/get-latest-changelog.py - python get-latest-changelog.py "$TAG" - rm get-latest-changelog.py - - - name: Upload changelog.txt - uses: actions/upload-artifact@v4 - with: - name: changelog - path: CHANGELOG.txt - - release: - needs: [prepare-release] - if: always() - runs-on: ubuntu-latest - env: - REPO_FULL: ${{ github.repository }} - PAT_TOKEN: ${{ secrets.PAT_TOKEN }} - steps: - - name: Check prepare release - run: | - if [[ ${{ needs.prepare-release.result }} != 'success' && "$TAG" != *rc* ]]; then - echo "::error::Skipping release job because prepare-release failed" - exit 78 - fi - echo "Continuing with release job" - - - name: Download built wheels - uses: actions/download-artifact@v4 - with: - path: dist/ - - - name: Download changelog - if: ${{ needs.prepare-release.result == 'success' }} - uses: actions/download-artifact@v4 - with: - name: changelog - path: . - - - name: Download instructions - uses: actions/download-artifact@v4 - with: - name: instructions - path: . - - - name: Zip wheels and instructions into dist/srxconfutils-$TAG-wheels.zip - run: | - mkdir -p dist - find dist -type f -name '*.whl' | zip -j dist/srxconfutils-"$TAG"-wheels.zip -@ - zip -j dist/srxconfutils-"$TAG"-wheels.zip INSTRUCTIONS.txt - - - name: Prepare release metadata - id: meta - run: | - if [[ "$TAG" == *rc* ]]; then - PRERELEASE=true - TITLE="Pre-release $TAG" - BODY_RAW="Changelog: https://github.com/$REPO_FULL/commits/$TAG" - else - PRERELEASE=false - TITLE="Release $TAG" - BODY_RAW=$( payload.json - - echo "Release metadata:" - cat payload.json - - - name: Create GitHub Release - id: create_release - run: | - set -euo pipefail - - HTTP_STATUS=$( - curl --silent --output resp.json --write-out "%{http_code}" \ - -X POST "https://api.github.com/repos/$REPO_FULL/releases" \ - -H "Accept: application/vnd.github+json" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $PAT_TOKEN" \ - --data @payload.json - ) - if [[ "$HTTP_STATUS" -ne 201 ]]; then - echo "::error::Failed to create release (status $HTTP_STATUS)" - exit 1 - fi - - UPLOAD_URL=$(jq -r .upload_url resp.json | sed 's/{.*}//') - echo "upload_url=$UPLOAD_URL" >> $GITHUB_OUTPUT - - - name: Upload srxconfutils-$TAG-wheels.zip - if: steps.create_release.outputs.upload_url != '' - run: | - FILE=dist/srxconfutils-$TAG-wheels.zip - echo "Uploading asset: $FILE" - curl --silent --fail --data-binary @"$FILE" \ - -H "Content-Type: application/zip" \ - -H "Authorization: Bearer $PAT_TOKEN" \ - "${{ steps.create_release.outputs.upload_url }}?name=$(basename "$FILE")" diff --git a/.github/workflows/tests-on-pr.yml b/.github/workflows/tests-on-pr.yml index baf31cd..c9ce88f 100644 --- a/.github/workflows/tests-on-pr.yml +++ b/.github/workflows/tests-on-pr.yml @@ -6,12 +6,11 @@ on: jobs: tests-on-pr: - uses: scikit-package/release-scripts/.github/workflows/_tests-on-pr-no-codecov.yml@v0 + uses: scikit-package/release-scripts/.github/workflows/_tests-on-pr.yml@v0 with: project: diffpy.srxconfutils c_extension: false headless: false python_version: 3.13 - run: | - conda install pre-commit - pre-commit run --all-files + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/LICENSENOTICE.rst b/LICENSENOTICE.rst index db80319..c01cc33 100644 --- a/LICENSENOTICE.rst +++ b/LICENSENOTICE.rst @@ -1,10 +1,29 @@ -Use of this software is subject to and permitted only under a separate, -written Use License granted by Columbia University. If you or your employer -is not a party to such an agreement, then your use of this software is -prohibited. If you don’t know whether or not your anticipated use is under -a license, you must contact Prof. Simon Billinge at sb2896@columbia.edu. -Use of this software without a license is prohibited. +BSD 3-Clause License -Copyright 2009-2025, Trustees of Columbia University in the City of New York. +Copyright (c) 2009-2025, The Trustees of Columbia University in the City of New York. +All rights reserved. -For more information please email Prof. Simon Billinge at sb2896@columbia.edu +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.rst b/README.rst index 794e1d0..6fdd1dc 100644 --- a/README.rst +++ b/README.rst @@ -8,17 +8,30 @@ :target: https://diffpy.github.io/diffpy.srxconfutils :height: 100px -|PythonVersion| |PR| +|PyPI| |Forge| |PythonVersion| |PR| -|Black| |Tracking| +|CI| |Codecov| |Black| |Tracking| .. |Black| image:: https://img.shields.io/badge/code_style-black-black :target: https://github.com/psf/black +.. |CI| image:: https://github.com/diffpy/diffpy.srxconfutils/actions/workflows/matrix-and-codecov-on-merge-to-main.yml/badge.svg + :target: https://github.com/diffpy/diffpy.srxconfutils/actions/workflows/matrix-and-codecov-on-merge-to-main.yml + +.. |Codecov| image:: https://codecov.io/gh/diffpy/diffpy.srxconfutils/branch/main/graph/badge.svg + :target: https://codecov.io/gh/diffpy/diffpy.srxconfutils + +.. |Forge| image:: https://img.shields.io/conda/vn/conda-forge/diffpy.srxconfutils + :target: https://anaconda.org/conda-forge/diffpy.srxconfutils + .. |PR| image:: https://img.shields.io/badge/PR-Welcome-29ab47ff :target: https://github.com/diffpy/diffpy.srxconfutils/pulls -.. |PythonVersion| image:: https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13-blue +.. |PyPI| image:: https://img.shields.io/pypi/v/diffpy.srxconfutils + :target: https://pypi.org/project/diffpy.srxconfutils/ + +.. |PythonVersion| image:: https://img.shields.io/pypi/pyversions/diffpy.srxconfutils + :target: https://pypi.org/project/diffpy.srxconfutils/ .. |Tracking| image:: https://img.shields.io/badge/issue_tracking-github-blue :target: https://github.com/diffpy/diffpy.srxconfutils/issues @@ -36,42 +49,31 @@ If you use diffpy.srxconfutils in a scientific publication, we would like you to Installation ------------ -``diffpy.srxconfutils`` is normally installed as part of the ``xpdfsuite`` software, so please refer to the -installation instructions detailed in the ``README.rst`` file of ``xpdfsuite`` `here `_. - -Independent Installation ------------------------- -You can also install ``diffpy.srxconfutils`` independently for yourself. -Assuming you have a wheel file in the current working directory, in an active conda environment please type :: - - pip install ./diffpy.srxconfutils-VERSION.whl +The preferred method is to use `Miniconda Python +`_ +and install from the "conda-forge" channel of Conda packages. -where you replace VERSION with the actual version you have so the command matches the filename of the -wheel file you have. +To add "conda-forge" to the conda channels, run the following in a terminal. :: -The commands to create and activate the conda environment with name "conf-env" is :: + conda config --add channels conda-forge - conda create -n conf-env python=3.13 - conda activate conf-env +We want to install our packages in a suitable conda environment. +The following creates and activates a new environment named ``diffpy.srxconfutils_env`` :: -If you don't have conda installed, we recomment you install `miniconda -`_ -To install this software from a Python wheel distribution format execute :: + conda create -n diffpy.srxconfutils_env diffpy.srxconfutils + conda activate diffpy.srxconfutils_env - pip install ./diffpy.srxconfutils-VERSION.whl +The output should print the latest version displayed on the badges above. -If you are a developer, you can also install this package from sources. First, obtain the source archive -from `GitHub `_. -Install the packages in ``./requirements/conda.txt`` and ``./requirements/tests.txt`` -using the ``--file`` command :: +If the above does not work, you can use ``pip`` to download and install the latest release from +`Python Package Index `_. +To install using ``pip`` into your ``diffpy.srxconfutils_env`` environment, type :: - conda activate conf-env - conda install --file ./requirements/conda.txt - conda install --file ./requirements/tests.txt - pip install -e . # assuming you are in the top level directory of the package + pip install diffpy.srxconfutils -After installing the dependencies, ``cd`` into your ``diffpy.srxconfutils`` directory +If you prefer to install from sources, after installing the dependencies, obtain the source archive from +`GitHub `_. Once installed, ``cd`` into your ``diffpy.srxconfutils`` directory and run the following :: pip install . @@ -89,6 +91,38 @@ To view the basic usage and available commands, type :: diffpy.srxconfutils -h +Getting Started +--------------- + +You may consult our `online documentation `_ for tutorials and API references. + +Support and Contribute +---------------------- + +If you see a bug or want to request a feature, please `report it as an issue `_ and/or `submit a fix as a PR `_. + +Feel free to fork the project and contribute. To install diffpy.srxconfutils +in a development mode, with its sources being directly used by Python +rather than copied to a package directory, use the following in the root +directory :: + + pip install -e . + +To ensure code quality and to prevent accidental commits into the default branch, please set up the use of our pre-commit +hooks. + +1. Install pre-commit in your working environment by running ``conda install pre-commit``. + +2. Initialize pre-commit (one time only) ``pre-commit install``. + +Thereafter your code will be linted by black and isort and checked against flake8 before you can commit. +If it fails by black or isort, just rerun and it should pass (black and isort will modify the files so should +pass after they are modified). If the flake8 test fails please see the error messages and fix them manually before +trying to commit again. + +Improvements and fixes are always appreciated. + +Before contributing, please read our `Code of Conduct `_. Contact ------- diff --git a/cookiecutter.json b/cookiecutter.json index 629bacd..3d91046 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -2,7 +2,7 @@ "maintainer_name": "Simon J.L. Billinge group", "maintainer_email": "sb2896@columbia.edu", "maintainer_github_username": "sbillinge", - "contributors": "Billinge Group members", + "contributors": "Xiaohao Yang and Billinge Group members", "license_holders": "The Trustees of Columbia University in the City of New York", "project_name": "diffpy.srxconfutils", "github_username_or_orgname": "diffpy", diff --git a/news/update-workflows.rst b/news/update-workflows.rst new file mode 100644 index 0000000..6230e30 --- /dev/null +++ b/news/update-workflows.rst @@ -0,0 +1,23 @@ +**Added:** + +* No news added: Modified workflow files back to using the scikit-package workflow files + +**Changed:** + +* + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* + +**Security:** + +* diff --git a/pyproject.toml b/pyproject.toml index 80824ab..04ee942 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ authors = [ maintainers = [ { name="Simon J.L. Billinge group", email="sb2896@columbia.edu" }, ] -description = "Configuration utilities for dpx project. Part of xPDFsuite" +description = "Configuration utilities for project. Part of xPDFsuite" keywords = ['diffpy', 'pdf', 'data interpretation'] readme = "README.rst" requires-python = ">=3.11, <3.14" @@ -20,7 +20,7 @@ classifiers = [ 'Environment :: Console', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', - 'License :: Free To Use But Restricted', + 'License :: OSI Approved :: BSD License', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Microsoft :: Windows', 'Operating System :: POSIX', @@ -49,7 +49,7 @@ exclude = [] # exclude packages matching these glob patterns (empty by default) namespaces = false # to disable scanning PEP 420 namespaces (true by default) [project.scripts] -diffpy-srxconfutils = "diffpy.srxconfutils.app:main" +diffpy-srxconfutils = "diffpy.srxconfutils.srxconfutils_app:main" [tool.setuptools.dynamic] dependencies = {file = ["requirements/pip.txt"]} diff --git a/src/diffpy/srxconfutils/srxconfutils_app.py b/src/diffpy/srxconfutils/srxconfutils_app.py index f07f27b..0c0a986 100644 --- a/src/diffpy/srxconfutils/srxconfutils_app.py +++ b/src/diffpy/srxconfutils/srxconfutils_app.py @@ -7,7 +7,7 @@ def main(): parser = argparse.ArgumentParser( prog="diffpy.srxconfutils", description=( - "Configuration utilities for dpx project. Part of xPDFsuite\n\n" + "Configuration utilities for project. Part of xPDFsuite\n" "For more information, visit: " "https://github.com/diffpy/diffpy.srxconfutils/" ),