diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 908d4a0..54f6f7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: - setuptools-scm # Core - python - - qcelemental ==0.50.0rc3 + - qcelemental >=0.50.0rc5 - qcengine >=0.50rc1 # TODO temp - pydantic # Testing @@ -212,7 +212,7 @@ jobs: - setuptools-scm # Core - python - - qcelemental ==0.50.0rc3 + - qcelemental >=0.50.0rc5 # Docs - numpydoc - docutils diff --git a/CITATION.cff b/CITATION.cff index d4c257c..3ba1949 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -44,8 +44,8 @@ keywords: - mbe - schema license: BSD-3-Clause -version: 0.6.1 -date-released: '2026-03-11' +version: 0.7.1 +date-released: '2026-04-30' preferred-citation: type: article authors: diff --git a/docs/changelog.rst b/docs/changelog.rst index 564579b..c5baa03 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -33,6 +33,24 @@ Changelog :docs:`dev` for latest. +.. _`sec:cl071`: + +v0.7.1 / 2026-04-30 +=================== + +:docs:`v0.7.1` for current. :docs:`v0.5.2` for QCSchema v1. + +Enhancements +------------ +* :pr:`48` Maint -- Warning printing silenced, so `import qcmanybody` is clean. + Now depends on QCElemental >=0.50.0rc5 + +Bug Fixes +--------- +* :pr:`48` EE -- Electrostatic embedding potential bug with Psi4 fixed embedding + charges might appear in keywords even when no charges on molecule. + + .. _`sec:cl070`: v0.7.0 / 2026-03-27 diff --git a/pyproject.toml b/pyproject.toml index eac20b5..73c9a9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "numpy", "pydantic >=2.11; python_version <'3.14'", "pydantic >=2.12; python_version >='3.14'", - "qcelemental>=0.50.0rc3,<0.70.0", + "qcelemental>=0.50.0rc5,<0.70.0", ] [project.optional-dependencies] diff --git a/qcmanybody/models/v1/__init__.py b/qcmanybody/models/v1/__init__.py index ac40c33..e690c23 100644 --- a/qcmanybody/models/v1/__init__.py +++ b/qcmanybody/models/v1/__init__.py @@ -12,7 +12,6 @@ import importlib import sys -import warnings _MSG = ( "qcmanybody.models.v1 is active but incompatible with Python 3.14+ " @@ -21,10 +20,10 @@ "or migrate to qcmanybody.models.v2." ) -# Warn on import so users see the incompatibility when they explicitly import v1 -# Use FutureWarning (visible by default) so users notice the issue during import -if sys.version_info >= (3, 14): - warnings.warn(_MSG, FutureWarning, stacklevel=2) +# For a while, we used a FutureWarning (visible by default) so users notice the issue during import. +# Below works, but it interferes with clean `import qcmanybody`. So we'll rely on the instantiation errors. +# if sys.version_info >= (3, 14): +# warnings.warn(_MSG, FutureWarning, stacklevel=2) def _make_placeholder(name: str): diff --git a/qcmanybody/v1/__init__.py b/qcmanybody/v1/__init__.py index 70912e7..adcc654 100644 --- a/qcmanybody/v1/__init__.py +++ b/qcmanybody/v1/__init__.py @@ -1,6 +1,5 @@ import importlib import sys -import warnings _MSG = ( "qcmanybody.v1 is active but incompatible with Python 3.14+ " @@ -9,10 +8,10 @@ "or migrate to qcmanybody.v2." ) -# Warn on import so users see the incompatibility when they explicitly import v1 -# Use FutureWarning (visible by default) so users notice the issue during import -if sys.version_info >= (3, 14): - warnings.warn(_MSG, FutureWarning, stacklevel=2) +# For a while, we used a FutureWarning (visible by default) so users notice the issue during import. +# Below works, but it interferes with clean `import qcmanybody`. So we'll rely on the instantiation errors. +# if sys.version_info >= (3, 14): +# warnings.warn(_MSG, FutureWarning, stacklevel=2) def _make_placeholder(name: str): diff --git a/qcmanybody/v1/computer.py b/qcmanybody/v1/computer.py index 98a1e6a..70e2c91 100644 --- a/qcmanybody/v1/computer.py +++ b/qcmanybody/v1/computer.py @@ -410,8 +410,9 @@ def from_manybodyinput(cls, input_model: ManyBodyInput, build_tasks: bool = True component_results = {} for chem, label, imol in computer_model.qcmb_core.iterate_molecules(): - inp = AtomicInput(molecule=imol, **specifications[chem]["specification"]) - # inp = AtomicInput(molecule=imol, **specifications[chem]["specification"], extras={"psiapi": True}) # faster for p4 + # deepcopy so function_kwargs edits are independent between iterations + inp = AtomicInput(molecule=imol, **copy.deepcopy(specifications[chem]["specification"])) + # inp = AtomicInput(molecule=imol, **copy.deepcopy(specifications[chem]["specification"]), extras={"psiapi": True}) if imol.extras.get("embedding_charges"): # or test on self.embedding_charges ? if specifications[chem]["program"] == "psi4": diff --git a/qcmanybody/v2/computer.py b/qcmanybody/v2/computer.py index 8a677b9..e391e42 100644 --- a/qcmanybody/v2/computer.py +++ b/qcmanybody/v2/computer.py @@ -417,8 +417,9 @@ def from_manybodyinput(cls, input_model: ManyBodyInput, build_tasks: bool = True component_results = {} for chem, label, imol in computer_model.qcmb_core.iterate_molecules(): - inp = AtomicInput(molecule=imol, specification=specifications[chem]["specification"]) - # inp = AtomicInput(molecule=imol, specification=specifications[chem]["specification"], extras={"psiapi": True}) # faster for p4 + # deepcopy so function_kwargs edits are independent between iterations + inp = AtomicInput(molecule=imol, specification=copy.deepcopy(specifications[chem]["specification"])) + # inp = AtomicInput(molecule=imol, specification=copy.deepcopy(specifications[chem]["specification"]), extras={"psiapi": True}) # faster for p4 if imol.extras.get("embedding_charges"): # or test on self.embedding_charges ? if specifications[chem]["program"] == "psi4":