diff --git a/.flake8 b/.flake8
index 2d2cb16..a510511 100644
--- a/.flake8
+++ b/.flake8
@@ -1,10 +1,12 @@
+# As of now, flake8 does not natively support configuration via pyproject.toml
+# https://github.com/microsoft/vscode-flake8/issues/135
[flake8]
exclude =
.git,
__pycache__,
build,
dist,
- doc/source/conf.py
+ docs/source/conf.py
max-line-length = 115
# Ignore some style 'errors' produced while formatting by 'black'
# https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html#labels-why-pycodestyle-warnings
diff --git a/.github/ISSUE_TEMPLATE/release_checklist.md b/.github/ISSUE_TEMPLATE/release_checklist.md
index 6107962..56bcd01 100644
--- a/.github/ISSUE_TEMPLATE/release_checklist.md
+++ b/.github/ISSUE_TEMPLATE/release_checklist.md
@@ -34,7 +34,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-wheel-release-upload.yml b/.github/workflows/build-wheel-release-upload.yml
index 5d80dac..5dec5f6 100644
--- a/.github/workflows/build-wheel-release-upload.yml
+++ b/.github/workflows/build-wheel-release-upload.yml
@@ -7,7 +7,7 @@ on:
- "*" # Trigger on all tags initially, but tag and release privilege are verified in _build-wheel-release-upload.yml
jobs:
- release:
+ build-release:
uses: scikit-package/release-scripts/.github/workflows/_build-wheel-release-upload.yml@v0
with:
project: diffpy.pdffit2
diff --git a/.isort.cfg b/.isort.cfg
index e0926f4..7ce0fb1 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -1,4 +1,5 @@
[settings]
+# Keep import statement below line_length character limit
line_length = 115
multi_line_output = 3
include_trailing_comma = True
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
index 47f7a01..aaa8889 100644
--- a/.readthedocs.yaml
+++ b/.readthedocs.yaml
@@ -10,4 +10,4 @@ python:
- requirements: requirements/docs.txt
sphinx:
- configuration: doc/source/conf.py
+ configuration: docs/source/conf.py
diff --git a/CODE_OF_CONDUCT.rst b/CODE-OF-CONDUCT.rst
similarity index 100%
rename from CODE_OF_CONDUCT.rst
rename to CODE-OF-CONDUCT.rst
diff --git a/LICENSE.rst b/LICENSE.rst
index 040c880..092e90c 100644
--- a/LICENSE.rst
+++ b/LICENSE.rst
@@ -21,32 +21,26 @@ For more information please visit the project web-page:
or 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:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * 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.
-
- * 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 COPYRIGHT HOLDER "AS IS". COPYRIGHT HOLDER
-EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES AND CONDITIONS, EITHER
-EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, TITLE, FITNESS, ADEQUACY OR SUITABILITY
-FOR A PARTICULAR PURPOSE, AND ANY WARRANTIES OF FREEDOM FROM
-INFRINGEMENT OF ANY DOMESTIC OR FOREIGN PATENT, COPYRIGHTS, TRADE
-SECRETS OR OTHER PROPRIETARY RIGHTS OF ANY PARTY. IN NO EVENT SHALL
-COPYRIGHT HOLDER BE LIABLE TO ANY PARTY 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 OR RELATING TO THIS AGREEMENT, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
+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 4c90e84..0adcc4b 100644
--- a/README.rst
+++ b/README.rst
@@ -25,6 +25,7 @@
:target: https://anaconda.org/conda-forge/diffpy.pdffit2
.. |PR| image:: https://img.shields.io/badge/PR-Welcome-29ab47ff
+ :target: https://github.com/diffpy/diffpy.pdffit2/pulls
.. |PyPI| image:: https://img.shields.io/pypi/v/diffpy.pdffit2
:target: https://pypi.org/project/diffpy.pdffit2/
@@ -116,16 +117,18 @@ Install pdffit2 using ``pip`` to download and install the latest version from `P
pip install diffpy.pdffit2
-To confirm that the installation was successful, type ::
-
- python -c "import diffpy.pdffit2; print(diffpy.pdffit2.__version__)"
-
If you prefer to install from sources, after installing the dependencies, obtain the source archive from
`GitHub `_. Once installed, ``cd`` into your ``diffpy.pdffit2`` directory
and run the following ::
pip install .
+
+You can type the following command to verify the installation is successful. ::
+
+ python -c "import diffpy.pdffit2; print(diffpy.pdffit2.__version__)"
+
+
Getting Started
---------------
@@ -170,7 +173,7 @@ trying to commit again.
Improvements and fixes are always appreciated.
-Before contributing, please read our `Code of Conduct `_.
+Before contributing, please read our `Code of Conduct `_.
Contact
-------
diff --git a/cookiecutter.json b/cookiecutter.json
new file mode 100644
index 0000000..174c287
--- /dev/null
+++ b/cookiecutter.json
@@ -0,0 +1,18 @@
+{
+ "maintainer_name": "Simon Billinge",
+ "maintainer_email": "sb2896@columbia.edu",
+ "maintainer_github_username": "sbillinge",
+ "contributors": "Pavol Juhas, Chris Farrow, Simon Billinge, Billinge Group members",
+ "license_holders": "The Trustees of Columbia University in the City of New York",
+ "project_name": "diffpy.pdffit2",
+ "github_username_or_orgname": "diffpy",
+ "github_repo_name": "diffpy.pdffit2",
+ "conda_pypi_package_dist_name": "diffpy.pdffit2",
+ "package_dir_name": "diffpy.pdffit2",
+ "project_short_description": "PDFfit2 - real space structure refinement program.",
+ "project_keywords": "PDF, structure refinement",
+ "minimum_supported_python_version": "3.11",
+ "maximum_supported_python_version": "3.13",
+ "project_needs_c_code_compiled": "Yes",
+ "project_has_gui_tests": "No"
+}
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 58fb11f..cf1514d 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
-# diffpy.pdffit2 documentation build configuration file, created by
+# diffpy.pdffit2 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
@@ -22,17 +22,19 @@
try:
fullversion = version("diffpy.pdffit2")
except Exception:
- fullversion = "No version found. The correct version will appear in the released version."
+ fullversion = "No version found. The correct version will appear in the released version." # noqa: E501
# 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()))
# abbreviations
-ab_authors = "Billinge group and community members."
+ab_authors = (
+ "Pavol Juhas, Chris Farrow, Simon Billinge, Billinge Group members"
+)
# -- General configuration ------------------------------------------------
@@ -56,7 +58,6 @@
autodoc_mock_imports = [
"diffpy.pdffit2.pdffit2",
]
-
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
@@ -144,7 +145,7 @@
"github_user": "diffpy",
"github_repo": "diffpy.pdffit2",
"github_version": "main",
- "conf_py_path": "/doc/source/",
+ "conf_py_path": "/docs/source/",
}
# Theme options are theme-specific and customize the look and feel of a theme
diff --git a/docs/source/license.rst b/docs/source/license.rst
index fbdd3ed..5cdf347 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -25,32 +25,26 @@ For more information please visit the project web-page:
or 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:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * 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.
-
- * 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 COPYRIGHT HOLDER "AS IS". COPYRIGHT HOLDER
-EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES AND CONDITIONS, EITHER
-EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, TITLE, FITNESS, ADEQUACY OR SUITABILITY
-FOR A PARTICULAR PURPOSE, AND ANY WARRANTIES OF FREEDOM FROM
-INFRINGEMENT OF ANY DOMESTIC OR FOREIGN PATENT, COPYRIGHTS, TRADE
-SECRETS OR OTHER PROPRIETARY RIGHTS OF ANY PARTY. IN NO EVENT SHALL
-COPYRIGHT HOLDER BE LIABLE TO ANY PARTY 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 OR RELATING TO THIS AGREEMENT, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
+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/pyproject.toml b/pyproject.toml
index af52ce0..959054d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -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-pdffit2 = "diffpy.pdffit2_app:main"
+
[tool.setuptools.dynamic]
dependencies = {file = ["requirements/pip.txt"]}
diff --git a/src/diffpy/__init__.py b/src/diffpy/__init__.py
index 2efe939..04d8ace 100644
--- a/src/diffpy/__init__.py
+++ b/src/diffpy/__init__.py
@@ -14,13 +14,3 @@
# See LICENSE.rst for license information.
#
##############################################################################
-"""diffpy - tools for structure analysis by diffraction.
-
-Blank namespace package for module diffpy."""
-
-
-from pkgutil import extend_path
-
-__path__ = extend_path(__path__, __name__)
-
-# End of file
diff --git a/src/diffpy/pdffit2/pdffit2_app.py b/src/diffpy/pdffit2/pdffit2_app.py
new file mode 100644
index 0000000..d8ff2fd
--- /dev/null
+++ b/src/diffpy/pdffit2/pdffit2_app.py
@@ -0,0 +1,33 @@
+import argparse
+
+from diffpy.pdffit2.version import __version__ # noqa
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ prog="diffpy.pdffit2",
+ description=(
+ "PDFfit2 - real space structure refinement program.\n\n"
+ "For more information, visit: "
+ "https://github.com/diffpy/diffpy.pdffit2/"
+ ),
+ 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.pdffit2 {__version__}")
+ else:
+ # Default behavior when no arguments are given
+ parser.print_help()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/diffpy/pdffit2/version.py b/src/diffpy/pdffit2/version.py
index 8615928..7a1eaaa 100644
--- a/src/diffpy/pdffit2/version.py
+++ b/src/diffpy/pdffit2/version.py
@@ -7,17 +7,22 @@
# File coded by: Billinge Group members and community contributors.
#
# See GitHub contributions for a more detailed list of contributors.
-# https://github.com/diffpy/diffpy.pdffit2/graphs/contributors
+# https://github.com/diffpy/diffpy.pdffit2/graphs/contributors # noqa: E501
#
# See LICENSE.rst for license information.
#
##############################################################################
"""Definition of __version__."""
+# We do not use the other three variables, but can be added back if needed.
+# __all__ = ["__date__", "__git_commit__", "__timestamp__", "__version__"]
+
import datetime
import json
import urllib.request
-from importlib.metadata import version
+
+# obtain version information
+from importlib.metadata import PackageNotFoundError, version
from pathlib import Path
@@ -57,9 +62,9 @@ def get_pypi_release_date(package_name, timeout=5):
return str(release_date)
-__version__ = version("diffpy.pdffit2")
__date__ = get_pypi_release_date("diffpy.pdffit2")
-# End of file
-
-# Release date: 2025-02-07
+try:
+ __version__ = version("diffpy.pdffit2")
+except PackageNotFoundError:
+ __version__ = "unknown"
diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py
index 83f2b37..07a4f4e 100644
--- a/tests/test_exceptions.py
+++ b/tests/test_exceptions.py
@@ -18,7 +18,8 @@
import pytest
-from diffpy.pdffit2 import PdfFit, pdffit2
+from diffpy.pdffit2 import pdffit2
+from diffpy.pdffit2.pdffit import PdfFit
class read_structExceptions(unittest.TestCase):
diff --git a/tests/test_pdffit.py b/tests/test_pdffit.py
index 7336f0e..54b1a1c 100644
--- a/tests/test_pdffit.py
+++ b/tests/test_pdffit.py
@@ -6,7 +6,8 @@
import pytest
-from diffpy.pdffit2 import PdfFit, pdffit2
+from diffpy.pdffit2 import pdffit2
+from diffpy.pdffit2.pdffit import PdfFit
from diffpy.structure import loadStructure
# ----------------------------------------------------------------------------
diff --git a/tests/test_phase_fractions.py b/tests/test_phase_fractions.py
index ac33ec6..c86961e 100644
--- a/tests/test_phase_fractions.py
+++ b/tests/test_phase_fractions.py
@@ -6,7 +6,7 @@
import pytest
-from diffpy.pdffit2 import PdfFit
+from diffpy.pdffit2.pdffit import PdfFit
##############################################################################
diff --git a/tests/test_shape_factors.py b/tests/test_shape_factors.py
index 110ce55..70424e5 100644
--- a/tests/test_shape_factors.py
+++ b/tests/test_shape_factors.py
@@ -8,7 +8,8 @@
import numpy
import pytest
-from diffpy.pdffit2 import PdfFit, pdffit2
+from diffpy.pdffit2 import pdffit2
+from diffpy.pdffit2.pdffit import PdfFit
def spherefactor(r, d):
diff --git a/tests/test_version.py b/tests/test_version.py
index b9b25b0..a232202 100644
--- a/tests/test_version.py
+++ b/tests/test_version.py
@@ -1,6 +1,6 @@
"""Unit tests for __version__.py."""
-import diffpy.pdffit2
+import diffpy.pdffit2 # noqa
def test_package_version():