pyEQL 1.1.0__tar.gz → 1.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/dependabot.yml +5 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.pre-commit-config.yaml +5 -5
- {pyeql-1.1.0 → pyeql-1.1.2}/CHANGELOG.md +52 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/MANIFEST.in +0 -1
- {pyeql-1.1.0/src/pyEQL.egg-info → pyeql-1.1.2}/PKG-INFO +14 -12
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/changelog.md +52 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/chemistry.md +7 -1
- {pyeql-1.1.0 → pyeql-1.1.2}/pyproject.toml +68 -2
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.10.txt +36 -133
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.10_extras.txt +49 -128
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.11.txt +36 -129
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.11_extras.txt +48 -123
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.12.txt +36 -129
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.12_extras.txt +48 -123
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.9.txt +44 -138
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/macos-latest_py3.9_extras.txt +58 -132
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.10.txt +36 -133
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.10_extras.txt +49 -128
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.11.txt +36 -129
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.11_extras.txt +48 -123
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.12.txt +36 -129
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.12_extras.txt +48 -123
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.9.txt +44 -138
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/ubuntu-latest_py3.9_extras.txt +58 -132
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.10.txt +37 -135
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.10_extras.txt +49 -127
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.11.txt +37 -131
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.11_extras.txt +48 -122
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.12.txt +37 -131
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.12_extras.txt +48 -122
- pyeql-1.1.2/requirements/windows-latest_py3.9.txt +232 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/requirements/windows-latest_py3.9_extras.txt +58 -131
- pyeql-1.1.2/setup.cfg +11 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/__init__.py +1 -4
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/database/pyeql_db.json +2 -2
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/engines.py +43 -47
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/solution.py +48 -102
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/utils.py +47 -1
- {pyeql-1.1.0 → pyeql-1.1.2/src/pyEQL.egg-info}/PKG-INFO +14 -12
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL.egg-info/SOURCES.txt +0 -2
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL.egg-info/requires.txt +1 -1
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_solution.py +51 -10
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_utils.py +20 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_volume_concentration.py +7 -0
- pyeql-1.1.0/requirements/windows-latest_py3.9.txt +0 -327
- pyeql-1.1.0/setup.cfg +0 -103
- pyeql-1.1.0/src/pyEQL/pint_custom_units.txt +0 -52
- pyeql-1.1.0/src/pyEQL.egg-info/not-zip-safe +0 -1
- {pyeql-1.1.0 → pyeql-1.1.2}/.coveragerc +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.gitattributes +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/pull_request_template.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/release.yml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/workflows/post-process.yml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/workflows/release.yml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/workflows/testing.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.github/workflows/upgrade_dependencies.yml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.gitignore +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.readthedocs.yml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/.zenodo.json +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/AUTHORS.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/CITATION.cff +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/COPYING +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/LICENSE.txt +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/README.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/Makefile +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/_static/.gitignore +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/amounts.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/arithmetic.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/authors.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/class_solution.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/conf.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/contributing.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/creating.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/database.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/engines.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/.ipynb_checkpoints/pyEQL_demo_1-checkpoint.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/.ipynb_checkpoints/pyeql_demo-checkpoint.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_database-checkpoint.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_osmotic_pressure-checkpoint.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/.ipynb_checkpoints/speedup-checkpoint.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/pyEQL_demo_1.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/pyeql_demo.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/pyeql_tutorial_database.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/pyeql_tutorial_osmotic_pressure.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/examples/speedup.ipynb +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/index.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/installation.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/internal.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/license.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/mixing.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/quickstart.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/readme.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/requirements.txt +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/serialization.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/tutorials.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/docs/units.md +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/pyeql-logo.png +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/pyeql-logo.svg +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/setup.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/activity_correction.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/database/geothermal.dat +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/database/llnl.dat +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/database/phreeqc_license.txt +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/equilibrium.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/functions.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/Ringers lactate.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/normal saline.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/rainwater.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/seawater.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/urine.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/presets/wastewater.yaml +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/salt_ion_match.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL/solute.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL.egg-info/dependency_links.txt +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/src/pyEQL.egg-info/top_level.txt +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/conftest.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_activity.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_bulk_properties.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_debye_length.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_density.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_dielectric.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_effective_pitzer.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_equilibrium.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_functions.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_logging.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_mixed_electrolyte_activity.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_osmotic_coeff.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_phreeqc.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_salt_matching.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_solute.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tests/test_solute_properties.py +0 -0
- {pyeql-1.1.0 → pyeql-1.1.2}/tox.ini +0 -0
|
@@ -12,18 +12,18 @@ ci:
|
|
|
12
12
|
|
|
13
13
|
repos:
|
|
14
14
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
15
|
-
rev: v0.
|
|
15
|
+
rev: v0.5.5
|
|
16
16
|
hooks:
|
|
17
17
|
- id: ruff
|
|
18
18
|
args: [--fix, --ignore, "D,E501", "--show-fixes"]
|
|
19
19
|
|
|
20
|
-
- repo: https://github.com/psf/black
|
|
21
|
-
rev: 24.2
|
|
20
|
+
- repo: https://github.com/psf/black-pre-commit-mirror
|
|
21
|
+
rev: 24.4.2
|
|
22
22
|
hooks:
|
|
23
23
|
- id: black
|
|
24
24
|
|
|
25
25
|
- repo: https://github.com/codespell-project/codespell
|
|
26
|
-
rev: v2.
|
|
26
|
+
rev: v2.3.0
|
|
27
27
|
hooks:
|
|
28
28
|
- id: codespell
|
|
29
29
|
stages: [commit, commit-msg]
|
|
@@ -31,7 +31,7 @@ repos:
|
|
|
31
31
|
additional_dependencies: [tomli] # needed to read pyproject.toml below py3.11
|
|
32
32
|
|
|
33
33
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
34
|
-
rev: v4.
|
|
34
|
+
rev: v4.6.0
|
|
35
35
|
hooks:
|
|
36
36
|
- id: check-case-conflict
|
|
37
37
|
- id: check-symlinks
|
|
@@ -5,6 +5,58 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.2] - 2024-07-28
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `Solution`: Fix a bug in which setting `balance_charge` to `auto` when the initial
|
|
13
|
+
composition was electroneutral would cause errors and/or improper charge balancing
|
|
14
|
+
after `equilibrate` was called.
|
|
15
|
+
|
|
16
|
+
## [1.1.1] - 2024-07-27
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- `equilibrate`: Fixed a bug that could cause an `AttributeError` when pH was used for charge
|
|
21
|
+
balancing.
|
|
22
|
+
- Database: `size.radius_ionic` was missing units for `Ni[+2]` and `Cr[+3]`. Correct units have been added.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `Solution`: New automatic charge balancing method will automatically identify the majority (highest concentration)
|
|
27
|
+
cation or anion as appropriate (depending on the charge balance) for charge balancing. To use this mode, set
|
|
28
|
+
`balance_charge='auto'` when instantiating a `Solution`.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- `Solution.add_amount`: This method will now add solutes that are absent from the Solution. Previously, calling, e.g.,
|
|
33
|
+
`add_amount('Na+', '1 mol')` on a `Solution` that did not contain any sodium would result in an error. A warning
|
|
34
|
+
is logged if the method has to add a new solute.
|
|
35
|
+
- Units: use the upstream chemistry context from `pint` instead of the custom one from 2013.
|
|
36
|
+
- `pre-commit autoupdate`
|
|
37
|
+
- Misc. linting and code quality improvements.
|
|
38
|
+
- Unit tests: update `tmpdir` to `tmp_path` text fixture.
|
|
39
|
+
- CI: Small updates to pre-commit and GitHub actions per scientific python [repo review](https://scientific-python.github.io/repo-review/?repo=kingsburylab%2FpyEQL&branch=main).
|
|
40
|
+
|
|
41
|
+
## [1.0.3] - 2024-07-20
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- `standardize_formula`: Fix incorrect display of additional formulas, including methane which
|
|
46
|
+
was shown as "H4C(aq)", other tri-anions (N3-, P3-), and a variety of haloacetic acids. For
|
|
47
|
+
example, tricholoracetic acid was previously shown as `'C2Cl3O2[-1]'` but will now display
|
|
48
|
+
as `'CCl3COO[-1]'`.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- `standardize_formula`: `pyEQL` can now parse ion formulas that contain unicode superscript
|
|
53
|
+
or subscript characters, which makes input even more flexible. For example, `"PO₄³⁻"` and `"Co²⁺"`
|
|
54
|
+
will now standardize correctly to `"PO4[-3]"` and `"Co[+2]"`, respectively.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- Housekeeping: move all project configuration to `pyproject.toml`
|
|
59
|
+
|
|
8
60
|
## [1.0.2] - 2024-07-09
|
|
9
61
|
|
|
10
62
|
### Fixed
|
|
@@ -2,6 +2,5 @@ include README COPYING CHANGELOG LICENSE README.md README.rst README.txt CHANGES
|
|
|
2
2
|
recursive-include src/pyEQL/database/ *
|
|
3
3
|
recursive-include src/pyEQL/presets/ *
|
|
4
4
|
recursive-include docs/ *
|
|
5
|
-
include src/pyEQL/pint_custom_units.txt
|
|
6
5
|
prune docs/build
|
|
7
6
|
global-exclude *.pyc *~ .DS_Store *__pycache__* *.pyo
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyEQL
|
|
3
|
-
Version: 1.1.
|
|
4
|
-
Summary:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
Version: 1.1.2
|
|
4
|
+
Summary: A python interface for solution chemistry
|
|
5
|
+
Author-email: Ryan Kingsbury <kingsbury@princeton.edu>
|
|
6
|
+
Project-URL: Docs, https://pyeql.readthedocs.io/
|
|
7
|
+
Project-URL: Repo, https://github.com/KingsburyLab/pyEQL
|
|
8
|
+
Project-URL: Package, https://pypi.org/project/pyEQL
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
11
14
|
Classifier: Development Status :: 4 - Beta
|
|
12
|
-
Classifier: Programming Language :: Python
|
|
13
15
|
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
14
17
|
Classifier: Topic :: Scientific/Engineering
|
|
15
|
-
Classifier: Topic :: Software Development :: Libraries
|
|
16
18
|
Requires-Python: >=3.9
|
|
17
|
-
Description-Content-Type: text/markdown
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
18
20
|
License-File: LICENSE.txt
|
|
19
21
|
License-File: COPYING
|
|
20
22
|
License-File: AUTHORS.md
|
|
@@ -23,7 +25,7 @@ Requires-Dist: numpy<2
|
|
|
23
25
|
Requires-Dist: scipy
|
|
24
26
|
Requires-Dist: pymatgen==2024.5.1
|
|
25
27
|
Requires-Dist: iapws
|
|
26
|
-
Requires-Dist: monty
|
|
28
|
+
Requires-Dist: monty>=2024.7.12
|
|
27
29
|
Requires-Dist: maggma>=0.67.0
|
|
28
30
|
Requires-Dist: phreeqpython
|
|
29
31
|
Provides-Extra: testing
|
|
@@ -5,6 +5,58 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.2] - 2024-07-28
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `Solution`: Fix a bug in which setting `balance_charge` to `auto` when the initial
|
|
13
|
+
composition was electroneutral would cause errors and/or improper charge balancing
|
|
14
|
+
after `equilibrate` was called.
|
|
15
|
+
|
|
16
|
+
## [1.1.1] - 2024-07-27
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- `equilibrate`: Fixed a bug that could cause an `AttributeError` when pH was used for charge
|
|
21
|
+
balancing.
|
|
22
|
+
- Database: `size.radius_ionic` was missing units for `Ni[+2]` and `Cr[+3]`. Correct units have been added.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `Solution`: New automatic charge balancing method will automatically identify the majority (highest concentration)
|
|
27
|
+
cation or anion as appropriate (depending on the charge balance) for charge balancing. To use this mode, set
|
|
28
|
+
`balance_charge='auto'` when instantiating a `Solution`.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- `Solution.add_amount`: This method will now add solutes that are absent from the Solution. Previously, calling, e.g.,
|
|
33
|
+
`add_amount('Na+', '1 mol')` on a `Solution` that did not contain any sodium would result in an error. A warning
|
|
34
|
+
is logged if the method has to add a new solute.
|
|
35
|
+
- Units: use the upstream chemistry context from `pint` instead of the custom one from 2013.
|
|
36
|
+
- `pre-commit autoupdate`
|
|
37
|
+
- Misc. linting and code quality improvements.
|
|
38
|
+
- Unit tests: update `tmpdir` to `tmp_path` text fixture.
|
|
39
|
+
- CI: Small updates to pre-commit and GitHub actions per scientific python [repo review](https://scientific-python.github.io/repo-review/?repo=kingsburylab%2FpyEQL&branch=main).
|
|
40
|
+
|
|
41
|
+
## [1.0.3] - 2024-07-20
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- `standardize_formula`: Fix incorrect display of additional formulas, including methane which
|
|
46
|
+
was shown as "H4C(aq)", other tri-anions (N3-, P3-), and a variety of haloacetic acids. For
|
|
47
|
+
example, tricholoracetic acid was previously shown as `'C2Cl3O2[-1]'` but will now display
|
|
48
|
+
as `'CCl3COO[-1]'`.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- `standardize_formula`: `pyEQL` can now parse ion formulas that contain unicode superscript
|
|
53
|
+
or subscript characters, which makes input even more flexible. For example, `"PO₄³⁻"` and `"Co²⁺"`
|
|
54
|
+
will now standardize correctly to `"PO4[-3]"` and `"Co[+2]"`, respectively.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- Housekeeping: move all project configuration to `pyproject.toml`
|
|
59
|
+
|
|
8
60
|
## [1.0.2] - 2024-07-09
|
|
9
61
|
|
|
10
62
|
### Fixed
|
|
@@ -23,7 +23,8 @@ Here are some examples:
|
|
|
23
23
|
| Sodium Sulfate | "Na2(SO4)" or "Na2SO4" | "Na(SO4)(aq)" |
|
|
24
24
|
| Sodium Ion | "Na+", "Na+1", "Na1+", or "Na[+]" | "Na[+1]" |
|
|
25
25
|
| Magnesium Ion | "Mg+2", "Mg++", or "Mg[++]" | "Mg[+2]" |
|
|
26
|
-
| Methanol | "CH3OH", "CH4O" |
|
|
26
|
+
| Methanol | "CH3OH", "CH4O" | "CH3OH(aq)" |
|
|
27
|
+
| Phosphate Ion | "PO4-3", "PO₄³⁻" | "PO4[-3]" |
|
|
27
28
|
|
|
28
29
|
Specifically, `standardize_formula` uses `Ion.from_formula(<formula>).reduced_formla` (shown in the right hand column
|
|
29
30
|
of the table) to identify solutes. Notice that for charged species, the charges are always placed inside square brackets
|
|
@@ -33,6 +34,11 @@ by `(aq)` to disambiguate them from solids.
|
|
|
33
34
|
```{important}
|
|
34
35
|
**When writing multivalent ion formulas, it is strongly recommended that you put the charge number AFTER the + or -
|
|
35
36
|
sign** (e.g., type "Mg+2" NOT "Mg2+"). The latter formula is ambiguous - it could mean $Mg_2^+$ or $Mg^{+2}$ and it will be processed incorrectly into `Mg[+0.5]`
|
|
37
|
+
|
|
38
|
+
There is **one exception** to the rule above. If you really want to list the charge number
|
|
39
|
+
first , you can use unicode superscript characters (e.g., "Co²⁺"), and `pyEQL` will understand
|
|
40
|
+
these regardless of the order of the `+` and the `2`. So you can write "Co²⁺" and it will be
|
|
41
|
+
correctly standardized to `Co[+2]`
|
|
36
42
|
```
|
|
37
43
|
|
|
38
44
|
(manual-testing)=
|
|
@@ -1,8 +1,69 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "pyEQL"
|
|
3
|
+
readme = "README.md"
|
|
4
|
+
dynamic = ["version"]
|
|
5
|
+
description="A python interface for solution chemistry"
|
|
6
|
+
authors =[
|
|
7
|
+
{name = "Ryan Kingsbury", email = "kingsbury@princeton.edu"}
|
|
8
|
+
]
|
|
9
|
+
classifiers=[
|
|
10
|
+
"Programming Language :: Python :: 3",
|
|
11
|
+
"Programming Language :: Python :: 3.9",
|
|
12
|
+
"Programming Language :: Python :: 3.10",
|
|
13
|
+
"Programming Language :: Python :: 3.11",
|
|
14
|
+
"Programming Language :: Python :: 3.12",
|
|
15
|
+
"Development Status :: 4 - Beta",
|
|
16
|
+
"Intended Audience :: Science/Research",
|
|
17
|
+
"Operating System :: OS Independent",
|
|
18
|
+
"Topic :: Scientific/Engineering",
|
|
19
|
+
]
|
|
20
|
+
license = {file = "LICENSE"}
|
|
21
|
+
requires-python = ">=3.9"
|
|
22
|
+
dependencies = [
|
|
23
|
+
"pint>=0.19",
|
|
24
|
+
"numpy<2",
|
|
25
|
+
"scipy",
|
|
26
|
+
"pymatgen==2024.5.1",
|
|
27
|
+
"iapws",
|
|
28
|
+
"monty>=2024.7.12",
|
|
29
|
+
"maggma>=0.67.0",
|
|
30
|
+
"phreeqpython",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.urls]
|
|
34
|
+
Docs = "https://pyeql.readthedocs.io/"
|
|
35
|
+
Repo = "https://github.com/KingsburyLab/pyEQL"
|
|
36
|
+
Package = "https://pypi.org/project/pyEQL"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
testing = [
|
|
41
|
+
"setuptools",
|
|
42
|
+
"pre-commit",
|
|
43
|
+
"pytest",
|
|
44
|
+
"pytest-cov",
|
|
45
|
+
"pytest-xdist",
|
|
46
|
+
"black",
|
|
47
|
+
"mypy",
|
|
48
|
+
"ruff",
|
|
49
|
+
"tox<4",
|
|
50
|
+
]
|
|
51
|
+
docs = [
|
|
52
|
+
"sphinx>=3.2.1",
|
|
53
|
+
"sphinx-rtd-theme",
|
|
54
|
+
"myst-parser[linkify]",
|
|
55
|
+
]
|
|
56
|
+
full = ["rich"]
|
|
57
|
+
|
|
1
58
|
[build-system]
|
|
2
59
|
# AVOID CHANGING REQUIRES: IT WILL BE UPDATED BY PYSCAFFOLD!
|
|
3
60
|
requires = ["setuptools>=46.1.0", "setuptools_scm[toml]>=5"]
|
|
4
61
|
build-backend = "setuptools.build_meta"
|
|
5
62
|
|
|
63
|
+
[tool.setuptools.packages.find]
|
|
64
|
+
where = ["src"]
|
|
65
|
+
exclude = ["tests"]
|
|
66
|
+
|
|
6
67
|
[tool.setuptools_scm]
|
|
7
68
|
# See configuration details in https://github.com/pypa/setuptools_scm
|
|
8
69
|
version_scheme = "no-guess-dev"
|
|
@@ -11,7 +72,6 @@ version_scheme = "no-guess-dev"
|
|
|
11
72
|
line-length = 120
|
|
12
73
|
|
|
13
74
|
[tool.ruff]
|
|
14
|
-
target-version = "py39"
|
|
15
75
|
line-length = 120
|
|
16
76
|
exclude = [".dat"]
|
|
17
77
|
src = ["src"]
|
|
@@ -84,7 +144,13 @@ addopts = [
|
|
|
84
144
|
"--strict-config",
|
|
85
145
|
"--color=yes",
|
|
86
146
|
"--import-mode=importlib",
|
|
87
|
-
"--durations=30"
|
|
147
|
+
"--durations=30",
|
|
148
|
+
"--verbose",
|
|
149
|
+
]
|
|
150
|
+
norecursedirs = [
|
|
151
|
+
"dist",
|
|
152
|
+
"build",
|
|
153
|
+
".tox",
|
|
88
154
|
]
|
|
89
155
|
xfail_strict = true
|
|
90
156
|
filterwarnings = ["error", "ignore::UserWarning", "ignore::DeprecationWarning"]
|
|
@@ -8,44 +8,29 @@ aioitertools==0.11.0
|
|
|
8
8
|
# via maggma
|
|
9
9
|
annotated-types==0.7.0
|
|
10
10
|
# via pydantic
|
|
11
|
-
anyio==4.4.0
|
|
12
|
-
# via
|
|
13
|
-
# httpx
|
|
14
|
-
# starlette
|
|
15
|
-
# watchfiles
|
|
16
11
|
appdirs==1.4.4
|
|
17
12
|
# via pint
|
|
18
13
|
attrs==23.2.0
|
|
19
14
|
# via
|
|
15
|
+
# jsonlines
|
|
20
16
|
# jsonschema
|
|
21
17
|
# referencing
|
|
22
18
|
bcrypt==4.1.3
|
|
23
19
|
# via paramiko
|
|
24
|
-
|
|
25
|
-
# via flask
|
|
26
|
-
boto3==1.34.122
|
|
20
|
+
boto3==1.34.142
|
|
27
21
|
# via maggma
|
|
28
|
-
botocore==1.34.
|
|
22
|
+
botocore==1.34.142
|
|
29
23
|
# via
|
|
30
24
|
# boto3
|
|
31
25
|
# s3transfer
|
|
32
|
-
certifi==2024.
|
|
33
|
-
# via
|
|
34
|
-
# httpcore
|
|
35
|
-
# httpx
|
|
36
|
-
# requests
|
|
26
|
+
certifi==2024.7.4
|
|
27
|
+
# via requests
|
|
37
28
|
cffi==1.16.0
|
|
38
29
|
# via
|
|
39
30
|
# cryptography
|
|
40
31
|
# pynacl
|
|
41
32
|
charset-normalizer==3.3.2
|
|
42
33
|
# via requests
|
|
43
|
-
click==8.1.7
|
|
44
|
-
# via
|
|
45
|
-
# flask
|
|
46
|
-
# mongogrant
|
|
47
|
-
# typer
|
|
48
|
-
# uvicorn
|
|
49
34
|
contourpy==1.2.1
|
|
50
35
|
# via matplotlib
|
|
51
36
|
cryptography==42.0.8
|
|
@@ -54,56 +39,27 @@ cycler==0.12.1
|
|
|
54
39
|
# via matplotlib
|
|
55
40
|
dnspython==2.6.1
|
|
56
41
|
# via
|
|
57
|
-
# email-validator
|
|
58
42
|
# maggma
|
|
59
43
|
# pymongo
|
|
60
|
-
email-validator==2.1.1
|
|
61
|
-
# via fastapi
|
|
62
|
-
exceptiongroup==1.2.1
|
|
63
|
-
# via anyio
|
|
64
|
-
fastapi==0.111.0
|
|
65
|
-
# via maggma
|
|
66
|
-
fastapi-cli==0.0.4
|
|
67
|
-
# via fastapi
|
|
68
|
-
flask==3.0.3
|
|
69
|
-
# via mongogrant
|
|
70
44
|
flexcache==0.3
|
|
71
45
|
# via pint
|
|
72
46
|
flexparser==0.3.1
|
|
73
47
|
# via pint
|
|
74
|
-
fonttools==4.53.
|
|
48
|
+
fonttools==4.53.1
|
|
75
49
|
# via matplotlib
|
|
76
|
-
h11==0.14.0
|
|
77
|
-
# via
|
|
78
|
-
# httpcore
|
|
79
|
-
# uvicorn
|
|
80
|
-
httpcore==1.0.5
|
|
81
|
-
# via httpx
|
|
82
|
-
httptools==0.6.1
|
|
83
|
-
# via uvicorn
|
|
84
|
-
httpx==0.27.0
|
|
85
|
-
# via fastapi
|
|
86
50
|
iapws==1.5.4
|
|
87
51
|
# via pyEQL (setup.py)
|
|
88
52
|
idna==3.7
|
|
89
|
-
# via
|
|
90
|
-
# anyio
|
|
91
|
-
# email-validator
|
|
92
|
-
# httpx
|
|
93
|
-
# requests
|
|
94
|
-
itsdangerous==2.2.0
|
|
95
|
-
# via flask
|
|
96
|
-
jinja2==3.1.4
|
|
97
|
-
# via
|
|
98
|
-
# fastapi
|
|
99
|
-
# flask
|
|
53
|
+
# via requests
|
|
100
54
|
jmespath==1.0.1
|
|
101
55
|
# via
|
|
102
56
|
# boto3
|
|
103
57
|
# botocore
|
|
104
58
|
joblib==1.4.2
|
|
105
59
|
# via pymatgen
|
|
106
|
-
|
|
60
|
+
jsonlines==4.0.0
|
|
61
|
+
# via maggma
|
|
62
|
+
jsonschema==4.23.0
|
|
107
63
|
# via maggma
|
|
108
64
|
jsonschema-specifications==2023.12.1
|
|
109
65
|
# via jsonschema
|
|
@@ -111,20 +67,10 @@ kiwisolver==1.4.5
|
|
|
111
67
|
# via matplotlib
|
|
112
68
|
latexcodec==3.0.0
|
|
113
69
|
# via pybtex
|
|
114
|
-
maggma==0.
|
|
70
|
+
maggma==0.69.0
|
|
115
71
|
# via pyEQL (setup.py)
|
|
116
|
-
|
|
117
|
-
# via rich
|
|
118
|
-
markupsafe==2.1.5
|
|
119
|
-
# via
|
|
120
|
-
# jinja2
|
|
121
|
-
# werkzeug
|
|
122
|
-
matplotlib==3.9.0
|
|
72
|
+
matplotlib==3.9.1
|
|
123
73
|
# via pymatgen
|
|
124
|
-
mdurl==0.1.2
|
|
125
|
-
# via markdown-it-py
|
|
126
|
-
mongogrant==0.3.3
|
|
127
|
-
# via maggma
|
|
128
74
|
mongomock==4.1.2
|
|
129
75
|
# via maggma
|
|
130
76
|
monty==2024.5.24
|
|
@@ -149,10 +95,8 @@ numpy==1.26.4
|
|
|
149
95
|
# pymatgen
|
|
150
96
|
# scipy
|
|
151
97
|
# spglib
|
|
152
|
-
orjson==3.10.
|
|
153
|
-
# via
|
|
154
|
-
# fastapi
|
|
155
|
-
# maggma
|
|
98
|
+
orjson==3.10.6
|
|
99
|
+
# via maggma
|
|
156
100
|
packaging==24.1
|
|
157
101
|
# via
|
|
158
102
|
# matplotlib
|
|
@@ -161,16 +105,18 @@ packaging==24.1
|
|
|
161
105
|
palettable==3.3.3
|
|
162
106
|
# via pymatgen
|
|
163
107
|
pandas==2.2.2
|
|
164
|
-
# via
|
|
108
|
+
# via
|
|
109
|
+
# maggma
|
|
110
|
+
# pymatgen
|
|
165
111
|
paramiko==3.4.0
|
|
166
112
|
# via sshtunnel
|
|
167
|
-
periodictable==1.7.
|
|
113
|
+
periodictable==1.7.1
|
|
168
114
|
# via phreeqpython
|
|
169
115
|
phreeqpython==1.5.2
|
|
170
116
|
# via pyEQL (setup.py)
|
|
171
|
-
pillow==10.
|
|
117
|
+
pillow==10.4.0
|
|
172
118
|
# via matplotlib
|
|
173
|
-
pint==0.24
|
|
119
|
+
pint==0.24.1
|
|
174
120
|
# via pyEQL (setup.py)
|
|
175
121
|
plotly==5.22.0
|
|
176
122
|
# via pymatgen
|
|
@@ -178,25 +124,20 @@ pybtex==0.24.0
|
|
|
178
124
|
# via pymatgen
|
|
179
125
|
pycparser==2.22
|
|
180
126
|
# via cffi
|
|
181
|
-
pydantic==2.
|
|
127
|
+
pydantic==2.8.2
|
|
182
128
|
# via
|
|
183
|
-
# fastapi
|
|
184
129
|
# maggma
|
|
185
130
|
# pydantic-settings
|
|
186
|
-
pydantic-core==2.
|
|
131
|
+
pydantic-core==2.20.1
|
|
187
132
|
# via pydantic
|
|
188
|
-
pydantic-settings==2.3.
|
|
133
|
+
pydantic-settings==2.3.4
|
|
189
134
|
# via maggma
|
|
190
135
|
pydash==8.0.1
|
|
191
136
|
# via maggma
|
|
192
|
-
|
|
193
|
-
# via rich
|
|
194
|
-
pymatgen==2024.6.4
|
|
137
|
+
pymatgen==2024.5.1
|
|
195
138
|
# via pyEQL (setup.py)
|
|
196
|
-
pymongo==4.
|
|
197
|
-
# via
|
|
198
|
-
# maggma
|
|
199
|
-
# mongogrant
|
|
139
|
+
pymongo==4.8.0
|
|
140
|
+
# via maggma
|
|
200
141
|
pynacl==1.5.0
|
|
201
142
|
# via paramiko
|
|
202
143
|
pyparsing==3.1.2
|
|
@@ -210,17 +151,11 @@ python-dateutil==2.9.0.post0
|
|
|
210
151
|
# matplotlib
|
|
211
152
|
# pandas
|
|
212
153
|
python-dotenv==1.0.1
|
|
213
|
-
# via
|
|
214
|
-
# pydantic-settings
|
|
215
|
-
# uvicorn
|
|
216
|
-
python-multipart==0.0.9
|
|
217
|
-
# via fastapi
|
|
154
|
+
# via pydantic-settings
|
|
218
155
|
pytz==2024.1
|
|
219
156
|
# via pandas
|
|
220
157
|
pyyaml==6.0.1
|
|
221
|
-
# via
|
|
222
|
-
# pybtex
|
|
223
|
-
# uvicorn
|
|
158
|
+
# via pybtex
|
|
224
159
|
pyzmq==26.0.3
|
|
225
160
|
# via maggma
|
|
226
161
|
referencing==0.35.1
|
|
@@ -228,12 +163,8 @@ referencing==0.35.1
|
|
|
228
163
|
# jsonschema
|
|
229
164
|
# jsonschema-specifications
|
|
230
165
|
requests==2.32.3
|
|
231
|
-
# via
|
|
232
|
-
|
|
233
|
-
# pymatgen
|
|
234
|
-
rich==13.7.1
|
|
235
|
-
# via typer
|
|
236
|
-
rpds-py==0.18.1
|
|
166
|
+
# via pymatgen
|
|
167
|
+
rpds-py==0.19.0
|
|
237
168
|
# via
|
|
238
169
|
# jsonschema
|
|
239
170
|
# referencing
|
|
@@ -243,9 +174,9 @@ ruamel-yaml==0.18.6
|
|
|
243
174
|
# pymatgen
|
|
244
175
|
ruamel-yaml-clib==0.2.8
|
|
245
176
|
# via ruamel-yaml
|
|
246
|
-
s3transfer==0.10.
|
|
177
|
+
s3transfer==0.10.2
|
|
247
178
|
# via boto3
|
|
248
|
-
scipy==1.
|
|
179
|
+
scipy==1.14.0
|
|
249
180
|
# via
|
|
250
181
|
# iapws
|
|
251
182
|
# phreeqpython
|
|
@@ -253,68 +184,40 @@ scipy==1.13.1
|
|
|
253
184
|
# pymatgen
|
|
254
185
|
sentinels==1.0.0
|
|
255
186
|
# via mongomock
|
|
256
|
-
shellingham==1.5.4
|
|
257
|
-
# via typer
|
|
258
187
|
six==1.16.0
|
|
259
188
|
# via
|
|
260
189
|
# pybtex
|
|
261
190
|
# python-dateutil
|
|
262
|
-
sniffio==1.3.1
|
|
263
|
-
# via
|
|
264
|
-
# anyio
|
|
265
|
-
# httpx
|
|
266
191
|
spglib==2.4.0
|
|
267
192
|
# via pymatgen
|
|
268
193
|
sshtunnel==0.4.0
|
|
269
194
|
# via maggma
|
|
270
|
-
|
|
271
|
-
# via fastapi
|
|
272
|
-
sympy==1.12.1
|
|
195
|
+
sympy==1.13.0
|
|
273
196
|
# via pymatgen
|
|
274
197
|
tabulate==0.9.0
|
|
275
198
|
# via pymatgen
|
|
276
|
-
tenacity==8.
|
|
199
|
+
tenacity==8.5.0
|
|
277
200
|
# via plotly
|
|
278
201
|
tqdm==4.66.4
|
|
279
202
|
# via
|
|
280
203
|
# maggma
|
|
281
204
|
# pymatgen
|
|
282
|
-
typer==0.12.3
|
|
283
|
-
# via fastapi-cli
|
|
284
205
|
typing-extensions==4.12.2
|
|
285
206
|
# via
|
|
286
|
-
# anyio
|
|
287
|
-
# fastapi
|
|
288
207
|
# flexcache
|
|
289
208
|
# flexparser
|
|
290
209
|
# pint
|
|
291
210
|
# pydantic
|
|
292
211
|
# pydantic-core
|
|
293
212
|
# pydash
|
|
294
|
-
# typer
|
|
295
|
-
# uvicorn
|
|
296
213
|
tzdata==2024.1
|
|
297
214
|
# via pandas
|
|
298
|
-
|
|
299
|
-
# via fastapi
|
|
300
|
-
uncertainties==3.2.1
|
|
215
|
+
uncertainties==3.2.2
|
|
301
216
|
# via pymatgen
|
|
302
|
-
urllib3==2.2.
|
|
217
|
+
urllib3==2.2.2
|
|
303
218
|
# via
|
|
304
219
|
# botocore
|
|
305
220
|
# requests
|
|
306
|
-
uvicorn[standard]==0.30.1
|
|
307
|
-
# via
|
|
308
|
-
# fastapi
|
|
309
|
-
# maggma
|
|
310
|
-
uvloop==0.19.0
|
|
311
|
-
# via uvicorn
|
|
312
|
-
watchfiles==0.22.0
|
|
313
|
-
# via uvicorn
|
|
314
|
-
websockets==12.0
|
|
315
|
-
# via uvicorn
|
|
316
|
-
werkzeug==3.0.3
|
|
317
|
-
# via flask
|
|
318
221
|
|
|
319
222
|
# The following packages are considered to be unsafe in a requirements file:
|
|
320
223
|
# setuptools
|