pyEQL 1.1.0__tar.gz → 1.1.1__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.
Files changed (132) hide show
  1. {pyeql-1.1.0 → pyeql-1.1.1}/.github/dependabot.yml +5 -0
  2. {pyeql-1.1.0 → pyeql-1.1.1}/.pre-commit-config.yaml +5 -5
  3. {pyeql-1.1.0 → pyeql-1.1.1}/CHANGELOG.md +44 -0
  4. {pyeql-1.1.0 → pyeql-1.1.1}/MANIFEST.in +0 -1
  5. {pyeql-1.1.0/src/pyEQL.egg-info → pyeql-1.1.1}/PKG-INFO +14 -12
  6. {pyeql-1.1.0 → pyeql-1.1.1}/docs/changelog.md +44 -0
  7. {pyeql-1.1.0 → pyeql-1.1.1}/docs/chemistry.md +7 -1
  8. {pyeql-1.1.0 → pyeql-1.1.1}/pyproject.toml +68 -2
  9. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.10.txt +36 -133
  10. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.10_extras.txt +49 -128
  11. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.11.txt +36 -129
  12. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.11_extras.txt +48 -123
  13. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.12.txt +36 -129
  14. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.12_extras.txt +48 -123
  15. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.9.txt +44 -138
  16. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/macos-latest_py3.9_extras.txt +58 -132
  17. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.10.txt +36 -133
  18. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.10_extras.txt +49 -128
  19. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.11.txt +36 -129
  20. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.11_extras.txt +48 -123
  21. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.12.txt +36 -129
  22. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.12_extras.txt +48 -123
  23. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.9.txt +44 -138
  24. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/ubuntu-latest_py3.9_extras.txt +58 -132
  25. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.10.txt +37 -135
  26. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.10_extras.txt +49 -127
  27. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.11.txt +37 -131
  28. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.11_extras.txt +48 -122
  29. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.12.txt +37 -131
  30. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.12_extras.txt +48 -122
  31. pyeql-1.1.1/requirements/windows-latest_py3.9.txt +232 -0
  32. {pyeql-1.1.0 → pyeql-1.1.1}/requirements/windows-latest_py3.9_extras.txt +58 -131
  33. pyeql-1.1.1/setup.cfg +11 -0
  34. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/__init__.py +1 -4
  35. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/database/pyeql_db.json +2 -2
  36. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/engines.py +39 -34
  37. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/solution.py +25 -84
  38. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/utils.py +47 -1
  39. {pyeql-1.1.0 → pyeql-1.1.1/src/pyEQL.egg-info}/PKG-INFO +14 -12
  40. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL.egg-info/SOURCES.txt +0 -2
  41. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL.egg-info/requires.txt +1 -1
  42. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_solution.py +32 -10
  43. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_utils.py +20 -0
  44. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_volume_concentration.py +7 -0
  45. pyeql-1.1.0/requirements/windows-latest_py3.9.txt +0 -327
  46. pyeql-1.1.0/setup.cfg +0 -103
  47. pyeql-1.1.0/src/pyEQL/pint_custom_units.txt +0 -52
  48. pyeql-1.1.0/src/pyEQL.egg-info/not-zip-safe +0 -1
  49. {pyeql-1.1.0 → pyeql-1.1.1}/.coveragerc +0 -0
  50. {pyeql-1.1.0 → pyeql-1.1.1}/.gitattributes +0 -0
  51. {pyeql-1.1.0 → pyeql-1.1.1}/.github/pull_request_template.md +0 -0
  52. {pyeql-1.1.0 → pyeql-1.1.1}/.github/release.yml +0 -0
  53. {pyeql-1.1.0 → pyeql-1.1.1}/.github/workflows/post-process.yml +0 -0
  54. {pyeql-1.1.0 → pyeql-1.1.1}/.github/workflows/release.yml +0 -0
  55. {pyeql-1.1.0 → pyeql-1.1.1}/.github/workflows/testing.yaml +0 -0
  56. {pyeql-1.1.0 → pyeql-1.1.1}/.github/workflows/upgrade_dependencies.yml +0 -0
  57. {pyeql-1.1.0 → pyeql-1.1.1}/.gitignore +0 -0
  58. {pyeql-1.1.0 → pyeql-1.1.1}/.readthedocs.yml +0 -0
  59. {pyeql-1.1.0 → pyeql-1.1.1}/.zenodo.json +0 -0
  60. {pyeql-1.1.0 → pyeql-1.1.1}/AUTHORS.md +0 -0
  61. {pyeql-1.1.0 → pyeql-1.1.1}/CITATION.cff +0 -0
  62. {pyeql-1.1.0 → pyeql-1.1.1}/COPYING +0 -0
  63. {pyeql-1.1.0 → pyeql-1.1.1}/LICENSE.txt +0 -0
  64. {pyeql-1.1.0 → pyeql-1.1.1}/README.md +0 -0
  65. {pyeql-1.1.0 → pyeql-1.1.1}/docs/Makefile +0 -0
  66. {pyeql-1.1.0 → pyeql-1.1.1}/docs/_static/.gitignore +0 -0
  67. {pyeql-1.1.0 → pyeql-1.1.1}/docs/amounts.md +0 -0
  68. {pyeql-1.1.0 → pyeql-1.1.1}/docs/arithmetic.md +0 -0
  69. {pyeql-1.1.0 → pyeql-1.1.1}/docs/authors.md +0 -0
  70. {pyeql-1.1.0 → pyeql-1.1.1}/docs/class_solution.md +0 -0
  71. {pyeql-1.1.0 → pyeql-1.1.1}/docs/conf.py +0 -0
  72. {pyeql-1.1.0 → pyeql-1.1.1}/docs/contributing.md +0 -0
  73. {pyeql-1.1.0 → pyeql-1.1.1}/docs/creating.md +0 -0
  74. {pyeql-1.1.0 → pyeql-1.1.1}/docs/database.md +0 -0
  75. {pyeql-1.1.0 → pyeql-1.1.1}/docs/engines.md +0 -0
  76. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/.ipynb_checkpoints/pyEQL_demo_1-checkpoint.ipynb +0 -0
  77. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/.ipynb_checkpoints/pyeql_demo-checkpoint.ipynb +0 -0
  78. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_database-checkpoint.ipynb +0 -0
  79. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_osmotic_pressure-checkpoint.ipynb +0 -0
  80. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/.ipynb_checkpoints/speedup-checkpoint.ipynb +0 -0
  81. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/pyEQL_demo_1.ipynb +0 -0
  82. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/pyeql_demo.ipynb +0 -0
  83. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/pyeql_tutorial_database.ipynb +0 -0
  84. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/pyeql_tutorial_osmotic_pressure.ipynb +0 -0
  85. {pyeql-1.1.0 → pyeql-1.1.1}/docs/examples/speedup.ipynb +0 -0
  86. {pyeql-1.1.0 → pyeql-1.1.1}/docs/index.md +0 -0
  87. {pyeql-1.1.0 → pyeql-1.1.1}/docs/installation.md +0 -0
  88. {pyeql-1.1.0 → pyeql-1.1.1}/docs/internal.md +0 -0
  89. {pyeql-1.1.0 → pyeql-1.1.1}/docs/license.md +0 -0
  90. {pyeql-1.1.0 → pyeql-1.1.1}/docs/mixing.md +0 -0
  91. {pyeql-1.1.0 → pyeql-1.1.1}/docs/quickstart.md +0 -0
  92. {pyeql-1.1.0 → pyeql-1.1.1}/docs/readme.md +0 -0
  93. {pyeql-1.1.0 → pyeql-1.1.1}/docs/requirements.txt +0 -0
  94. {pyeql-1.1.0 → pyeql-1.1.1}/docs/serialization.md +0 -0
  95. {pyeql-1.1.0 → pyeql-1.1.1}/docs/tutorials.md +0 -0
  96. {pyeql-1.1.0 → pyeql-1.1.1}/docs/units.md +0 -0
  97. {pyeql-1.1.0 → pyeql-1.1.1}/pyeql-logo.png +0 -0
  98. {pyeql-1.1.0 → pyeql-1.1.1}/pyeql-logo.svg +0 -0
  99. {pyeql-1.1.0 → pyeql-1.1.1}/setup.py +0 -0
  100. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/activity_correction.py +0 -0
  101. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/database/geothermal.dat +0 -0
  102. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/database/llnl.dat +0 -0
  103. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/database/phreeqc_license.txt +0 -0
  104. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/equilibrium.py +0 -0
  105. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/functions.py +0 -0
  106. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/Ringers lactate.yaml +0 -0
  107. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/normal saline.yaml +0 -0
  108. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/rainwater.yaml +0 -0
  109. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/seawater.yaml +0 -0
  110. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/urine.yaml +0 -0
  111. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/presets/wastewater.yaml +0 -0
  112. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/salt_ion_match.py +0 -0
  113. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL/solute.py +0 -0
  114. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL.egg-info/dependency_links.txt +0 -0
  115. {pyeql-1.1.0 → pyeql-1.1.1}/src/pyEQL.egg-info/top_level.txt +0 -0
  116. {pyeql-1.1.0 → pyeql-1.1.1}/tests/conftest.py +0 -0
  117. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_activity.py +0 -0
  118. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_bulk_properties.py +0 -0
  119. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_debye_length.py +0 -0
  120. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_density.py +0 -0
  121. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_dielectric.py +0 -0
  122. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_effective_pitzer.py +0 -0
  123. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_equilibrium.py +0 -0
  124. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_functions.py +0 -0
  125. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_logging.py +0 -0
  126. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_mixed_electrolyte_activity.py +0 -0
  127. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_osmotic_coeff.py +0 -0
  128. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_phreeqc.py +0 -0
  129. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_salt_matching.py +0 -0
  130. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_solute.py +0 -0
  131. {pyeql-1.1.0 → pyeql-1.1.1}/tests/test_solute_properties.py +0 -0
  132. {pyeql-1.1.0 → pyeql-1.1.1}/tox.ini +0 -0
@@ -1,6 +1,11 @@
1
1
  version: 2
2
2
  updates:
3
+ # Maintain dependencies for GitHub Actions
3
4
  - package-ecosystem: "github-actions"
4
5
  directory: "/"
5
6
  schedule:
6
7
  interval: "weekly"
8
+ groups:
9
+ actions:
10
+ patterns:
11
+ - "*"
@@ -12,18 +12,18 @@ ci:
12
12
 
13
13
  repos:
14
14
  - repo: https://github.com/astral-sh/ruff-pre-commit
15
- rev: v0.3.2
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.0
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.2.6
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.5.0
34
+ rev: v4.6.0
35
35
  hooks:
36
36
  - id: check-case-conflict
37
37
  - id: check-symlinks
@@ -5,6 +5,50 @@ 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.1] - 2024-07-27
9
+
10
+ ### Fixed
11
+
12
+ - `equilibrate`: Fixed a bug that could cause an `AttributeError` when pH was used for charge
13
+ balancing.
14
+ - Database: `size.radius_ionic` was missing units for `Ni[+2]` and `Cr[+3]`. Correct units have been added.
15
+
16
+ ### Added
17
+
18
+ - `Solution`: New automatic charge balancing method will automatically identify the majority (highest concentration)
19
+ cation or anion as appropriate (depending on the charge balance) for charge balancing. To use this mode, set
20
+ `balance_charge='auto'` when instantiating a `Solution`.
21
+
22
+ ### Changed
23
+
24
+ - `Solution.add_amount`: This method will now add solutes that are absent from the Solution. Previously, calling, e.g.,
25
+ `add_amount('Na+', '1 mol')` on a `Solution` that did not contain any sodium would result in an error. A warning
26
+ is logged if the method has to add a new solute.
27
+ - Units: use the upstream chemistry context from `pint` instead of the custom one from 2013.
28
+ - `pre-commit autoupdate`
29
+ - Misc. linting and code quality improvements.
30
+ - Unit tests: update `tmpdir` to `tmp_path` text fixture.
31
+ - 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).
32
+
33
+ ## [1.0.3] - 2024-07-20
34
+
35
+ ### Fixed
36
+
37
+ - `standardize_formula`: Fix incorrect display of additional formulas, including methane which
38
+ was shown as "H4C(aq)", other tri-anions (N3-, P3-), and a variety of haloacetic acids. For
39
+ example, tricholoracetic acid was previously shown as `'C2Cl3O2[-1]'` but will now display
40
+ as `'CCl3COO[-1]'`.
41
+
42
+ ### Added
43
+
44
+ - `standardize_formula`: `pyEQL` can now parse ion formulas that contain unicode superscript
45
+ or subscript characters, which makes input even more flexible. For example, `"PO₄³⁻"` and `"Co²⁺"`
46
+ will now standardize correctly to `"PO4[-3]"` and `"Co[+2]"`, respectively.
47
+
48
+ ### Changed
49
+
50
+ - Housekeeping: move all project configuration to `pyproject.toml`
51
+
8
52
  ## [1.0.2] - 2024-07-09
9
53
 
10
54
  ### 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.0
4
- Summary: Python tools for solution chemistry
5
- Home-page: https://github.com/KingsburyLab/pyEQL
6
- Author: Ryan Kingsbury
7
- Author-email: kingsbury@princeton.edu
8
- License: LGPL3
9
- Project-URL: Documentation, https://pyeql.readthedocs.io/
10
- Platform: any
3
+ Version: 1.1.1
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; charset=UTF-8; variant=GFM
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,50 @@ 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.1] - 2024-07-27
9
+
10
+ ### Fixed
11
+
12
+ - `equilibrate`: Fixed a bug that could cause an `AttributeError` when pH was used for charge
13
+ balancing.
14
+ - Database: `size.radius_ionic` was missing units for `Ni[+2]` and `Cr[+3]`. Correct units have been added.
15
+
16
+ ### Added
17
+
18
+ - `Solution`: New automatic charge balancing method will automatically identify the majority (highest concentration)
19
+ cation or anion as appropriate (depending on the charge balance) for charge balancing. To use this mode, set
20
+ `balance_charge='auto'` when instantiating a `Solution`.
21
+
22
+ ### Changed
23
+
24
+ - `Solution.add_amount`: This method will now add solutes that are absent from the Solution. Previously, calling, e.g.,
25
+ `add_amount('Na+', '1 mol')` on a `Solution` that did not contain any sodium would result in an error. A warning
26
+ is logged if the method has to add a new solute.
27
+ - Units: use the upstream chemistry context from `pint` instead of the custom one from 2013.
28
+ - `pre-commit autoupdate`
29
+ - Misc. linting and code quality improvements.
30
+ - Unit tests: update `tmpdir` to `tmp_path` text fixture.
31
+ - 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).
32
+
33
+ ## [1.0.3] - 2024-07-20
34
+
35
+ ### Fixed
36
+
37
+ - `standardize_formula`: Fix incorrect display of additional formulas, including methane which
38
+ was shown as "H4C(aq)", other tri-anions (N3-, P3-), and a variety of haloacetic acids. For
39
+ example, tricholoracetic acid was previously shown as `'C2Cl3O2[-1]'` but will now display
40
+ as `'CCl3COO[-1]'`.
41
+
42
+ ### Added
43
+
44
+ - `standardize_formula`: `pyEQL` can now parse ion formulas that contain unicode superscript
45
+ or subscript characters, which makes input even more flexible. For example, `"PO₄³⁻"` and `"Co²⁺"`
46
+ will now standardize correctly to `"PO4[-3]"` and `"Co[+2]"`, respectively.
47
+
48
+ ### Changed
49
+
50
+ - Housekeeping: move all project configuration to `pyproject.toml`
51
+
8
52
  ## [1.0.2] - 2024-07-09
9
53
 
10
54
  ### 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" | "'CH3OH(aq)'" |
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
- blinker==1.8.2
25
- # via flask
26
- boto3==1.34.122
20
+ boto3==1.34.142
27
21
  # via maggma
28
- botocore==1.34.122
22
+ botocore==1.34.142
29
23
  # via
30
24
  # boto3
31
25
  # s3transfer
32
- certifi==2024.6.2
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.0
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
- jsonschema==4.22.0
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.67.0
70
+ maggma==0.69.0
115
71
  # via pyEQL (setup.py)
116
- markdown-it-py==3.0.0
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.3
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 pymatgen
108
+ # via
109
+ # maggma
110
+ # pymatgen
165
111
  paramiko==3.4.0
166
112
  # via sshtunnel
167
- periodictable==1.7.0
113
+ periodictable==1.7.1
168
114
  # via phreeqpython
169
115
  phreeqpython==1.5.2
170
116
  # via pyEQL (setup.py)
171
- pillow==10.3.0
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.7.3
127
+ pydantic==2.8.2
182
128
  # via
183
- # fastapi
184
129
  # maggma
185
130
  # pydantic-settings
186
- pydantic-core==2.18.4
131
+ pydantic-core==2.20.1
187
132
  # via pydantic
188
- pydantic-settings==2.3.1
133
+ pydantic-settings==2.3.4
189
134
  # via maggma
190
135
  pydash==8.0.1
191
136
  # via maggma
192
- pygments==2.18.0
193
- # via rich
194
- pymatgen==2024.6.4
137
+ pymatgen==2024.5.1
195
138
  # via pyEQL (setup.py)
196
- pymongo==4.7.3
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
- # mongogrant
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.1
177
+ s3transfer==0.10.2
247
178
  # via boto3
248
- scipy==1.13.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
- starlette==0.37.2
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.3.0
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
- ujson==5.10.0
299
- # via fastapi
300
- uncertainties==3.2.1
215
+ uncertainties==3.2.2
301
216
  # via pymatgen
302
- urllib3==2.2.1
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